蛋糕PHP本地化问题


CakePHP Localization issue

我按照蛋糕PHP书配置了我网站的i18n和l10n。假设我有英语、西班牙语、德语。

浏览器通常有一个按优先级排序的语言列表。如果在列表的第一个位置出现在我的网站上配置的语言,则一切正常。但是,例如,如果列表是这样的:法语、德语、西班牙语、英语;本地化失败并显示我在代码中使用的 i18n 标识符。

我希望在这种情况下,页面显示为德语翻译,因为在列表中是我的网站可以提供的第一种语言。这将是完美的解决方案,但至少我希望如果我的页面不知道浏览器列表的第一种语言,我可以配置默认语言(例如英语)。

我能做些什么来实现这一点,应该把代码放在哪里?

提前谢谢你。

好吧,我在app/Config/bootstrap.php中做了下一个:

$browserLangs = explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
$find = 'eng';
foreach($browserLangs as $browserLang) {
    $lang = substr($browserLang,0,2);
    var_dump($lang);
    if ($lang == 'en') {
        $find = 'eng';
        break;
    } else if ($lang == 'es') {
        $find = 'spa';
        break;
    } else if ($lang == 'ca') {
        $find = 'cat';
        break;
    }
}
Configure::write('Config.language', $find);

在接受语言标头中,我们有一个包含浏览器所有语言列表的字符串。然后我将英语定义为默认语言,并尝试在列表中找到其他语言,当我得到一种语言时,会打破bucle。

我把它作为一个答案,因为它有效,但它很脏,因为:

  1. 我不知道这是否是最好的方式和最好的地方,
  2. 这是非常静态的,您必须一个接一个地放置语言,当您添加另一种语言时,您必须更新算法。最好的解决方案是自动检查蛋糕应用程序上定义的区域设置,我不知道如何要求。
  3. 也许这段代码应该定义为插件、组件或类似的东西。

也许有人可以改进这一点或发布另一个更好的解决方案作为新答案。

您必须打开创建的 .po 文件,使用编辑器(例如:http://poedit.net)在那里您可以创建多种语言版本。

不要忘记更改每种语言的复数形式,对于德语来说,这是nplurals=2; plural=(n != 1),这里有一个列表:http://translate.sourceforge.net/wiki/l10n/pluralforms。

之后,您必须将语言文件保存为app/Locale/deu/LC_MESSAGES/...

最后,该文件夹中应该有一个 default.mo 和 default.po 文件。