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_FR
、en_FR
、it_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.2.4 无法使用 HAVING 子句和计算字段对结果进行分页 - Haversine 公式