स्ट्रिंग्स और लेबल के स्थानीयकरण और वैश्वीकरण के लिए सबसे अच्छा अभ्यास [बंद]


124

मैं 20 से अधिक डेवलपर्स वाली टीम का सदस्य हूं। प्रत्येक डेवलपर एक अलग मॉड्यूल (10 मॉड्यूल के पास कुछ) पर काम करता है। प्रत्येक मॉड्यूल में हमारे पास कम से कम 50 CRUD फॉर्म हो सकते हैं, जिसका अर्थ है कि वर्तमान में हमारे पास 500 ऐड बटन , सेव बटन , एडिट बटन आदि हैं।

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

अब तक हमने जो कुछ किया है, वह यह है कि UI या प्रेजेंटेशन लेयर में प्रत्येक दृश्य के लिए, हमारे पास अनुवादों के प्रमुख / मूल्य युग्मों का शब्दकोश है। फिर दृश्य प्रस्तुत करते समय, हम इस शब्दकोश का उपयोग करके आवश्यक ग्रंथों और तार का अनुवाद करते हैं। हालांकि, इस पद्धति, हम 500 के पास कुछ है पर आए हैं ऐड 500 शब्दकोशों में। इसका मतलब है कि हमने DRY प्रिंसिपल का उल्लंघन किया है।

दूसरी ओर, यदि हम सामान्य स्ट्रिंग्स को केंद्रीकृत करते हैं, जैसे कि एक जगह में ऐड लगाना , और डेवलपर्स को हर जगह इसका उपयोग करने के लिए कहें, तो हम यह सुनिश्चित करने की समस्या का सामना करते हैं कि क्या कोई स्ट्रिंग पहले से ही केंद्रीकृत शब्दकोश में परिभाषित है या नहीं।

एक अन्य विकल्प हो सकता है कि कोई अनुवाद शब्दकोश न हो और Google अनुवाद, बिंग अनुवादक आदि जैसी ऑनलाइन अनुवाद सेवाओं का उपयोग करें।

एक और समस्या जिसका हमें सामना करना पड़ा है, वह यह है कि प्रोजेक्ट को समय पर वितरित करने के तनाव के तहत कुछ डेवलपर्स अनुवाद कुंजियों को याद नहीं रख सकते हैं । उदाहरण के लिए, ऐड बटन के पाठ के लिए, एक डेवलपर ने ऐड का उपयोग किया है जबकि दूसरे डेवलपर ने नए का उपयोग किया है , आदि।

किसी अनुप्रयोग के स्ट्रिंग संसाधनों के वैश्वीकरण और स्थानीयकरण के लिए सबसे अच्छा अभ्यास या सबसे प्रसिद्ध तरीका क्या है?


2
बात द्वारा एलेक्स सेक्सटन पर विषय क्लाइंट साइड अंतर्राष्ट्रीयकरण जे एस यूरोपीय संघ के सम्मेलन से एक अच्छी शुरुआत है।
मिंको गेचेव

जवाबों:


51

जहाँ तक मुझे पता है, localeplanetजावास्क्रिप्ट में स्थानीयकरण और अंतर्राष्ट्रीयकरण के लिए एक अच्छी लाइब्रेरी कहा जाता है । इसके अलावा, मुझे लगता है कि यह मूल है और अन्य पुस्तकालयों (जैसे jQuery) के लिए कोई निर्भरता नहीं है

यहाँ पुस्तकालय की वेबसाइट है: http://www.localeplanet.com/

मोज़िला के इस लेख को भी देखें, आप क्लाइंट-साइड अनुवाद के लिए बहुत अच्छी विधि और एल्गोरिदम पा सकते हैं: http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with- एक-छोटी-सहायता-से-json और सर्वर /

उन सभी लेखों / पुस्तकालयों का सामान्य हिस्सा यह है कि वे एक i18nकक्षा और एक getविधि का उपयोग करते हैं (कुछ मायनों में एक छोटे फ़ंक्शन नाम को भी परिभाषित करते हैं _) को पुनः प्राप्त करने / परिवर्तित keyकरने के लिए value। मेरे समझाने का keyअर्थ है कि स्ट्रिंग आप अनुवाद करना चाहते हैं और valueअनुवादित स्ट्रिंग का मतलब है।
उसके बाद, आप बस की दुकान में एक JSON दस्तावेज़ की जरूरत keyहै और valueकी।

उदाहरण के लिए:

var _ = document.webL10n.get;
alert(_('test'));

और यहाँ JSON:

{ test: "blah blah" }

मेरा मानना ​​है कि वर्तमान लोकप्रिय पुस्तकालयों के समाधान का उपयोग करना एक अच्छा तरीका है।


1
कोई अपराध नहीं है, लेकिन क्या यह अफशीन पहले से ही कोशिश कर रहा है? वह समस्या यह है कि विभिन्न डेवलपर्स को यह याद रखने में कठिनाई होती है कि किस कुंजी का उपयोग करना है। मैं इससे सहमत हूं कि आपकी बताई गई विधि रास्ता तय करना है। मैं नहीं देखता कि यह कैसे हो सकता है। महान लिंक btw के लिए धन्यवाद।
स्पॉक

47

जब आप को हल करने के लिए एक समस्या का सामना करना पड़ता है (और स्पष्ट रूप से, जो इन दिनों नहीं है?), आम तौर पर हमारे द्वारा कंप्यूटर लोगों द्वारा ली गई मूल रणनीति को "विभाजित और जीतना" कहा जाता है। यह इस प्रकार चलता है:

  • छोटी उप-समस्याओं के एक सेट के रूप में विशिष्ट समस्या की अवधारणा करें।
  • प्रत्येक छोटी समस्या का समाधान करें।
  • विशिष्ट समस्या के समाधान में परिणामों को मिलाएं।

लेकिन "फूट डालो और जीतो" केवल संभव रणनीति नहीं है। हम एक अधिक सामान्य दृष्टिकोण भी अपना सकते हैं:

  • विशिष्ट समस्या को एक अधिक सामान्य समस्या के विशेष मामले के रूप में संकल्पित करें।
  • किसी तरह सामान्य समस्या हल करें।
  • विशिष्ट समस्या के लिए सामान्य समस्या के समाधान को अपनाना।

- एरिक लिपर्ट

मेरा मानना ​​है कि इस समस्या के लिए ASP.Net/C# जैसी कई समाधान पहले से मौजूद हैं।

मैंने समस्या के कुछ प्रमुख पहलुओं को रेखांकित किया है

  • समस्या : हमें केवल वांछित भाषा के लिए डेटा लोड करना होगा

    समाधान : इस प्रयोजन के लिए हम प्रत्येक भाषा के लिए एक अलग फाइल में डेटा को सहेजते हैं

पूर्व। res.de.js, res.fr.js, res.en.js, res.js (डिफ़ॉल्ट भाषा भाषा के लिए)

  • समस्या: प्रत्येक पृष्ठ के लिए संसाधन फ़ाइलों को अलग किया जाना चाहिए ताकि हमें केवल वह डेटा मिले जो हमें चाहिए

    समाधान : हम कुछ उपकरणों का उपयोग कर सकते हैं जो पहले से मौजूद हैं जैसे कि https://github.com/rgrove/lazyload

  • समस्या: हमें अपना डेटा बचाने के लिए एक कुंजी / मान युग्म संरचना की आवश्यकता है

    समाधान : मैं स्ट्रिंग / स्ट्रिंग हवा के बजाय एक जावास्क्रिप्ट ऑब्जेक्ट का सुझाव देता हूं। हम एक IDE से इंटैलिजेंस से लाभ उठा सकते हैं

  • समस्या: सामान्य सदस्यों को एक सार्वजनिक फ़ाइल में संग्रहित किया जाना चाहिए और सभी पृष्ठों को उन तक पहुंचना चाहिए

    समाधान : इस उद्देश्य के लिए मैं Global_Resource नामक वेब एप्लिकेशन की जड़ में एक फ़ोल्डर बनाता हूं और प्रत्येक उप फ़ोल्डर्स के लिए वैश्विक फ़ाइल संग्रहीत करने के लिए एक फ़ोल्डर जिसे हमने इसे 'Local_Resources' नाम दिया है

  • समस्या: प्रत्येक सबसिस्टम / सबफ़ोल्डर / मॉड्यूल सदस्य को अपने दायरे में Global_Resources सदस्यों को ओवरराइड करना चाहिए

    समाधान : मैंने प्रत्येक के लिए एक फ़ाइल पर विचार किया

आवेदन संरचना

root/
    Global_Resources/
        default.js
        default.fr.js
    UserManagementSystem/
        Local_Resources/
            default.js
            default.fr.js
            createUser.js
        Login.htm
        CreateUser.htm

फ़ाइलों के लिए संबंधित कोड:

Global_Resources / default.js

var res = {
    Create : "Create",
    Update : "Save Changes",
    Delete : "Delete"
};

Global_Resources / default.fr.js

var res = {
    Create : "créer",
    Update : "Enregistrer les modifications",
    Delete : "effacer"
};

वांछित भाषा के लिए संसाधन फ़ाइल Global_Resource से चयनित पृष्ठ पर लोड की जानी चाहिए - यह पहली फ़ाइल होनी चाहिए जो सभी पृष्ठों पर लोड की गई हो।

UserManagementSystem / Local_Resources / default.js

res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";

UserManagementSystem / Local_Resources / default.fr.js

res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";

UserManagementSystem / Local_Resources / createUser.js

// Override res.Create on Global_Resources/default.js
res.Create = "Create User"; 

UserManagementSystem / Local_Resources / createUser.fr.js

// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";

manager.js फ़ाइल (यह फ़ाइल अंतिम लोड होनी चाहिए)

res.lang = "fr";

var globalResourcePath = "Global_Resources";
var resourceFiles = [];

var currentFile = globalResourcePath + "\\default" + res.lang + ".js" ;

if(!IsFileExist(currentFile))
    currentFile = globalResourcePath + "\\default.js" ;
if(!IsFileExist(currentFile)) throw new Exception("File Not Found");

resourceFiles.push(currentFile);

// Push parent folder on folder into folder
foreach(var folder in parent folder of current page)
{
    currentFile = folder + "\\Local_Resource\\default." + res.lang + ".js";

    if(!IsExist(currentFile))
        currentFile = folder + "\\Local_Resource\\default.js";
    if(!IsExist(currentFile)) throw new Exception("File Not Found");

    resourceFiles.push(currentFile);
}

for(int i = 0; i < resourceFiles.length; i++) { Load.js(resourceFiles[i]); }

// Get current page name
var pageNameWithoutExtension = "SomePage";

currentFile = currentPageFolderPath + pageNameWithoutExtension + res.lang + ".js" ;

if(!IsExist(currentFile))
    currentFile = currentPageFolderPath + pageNameWithoutExtension + ".js" ;
if(!IsExist(currentFile)) throw new Exception("File Not Found");

आशा करता हूँ की ये काम करेगा :)


7
इस दृष्टिकोण के बारे में केवल एक चीज मुझे पसंद नहीं है कि स्थानीयकरण और विकास को कसकर जोड़ा जाता है ... इसलिए जब एक अंग्रेजी (जो भी डिफ़ॉल्ट है) को जोड़ा जाता है, बाकी भाषाओं को कोड के माध्यम से अद्यतन करना पड़ता है। मैं बजाय JSON अनुवाद फ़ाइल के कुछ प्रकार से एक उपकरण के साथ बनाया है। फिर भी एक अच्छा प्रतिनिधित्व!
नैट-विल्किंस

उसी तरह से किया है जैसे आपने स्थानीयकरण के लिए किया था, आप इस प्रश्न में देख सकते हैं: stackoverflow.com/q/53864279/4061006 । केवल एक चीज यह है कि कैसे आप Global_Resources / default.js का Global_Resources / default.fr.js में अनुवाद कर रहे हैं? आप उन फ़ाइलों को वांछित भाषाओं में बदलने के लिए किस टूल / किट का उपयोग कर रहे हैं। चूँकि मुझे इसकी भी आवश्यकता है
जयावेल

आपको प्रत्येक मुख्य विवरण के साथ एक मानव-पठनीय टिप्पणी संग्रहीत करनी चाहिए जहां स्ट्रिंग जाती है और इसका क्या अर्थ है, ताकि आप अनुवादक को (या स्वयं को) और अधिक संदर्भ प्रदान कर सकें जब आप एक नई भाषा जोड़ने के लिए जाते हैं और आप कुछ भूल गए हैं तार का मतलब है। कुछ ऐसा करें "Create" : {"message": "Create", "description": "text on the button that opens the editor with a blank Foo"}जैसे वे उदाहरण के लिए क्रोम एक्सटेंशन को स्थानीय बनाने के लिए करते हैं। या इन टिप्पणियों को पकड़कर एक अलग फाइल बनाएं।
बोरिस

13

jQuery.i18n आपके वेब पृष्ठों में अंतर्राष्ट्रीयकरण को सक्षम करने के लिए एक हल्का jQuery प्लगइन है। यह आपको जावा संसाधन बंडल की तरह, '.properties' फ़ाइलों में कस्टम संसाधन स्ट्रिंग्स को पैकेज करने की अनुमति देता है। यह ब्राउज़र द्वारा रिपोर्ट की गई भाषा या भाषा के आधार पर संसाधन बंडलों (और .properties) को लोड और पार्स करता है।

इस बारे में अधिक जानने के लिए JQuery का उपयोग करके अपने पृष्ठों का अंतर्राष्ट्रीयकरण कैसे करें?


लिंक गया है
अलेक्जेंडर फारबर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.