【问题标题】: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

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

如果有人能启发我...

【问题讨论】:

    标签: php internationalization cakephp-4.x


    【解决方案1】:

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

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

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

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

    另见

    【讨论】:

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