CakePhp локализация - PullRequest
       1

CakePhp локализация

2 голосов
/ 23 сентября 2011

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

Я нашел учебник, который делает именно то, что мне нужно: http://nuts -and-bolts-of-cakephp.com/2008/11/28/cakephp-url-based-language-switching-for-i18n-and-l10n-internationalization-and-localization/ (имеющий непосредственно язык после имени хоста).

Итак, я сделал все, что написано на этом сайте:

  1. Я сгенерировал файл банка, с помощью этого файла я создаю три файла po (eng, gerи fre) с помощью PoEdit я перевел два поля тестов.
  2. Я поместил эти файлы в app / locale / eng | fre | ger
  3. Я добавил маршрут Router :: connect('/: language /: controller /: action / *', array (), array ('language' => '[az] {3}'));в правильном файле
  4. Я установил язык по умолчанию: Configure :: write ('Config.language', 'fre');
  5. Я создал три ссылки для изменения языка: link ('Français', array ('language' => 'fre'));?>
  6. Я установил метод _setLanguage в моем appController (и вызвал его в beforeFilter ())
  7. Я создал appHelper, чтобы не указывать каждый раз текущийlanguage

Мои ссылки хорошо сгенерированы, у меня нет исключений / ошибок, мои локальные файлы читабельны, но когда я захожу на шаблон, где я пытаюсь использовать variable (), я просто вижу«testTranslation» как текст, без переведенного текста.

Почему это не работает?Похоже, он не может найти мои файлы, но я не знаю, почему: (

Любая помощь будет очень признательна! *

Редактировать: я провел некоторую отладку с помощью cakePhp, и похоже, чтокогда вызывается метод translate файла i18n.php, я получаю переменную $ domain = default_ger. Все мои переводы находятся в файлах default.po, и я предполагаю, что он ищет в default_ger.po «почему это», как я могузаставить его читать в файле default.po?

Редактировать: Я нашел кое-что: у меня была проблема с моим контроллером, я забыл объявить parent :: beforeFilter () в моем дочернем контроллере, затем методв контроллере не вызывался и язык всегда был немецкий. После того, как я это исправил, французский и английский работают нормально, но немецкий по-прежнему отображает только ключ, а не значения, которые есть в файле перевода.Это действительно странно, я удалил все файлы в кеше, удалил папку / app / locale / ger и скопировал мой / app / locale / fre в / app / locale / ger (без изменения каких-либовещь в файлах), и это все еще не работает.Что может быть другим?

Ответы [ 3 ]

1 голос
/ 26 сентября 2011

Я наконец нашел проблему:

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

Все другие языки, кроме немецкого, правильно отображали мои значения.

Итак, я искал об этой проблеме и пытался использовать «deu» вместо «ger», и это сработало!

Папка локали должна быть "deu", значение языка может быть deu или ger.

Это очень странно, потому что для французов у ​​меня есть "fre" (FREnch), а не "fra" (FRAnçais), и это работает.

В любом случае, эта работа с этим изменением

1 голос
/ 23 сентября 2011

Попробуйте этот макет файла:

***\app\locale>tree /F
├───eng
│   └───LC_MESSAGES
│           default.po
│
└───spa
    └───LC_MESSAGES
            default.po
0 голосов
/ 29 мая 2018

**

  • CakePHP 3.x Локализация

**

use App\Middleware\TranslationMiddleware;

 $routes->registerMiddleware('translation', new TranslationMiddleware());
 $routes->applyMiddleware('translation');

// Изменить языковой маршрут

  $routes->connect('/swtich-language/:lang', ['controller' => 'Translations', 'action' => 'switchLanguage', ['pass' => ['lang'], '_name' => 'switch-language']);

Изменение языка среды выполнения для действия

use Cake\I18n\I18n;
use Cake\Cache\Cache;

 /**
     * Change language run time
     * @param type $lang local
     */
    public function switchLanguage($lang = null)
    {
        if (array_key_exists($lang, Configure::read('Translations'))) {
            Cache::write('Config.language', $lang);
            $this->redirect($this->referer());
        } else {
            Cache::write('Config.language', I18n::getLocale());
            $this->redirect($this->referer());
        }
    }


namespace App\Middleware;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Cake\I18n\I18n;
use Cake\Cache\Cache;
class TranslationMiddleware
{

      public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
    {
        if (Cache::read('Config.language')) {
            I18n::setLocale(Cache::read('Config.language'));
        } else {
            I18n::setLocale(I18n::getLocale());
        }
        return $next($request, $response);
    }
}

Создание файла .po

/ src / locale / fr / default.po

msgid "Dashboard"
msgstr "Tableau de bord"

msgid "Companies"
msgstr "Entreprises"

msgid "Log Out"
msgstr "Connectez - Out"

Использование msgid-ключа

Пример.

<?= __(‘Log Out);?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...