Каков рекомендуемый способ / лучшая практика Poedit для перевода строк без исходного ключевого слова?

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

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

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

  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')

Думаю, второй подход чище, и мне больше нравится. Мне не нужно дважды писать свой key sring и держать в голове то, что уже переведено/обновлено. Но может есть идеи получше?


person automatix    schedule 12.04.2013    source источник
comment
Вы можете получить доступ к переводчику практически везде;) Просто введите переводчик или сам ServiceManager/ServiceLocator;)   -  person Sam    schedule 12.04.2013
comment
@Sam О, это было бы здорово! Как я могу получить к нему доступ в классе модели/таблицы? Например. когда используется Expression: $select->columns(array('title' => new Expression('IFNULL(sports.title, "' . 'unassigned')));   -  person automatix    schedule 13.04.2013
comment
Я могу перевести строку в скрипте представления, например: $this->translate($sport->title). Но это будет возможно только в том случае, если ключевая строка уже добавлена ​​в файл .po. Это означает, что мне нужен доступ к Service Locator из моего класса таблицы. Ну, я могу передать его как аргумент конструктора, когда я создаю его объект в классе Module, и использовать его непосредственно в классе Table. Но тогда мне нужно каждый раз заботиться о нем.   -  person automatix    schedule 13.04.2013


Ответы (3)


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

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

to

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

и в Poedit обновить Каталог из источников. Вот и все, теперь у вас есть лейбл в Poedit.

person user2047861    schedule 10.08.2014

Я до сих пор не совсем понимаю, в чем заключается ваша проблема: 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 или что угодно.

person Sam    schedule 13.04.2013
comment
В чем заключается проблема: Прежде всего, я должен использовать translate() (или другой зарегистрированный Poedit keyword) где-то в коде, чтобы автоматически передавать строки в Poedit. Верно? Теперь. Где я могу это сделать? Значение метки определяется в классе Form. Это означает, что я не могу использовать для него в представлении помощник представления Translate (= ключевое слово Poedit). Но я также не могу использовать его в классе Form. (Хорошо, может быть, теоретически я мог бы как-то, но... 1. как? 2. просмотреть хелпер в классе Form?..) Вот я и не могу понять, как передать свои метки в Poedit и правильно их перевести. - person automatix; 17.04.2013
comment
Ну, я полагаю, вы всегда можете добавить 'label' => '%s' в PoEdit, для этого вам потребуется только, чтобы у вас никогда не было дополнительных пробелов (CodeFormat)? Некоторые вещи иногда лучше делать вручную ^^ - person Sam; 17.04.2013
comment
К сожалению, такой шаблон, как 'label' => '%s', не работает, поскольку Poedit нуждается в функции и затем анализирует ее аргументы. Вручную? ОК, может быть. Или со вторым обходным путем, который я описал в вопросе. - person automatix; 17.04.2013
comment
Да, второй обходной путь на самом деле становится немного знакомым в некоторых проектах с открытым исходным кодом, где люди дополнительно добавляют файл языковых строк. - person Sam; 18.04.2013
comment
То, о чем вы говорите, - это первый обходной путь. В любом случае, у вас есть пример проекта, в котором используется этот подход? - person automatix; 18.04.2013

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

$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, и он подберет текст метки для перевода.

person towr    schedule 26.07.2013