Я работаю над небольшим проектом, который состоит из регистрации, входа, сброса пароля и управления пользователями в фоновом режиме. Я должен создавать файлы переводов для разных языков, и вместо того, чтобы использовать что-то вроде gettext (о котором я ничего не знаю), я решил реализовать очень простой метод, используя статический массив для каждого языкового файла следующим образом:
function plLang($phrase) { $trimmed = trim($phrase); static $lang = array( /* ----------------------------------- 1. REGISTRATION HTML ----------------------------------- */ 'LNG_1' => 'some text', 'LNG_2' => 'some other text', etc. ... ); $returnedPhrase = (!array_key_exists($trimmed,$lang)) ? $trimmed : $lang[$trimmed]; echo $returnedPhrase; }
Он работает отлично, он очень быстро на этом этапе, но моя разметка теперь завален метками языка php, и я не уверен, что принял правильное решение. Я никогда не делал этого раньше, поэтому я понятия не имею, с чем я с нетерпением жду. Также кажется, что к тому времени, когда я закончу, этот файл будет длиной в милю.
Это хороший способ сделать это? Есть ли лучший способ, который вы могли бы предложить?
Спасибо!
это то, что я делаю в своих cms:
each
плагина / программы / сущности (вы называете это) я разрабатываю, я создаю папку /translations
. JSON.parse
их) a data column of TEXT datatype
) json_decode()
ко всему результату, чтобы получить его один раз; затем поставьте его в $ _SESSION, чтобы в следующий раз получить переведенные строки с флэш-памятью для текущего выбранного языка. все это было разработано с учетом производительности и совместимости .
в вашем случае строка в таком файле может выглядеть так:
в en.txt
{"id":"LNG_1","str":"My word"}
в de.txt
{"id":"LNG_1","str":"Mein Wort"}
Текущий язык может храниться в сеансе как $ _SESSION ["language"]; и использовать это как отправную точку. Затем вы можете читать переводы:
lang("LNG_1");
Многие фреймворки хранят эти языковые массивы в отдельных файлах, причем каждый массив на любом языке имеет одно и то же имя. Тогда ваша языковая функция просто требует соответствующего файла для выбранного пользователем языка ( require('lang.en.php')
).
// lang.en.php $languageStrings = array( 'login' => 'Log in', ); // lang.ru.php $languageStrings = array( 'login' => 'Авторизовать в системе', ); // lang.ja.php $languageStrings = array( 'login' => 'ログイン', );
Какой язык в настоящее время используется (например, выбранный пользователем), может быть определен с помощью какой-либо глобальной доступной переменной.
Идея: Использовать языковые теги IETF в качестве языковых ключей.
Вы должны использовать механизм шаблонов, который поддерживает интернализацию.
Например, мой собственный механизм шаблонов позволяет мне делать что-то вроде:
<p>(_text to be localized here)</p>
И текст внутри этого маркера будет переведен. Это позволяет не открывать каждый раз, когда теги php в файле шаблона:
<p><?php plLang('lang'); ?></p>
Стандартное решение в любом случае – использовать gettext http://php.net/manual/en/book.gettext.php
Пример:
// alias _() for gettext() echo _("Have a nice day");