Как добавить контекст к слову в CakePhp i18n? - PullRequest
2 голосов
/ 22 января 2012

Я использую интернационализацию Cakephp и хочу дать контекст слову.Сообщения пишутся на английском языке как язык по умолчанию в приложении.Некоторые (жирные) сообщения поступают из базы данных.Например:

Оригинал: оценка первая оценка первая часть первая уровень ...

Перевод:Hodnotenie prvého ročníka, prvej časti, prvého stupňa ...

В некоторых языках слово имеет разную форму использования с разными словами.Например, может быть 10 разных форм одного слова.Как я могу сказать приложению cakephp показывать правильную форму слова «first», которое приходит из базы данных?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2017

Через некоторое время после вопроса была добавлена ​​функция __x().Он предназначен именно для добавления контекста в литералы i18n.

Общая помощь: https://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html#using-translation-functions

Руководство по миграции: https://book.cakephp.org/2.0/en/appendices/2-6-migration-guide.html#basics-php

Информация API для CakePHP 3: https://api.cakephp.org/3.4/function-__x.html

Информация об API для CakePHP 2: https://api.cakephp.org/2.9/function-__x.html

0 голосов
/ 22 января 2012

CakePHP (по крайней мере, 1,3 делает) предлагает функцию __d (). Используется как:

__d($domain, $message, $return)

Где вы можете использовать «домен», чтобы указать грамматическое значение слова, которое вы хотите перевести. Когда вы закончите писать код, вы запустите консольную задачу CakePHP i18n. Это создаст несколько файлов .pot в APP / locale / с именем .pot. Имя файла будет $ domain, поэтому вы получите файл .pot для каждого из грамматических значений (на самом деле, я не знаю подходящего слова для этого), которое вы определили.

Консольная задача CakePHP i18n ищет файлы вашего приложения для функции перевода и затем помещает строки для перевода в файл, по крайней мере, я думаю, что так оно и работает. Если контент, который вы хотите перевести, является динамическим (что в вашем случае), консольная задача не сможет найти ваши строки, а это значит, что вам придется создавать файлы .pot самостоятельно. Если all ваш контент, требующий перевода, является динамическим, вы можете создать один файл, который содержит функцию перевода один раз для каждого грамматического значения, а затем запустить консольную задачу, чтобы у вас были как минимум соответствующие файлы.

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

#: /app_controller.php:129
msgid "Home"
msgstr ""

Строка с хэштегом перед ней просто для справки (чтобы увидеть, где произошла строка), вам не нужно будет добавлять ее, если вы собираете файл самостоятельно. msgid - это слово / предложение, которое вы хотите перевести, а msgstr - предоставленный перевод. Сборка файлов самостоятельно состоит из простого копирования этих трех строк снова и снова, изменения msgid и ввода чего-либо в качестве перевода. Я думаю, что самый простой способ создания этих файлов - это сначала создать один файл, а затем скопировать его содержимое (поскольку значение msgid будет одинаковым для всех этих файлов), а затем ввести соответствующие переводы.

После того, как вы закончите, переместите ваши файлы .pot в APP / locale // LC_MESSAGES / и измените их расширение на .po.

Этот метод, очевидно, работает только в том случае, если вы хотите перевести только фиксированное количество слов, потому что функции перевода зависят от того, как вы жестко закодировали переводы в файлах .po до того, как они понадобятся. Так что, если вы переводите пользовательский ввод, это, вероятно, не будет идеальным решением.

Источники:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...