-1

我正在使用 CakePHP 创建一个网站,该网站不仅需要翻译成多种语言,还需要根据登录用户的类型翻译每种语言的多个短语。这将允许相同的功能,但使用更正式或更友好的语言而不会重复。

作为一个非常简单的例子:

  • 类型 1:“客户”、“购买”、“购物车”
  • 类型 2:“客户”、“购买”、“篮子”
  • 类型 3:“用户”、“订单”、“发票”

这些类型中的每一种都将提供多种语言。

我已经在 CakePHP 中使用了标准本地化(我选择它的原因之一!),并且在 /Locale/[lang]/LC_MESSAGES/ 目录中有适当的 default.po 文件,并且一切正常(谢谢在此站点上指出 ger 需要 deu 才能工作的用户 ;) )。

在深入了解应用程序之前,我想添加短语,以便我可以将语言设置为法语,将短语设置为 type2。如果我在框架之外执行此操作,我将进行矩阵查找以根据语言和短语键找到正确的字符串,但不确定如何在 CakePHP 的本地化中执行此操作。

目前我正在使用标准的 __([string]) 约定,但由于这是在开发周期的早期,因此在必要时进行更改将是微不足道的。

我正在考虑使用 __d([phrase],[string]) 但如果不将我的应用程序创建为插件,则看不到如何设置它,然后我又回到 /Locale/ 的相同问题

我在 SO 或 cakePHP 社区网站上的搜索中找不到任何此类示例,因此将不胜感激任何建议。

在 cakePHP 中是否有标准的方法来做到这一点?如果不是,那么实现这一点的一个好的“最佳实践”方式是什么?

编辑- 按照下面的答案是它是如何实现的:

在 /app/Locale/[lang]/LC_MESSAGES/ 我创建了一个新的 .po 文件,其中包含新的短语,如phrase1.po、phrase2.po 等。

在我设置语言的地方,我还设置了短语文件与 po 文件名称匹配的短语:

Configure::write('Config.language', 'deu');
Configure::write('App.langDomain', 'phrase1');

并且所有字符串都被包裹着:

__d(Configure::read('App.langDomain', 'string') 

它只是工作。

4

1 回答 1

0

Use __d() like this:

__d(Configure::read('App.langDomain'), 'Some string');

In bootstrap.php check the conditions and set App.langDomain based on whatever you need.

__d() has nothing to do with plugins, you can use it everywhere.

And alternative would be to wrap your translations with a custom method, something like

__dd(Configure::read('App.langDomain'), array('foo' => __('String1', 'bar' => __('String2'));

The array is an array of langDomain => stringForThatDomain mappings. Your __dd() method would take the one that is passed in the first argument.

于 2013-05-30T08:06:29.313 回答