Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रेल I18n:3 त्वरित युक्तियाँ और 1 पागल दुर्व्यवहार

रेल की i18n लाइब्रेरी जितनी दिखती है, उससे कहीं ज्यादा शक्तिशाली है। आपको इसे केवल अनुवाद के लिए उपयोग करने की आवश्यकता नहीं है। i18n लाइब्रेरी आपके द्वारा प्रदर्शित टेक्स्ट को उस स्थान से अलग करने के लिए कहीं भी उपयोगी है जहां आप इसे प्रदर्शित करते हैं।

जब मैं एवो में रहा हूं, हमने कुछ बहुत अच्छी चीजें करने के लिए i18n का उपयोग किया है। मैं कुछ चीजें साझा करने जा रहा हूं जो हमने सीखी हैं जो काम में आई हैं, साथ ही पुस्तकालय का एक पागल दुरुपयोग जो हमारे लिए अविश्वसनीय रूप से अच्छा काम कर रहा है।

स्वचालित HTML एस्केपिंग

क्या आपके पास ऐसी लाइनें हैं जो इस तरह दिखती हैं:

<%= raw(t('form.required_field_header')) %>

आपके विचारों में? आपको उस raw की आवश्यकता नहीं है , क्योंकि यदि आपकी अनुवाद कुंजी _html . के साथ समाप्त होती है , आप मुफ्त में बच जाते हैं:

<%= t('form.required_field_header_html') %>

आपके अन्य t() . के साथ सरल, और अधिक सुसंगत कॉल।

स्थानीय स्थानों को अधिक आसानी से एक्सेस करना

जब आप अपनी स्थानीय फ़ाइलें बनाते हैं, तो संभवत:आपकी कुछ कुंजियाँ एक ही पैरेंट के अंतर्गत समूहीकृत होंगी:

en:
  bugs:
    index:
      new_label: "File a new bug"
      edit_label: "edit"
      delete_label: "delete"

इन सभी के एक समूह को एक साथ संदर्भित करने के लिए, आप कर सकते हैं उन्हें उनकी पूरी कुंजी से देखें:

<%= t('bugs.index.edit_label') %> | <%= t('bugs.index.delete_label') %>

यह काफी कष्टप्रद और दोहराव वाला है। लेकिन t() सहायक रूप से एक दायरा लेता है, इसलिए आप कुंजियों को अधिक आसानी से संदर्भित कर सकते हैं:

<% bugs_scope = 'bugs.index' -%>
<%= t('edit_label', scope: bugs_scope) %> | <%= t('delete_label', scope: bugs_scope) %>

यदि आप अपने आंशिक नाम अच्छी तरह से रखते हैं, तो आपको दायरा निर्दिष्ट करने की भी आवश्यकता नहीं है:

app/views/bugs/index.html.erb
<%= t('.edit_label') %> | <%= t('.delete_label') %>

यानी .edit_label संदर्भ bugs.index.edit_label , क्योंकि आप bugs/index.html.erb . में हैं ।

ActiveRecord बैकएंड

कभी-कभी, yaml फ़ाइल में स्थिर अनुवाद आपके प्रोजेक्ट के लिए काम नहीं करते हैं। यदि आप इसके बजाय ActiveRecord i18n बैकएंड का उपयोग करते हैं:

config/initializers/locale.rb
require 'i18n/backend/active_record'
I18n.backend = I18n::Backend::ActiveRecord.new

आप अनुवादों को translations में देख सकते हैं आपके डेटाबेस में तालिका। इस तरह, आपको अपने सभी अनुवादों को पहले से परिभाषित करने की आवश्यकता नहीं है। इसके बजाय, आप तुरंत नए अनुवाद जोड़ सकते हैं।

translations सेट करना तालिका के लिए एक विशिष्ट माइग्रेशन की आवश्यकता होती है। i18n-active_record रेपो पर README में वह सारी जानकारी है जो आपको इसे काम करने के लिए चाहिए।

ऑब्जेक्ट प्रकारों के बीच आंशिक साझा करना

एवो में, हमारे पास एक वकील निर्देशिका, वकील की समीक्षा और कानूनी सलाह है। लेकिन कुछ साल पहले, हमारी साइट पर केवल वकील ही नहीं थे। हमारे पास डॉक्टर और दंत चिकित्सक भी थे!

इन व्यवसायों के बीच हमारा बहुत सारा UI समान था। लेकिन काफी अलग था (उदाहरण के लिए, जिसे वकील "अभ्यास क्षेत्र" कहते हैं, डॉक्टर "विशेषज्ञता" कहते हैं), कि बिना किसी बदसूरत कोड के समान विचार या आंशिक साझा करना मुश्किल होगा।

आखिरकार, हमने इसके लिए i18n सिस्टम पर भरोसा करने की कोशिश करने के बारे में सोचा। आखिरकार, अंग्रेजी वकील तरह का है अंग्रेजी की एक बोली, और डॉक्टरेट एक ही तरह से है . हम अंततः अन्य भाषाओं का उपयोग करने से खुद को रोकना नहीं चाहते थे, इसलिए हमने दो नए स्थान बनाने का निर्णय लिया:en_jd और en_md

यह एक कस्टम i18n बैकएंड के रूप में स्थापित करना आसान साबित हुआ:

class AvvoI18nStore < I18n::Backend::Simple
  def translate(locale, key, options = {})
    begin
      default = options.delete(:default)
      super(locale, key, options)
    rescue I18n::MissingTranslationData => e
      # fall back to "en" if we can't find anything under "en_jd", etc.
      fallback_locale = locale.to_s.split("_").first
      super(fallback_locale, key, options.merge(:default => default))
    end
  end
end

I18n.backend = AvvoI18nStore.new

और अनुवादों को परिभाषित करना उतना ही आसान था:

en_jd:
  practice_area: "practice area"

en_md:
  practice_area: "specialty"

इसने संपूर्ण आंशिक अनुवादों के लिए भी बहुत अच्छा काम किया (फ़ाइल नाम नोट करें):

ऐप्लिकेशन/दृश्य/प्रश्न/_answer_badge.en_jd.html.erb
<!-- Lawyer badge HTML -->
app/views/questions/_answer_badge.en_md.html.erb
<!-- Doctor badge HTML -->

और यह वापस en . पर भी गिर गया लोकेल, साझा अनुवादों के लिए:

en:
  leaderboard:
    title: "Leaderboard"

जब आप साइट के "डॉक्टर" अनुभाग में थे, तो हमने डिफ़ॉल्ट लोकेल को :en_md में बदल दिया था , और इसके विपरीत:

I18n.locale = :en_md

और सब कुछ बस काम कर गया!

मुझे यकीन नहीं है कि मैं इसकी सिफारिश करूंगा। यह थोड़ा पागल है, अलग-अलग भाषाओं वाले विभिन्न व्यवसायों के बारे में सोच रहा है। लेकिन हमने ऐसा करते हुए आश्चर्यजनक रूप से अच्छा काम किया। और इससे पता चलता है कि i18n जैसे सरल उपकरणों में कितनी शक्ति हो सकती है।

आप यह सामान कहां से लाते हैं?

पिछले हफ्ते, मैंने एक शुरुआत से एक विशेषज्ञ तक जाने के तरीके के रूप में विशिष्ट तकनीकों में गहरी गोता लगाने के बारे में बात की थी। यह उसका एक और उदाहरण है:हमने i18n के बारे में जो कुछ भी सीखा है, उसमें से अधिकांश हमने रेल गाइड और एपीआई डॉक्स को पढ़ने से सीखा है।

तो, वह अतिरिक्त कदम उठाएं। उन उपकरणों को जानें जिन पर आप अच्छी तरह भरोसा करते हैं। आप पाएंगे कि आप ऐसी उपयुक्तताओं और तरकीबों में भाग लेंगे जो न केवल आपको अधिक उत्पादक बनाएगी, बल्कि उन नई श्रेणियों के समाधानों को भी अनलॉक कर सकती हैं जिनके बारे में आपने कभी सोचा भी नहीं होगा।


  1. बायबग, रेल और पाउ ​​के साथ रिमोट डिबगिंग

    यदि आपने पहले बायबग नहीं देखा है, तो मेरा सुझाव है कि आप इसे देखें। रूबी 2.x के लिए यह एक अच्छा डीबगर है। इसके लेखकों के शब्दों में: Byebug रूबी 2 के लिए उपयोग करने के लिए एक आसान, सुविधा संपन्न डिबगर है। यह निष्पादन नियंत्रण के लिए नए TracePoint API और कॉल स्टैक नेविगेशन के लिए नए डीबग इंस्पेक्टर A

  1. रेडिस के लिए 10 त्वरित टिप्स

    तकनीकी समुदाय में अभी रेडिस गर्म है। यह एंटिरेज़ की एक छोटी व्यक्तिगत परियोजना होने से लेकर मेमोरी डेटा स्टोरेज के लिए एक उद्योग मानक होने तक का लंबा सफर तय कर चुका है। इसके साथ सर्वोत्तम प्रथाओं का एक सेट आता है, जिस पर अधिकांश लोग रेडिस का ठीक से उपयोग करने के लिए सहमत हो सकते हैं। नीचे हम रेडिस क

  1. उत्पादकता बढ़ाने के लिए 10 त्वरित जीमेल टिप्स और ट्रिक्स

    दुनिया भर में हर सात में से एक व्यक्ति जीमेल का इस्तेमाल करता है लेकिन उन्हें भी जीमेल द्वारा उपलब्ध कराये जाने वाले विभिन्न विकल्पों के बारे में पता नहीं है। Gmail का उपयोग करके, आप न केवल मेलों की जांच कर सकते हैं, बल्कि महत्वपूर्ण मेलों को हाइलाइट भी कर सकते हैं, कचरा फ़िल्टर कर सकते हैं, उपयोगकर