i18n - 在创建语言文件时使用什么命名约定?

时间:2010-05-12 14:24:34

标签: naming-conventions internationalization

我正在开发一个需要i18​​n支持的CMS。翻译字符串作为数组存储在语言文件(即en.php)中。是否有任何命名约定..

如何改进下面的示例语言文件...

 // General
 'general.title' => 'CMS - USA / English',
 'general.save' => 'Save',
 'general.choose_category' => 'Choose category',
 'general.add' => 'Add',
 'general.continue' => 'Continue',
 'general.finish' => 'Finish',

 // Navigation
 'nav.categories' => 'Categories',
 'nav.products' => 'Products',
 'nav.collections' => 'Collections',
 'nav.styles' => 'Styles',
 'nav.experts' => 'Experts',
 'nav.shareyourstory' => 'Share Your Story',

 // Products
 'cms.products' => 'Products',
 'cms.add_product' => 'Add Product',

 // Categories
 'cms.categories' => 'Categories',
 'cms.add_category' => 'Add Category',

 // Collections
 'cms.collections'=> 'Collections',
 'cms.add_collections' => 'Add Collection',

 // Stylists
 'cms.styles' => 'Stylists',
 'cms.add_style' => 'Add Style',
 'cms.add_a_style' => 'Add a style',

 // Share your story
 'cms.share_your_story' => 'Share Your Story',

 // Styles
 'cms.add_style' => 'Add Style',

4 个答案:

答案 0 :(得分:3)

使用英语单词作为键可以很好地工作,但是您可能会在以后遇到问题。随着应用程序的增长,您可能希望开始命名空间键,以便更容易找到,例如通过控制器和操作/目的/上下文。

示例:如果您有一个带有关键“类别”的翻译,那么就会阻止命名空间,例如“categories.flashes.failure”,它们对开发人员来说是表达的,而不会与文本过于紧密相关。

这是我如何处理上面的例子,假设没有WordsController; - )

t(:'words.categories', :default => 'Categories')

这也使得编写与翻译无关的测试更容易。

答案 1 :(得分:2)

关于文件命名约定,您可能希望使用ISO 639-2 Alpha 3代码: http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes

答案 2 :(得分:1)

我见过的一个有趣的选择是使用英文字符串本身作为键:

// General
'CMS - USA / English' => 'CMS - USA / English',
'Save' => 'Save',
'Choose category' => 'Choose category',
...

需要注意的一些要点:

  1. 这使得应用程序代码更具可读性,并且对开发人员更加透明。开发人员可能不会注意到cms.styles在应用中错误地显示为Stylists。但是'Styles' => 'Stylists'像拇指一样突出,特别是对于一行审核剧本。
  2. 它更脆弱,因为对英文文本的更改会影响所有其他语言文件。然而,它应该非常吵闹,因此很容易发现。
  3. 它更强大,因为如果测试没有发现遗漏,生产系统可以简单地回归到英文文本。
  4. 您不必重复Category之类的字词,因为它们出现在不同的地方。

答案 3 :(得分:0)

您也可以改用gettext