【问题标题】:Rails language name using I18n locale使用 I18n 语言环境的 Rails 语言名称
【发布时间】:2017-06-12 08:04:32
【问题描述】:

我想将语言环境代码与特定语言名称相匹配。 I18n/rails 中是否有任何内置函数可以将语言名称返回到相应的语言环境。安装 gem 是唯一的方法吗?

【问题讨论】:

  • 您是否要求将"en" 映射到"English""fr""French" 等等的方法?
  • 谷歌上 5 秒,我发现:github.com/grosser/i18n_data -- 这能解决你的问题吗?
  • @TomLord 是的,这就是我需要的映射。这是解决问题的额外宝石。我想知道没有额外的宝石还有其他选择。
  • I18n 只提供框架,内容必须由框架的消费者提供。例如,Rails 添加了active_model/locale/en.ymlactive_support/locale/en.yml。这些都不包含语言名称。

标签: ruby-on-rails ruby rails-i18n


【解决方案1】:

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', ... }

【讨论】:

  • @Stefan,在这种情况下,您必须拥有带有 language_name: "German" 键的 de.yml,然后是您感兴趣的所有语言的所有语言环境 yaml。这就是为什么(对于我个人)这不是一个理想的解决方案(除非你已经拥有所有的语言环境 yamls)
  • 不应该de.yml 有德语内容,即language_name: "Deutsch"
  • @Stefan,是的,如果它在视图中的任何地方作为文本使用,那么它应该具有翻译后的字符串(德语)。如果它被用于其他目的(这有点违背语言环境 yaml 的概念,至少主要是为了),那么没关系。这是手头问题的一个hacky解决方案。这是一个有趣的,但不是我个人会使用的东西(尽管它确实有效)。
  • 也许语言环境文件不应该只包含它们自己的语言名称,而是所有语言名称,即一个文件 languages.en.ymlen: { languages: { en: 'English', de: 'German' } } 和另一个文件 languages.de.ymlde: { languages: { en: 'Englisch', de: 'Deutsch' } } 等等。
【解决方案2】:

无需安装额外的 gem,您可以创建自己的键/值对(将其存储在 json 文件中或将其存储到数据库中)然后查找键,例如“de”并读取值(在这种情况下,“德语”)。它需要一些手动工作(或设置一个 rake 任务或其他东西以从某些信息源以适当的格式为您构建它),但在这种情况下您并不依赖于额外的 gem(无需彻底阅读代码,可能对您的应用程序性能/内存的影响远大于您对所有您所知道的特定需求的自定义实现。

不过,我不知道有任何 Rails 内置函数会返回整个语言名称。您可以返回语言缩写(例如,用于 html lang 属性),但我认为就内置函数而言,它就止于此了)。

【讨论】:

  • @Charles,我同意存储在数据库中不一定是最好的解决方案,这取决于您是否已经有一个表,其中包含另一列是有意义的(例如,您已经有一个包含信息的表关于每个国家,只需添加语言环境)。我的意思是你必须把它存储在某个地方。如果您已经拥有每种语言的 yamls,则将其存储在语言环境 yamls 中是一种有效且简洁的解决方案,否则我个人更愿意将其存储在 json 文件中(因此您将所有内容都放在一个地方,只需要生成一个附加文件即可几十个文件):)
  • @I.varga 我同意你的看法
【解决方案3】:

查看google groups (Gist) 中的以下帖子。我希望rails中没有对所需转换的默认支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多