CakePHP Локализация статических данных - PullRequest
0 голосов
/ 05 сентября 2018

CakePHP Версия: 3.6.6

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

============================================ =============================== РАЗДЕЛ 1

// ЧТО Я НРАВИТСЯ, ЧТОБЫ ДОСТИГАТЬ

В конечном счете, я бы хотел, чтобы мое приложение автоматически определяло язык пользователя и соответственно изменяло следующее:

  1. Текст.
  2. Формат даты.
  3. Числовой формат.
  4. Валюта.

В попытке реализовать это я начал с упрощения, не пытаясь автоматически определять язык пользователя, а вручную изменяя локаль в config / app.php.

============================================ =============================== РАЗДЕЛ 2

// ИНФОРМАЦИЯ, КОТОРУЮ Я БЫЛ УКАЗАН

  1. Интернационализация и локализация - Здесь

  2. Оболочка I18N - Здесь

============================================ =============================== РАЗДЕЛ 3

// ЧТО Я ПЕРЕД НАЧАЛОМ

config / app.php
'defaultLocale' => env ('APP_DEFAULT_LOCALE', 'en_GB'),

config / bootstrap.php
ini_set ('intl.default_locale', Configure :: read ('App.defaultLocale'));

// Приветственный контроллер

?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Event\Event;

// For translation
use Cake\I18n\I18n;
use Cake\I18n\Time;
use Cake\I18n\Number;

class WelcomeController extends AppController
{   
    public function index()
    {
        // Get the default locale
        $defaultLocale = I18n::getDefaultLocale();
        echo $defaultLocale . '<br />';

        // Date
        $date = new Time('2017-12-05 23:00:00'); 
        echo $date . '<br />';

        // Number
        echo Number::format(123.50) . '<br />';

        // Currency
        echo Number::currency(1250.00) . '<br /><br />';        
    }     
}

// index.ctp

<?= __('Welcome') ?>
<br />
<?= __('What would you like to do today!') ?>

// Это то, что отображает браузер

en_GB
05/12/2017, 23:00
123.5
£1,250.00
Welcome
What would you like to do today!

============================================ =============================== РАЗДЕЛ 4

// ЧТО Я СДЕЛАЛ

1. Создана папка в src с именем Locale
2. Создал в Locale папку с именем de_DE

3. Переместился в корзину с кли.
4. Набрал торт i18n экстракт и нажал ввод.
5. После нажатия на кнопку введите следующее:

Текущие пути: нет
Какой путь вы хотели бы извлечь?
[Q] Uit [D] один
[C: xampp \ htdocs \ app_name \ src]>

Затем я добавляю следующее после> и нажимаю ввод
C: XAMPP \ HTDOCS \ app_name \ SRC \ Template \ Добро пожаловать

6. После нажатия клавиши введите следующее:

Текущие пути: C: xampp \ htdocs \ app_name \ src \ Template \ Welcome
Какой путь вы хотели бы извлечь?
[Q] Uit [D] один
[D]>

7. Затем я нажимаю Enter, и клиент отображает следующее:

Хотите извлечь сообщения из ядра CakePHP? (да / нет)
[n]>

8. Затем я нажимаю Enter, и клиент отображает следующее:

Какой путь вы хотите вывести?
[Q] UIT
[C: xampp \ htdocs \ app_name \ src \ Template \ Welcome \ Locale]>

Затем я добавляю следующее после> и нажимаю ввод
C: xampp \ htdocs \ app_name \ src \ Locale

9. Затем я нажимаю Enter, и клиент отображает следующее:

Хотите ли вы объединить все строки домена в файл default.pot? (да / нет)
[n]>

10. Затем я нажимаю кнопку ввода, и клиент отображает следующее:

Извлечение ...
Пути: C: xampp \ htdocs \ app_name \ src \ Template \ Welcome
Выходной каталог: C: xampp \ htdocs \ app_name \ src \ Locale \
================================================== ==================> 100%
Готово.

11. После этого у меня есть файл default.pot в папке src / Locale. Я копирую и вставляю этот файл в папку de_DE.

Содержимое этой папки указано ниже:

# LANGUAGE translation of CakePHP Application
# Copyright YEAR NAME <EMAIL@ADDRESS>
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"POT-Creation-Date: 2018-09-05 09:20+0000\n"
"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
"Last-Translator: NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"

#: Template/Welcome/index.ctp:52
msgid "Welcome"
msgstr ""

#: Template/Welcome/index.ctp:58
msgid "What would you like to do today!"
msgstr ""

Затем я добавляю следующее в 2 msgstr, чтобы они выглядели так:

#: Template/Welcome/index.ctp:52
msgid "Welcome"
msgstr "abc"

#: Template/Welcome/index.ctp:58
msgid "What would you like to do today!"
msgstr "xyz"

Затем я изменяю язык по умолчанию в config / app.php на:
'defaultLocale' => env ('APP_DEFAULT_LOCALE', 'de_DE'),

Затем я обновляю браузер, и отображается следующее:

de_DE
05.12.15, 23:00
123,5
1.250,00 €
Welcome
What would you like to do today!

============================================ =============================== РАЗДЕЛ 5

// РЕЗУЛЬТАТ

Язык, дата, номер и валюта изменились, но НЕ текст. Он по-прежнему отображает:

Welcome
What would you like to do today!

И я ожидал, что это покажет:

abc
xyz

============================================ =============================== РАЗДЕЛ 6

// ЧТО Я ПОПЫТАЛ, ЧТОБЫ ИСПРАВИТЬ ЕГО

Я добавил ниже в промежуточное ПО - Application.php:

// Add middleware and set the valid locales
$middlewareQueue->add(new LocaleSelectorMiddleware(['en_GB', 'de_DE']));

А вот что отобразил браузер:

de_DE
05/12/2015, 23:00
123.5
£1,250.00
Welcome
What would you like to do today!  

Язык по-прежнему de_DE, но дата, число и валюта вернулись обратно на английский?

============================================ =============================== РАЗДЕЛ 7

// РЕЗЮМЕ

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

Если есть что-то еще, что я не написал, но вам нужно, пожалуйста, не стесняйтесь, дайте мне знать.

Большое спасибо заранее за любую помощь. Z.

============================================ ===============================

@ ndm - Спасибо за ответ, уже многому научился, но сигары до сих пор нет.

Я скачал Poedit и открыл его. Затем я нажал «Редактировать перевод» и открыл файл default.pot из папки Locale.

Все выглядит хорошо, и отображается ниже:
Добро пожаловать
Что бы вы хотели сделать сегодня!

Затем я нажимаю «Создать новый перевод» и выбираю немецкий из выпадающего списка, окно делится на 2 половины:

Слева - исходный текст - английский.
Справа - перевод - немецкий.

Я выделяю «Добро пожаловать» и выбираю немецкий эквивалент «Willkommen», который затем заполняется в правом окне. Я делаю то же самое для «Что бы вы хотели сделать сегодня».

В этот момент правое окно заполняется немецкими эквивалентами, поэтому я иду в «Сохранить как» и сохраняю файл в моей папке de_DE в папке src / Locale.

Моя папка de_DE теперь заполнена двумя файлами, как описано ниже:

  1. de.mo
  2. de.po

Я открываю файл de.po, содержимое которого подробно описано ниже:

# LANGUAGE translation of CakePHP Application
# Copyright YEAR NAME <EMAIL@ADDRESS>
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"POT-Creation-Date: 2018-09-05 09:41+0000\n"
"PO-Revision-Date: 2018-09-05 14:26+0100\n"
"Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.1.1\n"
"Last-Translator: \n"
"Language: de\n"

#: Template/Welcome/index.ctp:52
msgid "Welcome"
msgstr "Willkommen"

#: Template/Welcome/index.ctp:58
msgid "What would you like to do today!"
msgstr "Was würden Sie heute gerne machen!"

Затем я очищаю кеш (tmp / cache / persistent) и обновляю браузер.

Для подтверждения у меня есть ниже в config / app.php
'defaultLocale' => env ('APP_DEFAULT_LOCALE', 'de_DE'),

И я прокомментировал ссылку на промежуточное ПО.

К сожалению, текст до сих пор не переведен?

Это казалось довольно простым процессом, поэтому я удивлен, что он не сработал. Я надеюсь, что вы можете увидеть что-то, что я сделал неправильно в процессе, который я использовал, как описано выше.

Еще раз спасибо, Z.

// ЧТО Я ПОПЫТАЛСЯ, КАК ИСПРАВИТЬ

1. Я попытался изменить определение языка в config / app.php с:

'defaultLocale' => env ('APP_DEFAULT_LOCALE', 'de_DE'),

до

'defaultLocale' => env ('APP_DEFAULT_LOCALE', 'de'),

затем очистил кеш и обновил, но не повезло.

2. Я отменил вышесказанное и попытался изменить определение языка в файле de.po с:

"Язык: от \ n" до de_DE \ n

затем очистил кеш и обновил, но все равно не повезло.

1 Ответ

0 голосов
/ 05 сентября 2018

.pot файлы являются шаблонами (в формате PO), вы используете их для создания окончательных файлов перевода в формате .po (обычный) или .mo (двоичный) из них (это файлы, которые ищет CakePHP for) или обновить последнее с измененными сообщениями.

Вы можете переименовывать и редактировать файлы вручную или использовать такие инструменты, как Poedit , которые предоставляют графический интерфейс для gettext tools , который может помочь вам в создании / обновлении .po / .mo файлов.

Всякий раз, когда вносите изменения в файлы перевода, не забудьте впоследствии очистить кэш (tmp/cache/persistent)!

...