我正在使用Ruby on Rails 3.1.0和I18n gem。我(正在实现一个插件)我想在运行时检查 如果I18n缺少翻译键/值对,如果是,则使用自定义字符串。也就是说,我有:
validates :link_url,
:format => {
:with => REGEX,
:message => I18n.t(
'custom_invalid_format',
:scope => 'activerecord.errors.messages'
)
}
如果在.yml
文件中没有以下代码
activerecord:
errors:
messages:
custom_invalid_format: This is the test error message 1
我想使用This is the test error message 2
。 有可能吗?如果是这样,我该如何做到?
BTW :出于性能原因,如果转换键/值对存在,建议在运行时检查 吗?
答案 0 :(得分:23)
答案 1 :(得分:20)
我刚才有同样的问题,我想计算一个自动字符串,以防翻译丢失。如果我使用:default
选项,我每次都要计算自动字符串,即使翻译没有丢失。所以我搜索了另一个解决方案。
您可以添加选项:raise => true
或使用I18n.translate!
代替I18n.translate
。如果找不到翻译,则会引发异常。
begin
I18n.translate!('this.key.should.be.translated', :raise => true)
rescue I18n::MissingTranslationData
do_some_resource_eating_text_generation_here
end
答案 2 :(得分:16)
我不知道如何在运行时,但你可以使用rake来找到它。你将为此创建自己的rake任务。这是一个:
namespace :i18n do
desc "Find and list translation keys that do not exist in all locales"
task :missing_keys => :environment do
def collect_keys(scope, translations)
full_keys = []
translations.to_a.each do |key, translations|
new_scope = scope.dup << key
if translations.is_a?(Hash)
full_keys += collect_keys(new_scope, translations)
else
full_keys << new_scope.join('.')
end
end
return full_keys
end
# Make sure we've loaded the translations
I18n.backend.send(:init_translations)
puts "#{I18n.available_locales.size} #{I18n.available_locales.size == 1 ? 'locale' : 'locales'} available: #{I18n.available_locales.to_sentence}"
# Get all keys from all locales
all_keys = I18n.backend.send(:translations).collect do |check_locale, translations|
collect_keys([], translations).sort
end.flatten.uniq
puts "#{all_keys.size} #{all_keys.size == 1 ? 'unique key' : 'unique keys'} found."
missing_keys = {}
all_keys.each do |key|
I18n.available_locales.each do |locale|
I18n.locale = locale
begin
result = I18n.translate(key, :raise => true)
rescue I18n::MissingInterpolationArgument
# noop
rescue I18n::MissingTranslationData
if missing_keys[key]
missing_keys[key] << locale
else
missing_keys[key] = [locale]
end
end
end
end
puts "#{missing_keys.size} #{missing_keys.size == 1 ? 'key is missing' : 'keys are missing'} from one or more locales:"
missing_keys.keys.sort.each do |key|
puts "'#{key}': Missing from #{missing_keys[key].join(', ')}"
end
end
end
将给定的.rake文件放在lib / tasks目录中并执行:
rake i18n:missing_keys
答案 3 :(得分:0)
如果您希望将变量传递给This is the test error message {variable}
这可以使用如下语言文件中的变量。
# app/views/home/index.html.erb
<%=t 'greet_username', :user => "Bill", :message => "Goodbye" %>
# config/locales/en.yml
en:
greet_username: "%{message}, %{user}!"
您可以find here进行更多说明。