【问题标题】:CakePhp localizationCakePhp 本地化
【发布时间】:2011-09-23 12:36:04
【问题描述】:

我正在网站上设置本地化,但遇到了一些麻烦。

我找到了一个教程,它完全符合我的需要:http://nuts-and-bolts-of-cakephp.com/2008/11/28/cakephp-url-based-language-switching-for-i18n-and-l10n-internationalization-and-localization/ (在主机名之后直接使用语言)。

所以我已经完成了这个网站上写的所有内容:

  1. 我已经生成了一个 pot 文件,用这个 pot 文件,我用 PoEdit 创建了三个 po 文件(eng、ger 和 fre),我翻译了两个测试字段。
  2. 我已将这些文件放入 app/locale/eng|fre|ger
  3. 我添加了路由Router::connect('/:language/:controller/:action/*', array(),array('language' => '[a-z]{3}'));在正确的文件中
  4. 我设置了默认语言:Configure::write('Config.language', 'fre');
  5. 我创建了三个链接来更改语言:link('Français', array('language'=>'fre')); ?>
  6. 我在 appController 中设置了 _setLanguage 方法(并在 beforeFilter() 中调用它)
  7. 我创建了一个 appHelper,不必每次都指定当前语言

我的链接生成良好,没有任何异常/错误,我的本地文件是可读的,但是当我继续尝试使用 variable() 的模板时,我只看到“testTranslation”作为文本,没有翻译文本。

为什么这不起作用?看起来它找不到我的文件,但我不知道为什么:(

任何帮助将不胜感激!

编辑:我用 cakePhp 进行了一些调试,似乎在调用 i18n.php 文件的方法 translate 时,我收到了 $domain = default_ger var。我的翻译都在 default.po 文件中,我想他正在搜索 default_ger.po?为什么这个?如何强制它读取 default.po 文件?

编辑:我发现了一些问题:我的控制器有问题,我忘记在我的子控制器中声明 parent::beforeFilter(),然后没有调用控制器中的方法并且语言始终是德语一。在我解决这个问题后,法语和英语工作正常,但德语仍然只显示关键而不是我在翻译文件中的值。这真的很奇怪,我已经删除了缓存中的所有文件,删除了我的 /app/locale/ger 文件夹并将我的 /app/locale/fre 复制到 /app/locale/ger(不更改文件中的任何内容),这仍然不起作用。有什么不同?

【问题讨论】:

  • 你把.po文件放到LC_MESSAGES目录(/app/locale/eng/LC_MESSAGES/)了吗?
  • 是的,我有:/app/locale/eng/LC_MESSAGES/default.po、/app/locale/fre/LC_MESSAGES/default.po 和 /app/locale/ger/LC_MESSAGES/default。宝

标签: php cakephp localization


【解决方案1】:

试试这个文件布局:

***\app\locale>tree /F
├───eng
│   └───LC_MESSAGES
│           default.po
│
└───spa
    └───LC_MESSAGES
            default.po

【讨论】:

  • 与 Juhana 的响应相同,我将这些文件放在正确的位置。 :(
  • 奇怪...您的默认设置是法语。为什么ger是另一个?我认为一些缓存没有完全删除。尝试在内核中进行更多调试。
【解决方案2】:

我终于找到问题了:

我的 App 控制器没有被调用,所以总是使用德语(因为它在将语言更改为德语时工作过一次,并通过 cookie 注册它)。

除德语以外的所有其他语言都正确显示了我的值。

于是我搜索了这个问题,并尝试使用“deu”而不是“ger”,并且成功了!

语言环境文件夹必须是“deu”,语言值可以是 deu 或 ger。

这很奇怪,因为对于法国人来说,我有一个“fre”(FREnch)而不是一个“fra”(FRAnçais),这是有效的。

不管怎样,这个改动就可以了

【讨论】:

  • 很高兴找到这个,我也遇到了德语语言环境的问题。是的,将文件夹重命名为“deu”有效。
【解决方案3】:

**

  • 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);?>

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2019-01-30
    相关资源
    最近更新 更多