القضبان - كيفية إضافة / تجاوز / تجاوز ديناميكيا إلى I18N Yaml
-
12-09-2019 - |
سؤال
كمثال، لدي ملف لغة إنجليزية افتراضي "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) %>