Предполагается, что i18n уже включен, и плагин mgI18n вам по каким-то причинам не подошел (в моем случае он просто не завелся - ни с первого, ни с третьего раза).
Поиск документации дал только этот старенький документ и это несколько мутное описание решение проблемы.
Итак, начнем.
Для хранения фраз нам потребуется две таблицы (их структура дана в первом найденном документе, а также в файле symfony/lib/i18n/sfMessageSource_MySQL.class.php. Поскольку мы работаем с Doctrine, нарисуем схему для этих таблиц:
Catalogue: columns: cat_id: { type: integer, notnull: true, autoincrement: true, primary: true } name: { type: string(100), notnull: true, default: '' } source_lang: { type: string(100), notnull: true, default: '' } target_lang: { type: string(100), notnull: true, default: '' } date_created: { type: integer, notnull: true, default: 0 } date_modified: { type: integer, notnull: true, default: 0 } author: { type: string(255), notnull: true, default: '' } trans_unit: columns: msg_id: { type: integer, notnull: true, autoincrement: true, primary: true } cat_id: { type: integer, notnull: true} source: { type: clob(65532), notnull: true } target: { type: clob(65532), notnull: true } comments: { type: clob(65532) } date_added: { type: integer, notnull: true } date_modified: { type: integer, notnull: true } author: { type: string(255), notnull: true, default: ''} translated: { type: boolean, notnull: true, default: false } relations: Catalogue: local: cat_id foreign: cat_id foreignAlias: Units
И немножечко фикстур
catalogue: ru: name: messages.ru_RU source_lang: en_US target_lang: ru_RU author: '' en: name: messages.en_US source_lang: en_US target_lang: en_US author: '' jp: name: messages.jp source_lang: en_US target_lang: jp author: '' trans_unit: u1: Catalogue: ru source: hello target: Привет translated: true
Здесь следует обратить внимание на следующие важные моменты:
- поле name должно содержать значение вида "каталог.вариант", где каталог - это название каталога фраз (messages по умолчанию), а вариант - это вариант написания локали (ru_RU,RU,ru). В ходе поиска перевода перебираются все варианты локалей, поэтому лучше писать сразу ru_RU - он идет первым.
- можно переводить с английского на английский. Зачем это надо? Чтобы в шаблонах вставлять "токены" фраз, а полнотекстовые переводы делать уже в админке (актуально для длинных фраз, например, для шаблонов писем).
Затем небольшие настройки в factories.yml:
all: #... i18n: class: sfI18N param: source: MySQL database: mysql://user:pass@localhost/your_db debug: true untranslated_prefix: "[T]" untranslated_suffix: "[/T]" cache: class: sfNoCache
В общем-то, готово. Потестируем? Напишем где-нибудь в шаблоне
echo __('hello')
Следующий абзац предназначен для тех, у кого выскочили ромбики или всякие кракозябры вместо русского перевода. Если это случилось, значит mysql-сервер выдает по умолчанию результат в кодировке, отличной от UTF8. Что ж, придется допиливать класс, который коннектится к БД и выбирает переводы фраз. Создаем новый файл sfMessageSource_MySQL_utf8.class.php с содержимым
class sfMessageSource_MySQL_utf8 extends sfMessageSource_MySQL { protected function connect() { $conn=parent::connect(); mysql_query('SET NAMES \'UTF8\'',$conn); return $conn; } }Теперь нам следует поменять source в factories.yml на MySQL_utf8. Готово.
Осталось сгенерировать админку для каталогов и фраз. Это уж сами :)
И да, не пытайтесь увидеть на веб-панели mysql-запросы, которые делает подсистема i18n: она делает их не через доктрину.
Еще одна полезная ссылка, на которую натолкнулся, пока искал решение - презентация на тему i18n в симфонии (PDF)
и так грабли с которыми вы встретитесь так как тут куча ошибок в этой статье да и не полная она, но все же спасибо за что есть.
ОтветитьУдалить1.
date_added: { type: integer, notnull: true, default: 0 }
date_modified: { type: integer, notnull: true, default: 0 }
2. (пропущено важное поле)
trans_unit:
columns:
id: { type: string(255), notnull: true, default: '' }
3.
что бы проверить hello
надо сменить культуру, ставим дефолтное
заходим в frontend/config/setings.yml
i18n: true
standard_helpers: [Partial, Cache, I18N]
default_culture: ru_RU
чистим кэш, а также кэш браузера!!
Думаю я вам сэкономил немного времени и нервов
added by Skynet