Как передать переведенный текст моему объекту в многоязычном приложении? - PullRequest
2 голосов
/ 30 марта 2010

До сих пор я поддерживал таблицу «словарь» в своей базе данных, например:

+-----------+---------------------------------------+-----------------------------------------------+--------+
| phrase    | en                                    | fr                                            | etc... |
+-----------+---------------------------------------+-----------------------------------------------+--------+
| generated | Generated in %1$01.2f seconds at %2$s | Créée en %1$01.2f secondes à %2$s aujourd'hui | ...    |
| submit    | Submit...                             | Envoyer...                                    | ...    |
+-----------+---------------------------------------+-----------------------------------------------+--------+

Затем я выберу все строки в базе данных для столбца, который соответствует интересующему нас языку (или прочту кэш из файла для ускорения поиска в БД), и дам дамп словаря в массив с именем $lng.

Тогда я буду иметь вспомогательные объекты HTML, как это на мой взгляд:

$html->input(array('type' => 'submit', 'value' => $lng['submit'], etc...));
...
$html->div(array('value' => sprintf($lng['generated'], $generated, date('H:i')), etc...));

Переводы могут также отображаться в ответах в формате PDF, XLS и AJAX.

Проблема с моим подходом состоит в том, что теперь у меня есть загрузки global $lng; в каждом классе, где есть функция, которая выплевывает код пользовательского интерфейса.

Как другие люди получают перевод на объект? Это один из сценариев, где глобалы не так уж и плохи? Было бы безумием создавать класс со средствами доступа, когда все словарные термины статичны?

Добавление

Поскольку у меня есть класс HTML, класс PDF, класс JSON и т. Д., Каждый из которых имеет словарь в качестве зависимости, это ситуация, в которой я мог бы использовать внедрение зависимостей в классе Lng, чтобы упростить проверить разные переводы?

1 Ответ

2 голосов
/ 30 марта 2010

В качестве быстрого и простого решения просто сделайте lng функцией:

 $html->input(array('type' => 'submit', 'value' => lng('submit'), etc...));

Еще одна мысль: если вы используете html-помощники, почему бы не сообщить им о i18n, чтобы вы могли просто передать идентификатор строки, например

 $html->input(array('type' => 'submit', 'value' => '@submit', etc...));

и в функции input () заменить '@xxx' на 'lng (xxx)'

Также gettext может быть вариантом.

...