cakephp 4 中的 I18n::setLocale('en_FR') 是不是正确?

Posted

技术标签:

【中文标题】cakephp 4 中的 I18n::setLocale(\'en_FR\') 是不是正确?【英文标题】:Is it correct I18n::setLocale('en_FR') in cakephp 4?cakephp 4 中的 I18n::setLocale('en_FR') 是否正确? 【发布时间】:2021-12-09 06:22:50 【问题描述】:

我正在使用 Cakephp 4 在我的网站上使用 i18n。

我的路线使用 2 个字符的语言(fr、en、it 等)

// Route For example 
$builder
        ->connect(
            '/lang/controller/action/*', 
            []
        )
        ->setPatterns([
            'lang' => 'fr|en|it'
        ])
        ->setPersist(['lang']);

由于没有定义国家,当我这样做时:

echo __(
    'Bonjour 0, votre solde au 1,date est de 2,number,currency',
    ['Olivier', \Cake\I18n\FrozenTime::now(), 1354.37]
);

货币是¤,而不是

所以我在AppController 中设置了国家/地区 FR 的语言:

if($this->request->getParam('lang'))
            I18n::setLocale($this->request->getParam('lang') . '_FR');

我们的目标是让 不管是什么语言。 因此,它会生成fr_FRen_FRit_FR

这样做是正确的还是丑陋的?

如果有人能启发我...

【问题讨论】:

【参考方案1】:

¤ (U+00A4) 是用于表示未指定货币的字符,这是未在语言旁边提供区域时的预期行为。

您可以使用currency 关键字来独立指定货币,而不是使用特定区域:

// eg en@currency=EUR
$locale = "$this->request->getParam('lang')@currency=EUR";

我不确定翻译行为是否能正常工作,您可能必须手动设置表实例的语言环境,使其不包含任何关键字。

另见

ICU Documentation > Locales and Resources > The Locale Concept > Keywords Cookbook > Database Access & ORM > Behaviors > Tree

【讨论】:

确实,翻译行为对您的解决方案和我的解决方案都不起作用。我不确定您所说的“手动设置表实例的语言环境”是什么意思? @Oliv 我的意思是在对表进行任何涉及翻译行为的操作之前,明确设置表上的当前语言环境,例如$this->Articles->setLocale($localeWithoutKeywords)。不幸的是,这需要对所有使用翻译的相关关联表进行。当没有像这样手动提供语言环境时,行为将通过I18n::getLocale() 读取它,然后它将检索例如en@currency=EUR 而不仅仅是en。虽然我认为让行为过滤掉关键字可能是可以添加到核心的东西。 我刚刚在 github 上创建了一个问题,谢谢。

以上是关于cakephp 4 中的 I18n::setLocale('en_FR') 是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

cakephp 4 中的 I18n::setLocale('en_FR') 是不是正确?

Cakephp 2.8.4 忽略 hasMany

CakePHP 2.2.4 无法使用 HAVING 子句和计算字段对结果进行分页 - Haversine 公式

布局中的 CakePHP 动态菜单内容

CakePHP 3.4.2 测试 POST 的响应总是返回 NULL

Cake php 4 使用数组中的关联保存数据