القضبان - كيفية إضافة / تجاوز / تجاوز ديناميكيا إلى I18N Yaml

StackOverflow https://stackoverflow.com/questions/1840027

سؤال

كمثال، لدي ملف لغة إنجليزية افتراضي "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"، وسوف تختفي ترجمة "المستخدمين"، أليس كذلك؟

هل كانت مفيدة؟

المحلول

لا ينبغي الكتابة فوق لغة "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 الترجمة الأخير.

نصائح أخرى

استخدم I18N.Fallbacks.

لست متأكدا عندما تمت إضافته إلى القضبان، ولكن في 4.2.2 يمكنك القيام به:

# application.rb
# If key is not found in a locale, we look in fallback
config.i18n.fallbacks = {
  "locale_1"    => "en",
  "locale_2"    => "en",
  "locale_3"    => "de",
}

إذا قمت أيضا بتعيين config.action_view.raise_on_missing_translations = true (الذي أقوم به في التنمية والاختبار)، سوف يرفع إلا إذا لم يتم العثور على مفتاح في اللغة المحلية أو الاحتراق.

أردت شيئا مشابها عندما كنا نكتب ترجمة من القراصنة. أيمن، لكنني أردت أي شيء غير محدد في القراصنة.

ما كتبته يمكن العثور عليها على جيثب.

أعتقد أنك قد تختلط شيئين مختلفين.

ملف i18n هو للترجمات.

إذا كان لديك عميل يحتاج إلى اسم محدد لبعض الحقل، فليس هذه مشكلة ترجمة، ولكن الوظيفة.

وبعبارة أخرى، أعتقد أنك بحاجة إلى شيء مثل هذا:

 en:
   messages: messages
   users: users
   discussions: discussions

ثم أضف الوظيفة المحددة في مكان آخر، على سبيل المثال في عرضك:

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

بدلا من ذلك، يمكنك إضافة سمة سلسلة لعملائك، وتخلف إلى "الرسائل". ثم رأيك يبدو أن هذا:

<%= t(customer.messages_field_name) %>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top