2013-04-12 2 views
1

Я разрабатываю приложение Zend Framework 2, имеющее проблему с переводами. На самом деле в сценариях вида a можно использовать помощник вида Translate. Поскольку я определил «переводить» как ключевое слово source в Poedit ([Poedit menu] -> Catalogue -> Properties... -> Source keywords), строки идентифицируются инструментом и добавляются в список трансакций.Что такое рекомендуемый способ/передовая практика для перевода строк в Poedit без ключевого слова источника?

Но есть и некоторые строки в других местах, где я не могу использовать помощник/view view, например. в классах классов или в навигации. Как это должно управляться?

Некоторые идеи:

  1. Создайте файл со списком таких строк. Пример: мы создаем файлы navigation.i18n, forms.i18n и т. Д. (Или только один файл), определим там все строки, которые нам нужны, в общем синтаксисе Poedit, который мы добавили в список Source keywords (например, с translate: translate('my label foo'), translate('my label bar') и т. Д.) И, наконец, добавить i18n в качестве путь источника ([Poedit menu] -> Catalogue -> Properties... -> Source paths). Мы также можем использовать расширение, которое уже определено как «Исходные пути».

  2. Класс, который обеспечивает один (статический) метод translate(...) без каких-либо функциональных возможностей. Пример: Вместо 'label' => 'foo' мы используем 'label' => \MyNamespace\Util\Translator::translate('foo')

Я думаю, второй appoach чист, и мне нравится больше. Мне не нужно писать мою ключевую строку дважды и держать в голове, что уже переведено/обновлено. Но, может быть, есть идеи?

+1

U может получить доступ к переводчику во всем мире;) Просто введите переводчик или ServiceManager/ServiceLocator;) – Sam

+0

@Sam О, это было бы здорово! Как я могу получить к нему доступ в классе модели/таблицы? Например. wenn используется выражение 'Expression':' $ select-> columns (array ('title' => new Expression ('IFNULL (sports.title, ".' unassigned ')));' – automatix

+0

Я могу перевести строку в например,: $ this-> translate ($ sport-> title) '. Но это будет возможно только в том случае, если ключевая строка уже добавлена ​​в файл' .po'. Это означает, что мне нужен доступ в Service Locator из моего класса таблицы. Ну, я могу передать его как аргумент конструктора, когда я создаю его объект в классе 'Module', и его использование выполняется непосредственно в классе Table. Но тогда мне нужно каждый раз принимать забота об этом. – automatix

ответ

0

Я все еще не понимаю, где ваша проблема: S Из всего, что я могу сказать, вы пытаетесь перевести вывод модели/объекта. Это типичная проблема View!

Если основной проблемой является «? Как получить все эти модели-выход в PoEdit», то все, что я могу вам сказать: либо вручную, либо реализовать DB-Translation ...

Впрыскивание ServiceManager в в основном все, следуя синтаксису getServiceConfig()

return array('factories' => array(
    'my-service' => function ($sm) { 
     $class = new ServiceClass(); 
     $class->setServiceManager($sm); 
     return $class; 
    } 
)); 

В приведенном выше примере $class может быть в значительной степени все. Модель/Сущность, TableGateway или все, что вы хотите.

+0

Где проблема: Прежде всего, я должен использовать «translate()» (или другое зарегистрированное ключевое слово Poedit ') где-то в коде, чтобы автоматически передавать строки в Poedit. Где я могу это сделать? Значение метки определяется в классе 'Form'. Это значит, что я не могу использовать помощник представления перевода (= ключевое слово Poedit) в представлении. Но я также не могу использовать его в th e Класс формы. (ОК, может быть, я мог бы теоретически каким-то образом, но ... 1. как? 2. Просмотреть хелпер в классе 'Form'? ..) Поэтому я не могу понять, как передать свои метки Poedit и правильно их перевести. – automatix

+0

Ну, я полагаю, вы всегда можете добавить '' label '=>'% s'' в PoEdit, который потребует, чтобы у вас никогда не было дополнительных (CodeFormat) пробелов там? Пара вещей просто лучше делать вручную иногда ^^ – Sam

+0

Шаблон типа '' label '=>'% s'', к сожалению, не работает, так как Poedit нуждается в функции и анализирует его аргумент (-s). Вручную? ОК, может быть. Или со вторым обходным решением, которое я описал в вопросе. – automatix

0

Если вы строите свою форму по-другому, например, так:

$name = new \Zend\Form\Element('name'); 
$name->setLabel('Your name'); 
$name->setAttributes(array(
    'type' => 'text' 
)); 
$this->add($name); 

(http://framework.zend.com/manual/2.0/en/modules/zend.form.quick-start.html)

Тогда вы можете зарегистрировать «setLabel» в качестве ключевого слова в PoEdit, и он подберет этикетку -text для перевода.

1

Просто добавьте ключевое слово _ в Poedit ([Poedit menu] -> Catalogue -> Properties... -> Source keywords). Затем вместо метки используйте функцию _ с этой меткой. Например изменить

 'options' => array(
      'label' => 'Username', 
     ), 

к

 'options' => array(
      'label' => _('Username'), 
     ), 

и в PoEdit Обновление каталога от источников. Вот и все - теперь у вас есть свой лейбл в Poedit.