ठीक से संख्याओं का स्थानीयकरण कैसे करें?


38

मेरे फ्रंट-एंड एप्लिकेशन में संख्याओं का स्थानीयकरण करते समय मुझे कौन-कौन से प्रश्न मालूम होने चाहिए?

उदाहरण: ब्राजील के पुर्तगाली (पीटी-बीआर) में हम डॉट्स के साथ हजारों और कॉमा के साथ डेसीमल विभाजित करते हैं। अमेरिकी अंग्रेजी (en-US) में इसके विपरीत है। पीटी-बीआर में हम हजारों द्वारा अलग किए गए अंकों को एन-यूएस के रूप में प्रस्तुत करते हैं। लेकिन आज भारतीय अंग्रेजी (en-IN) के बारे में पढ़कर मुझे इस मणि के बारे में पता चला:

डिजिट ग्रुपिंग के लिए भारतीय नंबरिंग प्रणाली को प्राथमिकता दी जाती है। जब शब्दों में लिखा जाता है, या जब बात की जाती है, तो मानक अंग्रेजी में 100,000 / 100 000 से कम संख्याएं व्यक्त की जाती हैं। भारतीय नंबरिंग प्रणाली के सबसेट में 100,000 / 100 000 से अधिक संख्याएं शामिल हैं।

https://en.wikipedia.org/wiki/Indian_English#Numbering_system

जिसका मतलब है:

1000000 units in pt-BR are formatted 1.000.000
1000000 units in en-US are formatted 1,000,000
1000000 units in en-IN are formatted 10,00,000

कॉमा और डॉट्स और अन्य विशिष्ट विभाजकों के अलावा, ऐसा लगता है कि मास्किंग भी एक वैध चिंता है।

अपने फ्रंट-एंड एप्लिकेशन में संख्याओं का स्थानीयकरण करते हुए मुझे कौन से अन्य चेतावनी के बारे में पता होना चाहिए? विशेष रूप से अगर मैं गैर-लैटिन वर्ण सेटों को संख्या दिखा रहा हूँ?


3
पैसे से निपटने के दौरान और भी दिलचस्प हो जाता है! :-)
स्टीफ़न बिज़िटर 21

4
मार्टियन नंबरिंग प्रणाली के बारे में बात नहीं कर रहे हैं, जिसमें आधार 6 (दो बार 3 उंगलियां);; लेकिन जापानी में भी एक अजीबता है: आदमी = 10.000 को 1.0000 के रूप में लिखा गया है, oku = 100.000.000 जापान में 1.0000.0000 और chō के रूप में लिखा गया है। .. अनुमान
qwerty_so

6
आपको इस बारे में चिंता क्यों करनी है? क्या आप OS सेटिंग का पालन नहीं कर सकते?
Jan Doggen

3
@JanDoggen क्योंकि यह सॉफ्टवेयर इंजीनियरिंग डोमेन की दिलचस्प समस्याओं में से एक है, "लोगों को डेटा कैसे ठीक से प्रस्तुत करें"। किसी सिस्टम को डिज़ाइन करते समय मुझे इस बारे में चिंतित होना चाहिए कि इस प्रश्न का डोमेन क्या है। और मैं पैसे के बारे में भी बात नहीं कर रहा हूं, जैसा कि हमारे दोस्त स्टीफन ने कहा, न ही तारीख और समय। बस कच्चे नंबर।
मचाडो

5
@JanDoggen, ऑनलाइन सॉफ्टवेयर के साथ काम करते समय यह बहुत अधिक जटिल हो जाता है। उपयोगकर्ता अमेरिकी अंग्रेजी कंप्यूटर पर भारत में हो सकता है, लेकिन ब्राजील के पुर्तगाली में एक वेबपेज पढ़ रहा है। आपका सर्वर चीनी हो सकता है। आपके ऐप को समझना चाहिए कि उपयोगकर्ता क्या चाहता है, वह इस बात की परवाह किए बिना कि वह किस ओएस का उपयोग कर रहा है, या आपका सर्वर कहां है। तो आपके 1,000.00 डॉलर 67.545,00 रुपये बन जाते हैं: एक अमेरिकी मुद्रा, स्थानीय विनिमय दर पर परिवर्तित, लेकिन पुर्तगाली प्रारूप में प्रदर्शित होती है।
noderman

जवाबों:


87

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

उदाहरण के लिए, C # इकोसिस्टम में System.Globalization नामस्थान है, जो आपको यह निर्दिष्ट करने की अनुमति देता है कि Cultureआप क्या चाहते हैं:

Console.WriteLine(myMoneyValue.ToString("C", "en-US"));

यह कुछ ऐसा नहीं है जिसे आप फिर से आविष्कार करना चाहते हैं। अपनी पसंदीदा भाषा या रूपरेखा द्वारा प्रदान की गई अंतर्राष्ट्रीयकरण सुविधाओं का उपयोग करें।


2
मैं System.Globalization और अन्य चौखटों से अवगत हूँ जो मेरे लिए इस तरह की जटिलता को संभालते हैं। मुझे नहीं पता कि वे क्या समस्याएं हल कर रहे हैं। उदाहरण के लिए, कई अनुप्रयोग जो मुझे दिखते हैं, वे ToString पर विशिष्ट मास्किंग का उपयोग करते हैं, जैसे .TString ("#, ## 0.00", लोकेल), लेकिन यदि मैं किसी भारतीय व्यक्ति को यह नंबर दिखा रहा हूं, तो वह मास्क प्रति-अमान्य है। तो, "विशिष्ट मास्क का उपयोग न करें" के अलावा, मुझे और क्या जानकारी होनी चाहिए?
मचाडो 16

7
कुछ भी नहीं जो मुझे पता है। यदि आप सही तरीके से फ्रेमवर्क का उपयोग करते हैं, तो यह सिर्फ काम करना चाहिए। अंतर्राष्ट्रीयकरण की समस्याओं के कुछ निश्चित, विशिष्ट मामले हैं, लेकिन उनमें से एक व्यापक सूची का निर्माण कुछ ऐसा नहीं है जो हम यहां करते हैं। इस उदाहरण को देखें ।
रॉबर्ट हार्वे

5
यह एकमात्र सही उत्तर है: अपना स्थान निर्धारित करें, फिर उपयोगकर्ता को प्रदर्शित करने से पहले i18n परत के माध्यम से अपने मूल्यों को धक्का दें और रूपरेखा लेखकों को इससे निपटने दें। यह संख्याओं, मुद्रा मूल्यों, अनुवादित तारों, तिथियों, सब कुछ के लिए सही है।

2
एकदम सही जवाब। "पहिया को मजबूत न करें" एक ऐसी चीज है जिसे हमेशा इस तरह की सामान्य समस्याओं से निपटने के दौरान ध्यान में रखा जाना चाहिए। यह अफ़सोस की बात है कि मैं एक से अधिक बार उत्थान नहीं कर सकता।
BgrWorker

3
@ मचाडो "उदाहरण के लिए, कई अनुप्रयोग जो मैं देख रहा हूँ, वे टोगरिंग पर विशिष्ट मास्किंग का उपयोग करते हैं, जैसे .ToString (" #, ## 0.00 ", लोकेल), लेकिन अगर मैं किसी भारतीय व्यक्ति को यह संख्या दिखा रहा हूँ तो वह मुखौटा प्रति-से अवैध है । " - यह स्पष्ट नहीं हो सकता है, लेकिन ध्यान दें कि ,प्रारूप स्ट्रिंग की स्थिति काफी हद तक अप्रासंगिक है और "#, 0.00" का समान प्रभाव होगा। ,बस "स्थानीय लोगों द्वारा निर्दिष्ट तरीके से संख्या समूह विभाजकों का उपयोग करें"।
hvd

23

कुछ उत्कृष्ट उत्तर यहां पहले से ही हैं, लेकिन उन्होंने एक बात का उल्लेख नहीं किया है जो मुझे लगता है कि महत्वपूर्ण है कि भूल न करें: सुनिश्चित करें कि जहां भी नंबर स्वरूपण होता है, यह स्पष्ट है (या नियंत्रित किया जा सकता है) कि आउटपुट का उपयोग किसके लिए किया जाता है:

  • जब यह यूजर इंटरफेस के लिए है, तो स्थानीय स्वरूपण लागू किया जाना चाहिए

  • जब संख्या किसी फ़ाइल में लिखी जाने वाली होती है, या नेटवर्क पर भेजी जाती है, या मशीन रीडेबल रूप में नंबर की आवश्यकता होती है , तो यह सुनिश्चित करें कि यह वर्तमान संस्कृति के अनुसार स्वरूपित नहीं है, लेकिन एक निश्चित सेटिंग के अनुसार (उदाहरण के लिए, .NET वातावरण में, उपयोग करें InvariantCulture)।

अन्यथा आपको संस्कृति ए का उपयोग करके नंबर लिखे या भेजे जाने पर समस्याएं आती हैं, और संस्कृति बी का उपयोग करके पढ़ा या प्राप्त किया जाता है।

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

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


2
और इससे भी बदतर कई आधुनिक भाषा में मानक पुस्तकालय में स्पष्ट / डिफ़ॉल्ट कार्य "स्थानीयकृत" हैं। इसलिए यदि डेवलपर को स्थानीयकरण के बारे में पता नहीं है या परवाह नहीं है, तो परिणामस्वरूप आवेदन विदेशी प्रणालियों पर केवल बदसूरत होने के बजाय विघटनकारी होने की संभावना है।
पीटर ग्रीन

4
मैं उतना ही बुरा मानता हूं। ऐसा उपकरण जो यूआई में स्थानीय संख्यात्मक सम्मेलनों का पालन नहीं करता है, वह अभी भी प्रयोग करने योग्य है। एक उपकरण जो पढ़ने में विफल रहता है वह स्वयं डेटा फ़ाइल है या संख्यात्मक कन्वेंशन बेमेल होने के कारण इसके सर्वर से बात करने में विफल रहता है।
पीटर ग्रीन

5
इसका एक किस्सा: en-ZA के लिए दशमलव सेपरेटर विन 7 और विन 8 के बीच बदल गया। पहले स्थानीय रूप से संग्रहीत मानों को विफल करने के लिए असफल होना शुरू हो गया
Caleth

1
@PeterGreen: एक उपकरण है कि यह के UI में स्थानीय सांख्यिक परंपराओं का पालन नहीं करता है हो सकता है अभी भी प्रयोग करने योग्य होने, या यह हो सकता है कुछ उपयोग के मामलों के लिए पूरी तरह से बेकार हो। मैं इस तरह की धारणाएँ बनाने से बहुत सावधान रहूँगा। इतने सारे देवों को संख्याओं का स्थानीयकरण गलत होने का कारण बिल्कुल यही है - इस प्रकार की धारणाएँ बनाना।
Doc Brown

1
@DocBrown मेरे पास मानक पुस्तकालय के स्थानीय पूर्णांक / फ्लोट पार्सिंग रूटीन से ग्रस्त होने के लिए सबसे भयानक विरासत कोड है। मुझे लगता है कि यह कहना उचित है कि स्थानीयकरण की परवाह किए बिना लिखा गया एक कार्यक्रम जब इन नौकरियों के लिए डिफ़ॉल्ट दिनचर्या गैर-स्थानीयकृत होती है, तो कुछ स्थितियों के लिए अनुपयोगी हो सकती है, लेकिन यदि डिफ़ॉल्ट दिनचर्या स्थानीय होती है, तो कार्यक्रम हमेशा के लिए टूट जाएगा। एक ऐसे कंप्यूटर पर निष्पादित किया जाता है जहां वैश्विक स्थान अंग्रेजी नहीं है।
सेबस्टियन रेडल

9

उचित स्थानीयकरण काफी कठिन है। अधिकांश प्रोग्रामिंग इकोसिस्टम में स्थानीयकरण के समाधान के प्रयास हैं, लेकिन मेरे अनुभव में वे कमोबेश सभी टूट चुके हैं। इसलिए मैं सुझाव दूंगा:

  • स्थानीयकरण को स्वचालित करने का प्रयास न करें। यह हमेशा काम नहीं करेगा। आपके लिए समस्याओं को समझना मुश्किल है, और आपके उपयोगकर्ताओं के लिए निराशाजनक है।

  • सुसंगत रहें: विभिन्न भाषाओं और स्वरूपण सम्मेलनों का मिश्रण न करें, जैसे अंग्रेजी पाठ में ब्राज़ीलियन शैली के दशमलव विभाजक।

  • स्पष्ट रूप से स्थानों के एक सेट का समर्थन करें। दिनांक और संख्याओं के लिए उचित स्वरूपण का पता लगाने के लिए अपने अनुवादकों के साथ मिलकर काम करें। आप संभवतः अपने स्वयं के स्थानीयकरण टूलकिट बनाने का प्रयास करेंगे, हालांकि अधिकांश (लेकिन सभी नहीं) समस्याओं को एक मौजूदा पुस्तकालय को सौंपा जा सकता है।

  • प्रत्येक उपयोगकर्ता द्वारा विन्यास योग्य सरल प्रारूपण विकल्प बनाएं: दिनांक और समय, दशमलव विभाजक, पसंदीदा मुद्रा,… के लिए प्रारूप। यह यात्रियों, एक्सपेट्स या अन्य लोगों के लिए विशेष रूप से उपयोगी है, जिन्हें भाषा से स्वतंत्र रूप से कई स्थानों या संस्कृतियों को मिलाने की आवश्यकता होती है।


18
यह भी जान लें कि बड़ी संख्या में उपयोगकर्ता उस सम्मलेन से घृणा करते हैं जिसे "उनके लोकेल के लिए सही" समझा जाता है, इसे एक घृणित विरासत प्रथा मानते हैं, और कोई समूहीकरण नहीं करना चाहते हैं, या एक अलग प्रकार का समूह बनाना चाहते हैं। जैसे कि शायद इसे बंद करने या मैन्युअल रूप से इसे ओवरराइड करने के विकल्प होने चाहिए।
आर ..

2

एक महत्वपूर्ण विचार: आपको यह तय करना चाहिए कि कितना पर्याप्त है। क्योंकि यदि आप खरगोश के छेद को पूरी तरह से स्थानीय बनाने की कोशिश कर रहे हैं, तो यह तेजी से जटिल हो जाएगा।

एक विशिष्ट लेबल लें जैसे "आपने n आइटम का चयन किया है।" यह गलत है अगर केवल एक आइटम चयनित है। बदसूरत लेकिन व्यावहारिक समाधान यह लिखना है कि "आपने n आइटम का चयन किया है।" लेकिन अगर आप इसे सही तरीके से करना चाहते हैं, तो आपको n के आधार पर दो अलग-अलग ग्रंथों की आवश्यकता है। यदि आप कई स्थानों पर ऐसा करने का प्रयास करते हैं तो यह वास्तव में वास्तव में जटिल हो जाएगा, क्योंकि विभिन्न भाषाओं में अलग-अलग व्याकरण होते हैं। कुछ भाषाओं में एक, दो और कई मदों के लिए अलग-अलग संयुग्मन होते हैं। इस कारण से लोगों को पता है कि मौजूदा स्थानीयकरण ढांचे अपर्याप्त हैं हमेशा शिकायत करेंगे।

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


इसे ICU (MessageFormat) द्वारा हल किया जाता है। दोष यह है कि कई भाषाओं पर ICU को अपनाना अभी भी कमजोर है। हालांकि, डेवलपर को अभी भी संदेश को सही तरीके से बनाने की आवश्यकता है। यह वास्तव में इसके इंजीनियरिंग पहलू से अधिक है। userguide.icu-project.org/formatparse/messages
noderman

यह GNU गेटटेक्स्ट में अधिक व्यापक रूप से उपलब्ध ngettext फ़ंक्शन द्वारा भी हल किया जाता है , लेकिन MessageFormat वर्ग कुछ अतिरिक्त समस्याओं को हल करने के लिए भी प्रकट होता है जो ngettext नहीं करता है।
hvd

2

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

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

http://site.icu-project.org

http://cldr.unicode.org

अद्यतन करें

सीएलडीआर सर्वेक्षण उपकरण सभी पैटर्न तक पहुंच प्रदान करता है। यह आपको दिखाएगा कि किसी विशेष भाषा और क्षेत्र में किसी संख्या को प्रारूपित कैसे करें। उदाहरण के लिए, पुर्तगाली (पुर्तगाल):

http://st.unicode.org/cldr-apps/v#/pt_PT/Number_Formatting_Patterns/

और यदि आप वास्तव में सभी डेटा की जांच करना चाहते हैं (और शायद इसका इस्तेमाल करते हैं), तो आप GDRH से JSON प्रारूप में CLDR डाउनलोड कर सकते हैं:

https://github.com/unicode-cldr/cldr-json#cldr-json

यहाँ डाउनलोड के बारे में अधिक जानकारी:

http://cldr.unicode.org/index/downloads


इनपुट के लिए धन्यवाद, लेकिन मैं अब तक संख्याओं में दिलचस्पी रखता हूं। :)
मचाडो '

ज़रूर। मैंने सर्वेक्षण उपकरण में एक लिंक शामिल करने के लिए प्रतिक्रिया को संपादित किया, जहां आप अपनी खोज को कम कर सकते हैं।
21

मैंने मतभेदों की जांच करने के लिए ब्राज़ील को बदलने की कोशिश की, लेकिन इसके लिए विज़ुअलाइज़ेशन को सक्षम करने की आवश्यकता नहीं है: st.unicode.org/cldr-apps/v#/pt_BR/Number_Formatting_Patterns अन्यथा, उपकरण बहुत अच्छा लगता है।
मचाडो

ऐसा इसलिए है क्योंकि ब्राजील मूल भाषा है। सर्वेक्षण उपकरण वास्तव में सीएलडीआर डेटा में परिवर्तन करने के लिए उपयोग किया जाता है, इसलिए जड़ों को विशेष खातों की आवश्यकता होती है। आप GitHub पर जा सकते हैं और सभी जानकारी सीधे प्राप्त कर सकते हैं: github.com/unicode-cldr/cldr-numbers-modern/tree/master/main विशेष रूप से, ब्राज़ील यहाँ है: github.com/unicode/cldr/cldr/cldr-nload-modern/ बूँद / मास्टर / मुख्य / पीटी /…
नोडरमैन

0

खैर, जब मैं यहाँ सभी उत्तरों से खुश हूँ, तो मैं सही उत्तर के रूप में एक को चिह्नित करने के लिए उनमें से प्रत्येक के साथ वास्तव में संतुष्ट नहीं हूँ।

अब तक यह है कि हमें स्थानीयकरण संख्या के बारे में पता होना चाहिए:

मनुष्यों के लिए :

  • हजारों विभाजक हमेशा हजारों में अलग नहीं होते हैं। प्रश्न में भारतीय मामला देखें;
  • हजारों और दशमलव वर्ण संस्कृति को संस्कृति में बदलते हैं। उदाहरण के लिए जर्मन हजारों में रिक्त स्थान का उपयोग करके विभाजित किया गया है, जबकि अंग्रेजी में यह कॉमन्स है और पुर्तगाली में यह डॉट्स है;
  • अगर हमारे पास बाएँ-से-दाएँ और दाएँ-से-बाएँ भाषाओं के बीच प्रासंगिक अंतर है, तो हमें जानकारी नहीं है;
  • समर्थित स्थानीयकरणों का एक विशिष्ट सेट प्रदान करें और इसे अपने उपयोगकर्ताओं के लिए स्पष्ट करें;
  • अपने उपयोगकर्ताओं को समर्थित स्थानीयकरण में से एक के लिए डिफ़ॉल्ट स्थानीयकरण को बदलने की अनुमति दें और वे खुश होंगे और आपको केक कृतज्ञ होने पर भेज देंगे, क्योंकि आप एक उदार देवता हैं। :);

कंप्यूटर के लिए :

  • याद रखें कि मशीनें उदार नहीं होती हैं और हमेशा क्रमबद्ध और नंबर क्रमांकित करते समय समान स्वरूपण प्राप्त करना चाहिए;
  • इसके लिए एक प्रारूप के साथ छड़ी;
  • न्यूनतम आवश्यक प्रारूप का उपयोग करें। हजारों पृथक्करण से बचें, क्रमिकरण और डी-क्रमांकन के लिए दशमलव पर्याप्त होना चाहिए।

डेवलपर्स के लिए :

  • (जैसा कि @ नीचे द्वारा सुझाव दिया गया है): स्थानीयकरण के लिए मौजूदा पुस्तकालय का उपयोग करें;
  • यदि आप देशी परीक्षकों का उपयोग कर सकते हैं और स्थानीयकरण / अंतर्राष्ट्रीयकरण परीक्षण मामलों को निर्दिष्ट कर सकते हैं, अन्यथा पुस्तकालय पर भरोसा करें;
  • याद रखें कि स्थानीयकरण एक समस्या है जो ज्यादातर हल की जाती है। प्रत्येक प्रमुख भाषा में एक पुस्तकालय, मूल या बाहरी है, जो संख्या, दिनांक और समय को स्थानीय कर सकता है;

1
अनुपलब्ध आइटम: डेवलपर्स के लिए: स्थानीयकरण के लिए मौजूदा लाइब्रेरी का उपयोग करें। यदि आप कर सकते हैं, तो मूल परीक्षकों का उपयोग करें और स्थानीयकरण / अंतर्राष्ट्रीयकरण परीक्षण मामलों को निर्दिष्ट करें, अन्यथा पुस्तकालय पर भरोसा करें।
हाइड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.