【问题标题】:i18n-js translations not updating with additional translations in .ymli18n-js 翻译未使用 .yml 中的其他翻译进行更新
【发布时间】:2017-01-04 22:39:14
【问题描述】:

我已经阅读了这几天,但似乎没有任何效果。我已经看过很多关于这个问题的文档,但是没有一个解决方法对我有用。 我有:

  Rails 5.0.1
  * sprockets (3.7.1)
  * sprockets-rails (3.2.0)
  * i18n (0.7.0)
  * i18n-js (3.0.0.rc15)

config/i18n-js.yml

translations:
- file: "app/assets/javascripts/application/i18n/translations.js"
  only: '*.js*'

config/application.rb

    config.middleware.use I18n::JS::Middleware

当我将新翻译添加到相应的 yml 文件时,i18n/translations.js 不会更新以包含新的 .yml 翻译。

例如在 en.yml 中:

en:
 form_error:
    tos_check: "You must agree to Lexody's Terms of Use to continue."
    choose_city: "Please select a city from the menu."
    cancel_reason: "Please provide a reason for cancelling."

$('.prompt').html('<p style="color:#e57373">' + I18n.t('form_error.cancel_reason') +'</p>');

返回:[missing "en.form_error.cancel_reason" translation]

我试过了:

删除 translations.js 并运行 rake i18n:js:export

rake tmp:cache:clear

rake assets:precompile

有没有人可以尝试其他解决方案?谢谢!!

【问题讨论】:

    标签: javascript ruby-on-rails ruby internationalization


    【解决方案1】:

    更新

    查看附加配置文件后,这个config/i18n-js.yml 似乎很可疑:

    translations:
    - file: "app/assets/javascripts/application/i18n/translations.js"
      only: '*.js*'
    

    根据export configuration 文档,only 键是指要导出的翻译键,而不是文件名。所以'*.js*' 将不匹配任何内容,导致no 翻译被导出。

    将此文件更改为:

    translations:
    - file: "app/assets/javascripts/application/i18n/translations.js"
      only: '*'
    

    (原答案如下)

    工作示例

    这是一个最小的工作示例,它使用 i18n-js gem 产生预期的行为:

    #!/bin/bash
    rails _5.0.1_ new .
    echo "gem 'i18n-js', '3.0.0.rc15'" >> Gemfile
    echo "  NEW_KEY: NEW_VALUE" >> config/locales/en.yml
    bundle install
    bundle exec rake i18n:js:export
    grep -o '"NEW_KEY"' public/javascripts/translations.js
    

    对我来说,运行上面的脚本在最后一行输出"NEW_KEY",正如预期的那样(证明NEW_KEY在全新的Rails安装中运行i18n:js:export后被正确添加到public/javascripts/translations.js),这意味着别的正在您的本地项目中进行。

    进一步调查

    为了了解究竟发生了什么,您必须进一步调查与全新的 Rails 安装相比,您在本地更改了哪些配置。

    (请注意,执行此操作的最简单方法是提供Minimal, Complete and Verifiable example,例如指向准确产生您的问题的 GitHub 存储库的链接。)

    • 您说“i18n/translations.js 不会更新以包含新的 .yml 翻译。”但更新的默认路径是 public/javascripts/translations.js。如果您为您的translations.js 文件使用非标准路径,您是否在config/i18n-js.yml 中对此进行了额外配置? (如果是,请分享此文件的全部内容)。
    • 您是否确认新翻译根本不会出现在translations.js 中(例如,使用上述grep 命令)?还是该问题可能与 asset pipeline 配置有关?

    【讨论】:

    • 感谢您提供所有详细信息!我添加了相关的配置文件。希望对您有所帮助!
    • @gwalshington 查看您的问题解决方案的更新。
    【解决方案2】:

    不确定您是指 dev 还是 prod 环境。我在dev 环境中遇到了类似的问题,我通过将config.middleware.use(I18n::JS::Middleware) 添加到config/application.rb 来解决它。您可以查看here。希望对您有所帮助。

    【讨论】:

    • 都是环境。我将在 yml 文件中添加一些新内容,并且不会出现新的翻译。我尝试了您的建议,但仍然缺少翻译:/
    【解决方案3】:

    .yml 文件中,检查语言代码后的冒号。

    您的示例如下:

    en
     form_error:
        cancel_reason: "Please provide a reason for cancelling."
    

    试试:

    en:
     form_error:
        cancel_reason: "Please provide a reason for cancelling."
    

    我没有试过用这个来做一个例子。但是,我拥有的项目副本中的.yml 文件在语言名称后都有冒号。这只是一种恼人的错字,可能对靠近它的人来说是看不见的。呸!

    【讨论】:

    • 感谢您的回复!这只是我帖子中的拼写错误,并不是缺少新翻译的原因,但当前的翻译仍然存在。有问题编辑:)
    【解决方案4】:

    您似乎有英文翻译,但正在尝试访问法语语言环境。

    【讨论】:

    • 这只是一个例子。问题是“当我向相应的 yml 文件添加新翻译时,i18n/translations.js 不会更新以包含新的 .yml 翻译。”即使我有英文翻译,并且它正在寻找法文,如果它可以找到它,它也会默认使用英文翻译。再次......它不存在,因为它没有更新
    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 2015-03-25
    • 2013-06-08
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多