Я искал варианты интернационализации проекта с открытым исходным кодом:
Gettext, который, кажется, все рекомендуют, очевидно, требует, чтобы локали были «установлены в вашей системе» для использования. См. Это примечание к руководству по PHP, которое точно отражает мою ситуацию . Этот вопрос SO также касается той же проблемы. Это не подходит для проекта с открытым исходным кодом, потому что я не могу доверять тому, что у конечных пользователей установлены соответствующие языковые стандарты в их системе. Кроме того, очень-очень странно, что вам нужно устанавливать локали только для того, чтобы использовать строки, которые вы перевели (IMO).
Zend_Translate иногда также рекомендуется в пользу gettext, но я не использую Zend framework, поэтому не думаю, что это вариант для меня. Некоторые люди говорят, что вы можете отделить его от фреймворка Zend, но я понятия не имел, как это сделать. Если кто-нибудь может сказать мне, какие файлы мне нужно выбрать (я загрузил архив с фреймворком Zend), я был бы открыт для использования Zend_Translate.
Массивы. Я сейчас этим и занимаюсь, но это не идеально, потому что:
- It will be using up lots of memory to define every translation, when most won't be used by the current page.
- У меня проблемы с копированием ключей в массиве, который уже превратился в 1000 строк кода, а я еще почти ничего не добавил ...
- Это означает, что непрограммисты действительно не могут переводить, тогда как POedit - это стандарт, который все ожидают использовать.
Могу ли я каким-то образом читать .mo
файлы без Gettext или Zend_Translate, или я должен использовать Gettext? Если да, как я могу заставить работать все языковые стандарты, как в вопросе, на который я ссылался выше?
РЕДАКТИРОВАТЬ: теперь я хочу использовать Zend_Translate. Мне просто нужно решить, какие файлы мне нужны (было бы здорово, если бы их можно было объединить в один файл) - мне не нужен весь Zend Framework в моем проекте.
Обновление: мне было интересно узнать, как большие проекты с открытым исходным кодом обрабатывают i18n:
- Moodle использует массивы.
- Drupal, похоже, использует массивы с резервной базой данных. Они также запускают
setlocale('C')
, чтобы получить общий языковой стандарт и обойти весьsetlocale
беспорядок. - Wordpress использует массу собственных функций для i18n, хотя внизу действительно используется gettext.
Итак, насколько я могу судить, ни один из этих трех случайных проектов не использует ни Zend_Translate, ни напрямую gettext.
Может быть, было бы неплохо использовать C
локаль, сохранить имя языка в текстовом доменном имени и продолжить работу оттуда.
Итак, вот что у меня получилось:
$lang = 'de'; //debug
setlocale( LC_ALL, 'C' );
bindtextdomain( 'default', PATH . "/locale/$lang" );
bind_textdomain_codeset( 'default', 'UTF-8' );
textdomain( 'default' );
var_dump( file_exists( PATH . "/locale/$lang/C/LC_MESSAGES/default.mo" ) ); //bool(true)
Но я все еще получаю только английскую строку, хотя я использовал poedit, msgfmt и т. Д. Для создания соответствующих файлов. Я также пробовал перезапустить Apache.
.mo
файлы и устанавливаете соответствующий языковой стандарт. Это действительно не так страшно, как вы думаете. - person mishmash   schedule 21.03.2013locale -a
, чтобы увидеть, какие языковые стандарты доступны для использования (и запуститьsudo apt-get install language-pack-langcode-base
, чтобы установить дополнительные языковые пакеты). Мои собственные тесты также отражают это. Это не подходит для проекта с открытым исходным кодом, так как я не могу ожидать этого от пользователей. - person   schedule 21.03.2013Zend_Translate
, готово. - person deceze♦   schedule 21.03.2013Zend_Translate
работает, удалите классы / папки и посмотрите, работает ли он по-прежнему ... пока не закончите с достаточно небольшим (для вас) набором классов. - person Carlos Campderrós   schedule 22.03.2013Zend/I18n/Translator/Translator.php
, или Zend Loader, или что-то в этом роде ...? - person   schedule 22.03.2013