.NET में स्थानीयकरण के लिए प्रभावी रणनीतियाँ [बंद]


121

मैं एक .NET MVC एप्लिकेशन के लिए UI विकसित कर रहा हूं, जिसे निकट भविष्य में सभी सामग्री के अंतर्राष्ट्रीय स्थानीयकरण की आवश्यकता होगी। मैं सामान्य रूप से .NET से बहुत परिचित हूं, लेकिन कभी भी ऐसी परियोजना नहीं थी जिसके लिए अंतर्राष्ट्रीय पहुंच पर इतना महत्वपूर्ण ध्यान केंद्रित करना आवश्यक था।

शुरू में अनुमानित अंग्रेजी में किया जा रहा है। भविष्य में स्थानीयकरण को लागू करना आसान बनाने के लिए मुझे इस बिंदु पर क्या उपाय करना चाहिए?


2
बड़ा अच्छा सवाल! मैं एक समान स्थिति का सामना कर रहा हूं और विशेषज्ञों को इस पर तौलते हुए देखना पसंद करूंगा।

किसी को भी संसाधन प्रबंधन के लिए कोई अच्छा मानक मिला है? स्थानीयकृत मान में चित्र भी शामिल हो सकते हैं, और केवल तार नहीं।

1
क्या यह WPF / सिल्वरलाइट UI, या Winforms है? मेरे (सीमित) अनुभव से स्थानीयकरण के लिए WinForms का अनुभव WPF / सिल्वरलाइट की तुलना में बहुत सरल है।
पीट स्टेंसोन्स

1
यदि आप अंत में संसाधन फ़ाइलों के बजाय डेटाबेस में अपने स्थानीयकृत स्ट्रिंग्स को संग्रहीत करते हैं, तो आप इस चर्चा पर एक नज़र डालना चाहते हैं: stackoverflow.com/questions/2458615/…

1
@Pete, @smartcaveman ने कहा कि वह "एक .NET MVC एप्लिकेशन के लिए UI विकसित कर रहा है", इसलिए ...
ब्रूनोसेवलीनो

जवाबों:


74

आप ASP.Net MVC एप्लिकेशन विकसित कर रहे हैं, क्या आप? अन्य उत्तर डेस्कटॉप अनुप्रयोगों के लिए विशिष्ट प्रतीत होते हैं। मुझे सामान्य चीजों पर कब्जा करने दें:

स्थान का पता लगाना

यह काफी महत्वपूर्ण है कि आपका एप्लिकेशन उपयोगकर्ता के लोकेल का सही पता लगाता है। डेस्कटॉप एप्लिकेशन में, CultureInfo.CurrentCulture पसंदीदा स्वरूपण लोकेल रखता है (वह जिसे संख्याओं, तिथियों, मुद्राओं इत्यादि को प्रारूपित करने के लिए उपयोग किया जाना चाहिए) जबकि संस्कृतिइन्फो.CurrentUICulture पसंदीदा उपयोगकर्ता इंटरफ़ेस लोकेल रखता है (स्थानीय संदेशों को प्रदर्शित करने के लिए इसका उपयोग किया जाना चाहिए) । जब तक आप कुछ फैंसी लोकेल डिटेक्शन वर्कफ़्लो को लागू नहीं करना चाहते (यानी मांग पर बदलती भाषा का समर्थन करना चाहते हैं) वेब अनुप्रयोगों के लिए, आपको दोनों संस्कृतियों को ऑटो में सेट करना चाहिए (जब तक कि AcceptLanguage हेडर से लोकेल का पता लगाने के लिए)।

तार बाहर करना

सभी तार संसाधनों से आने चाहिए, वह है रेक्स फाइलें। Winforms App में यह स्थानीय रूप से प्रापर्टी को सही पर सेट करके आसानी से प्राप्त किया जा सकता है। आपको अपने मॉडलों से मैन्युअल रूप से (दुर्भाग्य से) स्ट्रिंग्स को बाहरी करने की आवश्यकता होगी। यह अपेक्षाकृत सरल भी है। Asp.Net में आपको मैन्युअल रूप से सब कुछ बाहरी करने की आवश्यकता होगी ...

लेआउट

आपको निश्चित रूप से स्ट्रिंग विस्तार की अनुमति देने की आवश्यकता है। Winforms की दुनिया में यह TableLayoutPanel के माध्यम से प्राप्त करने योग्य है जिसका उपयोग यह सुनिश्चित करने के लिए किया जाना चाहिए कि लेआउट लंबे पाठ को समायोजित करने के लिए स्वचालित रूप से समायोजित हो जाएगा। वेब दुनिया में, आप भाग्य से थोड़ा बाहर हैं। आपको सीएसएस स्थानीयकरण तंत्र को लागू करने की आवश्यकता हो सकती है - सीएसएस परिभाषाओं को संशोधित (ओवरराइड) करने का एक तरीका। यह स्थानीयकरण के लोगों को मांग पर शैली के मुद्दों को संशोधित करने की अनुमति देगा। सुनिश्चित करें कि प्रदान किए गए पृष्ठ में प्रत्येक HTML तत्व में अद्वितीय आईडी है - यह इसे ठीक से लक्षित करने की अनुमति देगा।

संस्कृति विशिष्ट मुद्दे

ग्राफिक्स, रंगों और ध्वनियों के उपयोग से बचें जो पश्चिमी संस्कृति के लिए विशिष्ट हो सकते हैं। यदि आपको वास्तव में इसकी आवश्यकता है, तो कृपया स्थानीयकरण का साधन प्रदान करें। दिशा-संवेदी ग्राफिक्स से बचें (क्योंकि यह एक समस्या होगी जब आप अरबी या हिब्रू कहने के लिए स्थानीयकरण का प्रयास करेंगे)। इसके अलावा, यह मत समझिए कि पूरी दुनिया एक ही नंबर (यानी अरबी के लिए सच नहीं) का उपयोग कर रही है।

ToString () और Parse ()

के लिए सुनिश्चित करें हमेशा CultureInfo पारित जब ToString बुला () जब तक यह समर्थित नहीं है। इस तरह से आप अपने इरादों पर टिप्पणी कर रहे हैं। उदाहरण के लिए: यदि आप आंतरिक रूप से कुछ संख्या का उपयोग कर रहे हैं और किसी कारण से इसे स्ट्रिंग उपयोग में बदलने की आवश्यकता है:

int i = 42;
var s = i.ToString(CultureInfo.InvariantCulture);

उन संख्याओं के लिए जो उपयोगकर्ता के उपयोग के लिए प्रदर्शित होने वाली हैं:

var s = i.ToString(CultureInfo.CurrentCulture); // formatting culture used

Parse (), TryParse () और यहां तक ​​कि ParseExact () पर भी यही बात लागू होती है - CultureInfo के समुचित उपयोग के बिना कुछ गंदे कीड़े पेश किए जा सकते हैं। ऐसा इसलिए है क्योंकि माइक्रोसॉफ्ट में कुछ गरीब आत्मा, अच्छे इरादों से भरे हुए ने फैसला किया कि यह एक अच्छा विचार है। ) वह / वह उपयोगकर्ता के लिए, सही प्रदर्शित करना चाहते हैं? यह पता करें कि यह हमेशा ऐसा नहीं होता है - उदाहरण के लिए डेटाबेस में अपना एप्लिकेशन संस्करण नंबर संग्रहीत करने का प्रयास करें और फिर इसे संस्करण वर्ग के उदाहरण में परिवर्तित करें। सौभाग्य।

तिथियां और समय क्षेत्र

UTC में DateTime को हमेशा स्टोर और इंस्टेंट करना सुनिश्चित करें (DateTime.UtcNow के बजाय DateTime.Now का उपयोग करें)। प्रदर्शित होने पर इसे स्थानीय प्रारूप में स्थानीय समय में परिवर्तित करें:

DateTime now = DateTime.UtcNow;
var s = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);

यदि आपको शरीर में समय के संदर्भ के साथ ईमेल भेजने की आवश्यकता है, तो समय क्षेत्र की जानकारी शामिल करना सुनिश्चित करें - दोनों यूटीसी ऑफसेट और शहरों की सूची शामिल करें:

DateTime someDate; // i.e. from database
var formattedDate = String.Format("{0} {1}", 
             someDate.ToLocaleTime().ToString(CultureInfo.CurrentCulture),
             TimeZoneInfo.Local.DisplayName);

मिश्रित संदेश

आपको पहले ही चेतावनी दी जा चुकी है कि तार को न बदलें। इसके बजाय आप शायद String.Format () का उपयोग करेंगे जैसा कि ऊपर दिखाया गया है। हालाँकि, मुझे यह बताना होगा कि आपको यौगिक संदेशों का उपयोग कम से कम करना चाहिए। ऐसा केवल इसलिए है क्योंकि लक्ष्य व्याकरण के नियम काफी भिन्न हैं, इसलिए अनुवादकों को न केवल वाक्य को फिर से क्रम में रखने की आवश्यकता हो सकती है (यह प्लेसहोल्डर्स और स्ट्रिंग.फार्मेट ()) का उपयोग करके हल किया जाएगा, लेकिन इसके आधार पर पूरे वाक्य को अलग तरीके से अनुवाद करें प्रतिस्थापित किया जाएगा। मैं आपको कुछ उदाहरण देता हूँ:

// Multiple plural forms
English: 4 viruses found.
Polish: Znaleziono 4 wirusy. **OR** Znaleziono 5 wirusów.

// Conjugation
English: Program encountered incorrect character | Application encountered incorrect character.
Polish: Program napotkał nieznaną literę | Aplikacja napotkała nieznaną literę.

अन्य संघटन मुद्दे

सामंजस्य केवल तार तक सीमित नहीं है। नियंत्रणों को एक साथ रखने से बचें, कहते हैं:

[पाठ संख्या के साथ बॉक्स] दिनों में मुझे फिर से याद दिलाएं।

इसे कुछ इस तरह से फिर से डिज़ाइन किया जाना चाहिए: मुझे इस दिनों की संख्या में फिर से याद दिलाएं: [पाठ बॉक्स]।

चरित्र एन्कोडिंग और फोंट

हमेशा, यूनीकोड ​​(यानी UTF-8 में) जो भी पाठ है, उसे सहेजें, स्थानांतरित करें। हार्ड-कोड फोंट न करें - स्थानीयकरण को उन्हें संशोधित करने की आवश्यकता हो सकती है और यह डिफ़ॉल्ट फ़ॉन्ट फॉल-बैक तंत्र (Winform के मामले में) को बंद कर देगा। याद रखें कि अधिकांश क्षेत्रों (अर्थात उपयोगकर्ता नाम) में "अजीब" वर्णों की अनुमति दें।

परीक्षा

आपको संभवतः तथाकथित छद्म अनुवाद को लागू करने की आवश्यकता होगी, जो कि जर्मन संस्कृति के लिए संसाधन बनाने के लिए और उपसर्ग और प्रत्यय को जोड़ने वाले अपने अंग्रेजी तार को कॉपी करने के लिए है। आप कंपाउंड स्ट्रिंग्स का आसानी से पता लगाने के लिए प्लेसहोल्डर्स को भी लपेट सकते हैं। छद्म अनुवाद का उद्देश्य स्थानीयकरणीय मुद्दों जैसे हार्ड-कोडिंग स्ट्रिंग्स, लेआउट मुद्दों और यौगिक संदेशों के अत्यधिक उपयोग का पता लगाना है।


5
यौगिक संदेशों के बारे में - मुझे एक बार बहु-बहुवचन रूपों को करना पड़ा। मैंने इसे बढ़ाया String.Formatताकि यह इस शांत वाक्यविन्यास का समर्थन कर सके: "There {0:was|were} {0} {0:virus|viruses} found."प्रत्येक भाषा अपने नियमों को लोड कर सकती है, इसलिए आप कर सकते हैं "Znaleziono {0} {0:wirusy|wirusów}." स्रोत GitHub पर है: github.com/scottrippey/SmartFormat/wiki
स्कॉट रिप्स

2
@ सॉट रिप्पी क्या आपने देखा है कि पोलिश उदाहरण "Znaleziono 4 wirusy। या Znaleziono 5 wirusów।" <- पोलिश, कई अन्य भाषाओं की तरह, दो से अधिक बहुवचन रूप हैं और उनके बीच अंतर करने के नियम जटिल भी हो सकते हैं। यहां मुझे पोलिश छोड़ना चाहिए क्योंकि मैं इसे नहीं बोलता, लेकिन मेरी भाषा में, 101 चीजों के लिए बहुवचन रूप 1 चीज़ के लिए समान है। आप देख सकते हैं कि GNU गेटटेक्स्ट
gregopet

2
@gregopet माई पोलिश का उदाहरण दिया गया था, क्योंकि मैं इसे नहीं बोलता, लेकिन स्मार्टफॉरमैट प्रोजेक्ट यही करता है। यहाँ एक बेहतर उदाहरण है "{0} {0:plik|pliki|plików}":। फ़ॉर्मेटर में एक पोलिश नियम है जो निर्धारित करता है कि कौन से 3 रूपों का उपयोग करना है, और विशेष मामलों को सही ढंग से निर्धारित करता है। मैं वर्तमान में अधिक नियम जोड़ने पर काम कर रहा हूं, इसलिए gettextलेख बहुत उपयोगी साबित होगा, धन्यवाद।
स्कॉट रिपी

छद्म स्थानीयकरण के लिए, मैंने pseudolocalize.com पर एक मुफ्त ऑनलाइन छद्म सूचना उपकरण का निर्माण किया
JerSchneid

74

कुछ बुनियादी बातें जो आपको ध्यान में रखनी चाहिए:

सभी स्ट्रिंग संसाधनों को बाहरी करें

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

स्ट्रिंग विस्तार के लिए पर्याप्त जगह की अनुमति दें

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

ठीक है -> एसेक्राफ्ट (फ्रेंच - 400% विस्तार)

मैं एक प्रारंभिक बिंदु ( http://en.wikipedia.org/wiki/Pseudolocal ) के रूप में कुछ प्रकार के छद्म अनुवाद करने की सलाह दूंगा । या आप Google अनुवाद या बिंग के माध्यम से अपने संसाधनों का अनुवाद कर सकते हैं। यह आपको एक अच्छा संकेत देगा कि वास्तविक अनुवाद कैसा दिखेगा।

छवियों में पाठ के लिए बाहर देखो

यदि आप अपने आवेदन में किसी भी चित्र का उपयोग करते हैं - तो सुनिश्चित करें कि उनमें कोई पाठ नहीं है - यह स्पष्ट रूप से अनुवादित नहीं किया जा सकता है।

विंडोज फोल्डर में कभी भी कोई हार्डकोड न रखें

जाहिर है, लेकिन मैंने इसे अतीत में देखा है। उदाहरण के लिए, C:\Program Filesविंडोज के कुछ अंतरराष्ट्रीय संस्करणों पर अनुवादित किया गया है, उदाहरण के लिए यह C:\Programmeजर्मन ओएस पर है।

स्थानीय विशिष्ट शब्दों का उपयोग करने से बचें

उदाहरण के लिए, यदि आप किसी से अपने 'हाई स्कूल' के लिए किसी फॉर्म पर पूछते हैं, तो पश्चिमी यूरोप में इसका कोई अर्थ नहीं है।

स्ट्रिंग संगति के माध्यम से तार बनाने से बचें

उदाहरण के लिए, यह हानिरहित दिखता है:

strWelcome = ReadExternalString("Welcome"); 
strMessage = strWelcome + ", " + UserName;

लेकिन, उदाहरण के लिए जापानी शब्द का क्रम भिन्न होगा, इसलिए इसका कोई मतलब नहीं हो सकता है।

समय / दिनांक सेटिंग्स

हमेशा समय / तिथि प्रारूप प्राप्त करने के लिए सुनिश्चित करें कि ओएस।


@ जिमी सी, आप भाषा-स्वतंत्र तार्किक स्थिरता के लिए निर्माण के बारे में कैसे जाते हैं?
स्मार्टकेवमैन

14
@Smart अपने संसाधन में कुछ ऐसा करें जैसे "{0}, {1}" तब जब आप इसे स्थानीय करें, string.format का उपयोग करें और ग्रीटिंग और यूज़रनेम में पास करें। साथ ही इससे आपको "करंट {0} स्पीड {1} {2}" होने का लाभ मिलता है और आप "इंजन", "50" और "एमपीएच" में पास हो सकते हैं, और जब आप अपने वाक्य का अनुवाद करते हैं, तो आप { 0} आदि के आसपास जहां वे उस भाषा में समझ में आता है
taylonr

4
अच्छी सूची JimmyC। "विंडोज़ फोल्डर में कभी भी हार्डकोड न करें" मुझे याद दिलाया कि विंडोज़ पाथ्स के लिए स्ट्रिंग कॉन्टैनेशन के बजाय "ऑलवेज पाथ.कम्बाइन का उपयोग करें"।

@ जिमी-सी महान जवाब!

1
Environment.GetFolderPath का उपयोग उन रास्तों के अंग्रेजी नाम के आधार पर सामान्य पथ जैसे कि मेरे दस्तावेज़ जैसे मान्य पथ प्राप्त करने के लिए किया जा सकता है।
क्रिप्पेल्ड्समर्फ़

24

एशियाई भाषाओं के लिए विशेष विचार

पहले से ही सभी शानदार उत्तरों के अलावा, एशियाई भाषाओं के लिए कुछ वॉच-आउट:

पाठ की विभिन्न लंबाई से सावधान रहें

चीनी और कोरियाई पाठ समान अंग्रेजी पाठ की तुलना में बहुत छोटा हो जाता है (क्योंकि आपको आमतौर पर एक ही चीज़ लिखने के लिए कम अवरोधक वर्णों की आवश्यकता होती है), इसलिए एक पृष्ठ वास्तव में चीनी में खाली दिख सकता है लेकिन जर्मन में भरा हुआ ... आपको करने की आवश्यकता है कुछ गतिशील आकार यहाँ अच्छा लग रहा है।

हालाँकि, जापानी पाठ आमतौर पर वर्ण गणना के संदर्भ में समान अंग्रेजी पाठ की तुलना में अधिक लंबा होता है।

बेसलाइन लेआउट और "स्लेज अप" लुक से सावधान रहें

एशियाई पात्रों को आमतौर पर आधार रेखा पर रखा जाता है , जिसमें अवरोही शामिल नहीं होते हैं (अर्थात y, g, q, j आदि का निचला भाग) जब आप एक स्क्रीन तत्व को प्रारूपित करते हैं - आमतौर पर बटन - पाठ के अंदर, और यदि पाठ केवल एशियाई भाषाएं हैं (अर्थात कोई पश्चिमी वर्णमाला नहीं), फिर पाठ ऐसा दिखेगा जैसे वह ऊपर की ओर स्थानांतरित हो।

संख्याओं और स्थानीय संख्यात्मक इकाइयों का प्रारूपण

अलग से स्वरूपण संख्या संभाले। विभिन्न एशियाई देशों में संख्याओं को प्रारूपित करने के विभिन्न तरीके हैं। मुद्राओं के साथ भी। उदाहरण के लिए, पूर्वी एशिया में, 10,000 (वान) एक आम इकाई है। भारत में, 100,000 (लाख) आम है।

स्थानीय मुद्राएँ

कुछ देशों की मुद्राओं में बहुत सारे शून्य हैं और कोई दशमलव बिंदु नहीं है (जैसे जापान, इंडोनेशिया, इटली), जबकि अन्य में दशमलव बिंदु के बाद दो अंक तक हैं।

विभिन्न शब्द आदेशों से सावधान रहें

शब्द क्रम हमेशा समान नहीं हो सकता है। यदि आपका स्ट्रिंग डेटा के विभिन्न टुकड़ों के संयोजन से आता है, तो हार्ड-कोडिंग शब्द क्रम के बजाय स्ट्रिंग स्वरूपण में {0}, {1} आदि का उपयोग करना सबसे अच्छा है।

स्थानीय-विशिष्ट सॉर्ट का उपयोग करें

सॉर्टिंग प्रति भाषा और प्रति स्थान पर भिन्न होती है - आपको हमेशा O / S के स्थानीय-विशिष्ट प्रकार पर निर्भर रहना चाहिए।

पूर्ण-चौड़ाई / अर्ध-चौड़ाई वाले वर्णों से बहुत सतर्क रहें

"पूर्ण-चौड़ाई" और "आधी-चौड़ाई" वर्णों के बीच अंतर से सावधान रहें। ब्रैकेट, विराम चिह्न आदि में "पूर्ण-चौड़ाई" संस्करण हो सकते हैं जो मानक ASCII से भिन्न होते हैं। यदि आप इन अक्षरों के आधार पर खोज या स्ट्रिंग विभाजन करते हैं, तो आपको पहले सभी पूर्ण-चौड़ाई के प्रतीकों को आधी-चौड़ाई वाले समकक्षों में परिवर्तित करना होगा।

एक अवधि एक डॉट नहीं है ... एक अल्पविराम अल्पविराम नहीं है ...

डेटा इनपुट से सावधान रहें - उदाहरण के लिए, चीनी में, एक अवधि डॉट नहीं है ""। एक अल्पविराम पूर्ण-चौड़ाई है, "नहीं,"। यदि पश्चिमी डेटा उपयोगकर्ता-प्रविष्टि गलती से एशियाई भाषा IME चालू कर सकता है, तो पश्चिमी विराम चिह्न की खोज करने का प्रयास न करें।

फोन नंबर

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

यह मत समझो कि लोगों के पास केवल एक मोबाइल फोन नंबर, या एक फैक्स नंबर आदि होगा। यह एशिया में ऐसा नहीं है।

पते - आप सोच सकते हैं की तुलना में सघन

पते के लिए, कुछ भी मत मानो । हमेशा ज़िप कोड नहीं हो सकता है। ज़िप कोड हमेशा संख्या नहीं हो सकते हैं। किसी देश में प्रांत / राज्य नहीं हो सकते हैं। एक देश सिर्फ एक बड़ा शहर (जैसे सिंगापुर) हो सकता है। कुछ एशियाई देशों के लिए, एक घर की सबसे छोटी इकाई "रूम एक्स, यूनिट वाई, सेक्शन जेड, फ्लोर ए, ब्लॉक बी, ग्रुप सी, एस्टेट डी" हो सकती है। सामान्य तौर पर, फ़ील्ड्स की संख्या और पते में अनुमत वर्णों की संख्या में बहुत उदार हो ।

अभिवादन

सलाम केवल श्री, श्रीमती इत्यादि तक ही सीमित नहीं है, हालांकि आप शायद सेक्स के लिए "एम" और "एफ" का उपयोग करने में सुरक्षित हैं - हम अभी तक इस तरह से अजीब नहीं हैं ...


1
आखिरी पैराग्राफ ने मुझे मुस्कुरा दिया।
बोल्टकॉक

ओह, हम (i18n लोग) अभी भी शुरू नहीं हुए थे ... हम केवल सतह को खरोंचने में सक्षम थे :) अगर हमें GB18030 समर्थन जैसे विशिष्ट मुद्दों पर बात करनी थी, तो एसओ को संभालने के लिए हमारी पोस्ट बहुत लंबी होगी :) धन्यवाद आपके नोट के लिए वैसे भी, मैं काफी कुछ आइटम याद किया।
पावेल डिडा

आखिरी के बारे में, मेरा मानना ​​है कि यूके अब आधिकारिक तौर पर "अन्य" को सेक्स के रूप में स्वीकार करता है। ट्रांसजेंडर्स के बारे में सोचो।
बार्ट फ्रेडरिकिच

11

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

इसलिए आपके कोड में "अपलोड विफल" के बजाय, आपके पास Resources.UploadFailed जैसा कुछ हो सकता है

इस तरह आप अपने द्वारा उपयोग की जाने वाली प्रत्येक भाषा के लिए एक नई संसाधन फ़ाइल बना सकते हैं (और .net इससे मदद करेगा।) और प्रत्येक फ़ाइल में स्थानीयकृत स्ट्रिंग है।

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


1
मेरे L10n अनुभव से, रूसी सबसे खराब स्थिति है। हालांकि WinLs में TableLayoutPanels के उचित उपयोगकर्ता के साथ एक स्ट्रिंग को इनायत से संभाल सकते हैं।
पावेल डिडा

हाँ, मेरा अनुभव 7 भाषाओं तक सीमित था: अंग्रेजी, जर्मन, पुर्तगाली, इतालवी, फ्रेंच, स्पेनिश और जापानी। लेकिन मैं देख रहा हूँ कि रूसी बहुत खराब है क्योंकि उनमें बहुत सारे प्रत्यय और उपसर्ग होते हैं
taylonr

9

मेरा सुझाव है कि आप अपने असेंबली पर FXCop या Visual Studio कोड विश्लेषण (वे काफी समान हैं) चलाते हैं।

वे .NET कोड का पता लगाने में अच्छे हैं जो उचित संस्कृति उन्मुख अधिभार का उपयोग नहीं करते हैं, जैसे कि यह एक: CA1305: IFormatProvider निर्दिष्ट करें

मुझे यह जोड़ना चाहिए कि ये उपकरण इसलिए भी निराशाजनक हैं क्योंकि वे आमतौर पर आपके कोड में मुद्दों के क्षेत्र का पता लगाते हैं, लेकिन फिर भी, भले ही आप प्रत्येक नियम का पालन न करें, आपको बहुत कुछ सीखना चाहिए।


क्या यह डिफ़ॉल्ट है, या क्या मुझे इसके लिए वैश्वीकरण-विशिष्ट नियमों की खोज के लिए कुछ सेटिंग निर्दिष्ट करने की आवश्यकता है?
स्मार्टकेवमैन

@smartcaveman - यह डिफ़ॉल्ट है (हम्म .. वास्तव में, कुछ लोगों को लगता है कि इन उपकरणों में बहुत डिफ़ॉल्ट नियम हैं :-)
साइमन मूरियर

7

विशिष्ट के अलावा संसाधनों को कैसे लोड किया जाए, मुझे यकीन है कि आप एक छद्म स्थानीयकृत संस्करण के साथ परीक्षण करना शुरू करेंगे। अन्यथा आप उन स्थानों को नोटिस करने की संभावना नहीं रखते हैं जहां अंत तक अंतर्राष्ट्रीयकरण विचार छोड़ दिए गए थे।


एक त्वरित, आसान तरीका pseudolocalize करने के लिए, मैं में एक नि: शुल्क ऑनलाइन उपकरण का निर्माण किया pseudolocalize.com
JerSchneid

6

अन्य सभी सहायक संकेतों के अलावा, यहां कुछ ऐसे हैं जो गायब हैं:

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

यदि आप उपयोगकर्ता से एक प्रश्न पूछते हैं जो एकल पत्र उत्तर की अपेक्षा करता है, तो उपयोगकर्ता को हां कहने के लिए 'Y' कुंजी दबाने की अपेक्षा न करें।

Stored procs में बहुत जागरूक रहें जो SQL DB में दिनांक यूएसए प्रारूप में हैं

DB में टेक्स्ट स्ट्रिंग्स रखने से आप बाद में अतिरिक्त भाषाओं को बिना रीडेपॉलिंग के जोड़ सकते हैं।

अनुवाद के लिए लिखित पाठ फ़ाइलें भेजते समय, अनुवादक के सही शब्द का चयन सुनिश्चित करने के लिए हमेशा संदर्भ का विवरण शामिल करें। उदाहरण के बिना, आप "पिच:" का अनुवाद ध्वनि या ऐसी जगह पर कर सकते हैं, जिस पर आप फ़ुटबॉल खेलते हैं

पता लेबल को हमेशा परिवर्तित करने की आवश्यकता होती है। कनाडा में प्रांत, अमेरिका में राज्य, यूके में काउंटी


5

आपको विचार करने की आवश्यकता है:

  1. बहुभाषी के लिए रूटिंग

  2. सभी हार्डकोड स्ट्रिंग को संसाधन फ़ाइल में ले जाएं

एक संपत्ति के लिए एक उदाहरण:

आदर्श:

[Display(Name = <Resource for display name>.<field for this property>)]
[Required(ErrorMessage = <Resource for error message>.<field for this validate message>)]
public string TestProperty { get; set; }

राय:

@Html.LabelFor(m=>m.TestProperty)
@Html.EditorFor(m => m.TestProperty)
@Html.ValidationMessageFor(m => m.TestProperty)

5

यहाँ कुछ का जवाब बाकी में नहीं दिया गया है।

आपके आवेदन की जटिलता और इसके स्थानीयकरण के आधार पर, मैं एक वैकल्पिक संसाधन प्रदाता को लागू करने और स्थानीय संसाधनों को एक डेटाबेस में रखने की अत्यधिक सलाह दूंगा। डिफ़ॉल्ट ASP.NET स्थानीयकरण योजना के साथ सभी संसाधन RESX फ़ाइलों में रखे जाते हैं, जो:

  1. दृश्य स्टूडियो में संपादित करने के लिए बट में दर्द होता है
  2. आवेदन संकलित / शिप / चलाने के बाद स्थानीयकृत संसाधनों के वितरण और प्रबंधन को सीमित करें।

संभावित उपयोग के मामले में, अपने एप्लिकेशन के लिए भाषा पैक प्रदान करने और यूआई के माध्यम से भाषाओं को आयात और निर्यात करने की क्षमता पर विचार करें। RESX फाइलें यहां मदद नहीं करेंगी।

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


1
इन महान जवाबों को देखने के लिए समय निकालने के लिए धन्यवाद और फिर भी कुछ नया और उपयोगी योगदान देने के लिए।
स्मार्टक्वेमैन

+1; मैंने Asp.NET में एक व्यापक वेब एप्लिकेशन बनाया है और हमने डेटाबेस के माध्यम से अनुवाद करना समाप्त कर दिया है। नई सुविधाओं को अक्सर जोड़ा गया था, लेकिन जब हमारे अनुवादक विशेष शब्दावली में विशेषज्ञ नहीं थे, तो हम इस प्रकार के क्रोधित ग्राहक ईमेलों को जल्दी से संबोधित करने में सक्षम थे "आप एक्स के लिए वाई शब्द का उपयोग क्यों कर रहे हैं जो स्पष्ट रूप से गलत है?"।
gregopet

3

सबसे महत्वपूर्ण बात विभिन्न भाषाओं में सामग्री का प्रबंधन है। मैंने स्वयं वेबसेवी के कुछ जोड़े विकसित किए हैं और विभिन्न भाषा में सामग्री का प्रबंधन करना सबसे बड़ी चुनौती है।

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

आप बाद में किसी भाषा में अंग्रेजी मूल्य को परिवर्तित करने के लिए एक अनुवादक का उपयोग कर सकते हैं।


2

अंतर्राष्ट्रीयकरण पर विचार करने के लिए चीजों का सारांश:

  • सभी सूचनाओं का अंतर्राष्ट्रीयकरण किया जाना चाहिए। ध्यान रखें कि ग्राफिक्स में ऐसी जानकारी हो सकती है जिसे हम अंतर्राष्ट्रीयकरण करना चाहते हैं।

  • फ़ील्ड या स्ट्रिंग्स का आकार, भाषा पर निर्भर करता है क्योंकि यह हमें एक समस्या पैदा कर सकता है।

  • शब्दों का क्रम उस भाषा पर निर्भर करता है जो हम हैं, इसलिए एक भाषा में एक आदेश दूसरे में समान होगा।

  • हमें इस बात का ध्यान रखना चाहिए कि तिथि प्रारूप एक भाषा से दूसरी भाषा में बदल जाएगा


1

क्या तुर्की परीक्षण :

सॉफ्टवेयर अंतर्राष्ट्रीयकरण है परिस्थितियों का सबसे अच्छा के तहत मुश्किल है, लेकिन यह हमेशा मुझे चकित कितनी बार एक विशेष रूप से देश अंतर्राष्ट्रीयकरण समस्याओं की चर्चा में आया था: तुर्की ...

यदि आप स्थानीयकरण या अंतर्राष्ट्रीयकरण के बारे में एक सफेद परवाह करते हैं, तो अपने कोड को तुर्की लोकल के तहत जल्द से जल्द चलाने के लिए मजबूर करें । यह आपके कोड के लिए एक मजबूत बेलवेस्टर है जो अधिकांश में चल रहा है - लेकिन सभी साधनों और संस्कृतियों से नहीं ...

यदि आपकी साइट / कार्यक्रम तुर्की क्लाइंट के साथ अच्छी तरह से चलता है, तो आप सुनिश्चित कर सकते हैं कि यह अधिकांश अन्य प्लेटफार्मों पर चलेगा।

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