कभी-कभी, सबसे अच्छा ब्लॉग पोस्ट आपकी खुद की खुजली को दूर करने की आवश्यकता से आता है। और आज का ब्लॉग पोस्ट उसी का एक उदाहरण है!
आप शायद डेविस-रेल अनुप्रयोगों के लिए एक लोकप्रिय प्रमाणीकरण समाधान जानते हैं। डेविस के साथ काम करते समय, मैंने पाया कि अनुवाद करना और चलाना मेरे अनुमान से कहीं अधिक जटिल था। अतीत में मैं चाहता था कि एक चेकलिस्ट थी जो मुझे प्रक्रिया के माध्यम से मार्गदर्शन करने में मदद कर सके।
तो यह है - भविष्य के लिए मैं और आप - अंतिम वसीयत अंतर्राष्ट्रीयकरण चेकलिस्ट!
डिवाइस-i18n रत्न का उपयोग कब (नहीं) करना है?
डेविस की नीति डेविस विचारों में स्ट्रिंग्स को अनुवाद योग्य नहीं बनाना है। सभी तार हार्ड कोडित हैं। डेविस-आई18एन रत्न के रचनाकारों के लिए यश, जो सभी डेविस टेम्पलेट्स को अनुवाद योग्य बनाता है और समुदाय-स्रोत अनुवाद भी प्रदान करता है। अंतर्राष्ट्रीय ऐप्स के लिए, जहां आपको बहु-भाषा समर्थन की आवश्यकता होती है, devise-i18n रत्न सबसे आसान समाधान है।
हालांकि, devise-i18n मणि स्पष्ट रूप से जितना संभव हो सके वसीयत पाठ का पालन करना चुनता है। लेकिन डेविस द्वारा प्रदान किया जाने वाला पाठ शुरू करने के लिए बहुत संगत नहीं है। और चूंकि शाब्दिक अनुवाद कभी भी धाराप्रवाह भाषा उत्पन्न नहीं करेगा, मैं लगातार अनुवादों को बदल रहा हूं (और परियोजनाओं के बीच फाइलों की प्रतिलिपि बना रहा हूं)। यह एक सतत संघर्ष है क्योंकि एक समय में एक स्ट्रिंग या एक दृश्य को देखते समय सभी अनुवादों को सुसंगत बनाना कठिन होता है।
परिणामस्वरूप, i18n-devise gem के अनुवादों की गुणवत्ता मेरे मोनोलिंगुअल, डच-ओनली प्रोजेक्ट्स के लिए आवश्यक मानकों तक नहीं पहुंचती है।
मणि का उपयोग करने का एक और नुकसान अनुकूलित विचारों के साथ होता है। यहां तक कि जब यह केवल स्टाइल के साथ करना है, तो Devise-i18n रत्न का हर अपडेट जो किसी भी बदलाव को छूता है, जो कि विचारों में डेविस द्वारा किया गया है, इसका मतलब होगा कि आपको चीजों को ठीक करना होगा। आपको या तो विचारों को पुन:उत्पन्न करने और अनुकूलन लागू करने की आवश्यकता होगी या आपको परिवर्तनों को अपने विचारों में कॉपी/पेस्ट करना होगा। वैसे, नीचे दी गई चेकलिस्ट में दृष्टिकोण के साथ यह समस्या हल नहीं हुई है, लेकिन यह भी devise-i18n मणि के बिना हल करना अधिक कठिन नहीं है। ♀
🇳🇱 एक डच दावत
मैंने डेविस के लिए एक अच्छी डच अनुवाद फ़ाइल बनाने का फैसला किया, और इसके बारे में फिर कभी चिंता करने की ज़रूरत नहीं है। एक दावत की तरह लगता है? आप GitHub पर नई और बेहतर अनुवाद फ़ाइल पा सकते हैं। चेकलिस्ट में चरण 3 देखें। प्रत्येक अनुवाद निर्णय का औचित्य फ़ाइल में समझाया गया है।
अंतिम चेकलिस्ट
अब जबकि हम :nl अनुवाद के साथ अकेले उड़ान भर रहे हैं, आइए सभी विवरणों के साथ शुरुआत करें और बॉक्स चेक करना शुरू करें।
ध्यान दें कि यह मानता है कि आपके पास एक ऐप तैयार है, जिसमें एक उपयोगकर्ता मॉडल के साथ डेविस जोड़ा और स्थापित किया गया है, और डेविस विचार उत्पन्न हुए हैं। यदि आप साथ में कोडिंग कर रहे हैं:यह प्रारंभिक बिंदु है। और ध्यान दें कि nl
*.nl.yml
. में आपकी पसंद की भाषा से बदला जा सकता है, और उस उपयोगकर्ता और :उपयोगकर्ता को आपके द्वारा डेविस में उपयोग किए जाने वाले मॉडल नाम से बदला जा सकता है।
एक कदम:स्थानीय भाषा सेट करें
जोड़ें :nl
उपलब्ध स्थानों के लिए (यदि इस मामले पर आपकी कोई मजबूत राय नहीं है, तो इसे application.rb
में डालने से शुरुआत करें। अभी के लिए)। अब आप इसे डिफ़ॉल्ट के रूप में सेट कर सकते हैं।
# application.rb
config.i18n.available_locales = [:nl, :en]
config.i18n.default_locale = :nl
लोकेल को application.rb
में जोड़ने की तुलना में बेहतर, शायद क्लीनर विकल्प हैं . आपके लिए सबसे उपयुक्त विकल्प चुनने के लिए इस पोस्ट को पढ़ने के बाद Rails i18n गाइड देखें।
चरण दो:रेल अनुवाद जोड़ें
रेल जोड़ें:nl अनुवाद फ़ाइल इंटरफ़ेस में स्ट्रिंग्स की देखभाल करने के लिए जो विशिष्ट डेविस (विशेष रूप से रेल सत्यापन त्रुटि संदेश) नहीं हैं।
तीसरा चरण:वसीयत कुंजियां
डेविस कुंजियों का अनुवाद :nl
. में करें :नया और बेहतर डच अनुवाद जोड़ें! (ऊपर लिंक 🇳🇱)
चरण चार:दृश्य बनाएं।*.yml फ़ाइलें
डच और अंग्रेज़ी जोड़ें .yml
विचारों के लिए फ़ाइलें, views.*.yml
. रेपो में एक तैयार views.nl.yml फ़ाइल का एक उदाहरण है, जो चरण 4, 6 और 7 को दर्शाता है।
#example views.nl.yml
nl:
devise:
# to be filled in later with Devise scopes:
# registrations:
# new:
# forget_password: Wachtwoord vergeten?
पांचवां चरण:सक्रिय रिकॉर्ड विशेषताएँ
अब, ईमेल और पासवर्ड जैसी सक्रिय रिकॉर्ड विशेषताओं के लेबल के लिए अनुवाद जोड़ें। आपके द्वारा कार्यान्वित किए गए प्रत्येक मॉड्यूल के लिए केवल उन्हीं का अनुवाद करें जिन्हें उपयोगकर्ता और व्यवस्थापक उपयोगकर्ता देखते हैं। टोकन नामों और इस तरह का अनुवाद करने की आवश्यकता नहीं है (जैसा कि i18n मणि करता है)। यहाँ वह है जिसे मैं उपयोगी 'अनुवाद योग्य' मानता हूँ:
# In: active_record.nl.yml
# translating the labels that map to User attributes
nl:
activerecord:
attributes:
user:
current_password: Huidig wachtwoord
email: e-mailadres
password: wachtwoord
password_confirmation: Wachtwoord bevestigen
remember_me: Ingelogd blijven?
models:
user: Gebruiker
ध्यान दें कि :email
और :password
मूल्यों को कम किया जाता है। यह चरण 7 में रेल त्रुटि संदेशों में बदलाव के कारण है।
अभी के लिए, कुंजियों को active_record.*.yml
. में डालें ।
छठा चरण:प्रत्येक डेविस दृश्य की जांच करें
इसके बाद, सभी डेविस-विशिष्ट टेम्पलेट्स और स्ट्रिंग्स को संबंधित अनुवादों के साथ i18n-ed होना चाहिए। इसे स्वयं करना एक कष्टप्रद काम है। इससे पहले कि आप इसमें गोता लगाएँ, देखें कि क्या इनमें से कोई एक शॉर्टकट आपके लिए काम करता है:
-
आप दृश्यों के लिए 118n-devise मणि का उपयोग कर सकते हैं, लेकिन आपको अभी भी रत्न के
.yml
से चाबियों को कॉपी करना होगा आपके प्रोजेक्ट के.yml
. में फ़ाइलें फ़ाइलें। रत्न उन्हेंdevise.*.yml
. में अंतःस्थापित करता है , लेकिन हम अपने अच्छे नए डच अनुवाद को अधिलेखित नहीं करना चाहते हैं। और अगर आपने डेविस व्यू को स्टाइल किया है, तो आपको स्टाइल को भी कॉपी करना होगा। यूह। -
यदि आपके पास पहले से ही i18n-ed प्रोजेक्ट हैं, तो आप दृश्य फ़ाइलों की प्रतिलिपि बना सकते हैं। (इसके साथ पिछले विकल्प के समान ही नुकसान।)
-
कुछ दृश्यों के उदाहरणों के लिए रेपो का उपयोग करें जिनका मैंने अपने नवीनतम प्रोजेक्ट में उपयोग किया था।
या इसे एक बार और सभी के लिए हल करें:नीचे की ओर, फ़ाइलों का एक सेट बनाएं जिसका उपयोग आप अभी से कर सकते हैं, ठीक वैसे ही जैसे आप उन्हें चाहते हैं। पिछले चरण के उदाहरण मेरे अपने पहले संस्करण हैं; वे आपको अपना खुद का किक-स्टार्ट करने में मदद कर सकते हैं। सभी आवश्यकताओं के लिए नीचे दी गई मिनी-चेकलिस्ट देखें।
डिवाइस फॉर्म के लिए मिनी चेकलिस्ट
- स्ट्रिंग्स जो सक्रिय रिकॉर्ड स्ट्रिंग्स नहीं हैं, उन्हें 118n-ed होना चाहिए और उनमें (ठीक से स्कोप) कुंजियाँ और अनुवाद होना चाहिए (उदाहरण के लिए, एक
views.*.yml
में संग्रहीत। फ़ाइल—उदाहरण देखें)। - ध्यान रखें कि डच अनुवाद, अपना खुद का जोड़ते समय, नए
devise.nl.yml
के अनुरूप हों । - नीचे दिए गए लेबल पर ध्यान न दें; उन्हें चरण 7 में ठीक से कैपिटलाइज़ किया जाएगा।
- यदि आपके पास पहले से ही मेलर्स i18n-ed है, तो कोई बात नहीं। यदि नहीं, तो आप चरण 8 तक उन्हें अनदेखा कर सकते हैं।
- निम्नलिखित वसीयत विचारों को रेल अनुवाद के साथ अनुवाद योग्य बनाने की आवश्यकता है (
t
) हेल्पर:- द
devise/views/shared/_links
आंशिक:सभी लिंक नाम; - द
devise/views/shared/_errors
आंशिक (डिवाइस 4.6 के बाद से) - आपके द्वारा उपयोग किए जाने वाले प्रत्येक मॉड्यूल के लिए डेविस फॉर्म में:सभी स्ट्रिंग्स जो सक्रिय रिकॉर्ड विशेषताओं के लिए लेबल नहीं हैं।
- द
चरण सात:सक्रिय रिकॉर्ड त्रुटि संदेश
इसके बाद, हमें सक्रिय रिकॉर्ड त्रुटि संदेशों को संशोधित करने की आवश्यकता है जो कि डेविस कार्यक्षमता से संबंधित हैं। जैसे "पासवर्ड खाली नहीं हो सकता", और अन्य सत्यापन।
बात यह है कि, अब जब हमने डेविस अनुवादों को अपग्रेड कर दिया है, सक्रिय रिकॉर्ड संदेशों को भी ट्विक करने की आवश्यकता है क्योंकि शैली में असंगतता वास्तव में दिख रही है। इसलिए मैंने उनमें भी बदलाव किया, डेविस अनुवादों के समान नियमों का पालन करते हुए, और सुनिश्चित किया कि वे सुसंगत हैं।
आप देखेंगे कि संदेशों का प्रारूप बदल गया है:"%{attribute} %{message}" से "%{message}"। अब हम अनूदित स्ट्रिंग के भीतर विशेषता को संदर्भित कर रहे हैं बजाय इसे स्ट्रिंग की शुरुआत में मजबूर करने के, इससे डच संदेशों को सुंदर बनाना इतना आसान हो जाता है। मेरे पास कभी-कभी अजीब संदेशों को रखने के बजाय दोहराव होता है।
नया संदेश प्रारूप यही कारण है कि, चरण 5 में, ईमेल और पासवर्ड विशेषताओं को कम करने की आवश्यकता है:त्रुटि संदेशों में, वे एक वाक्य के भीतर कहीं भी दिखाई दे सकते हैं।
मैंने :taken
. को भी बदल दिया है संदेश। डेविस नीति यह प्रकट नहीं करना है कि कोई ईमेल पता 'नहीं मिला' या 'अमान्य' है। मैंने उस नीति को रेल के taken
. तक बढ़ा दिया संदेश।
यदि आप नई संदेश शैली का अनुसरण करना चाहते हैं तो यह फ़ाइल देखें। फिर रेल के संबंधित भाग को बदलें error: messages:
मूल nl.yml
. में कुंजियां फ़ाइल। एक चेतावनी:जब आप किसी भी डिवाइस से संबंधित इनपुट के लिए सत्यापन जोड़ रहे हैं, तो कृपया दोबारा जांचें कि क्या त्रुटि संदेश अभी भी समझ में आता है। (मुझे और जांच करने की आवश्यकता है; मैंने केवल उन्हीं की जांच की है जो डेविस से संबंधित हैं।)
आठवां चरण:वे लेबल ठीक करें जिन्हें हमने अभी तोड़ा है
चरण 5 में, हमने नए त्रुटि संदेशों में उपयोग के लिए ईमेल और पासवर्ड अनुवादों को छोटा कर दिया। अब हमें लेबल . में उनके स्वरूप को ठीक करने की आवश्यकता है . कई विकल्प हैं, लेकिन जो मुझे सबसे ज्यादा पसंद है वह है अलग 'लेबल' कुंजियाँ जोड़ना।
यह उपयोगकर्ता कुंजियों के लिए कुछ दोहराव जोड़ता है, लेकिन यह प्रपत्रों में लेबल को साफ़ रखता है।
# in active_record.nl.yml add the label helper keys:
nl:
activerecord:
attributes:
user:
current_password: Huidig wachtwoord
email: e-mailadres
password: wachtwoord
password_confirmation: Herhaal het wachtwoord
remember_me: Wil je ingelogd blijven?
models:
user: Gebruiker
helpers:
label:
user:
email: Emailadres
password: Wachtwoord
ध्यान दें कि पहले से ही एक :helpers
है मूल nl.yml
. में दायरा . सामान्य तौर पर, आसान लुकअप (मनुष्यों द्वारा) के लिए, स्कोप की कुंजियों को एक साथ रखना एक अच्छा विचार है।
हमें जो अन्य परिवर्तन करने की आवश्यकता है, वे सीधे हैं। यहां से कोई बड़ा आश्चर्य नहीं होगा। .
नौवां चरण:नेविगेशन लिंक अपडेट करें
सभी लिंक खोजें जो डेविस (नेविगेशन के बारे में सोचें) की ओर इशारा करते हैं और उन्हें रेल t
के साथ i18n करते हैं सहायक।
मैं उन्हें .yml के डेविस स्कोप में कहीं रखना पसंद करता हूं। उदाहरण के लिए, मैं जोड़ूंगा t(".devise.sign_out")
:sign_out
होने के लिए :sign_up
. के समान दायरे में और :sign_in
(उदाहरण फ़ाइलें देखें)।
चरण दस:मेलर्स का अनुवाद करें।
मेलर विचारों का अनुवाद करें। कुछ विकल्प हैं:
-
आप प्रत्येक स्ट्रिंग और लिंक नाम को 'i18n' कर सकते हैं, ठीक वैसे ही जैसे हमने अन्य दृश्यों के साथ चरण 6 में किया था। आप एक अलग
mailer.*.yml
जोड़ना चाह सकते हैं । -
या आप प्रत्येक स्थान के लिए अलग मेलर दृश्य जोड़ सकते हैं:
devise/mailer/reset_password.nl.html.erb
औरdevise/mailer/reset_password.en.html.erb
. प्रत्येक अपने स्वयं के पाठ के साथ। रेल उस स्थान को चुनेंगी जो सेट की गई लोकेल से मेल खाती है।
ठीक है! अब सभी डेविस स्ट्रिंग्स का ठीक से अनुवाद किया गया है। जय!
आफ्टर केयर:डिक्लटर
मेरे विचार उदाहरण में, मैंने साझा कुंजियाँ निकालीं (जैसे :forgot_password
) और उन्हें सामान्य वसीयत के दायरे में एकत्र किया। इससे उन्हें बदलना आसान हो जाता है, लेकिन रेल उन्हें स्वचालित रूप से नहीं ढूंढ पाती हैं, इसलिए हमें वर्बोज़ सिंटैक्स की आवश्यकता होती है (t("devise.forgot_password")
), क्योंकि डॉट सिंटैक्स (t(".new_confirmation_mail")
) काम नहीं करेगा।
अगर आप active_record.*.yml
. के साथ जाते हैं , उस फ़ाइल में सक्रिय रिकॉर्ड दायरे वाली सभी कुंजियों को एकत्र करना समझ में आता है। रेल से सक्रिय रिकॉर्ड कुंजियों को स्थानांतरित करें *.yml
संबंधित active_record.*.yml
. में फ़ाइलें ।
हमारे पास *.yml
. के दो जोड़े भी हैं फ़ाइलें जो devise:
. की नकल करती हैं दायरा। डेविस व्यू की कुंजियों को devise.*.yml
. में मिलाने पर विचार करें विचार। यह वही है जो Devise-i18n रत्न करता है, और मुझे यह पसंद है। आप इसे इस तरह करेंगे:
# mixing the view scopes into devise.nl.yml
nl:
devise:
confirmations:
...
registrations:
...
edit:
...
new:
...
कुछ बदलाव और सुझाव
- मैं त्रुटि संदेश में शीर्षलेख का प्रशंसक नहीं हूं ('x त्रुटियों ने इस उपयोगकर्ता को सहेजे जाने से रोक दिया'), इसलिए मैंने इसे
errors
से हटा दिया आंशिक। - यदि आप
default_locale
सेट करते हैं करने के लिए:nl
, यदि अनुवाद नहीं मिल पाता है तो रेल चाबियों का 'मानवीकरण' कर देगी। तो,t(:some_untranslated_key)
Some Untranslated Key
के रूप में दिखाई देगा दृश्य में। - I18n-tasks रत्न से आप अप्रयुक्त कुंजियों को साफ कर सकते हैं और लापता कुंजियां जोड़ सकते हैं। यह एक अच्छा उपकरण है! हालांकि, मेरे आईडीई के पास बहुत अच्छा i18n समर्थन है और मेरे लिए यह रत्न की तुलना में तेज़ वर्कफ़्लो साबित हुआ है।
बिदाई कितना प्यारा दुख है
हमारे भाग लेने से पहले एक त्वरित अंतिम शब्द। जब मैंने यह यात्रा शुरू की थी तो मुझे उम्मीद नहीं थी कि यह उतना काम होगा जितना यह निकला। मैं बहुत खुश हूं कि अब मुझे पता है कि जटिलता कहां से आती है। और भविष्य में मेरे और आपके पास अब आवश्यक सभी परिवर्तनों की एक सूची है। वाह!
लेकिन हाथ में इस चेकलिस्ट के साथ, कार्य करने से पहले सोचें:शायद यह कुछ समय के लिए कम इष्टतम अनुवादों के साथ जीने लायक है…