9

例として、私はデフォルトの英語のロケールファイル「en.yml」の内容を持っています:

 en:
  messages: messages
  users: users

現在、ある顧客は、製品内でメッセージにディスカッションという名前を付けたいと考えていますが、ユーザーはユーザーのままにする必要があります。だから私がやりたいのは、「customer.en.yml」ファイルを作成することです

en:
 messages: discussions

これは、デフォルトの「メッセージ」の翻訳を上書きしますが、他のすべての単語は同じままにします。どうすれば達成できますか?

en.yml を次のようにロードすると:

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'locales', '*.{rb,yml}')] 

その後、customer.en.yml をロードします (APP_CONFIG['customer_name'] は前に定義されています)。

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'custom_locales',  APP_CONFIG['customer_name']+'.{rb|yml}')]

私の「en」ロケールを上書きするだけで、「users」の翻訳は消えてしまいますよね?

4

4 に答える 4

3

「en」ロケールを上書きしないでください。翻訳はマージされます。store_translations単純な I18n バックエンド呼び出しmerge_translationsで、次のようになります。

# Deep merges the given translations hash with the existing translations
# for the given locale
def merge_translations(locale, data)
  locale = locale.to_sym
  translations[locale] ||= {}
  data = deep_symbolize_keys(data)

  # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
  merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
  translations[locale].merge!(data, &merger)
end

ご覧のとおり、後者の翻訳 yml ファイルに入力したキーのみが上書きされます。

于 2009-12-03T14:10:41.233 に答える
1

pirate.ymlの翻訳を書いているときに似たようなものが欲しかったのですが、pirate.ymlで定義されていないものは、デフォルトでen.ymlにあるものにしたかったのです。

私が書いたものはGithubで見つけることができます。

于 2009-12-03T19:13:33.810 に答える
-2

2つの異なるものを混同している可能性があると思います。

i18n ファイルは翻訳用です。

一部のフィールドに特定の名前が必要なクライアントがある場合、それは翻訳の問題ではなく、機能です。

つまり、次のようなものが必要だと思います。

 en:
   messages: messages
   users: users
   discussions: discussions

次に、特定の機能を別の場所、たとえばビューに追加します。

if(customer.needs_discussions?)
<%= t(:discussions) %>
else
<%= t(:messages) %>
end

または、顧客に文字列属性を追加して、デフォルトを「メッセージ」にすることもできます。次に、ビューは次のようになります。

<%= t(customer.messages_field_name) %>
于 2009-12-03T22:27:31.497 に答える