Самый эффективный способ сделать языковой файл в PHP?

Вопросы Обновлены вместо того, чтобы задавать новый вопрос …

Я действительно хочу предоставить несколько альтернативных языков, кроме английского на моем сайте социальной сети, который я создаю, это будет мой первый раз, когда я буду делать какие-либо переводы по языку, поэтому, пожалуйста, несите меня.
Я изучаю так, что я все ухо и открыт для идей, и у меня много уже здесь есть вопросы.

1)
Что означает i18n, я часто вижу это при исследовании перевода языка на SO?

2)
Большинство людей говорят, что использование gettext PHP имеет расширение или поддержку для него,
хорошо я изучал его, и у меня есть базовое понимание этого, насколько я могу судить, это много дополнительной работы, чтобы идти по этому маршруту,
Я имею в виду кодирование моего сайта для использования его функций, т.е. _ («hello world i'm in English for now»), иначе gettext («hello world i'm in English for now») не проблема, поскольку любой маршрут, который я буду, потребует этого.
Но тогда вам нужно установить gettext на свой сервер и заставить его работать,
а затем использовать некоторые специальные редакторы для создания специальных файлов и скомпилировать их, я думаю?

Похоже на боль, я понимаю, что это лучший путь, хотя все, кажется, говорят.
Так может кто-то сказать мне, почему это путь?

3)
Мне очень нравится простота этого подхода, просто создавая языковой массив и вызывая нужную вам фразу в функции, подобной приведенной ниже, вы просто включаете файл с соответствующим языковым массивом.

Я действительно хочу знать, будет ли это менее эффективным методом производительности при высоком трафике и довольно большом сайте по сравнению с использованием gettext, и если да, то можете ли вы объяснить, почему, пожалуйста?

<?PHP //Have seperate language files for each language I add, this would be english file function lang($phrase){ static $lang = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return $lang[$phrase]; } //Then in application where there is text from the site and not from users I would do something like this echo lang('NO_PHOTO'); // No photo's available would show here ?> 

* некоторый код, используемый из ответа Брианреависа ниже

Не изобретайте велосипед. Используйте, например, gettext или Zend_Translate .

Вероятно, лучше всего определить функцию, которая обрабатывает ваше языковое сопоставление. Таким образом, если вы хотите изменить, как это работает позже, вы не будете вынуждены тратить сотни скриптов на случаи, когда вы использовали $lang[...] и заменяли их чем-то другим.

Что-то вроде этого будет работать и будет хорошо и быстро:

 function lang($phrase){ static $lang = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return $lang[$phrase]; } 

Убедитесь, что массив объявлен static внутри функции, поэтому он не получает перераспределения при каждом вызове функции. Это особенно важно, когда $lang действительно большой.

Чтобы использовать его:

 echo lang('NO_PHOTO'); 

Для работы с несколькими языками просто используйте эту функцию в нескольких файлах (например, en.php , fr.php и т. Д.) И require() соответствующего для пользователя.

Это может работать лучше:

 function _L($phrase){ static $_L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,$_L)) ? $phrase : $_L[$phrase]; } 

То, что я использую сейчас. Если язык не найден, он вернет фразу вместо ошибки.

Следует отметить, что массив может содержать не более ~ 65500 элементов. Должно быть достаточно, но хорошо, просто говорю.

Вот код, который я использую для проверки языка пользователя:

 <?php function setSessionLanguageToDefault() { $ip=$_SERVER['REMOTE_ADDR']; $url='http://api.hostip.info/get_html.php?ip='.$ip; $data=file_get_contents($url); $s=explode (':',$data); $s2=explode('(',$s[1]); $country=str_replace(')','',substr($s2[1], 0, 3)); if ($country=='us') { $country='en'; } $country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country )); $_SESSION["_LANGUAGE"]=$country; } if (!isset($_SESSION["_LANGUAGE"])) { setSessionLanguageToDefault(); } if (file_exists(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php')) { include(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php'); } else { include(APP_DIR.'/language/'.DEFAULT_LANG.'.php'); } ?> в <?php function setSessionLanguageToDefault() { $ip=$_SERVER['REMOTE_ADDR']; $url='http://api.hostip.info/get_html.php?ip='.$ip; $data=file_get_contents($url); $s=explode (':',$data); $s2=explode('(',$s[1]); $country=str_replace(')','',substr($s2[1], 0, 3)); if ($country=='us') { $country='en'; } $country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country )); $_SESSION["_LANGUAGE"]=$country; } if (!isset($_SESSION["_LANGUAGE"])) { setSessionLanguageToDefault(); } if (file_exists(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php')) { include(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php'); } else { include(APP_DIR.'/language/'.DEFAULT_LANG.'.php'); } ?> в <?php function setSessionLanguageToDefault() { $ip=$_SERVER['REMOTE_ADDR']; $url='http://api.hostip.info/get_html.php?ip='.$ip; $data=file_get_contents($url); $s=explode (':',$data); $s2=explode('(',$s[1]); $country=str_replace(')','',substr($s2[1], 0, 3)); if ($country=='us') { $country='en'; } $country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country )); $_SESSION["_LANGUAGE"]=$country; } if (!isset($_SESSION["_LANGUAGE"])) { setSessionLanguageToDefault(); } if (file_exists(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php')) { include(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php'); } else { include(APP_DIR.'/language/'.DEFAULT_LANG.'.php'); } ?> 

Его еще не сделано, но я думаю, что это может многое помочь.

Не пишите свой собственный язык. Используйте gettext . У PHP есть стандартные привязки, которые вы можете установить.

Поскольку другие ответы на самом деле не отвечают на все вопросы, я пойду за это в своем ответе плюс предложение разумной альтернативы.

1) I18n не подходит для интернационализации и имеет некоторое сходство с I-восемнадцатью годами.

2) По моему честному мнению gettext – пустая трата времени.

3) Ваш подход выглядит хорошо. Вы должны искать языковые переменные. В WoltLab Community Framework 2.0 реализована двухсторонняя языковая система. На данный момент существуют языковые переменные, которые сохраняются в базе данных, а внутри шаблона используется только имя переменной, которое затем будет заменено содержимым переменной на текущем языке (если доступно). Вторая часть системы обеспечивает способ сохранения созданного пользователем контента на нескольких языках (требуется ввод на нескольких языках).

В основном у вас есть текст интерфейса, который определяется разработчиком и контент, определенный пользователем. Многоязычный текст содержимого сохраняется в языковых переменных, а имя языковой переменной затем используется как значение для текстового поля в конкретной таблице содержимого (так как одноязычное содержимое также возможно).

Структура WCF печально в том, что повторное использование кода вне рамки очень сложно, но вы можете использовать его как вдохновение. Объем системы зависит исключительно от того, чего вы хотите достичь на своем сайте. Если он будет большим, вы должны обязательно взглянуть на систему WCF. Если это немного, сделают несколько выделенных языковых файлов (de.php, en.php и т. Д.), Из которых будет использоваться правильный для текущего языка.

К сожалению, gettext не работает хорошо и имеет проблемы в различной ситуации, например, на разных ОС (Windows или Linux), и заставить его работать очень сложно.

Кроме того, он требует, чтобы вы задавали множество переменных среды и доменов, и это не имеет никакого смысла.

Если разработчик хочет просто получить перевод текста, он должен установить только путь к файлу .mo и получить перевод с помощью одной функции, например translate («hello», «en_EN»); С gettext это невозможно.

почему бы вам просто не сделать это как многодисковый массив … например, это

 <?php $lang = array( 'EN'=> array( 'NO_PHOTO'=>'No photo\'s avaiable', 'NEW_MEMBER'=>'This user is new', ), 'MY'=> array( 'NO_PHOTO'=>'Tiada gambar', 'NEW_MEMBER'=>'Ini adalah pengguna baru', ) ); ?>