Hi
I and others have earlier discussed the need for delocalization
(inverse translation) methods. Sven proposed a solution that did not
work for me but for some others. As Sven said that solution was a kind
of fix.
I have now implemented a solutions and would like to have some
comments. The main problem is to find a solution as independen of the
way keys are used as possible.
In my soution one call with the word to be delocalized and the method
then makes an extended search through all translations to find the
key,that then is used for delocalization.
Any comments one that solution.?
Is it to ineffective ?
I add the code below so you can propose improvements
I use it as an extension to the string class, but it can of course be
used in other ways.
Delocalizes a string.
Delocalization means to transform a localized string to the
original used in the code, preferreble an en-string
Searchs for the string in all translations and uses the key of
the found translation to delocalize.
If the last word in the translation key is a dasherized version
of the string, then it is used for delocalization
Call with to_local= blank (or not used)
In all other cases call with to_locale = the language to be
delocalized to. The translation of that language will be used for
delocalization
def to_delocalize(to_locale=’’)
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
I18n.backend.send(:init_translations)
all_keys = I18n.backend.send(:translations).collect do |
check_locale, translations|
collect_keys([], translations).sort
end.flatten.uniq
delocalized_string=’’
key=’’
all_keys.each do |key|
result = I18n.translate(key)
if result==self
delocalized_string=key.split(’.’).last
break
end
end
if !to_locale.blank?
I18n.locale = to_locale.to_sym
delocalized_string = I18n.translate(key)
end
return delocalized_string
end