【问题标题】:Clean way to avoid I18n::InvalidLocale?避免 I18n::InvalidLocale 的干净方法?
【发布时间】:2015-12-23 01:11:20
【问题描述】:

我得到了一个我想避免的I18n::InvalidLocale: "zh-CN" is not a valid locale 异常。

要解决它,我听说过两种 hack:

# meh
config.i18n.enforce_available_locales = false

# Ever heard of convention over configuration?
config.i18n.available_locales = [:fr, :en, "zh-CN", "zh-TW"]

我觉得它们都不干净,因为在不触及这些配置变量的情况下,我已经有一堆自动预填充的可用语言环境:

我当前的可用语言环境是:

> I18n.available_locales
=> [:en, :fr]   (misses zh-CN and zh-TW)

在我的config/locales 文件夹中,我有:

en.yml
fr.yml
zh-CH.yml (newly added, and unavailable)
zh-TW.yml (newly added, and unavailable)

在我的config/application.rb 中,我有:

config.i18n.default_locale = :fr

我不明白fr 是如何自动输入I18n.available_locales,而zh-CNzh-TW 没有。

然而,让fr 输入它没有我设置config.i18n.available_locales 告诉我触摸这个配置变量不是干净的方法

您是否有提示在正确级别避免I18n::InvalidLocale异常?

【问题讨论】:

  • 谢谢 huan,但这并没有成功。
  • 何塞,config.i18n.fallbacks = true 是做什么的?
  • 对不起,我误解了你的问题。尝试将您的配置 config.i18n.default_localeconfig.i18n.available_locales 放入环境文件中
  • 何塞,你第一次误解是因为你没有阅读。设置available_locales 对我来说似乎是一种黑客行为。此外(我必须工作,所以我当然尝试过,即使它看起来像一个肮脏的黑客),我仍然会丢失翻译。
  • José,“memoizing”的意思是“只要程序运行就在内存中记住”。它只是“内存缓存”的一个花哨的名称。它无法在重新启动服务器后继续存在,并且与我们的主题无关。最后,我知道设置 available_locales 有效。我觉得这不是正确的解决方案,因此提出了这个问题。不过,感谢您的帮助。

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


【解决方案1】:

i18n 库对语言环境键采取务实的方法,仅包括语言环境(“语言”)部分,如 :en、:pl,而不包括区域部分,如 :en-US 或 :en-GB,如果你想要这种类型的定义检查很少有像 Globalize3 这样的宝石它可以帮助你。

也检查这个descussion 也通过this

同时删除config.i18n.default_locale = :fr 因为使用默认本地人,它会通过您提到的相同错误,所以在删除默认值后 使用这个config.i18n.available_locales = [:fr, :en, "zh-CN", "zh-TW"]

【讨论】:

  • 这不是真正的问题,但谢谢。当我最终会遇到中文翻译问题时,我会记得检查您的链接。 当前的问题是:如何在不设置 available_locales 全局的情况下为 I18n 提供可用的语言环境?
  • 如果它正在工作那么你能接受这个答案吗:)
  • 设置 available_locales 全局足以使其工作。问题是寻求一种避免它的方法。所以我并没有真正学到任何东西。你提到的 en-US / en-GB 问题对我没有影响,只要我能看到,所以它也是题外话。我不能接受你的回答,我只能投票作为对你参与的奖励。
  • 每次有人从不在我的available_locales 列表中的新语言环境访问该站点时,我仍然会遇到此异常。如何避免异常? begin / rescue?
【解决方案2】:

不要将语言环境设置为无效值。

class ApplicationController < ActionController::Base
  before_action :set_locale

  def set_locale
    [params[:locale], cookies[:locale], extract_locale, I18n.default_locale].each do |l|
      if l && I18n.available_locales.index(l.to_sym)
        I18n.locale = l
        break
      end
    end
    cookies[:locale] = params[:locale] if params[:locale]
  end

  def extract_locale
    request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first if request.env['HTTP_ACCEPT_LANGUAGE']
  end

在设置之前测试以确保区域设置存在。

【讨论】:

    猜你喜欢
    • 2018-02-05
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2014-10-17
    • 2015-10-03
    相关资源
    最近更新 更多