سؤال

أظن أن 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"), ، والتي تتمتع بميزة تلقائي تهيئة وإعادة تحميل الترجمات في وضع التطوير (شيء لا يحدث إذا اتصلت بالطرق المحمية.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top