使用I18n本地化的Rails语言名称

4

我希望能够将区域代码与特定语言名称匹配。I18n/Rails中是否有任何内置函数可返回相应区域代码的语言名称?是否只有安装gem才是唯一的方法?


2
你是在寻找一个将"en"映射到"英语""fr"映射到"法语"等的方法吗? - Tom Lord
1
5秒钟在谷歌上搜到了这个:https://github.com/grosser/i18n_data -- 这能解决您的问题吗? - Tom Lord
@TomLord 是的,那正是我需要的映射。这是一个额外的gem来解决这个问题。我想知道是否有其他替代方案而不需要额外使用gem。 - Charles
"I18n" 只提供框架,内容必须由框架的使用者提供。例如,Rails 添加了 active_model/locale/en.ymlactive_support/locale/en.yml。这两个文件都不包含语言名称。 - Stefan
3个回答

10

I18n 中似乎没有这方面的方法。 如果你只需要当前语言名称,你可以轻松地将其包含在相应的区域设置文件中:

# config/locales/en.yml
en:
  language_name: "English"

像往常一样获取它:I18n.t('language_name')I18n.t('language_name', locale: :en)

对于一般用途,您可以使用:https://github.com/hexorx/countries或初始化自己的映射作为Ruby哈希:{ en: 'English', ... }


1
@Stefan,如果是这样的话,你需要有一个包含language_name: "German"键的de.yml文件,以及所有你感兴趣的语言的本地化yamls。这就是为什么(对我个人而言)它不是一个理想的解决方案(除非你已经拥有了所有的本地化yamls)。 - l.varga
1
de.yml 应该有德语内容,即 language_name: "Deutsch",对吗? - Stefan
@Stefan,是的,如果在视图中作为文本使用,则应该有翻译后的字符串(德语)。如果它用于其他目的(这有点违反了区域设置yamls的主要用途),那就无所谓了。这是解决手头问题的hacky解决方案。这是一个有趣的解决方案,但不是我个人会使用的东西(即使它肯定有效)。 - l.varga
也许本地化文件不应该只包含自己的语言名称,而是所有语言名称,即一个名为languages.en.yml的文件包含en: { languages: { en: 'English', de: 'German' } },另一个名为languages.de.yml的文件包含de: { languages: { en: 'Englisch', de: 'Deutsch' } }等等。 - Stefan

2
不需要安装额外的 gem,你可以自己创建键/值对(存储在 json 文件或存储到数据库中),然后查找键,例如“de”,并读取值(在这种情况下为“German”)。这需要一些手动操作(或设置一个 Rake 任务或其他东西来从某个信息源以适当的格式构建它),但在这种情况下,你不依赖于额外的 gem(而且,如果没有彻底查看代码,可能会对应用程序性能/内存产生比你特定需求的自定义实现更大的影响)。
我不知道任何 Rails 内置函数会返回整个语言名称。你可以返回语言缩写(例如用于 HTML lang 属性),但就内置函数而言,我认为只有这些。

1
@Charles,我同意在数据库中存储并不一定是最好的解决方案,这取决于您是否已经有一个表,在其中包含另一列有意义(例如,您已经有一个包含有关每个国家信息的表,并且只需添加locale)。我的观点是,你必须将它存储在某个地方。如果您已经有每种语言的yaml文件,则将其存储在locale yaml本身中是有效且整洁的解决方案,否则我个人更喜欢将其存储在json文件中(因此您可以将所有内容放在一个地方,仅需要生成一个附加文件而不是几十个文件) :) - l.varga
@I.varga 我同意你的看法。 - Charles

0
请查看Google GroupsGist)中的以下帖子。我希望Rails没有默认支持所需的转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接