كيفية استرداد جميع الترجمات من ملفات YML في Rails i18n
-
26-09-2019 - |
سؤال
أظن أن Rails يخزن جميع الترجمات المحلية ملفات YML في نوع من الصفيف/التجزئة. هل هناك طريقة للوصول إلى هذا؟
على سبيل المثال ، إذا كان لدي ملف:
en:
test_string: "testing this"
warning: "This is just an example
هل يمكنني فعل شيء مثل ، i18n.translations_store [: en] [: test_string]؟ يمكنني تحليل ملف YML مع Yaml :: Load ، لكن في حالتي ، قمت بتقسيم ملفات YML في المجلدات الفرعية للمؤسسة ، وأنا متأكد تمامًا من أن القضبان قد قامت بالفعل بتحليلها جميعًا.
المحلول
عليك الاتصال بأسلوب خاص على الواجهة الخلفية. هذه هي الطريقة التي يمكنك بها الوصول:
translations = I18n.backend.send(:translations)
translations[:en][:test_string] # => "testing this"
نصائح أخرى
حسب تعليق 8xx8 ، نسخة أبسط من:
I18n.t(:foo)
I18n.backend.send(:translations)[:en][:test_string]
هو
I18n.t(".")[:test_string]
هذا يخفف من الاضطرار إلى التحميل المسبق للترجمات أو تحديد اللغة.
إذا كنت تستخدم I18n::Fallbacks
للأسف لا يمكنك استخدام I18n.t('.')
نظرًا لأنه يرجع فقط المحتويات المحتويات (على سبيل المثال. "EN-GB") ولا شيء من أي من أماكن الاحتياطية (على سبيل المثال "EN"). للحصول على هذا حول هذا ، يمكنك التكرار خلال الاحتياطات والاستخدام deep_merge!
الجمع بينهم.
module I18n
class << self
def all
fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback|
translations.deep_merge!(backend.translate(fallback, '.'))
end
end
end
end
الواجهة الخلفية I18N الافتراضية هي I18N :: Backend :: Simple ، والتي لا تعرض الترجمات لك. (i18.backend.translations هي طريقة محمية.)
هذه ليست فكرة جيدة بشكل عام ، ولكن إذا كنت بحاجة حقًا إلى هذه المعلومات ولا يمكنك تحليل الملف ، فيمكنك تمديد فئة الواجهة الخلفية.
class I18n::Backend::Simple
def translations_store
translations
end
end
يمكنك الاتصال بعد ذلك I18n.backend.translations_store
للحصول على الترجمات المحسورة. ربما يجب ألا تعتمد على هذا كاستراتيجية طويلة الأجل ، لكنها تمنحك المعلومات التي تحتاجها الآن.
إذا كنت تفعل ذلك في مهمة أشعل النار ، تذكر أن تتضمن Enviroment ، أو غير ذلك ، فلن تقوم بتحميل أماكنك الخاصة التي تعيش تحت config/locales/
require "./config/environment.rb" # Do not forget this
namespace :i18n do
desc "Import I18n to I18n_active_record"
task :setup do
I18n.t(:foo)
translations = I18n.backend.send(:translations)
end
end
بالنسبة للأشخاص الذين يتجولون في هذا السؤال القديم ، هناك حل لا يتطلب استدعاء الأساليب المحمية. تغيير الخاص بك yml
الملف على النحو التالي:
nl: &all
... translations here ...
all:
<<: *all
الآن يمكنك ببساطة استخراج جميع الترجمات باستخدام I18n.t("all")
, ، والتي تتمتع بميزة تلقائي تهيئة وإعادة تحميل الترجمات في وضع التطوير (شيء لا يحدث إذا اتصلت بالطرق المحمية.)