标签: i18n-gem

在rails app中组织Locale文件

我目前在我的root应用程序的config/locales中有以下4个文件:

-en.yml
-de.yml
-simple_form.en.yml
-simple_form.de.yml
Run Code Online (Sandbox Code Playgroud)

在我的application.rb中,它驻留在spec/dummy文件夹中以测试应用程序gem我有以下代码行,它似乎正在按预期检索翻译:

# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.default_locale = :de
Run Code Online (Sandbox Code Playgroud)

我现在希望引入结构到我的locales文件夹的文件结构但是当我添加其他文件夹并更改application.rb中的加载路径时,我得到翻译未找到错误.这是我的尝试:

尝试在我的根应用程序的config/locales中包含结构:

-views
  -en.yml
  -de.yml
-models
  -en.yml
  -de.yml
-forms
  -simple_form.en.yml
  -simple_form.de.yml
Run Code Online (Sandbox Code Playgroud)

我在application.rb中的加载路径更改为:

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
Run Code Online (Sandbox Code Playgroud)

根据以下rails指南:http: //guides.rubyonrails.org/i18n.html#setting-the-locale-from-the-domain-name

locale internationalization load-path ruby-on-rails-3 i18n-gem

17
推荐指数
2
解决办法
8048
查看次数

I18n没有Rails?

在没有Rails环境的情况下让I18n工作有麻烦:


irb> require 'i18n'
=> true
irb> I18n.load_path=Dir['/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/en.yml']
=> ["/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/en.yml"]
irb> I18n.load_path+=Dir['/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/sk.yml']
=> ["/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/en.yml", "/usr/lib/ruby/gems/1.9.1/gems/rails-i18n-0.6.6/rails/locale/sk.yml"]
irb> I18n.locale=:sk
=> :sk
irb> I18n.default_locale=:sk
=> :sk
irb> I18n.l Time.now
I18n::MissingTranslationData: translation missing:
sk.time.formats.default
  from /usr/lib/ruby/gems/1.9.1/gems/i18n-0.6.1/lib/i18n.rb:289:in
`handle_exception'
  from /usr/lib/ruby/gems/1.9.1/gems/i18n-0.6.1/lib/i18n.rb:159:in
`translate'
  from
/usr/lib/ruby/gems/1.9.1/gems/i18n-0.6.1/lib/i18n/backend/base.rb:55:in
`localize'
  from /usr/lib/ruby/gems/1.9.1/gems/i18n-0.6.1/lib/i18n.rb:236:in
`localize'
  from (irb):11
  from /usr/bin/irb:12:in `<main>'
irb>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?sk.yml包含sk.time.formats.default元素!!

另外,I18n的默认load_path是什么,所以我不打算为每个翻译YAML/Ruby文件提供完整路径?

谢谢.

ruby internationalization i18n-gem

9
推荐指数
2
解决办法
5531
查看次数

动态加载从gem到磁盘引擎的I18n转换

我创建了一个gem(TranslationsGem),我在多个项目(引擎和Rails应用程序)中使用它.这个宝石设置了几个加载到I18n后端的哈希.

一种方法#store_dynamic_translations设置了几个加载到I18n后端的哈希值.它基本上是这样的:

I18n.backend.store_translations(:en, { test: { property: 'value' } })
Run Code Online (Sandbox Code Playgroud)

我的测试确认方法和翻译加载正常.但是我不能让它在主机引擎和Rails应用程序中工作.在我的测试环境中,我必须在my中执行该方法test_helper以确保正确加载转换.在测试环境之外,我似乎无法使其正常工作.我可以验证该方法是否已执行,但未加载转换.

我已经尝试了好几个小时,比如在Engine初始化程序中执行方法并使用ActiveSupport挂钩.在主机Rails应用程序中,我尝试#store_dynamic_translations在初始化程序中执行,但无济于事.

奇怪的是,如果我#store_dynamic_translations在我的Rails应用程序控制器或视图中执行它,它就可以工作.有没有办法在app启动时设置它?


编辑:我已经设置了一个包含当前设置示例存储库.

  1. 一个Gem,它动态地将翻译存储到I18n后端.

  2. 一个Rails引擎加载gem并且应该有它的翻译

有问题的测试中,取消注释该MyI18n::Translations.store_dynamic_translations指令使测试通过.但我认为应该可以在引擎初始化程序中做到吗?

ruby ruby-on-rails internationalization i18n-gem

8
推荐指数
1
解决办法
456
查看次数

运行"bin/rake assets:precompile"时没有设置I18n加载路径!

我正在使用I18n-js,而我的客户端I18n.t调用在生产中运行时都返回翻译缺失消息.

一切都可以开发和测试.

此问题的根源似乎在资产管道中.

I18n.load_path不包含我的任何翻译(运行bin/rake资产:预编译时)它只包含以下路径:

["/home/chris/.rvm/gems/ruby-1.9.3-p125@Project/gems/activesupport-3.2.3/lib/active_support/locale/en.yml",
"/home/chris/.rvm/gems/ruby-1.9.3-p125@Project/gems/activemodel-3.2.3/lib/active_model/locale/en.yml",
"/home/chris/.rvm/gems/ruby-1.9.3-p125@Project/gems/activerecord-3.2.3/lib/active_record/locale/en.yml",
"/home/chris/.rvm/gems/ruby-1.9.3-p125@Project/gems/actionpack-3.2.3/lib/action_view/locale/en.yml"]
Run Code Online (Sandbox Code Playgroud)

这些看起来像来自gems的默认activesupport,activemodel,activerecord和actionpack翻译......

但是,在开发和生产中运行bin/rails控制台时,我的转换路径会按预期进行设置:

1.9.3p125 :002 > I18n.load_path
=> ["/home/chris/.rvm/gems/ruby-1.9.3-p125@Project/gems/activesupport-3.2.3/lib/active_support/locale/en.yml",
"/home/chris/.rvm/gems/ruby-1.9.3-p125@Project/gems/activemodel-3.2.3/lib/active_model/locale/en.yml",
"/home/chris/.rvm/gems/ruby-1.9.3-p125@Project/gems/activerecord-3.2.3/lib/active_record/locale/en.yml",
"/home/chris/.rvm/gems/ruby-1.9.3-p125@Project/gems/actionpack-3.2.3/lib/action_view/locale/en.yml",
"/home/chris/.rvm/gems/ruby-1.9.3-p125@Project/gems/carrierwave-0.6.1/lib/carrierwave/validations/../locale/en.yml",
"/home/chris/.rvm/gems/ruby-1.9.3-p125@Project/gems/devise-2.0.4/config/locales/en.yml",
"/media/sf_code/Project/config/locales/active_record.en.yml",
"/media/sf_code/Project/config/locales/project.en.yml"]
Run Code Online (Sandbox Code Playgroud)

事实上,I18n文档指出:"默认语言环境是:en和来自config/locales/*.rb,yml的所有翻译都是自动加载的."

我也试过在application.rb中指定

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{rb,yml}').to_s]
Run Code Online (Sandbox Code Playgroud)

但仍然没有快乐.

任何人都知道什么可能导致I18n.load_path只在运行资产时才设置:precompile?

谢谢你的任何想法

ruby ruby-on-rails ruby-on-rails-3 asset-pipeline i18n-gem

7
推荐指数
1
解决办法
2427
查看次数

Rails I18n set_locale

我想通过客户端browserlocale request.env['HTTP_ACCEPT_LANGUAGE']和URL 设置语言环境.

  1. 如果用户访问URL(例如:myapp.com),则应检查HTTP_ACCEPT_LANGUAGE并重定向到正确的URL(例如:myapp.com/en - 如果browserlocale是en)

  2. 如果用户然后通过语言菜单选择不同的语言,则应将URL更改为例如:myapp.com/de.

这是我到目前为止所得到的:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_locale

private

  # set the language
  def set_locale
    if params[:locale].blank?
      I18n.locale = extract_locale_from_accept_language_header
    else
      I18n.locale = params[:locale]
    end
  end

  # pass in language as a default url parameter
  def default_url_options(options = {})
    {locale: I18n.locale}
  end

  # extract the language from the clients browser
  def extract_locale_from_accept_language_header
    browser_locale = request.env['HTTP_ACCEPT_LANGUAGE'].try(:scan, /^[a-z]{2}/).try(:first).try(:to_sym) 
    if I18n.available_locales.include? browser_locale
      browser_locale
    else
      I18n.default_locale
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

在我的路线文件中,我得到了:

Myapp::Application.routes.draw do …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails internationalization ruby-on-rails-3 i18n-gem

7
推荐指数
1
解决办法
9219
查看次数

从I18n"缺少翻译"消息中删除html标签

请在视图中考虑以下代码:

<%= link_to 'Delete!', item ,  :confirm => t('action.item.confirm_deletion'), :method => :delete %>
Run Code Online (Sandbox Code Playgroud)

它通常会出现:

<a href="/items/123" data-confirm="Confirm deletion?" data-method="delete" rel="nofollow">Delete!</a>
Run Code Online (Sandbox Code Playgroud)

但是如果由于某种原因(不完整的yml文件,拼写错误等)缺少action.item.confirm_deletion的翻译,它会出现:

<a href="/items/123" data-confirm="<span class="translation_missing" title="translation missing: sv.action.item.confirm_deletion">Confirm Deletion</span>" data-method="delete" rel="nofollow">Delete!</a>
Run Code Online (Sandbox Code Playgroud)

这是无效的html,用户将在主页上看到损坏的html标签.在某些情况下,它也可能存在安全风险.

我知道我可以在每次调用I18n.t函数时使用应用一些转义,但这对于任务来说感觉不必要地重复.

所以我的问题是:有没有办法让"翻译缺失" - 消息不包含HTML代码.

ruby-on-rails i18n-gem

6
推荐指数
1
解决办法
2344
查看次数

现有轨道项目i18n本地化的最佳在线服务

您对翻译服务有什么看法,哪一个适合2,3项但是语言数量不断增长的rails项目?

也许我们可以用pro和con来编译服务列表.

我看过:

关于哪种服务很合适的任何建议?

translation ruby-on-rails internationalization ruby-on-rails-3 i18n-gem

6
推荐指数
1
解决办法
4021
查看次数

对于i18n-js,Heroku资产预编译失败

在将Rails4代码推送到heroku时,我收到以下错误,这已经在过去2天内开始发生,否则会顺利进行

 Writing config/database.yml to read from DATABASE_URL
  -----> Preparing app for Rails asset pipeline
   Running: rake assets:precompile
   rake aborted!
   couldn't find file '/tmp/build_b6402ff8-bda2-4bc5-95dc-2efe7a9044bc/tmp/i18n-js.cache'
   (in /tmp/build_b6402ff8-bda2-4bc5-95dc-2efe7a9044bc/vendor/bundle/ruby/2.0.0/gems/i18n-js-2.1.2/vendor/assets/javascripts/i18n/translations.js.erb)
   /tmp/build_b6402ff8-bda2-4bc5-95dc-2efe7a9044bc/vendor/bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/context.rb:87:in `resolve'
Run Code Online (Sandbox Code Playgroud)

这是我的production.rb的条目

config.assets.initialize_on_precompile = true
Run Code Online (Sandbox Code Playgroud)

我能够运行RAILS_ENV =生产佣金资产:本地预编译.虽然我没有将预编译资产推送到服务器.

我通过我的gem文件安装了I18n-js 2.1.2版本,它的Rails4服务器为我运行.

急需帮助.

heroku i18n-gem ruby-on-rails-4

5
推荐指数
2
解决办法
1876
查看次数

如何将本地化字符串日期转换为 Ruby Date 对象?

我有一个日期,当它用作英语时效果很好

> Date.strptime("Aug 02, 2015", "%b %d, %Y")
Sun, 02 Aug 2015
Run Code Online (Sandbox Code Playgroud)

但是,当我使用另一种语言时es,这不起作用。例如

> Date.strptime("ago 02, 2015", "%b %d, %Y")
ArgumentError: invalid date
Run Code Online (Sandbox Code Playgroud)

文本字符串ago 02, 2015本身来自另一个服务,我需要将其标准化为特定格式,例如

> I18n.localize(Date.strptime("Aug 02, 2015", "%b %d, %Y"), format:  "%m/%d/%Y")
"08/02/2015"
Run Code Online (Sandbox Code Playgroud)

有没有办法在 Ruby 中做到这一点,以便

> I18n.localize(Date.strptime("ago 02, 2015", "%b %d, %Y"), format:  "%m/%d/%Y")
"08/02/2015"
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails i18n-gem rails-i18n

5
推荐指数
1
解决办法
1755
查看次数

我如何找出rails(包括gems)加载了哪些语言环境文件?

我将向我的应用程序引入一个新的区域设置,并将 config/locales/ .locale1.yml 中的所有现有文件复制到 config/locales/ .locale2.yml。

起初我预计这I18n.backend.send(:translations)['locale1']会相等I18n.backend.send(:translations)['locale2'],但是当我比较两个哈希值时,我意识到我的新“locale2”缺少一堆翻译。

我认为对于 locale1 来说,其他翻译已经从 gem 中加载,例如流行的 Rails-i18n gem。

由于没有(简单)方法可以找出在哪个 .yml 文件中定义了翻译,因此我想获取从任何 gem 加载的所有语言环境文件的列表。

有什么建议如何获取该信息吗?

更有趣的是,如果我实际上可以实现一种方法来确定从哪个文件加载翻译,但我想这需要编写一个自定义的 i18n 后端,以某种方式存储每个密钥的加载位置。

ruby ruby-on-rails i18n-gem

5
推荐指数
1
解决办法
1148
查看次数