Neurons to bytes

Zend Translate и сканирование директорий

Здарова, юзеры ZF!

Большинство из вас уже используют Zend_Translate. До сих пор возможность для сканирования каталогов для перевода файлов была доступна только при создании экземпляра Zend_Translate.

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

Для тех, кто ничего не знает про данную функциональность - у меня тут есть краткое описание:

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

Не рекомендуемый метод добавления переводов:

$translate = new Zend_Translate('gettext', '/my/proj/lang/en/proj.mo', 'en');
$translate->addTranslation('/my/proj/lang/de/proj.mo', 'de');
$translate->addTranslation('/my/proj/lang/fr/proj.mo', 'fr');

Как вы видите, мы добавили лишь переводы для трех языков… Если вы работаете с разделенными переводами, когда для каждого языка используется несколько файлов перевода, то вам потребуется добавить гораздо больше файлов.

Поэтому, было бы лучше, если бы вы сделали это при помощи встроенной функциональности Zend_Translate. Смотрите следующий код:

$translate = new Zend_Translate('gettext', '/my/proj/lang/', 'en',
     array('scan' => Zend_Translate::LOCALE_DIRECTORY));

Что происходит при использовании этого кода:

Zend_Translate получает список директорий по указанному пути. При помощи опции scan мы сообщяем ему, что  имена вложенных директорий по указанному пути являются именами языка/локали. Теперь Zend_Translate пробежится по всем вложенным директориям и автоматически добавит все найденные переводы.

Таким образом, файл /my/proj/lang/de/proj.mo будет добавлен в локаль de, так как имя каталога, содержащего файл перевода совпадает с именем немецкой локали. Не имеет значения, какую глубину вложенности имеют файлы каталога /my/proj/lang/de/ - все файлы переводов будут найдены во всех подкаталогах директории. Это работает не только с c адаптером gettext, но и с любым другим, таким как TMX, Array, CSV и т.д. Единственное, что должно совпасть - это имя директории с переводами с именем локали.

Но есть и другой способ, чтобы получить имя локали. Локаль может быть прописана в имени файла, одним из следующих способов:

'/my/proj/lang/myfile_de.mo'
'/my/file/lang/myfile-de.mo'
'/my/file/lang/myfile.de.mo'

Все эти три способа именования файлов будут признаны для локали de.

Для использования этого способа именования вам только нужно установить значение Zend_Locale::LOCALE_FILENAME у опции scan.

Этот пост - вольный перевод поста Томаса Вейднера,
Главного чувака в команде ZF по интернационализации.

Also interesting

Tag after , ,


(required)


(required but won't be displayed)