2009-10-27 21 views
9

अपने iPhone अनुप्रयोग में, मैं, वस्तु मायने रखता है जो मैं तो स्थानीय बनाना प्रदर्शित करने के लिए की जरूरत है के बाद से अंग्रेजी एकवचन और बहुवचन का गौरव प्राप्त करता है, मैं निम्नलिखित हैआईफोन ऐप के लिए नंबरों को स्थानीय कैसे स्थानांतरित करें?

// स्यूडोकोड

 
if (objectList.count == 1) 
{ 
    NSLog(@"%@", NSLocalizedString(@"1 object", @"display one objects"); 
} 
else 
{ 
    NSLog(@"%@", NSLocalizedString(@"%d objects", @"display multiple objects"); 
} 

यह अंग्रेजी के लिए काम करता है लेकिन कई अन्य भाषाओं में एक संज्ञा का बहुवचन रूप केवल 'एस' जोड़कर बनाया नहीं जाता है।

  • प्रपत्र कैसे बहुवचन रूपों निर्माण कर रहे हैं अलग है:

    As this page explains, वहाँ दो चीजें हैं जो भाषाओं के बीच में अंतर आ सकता है। यह भाषाओं में एक समस्या है जिसमें कई अनियमितताएं हैं। जर्मन, उदाहरण के लिए, एक कठोर मामला है। हालांकि अंग्रेजी और जर्मन एक ही भाषा का हिस्सा हैं परिवार (जर्मनिक), लगभग नियमित बहुवचन संज्ञा रूपों का निर्माण ('एस' जोड़ना) शायद ही कभी जर्मन में पाया जाता है।

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

मुझे अपने कोड में इस से कैसे निपटना चाहिए?

+0

यह एक रूसी विशेष समस्या नहीं है - अन्य भाषाओं जिसके लिए आप सिर्फ एक बहुवचन की तुलना में अधिक की आवश्यकता होगी रहे हैं। –

+3

समस्या के बारे में अधिक विस्तृत स्पष्टीकरण के लिए http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html देखें (साथ ही अनियमितताओं वाली भाषाओं की काफी लंबी सूची)। –

+0

धन्यवाद पावेल, मैंने तदनुसार – zvolkov

उत्तर

11

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

if (objectList.count == 1) { 
    NSLocalizedString(@"ObjectCount1", @"display one"); 
} else if (objectList.count % 2 == 0) { 
    NSLocalizedString(@"ObjectCountEven", @"display even"); 
} else if (objectList.count % 2 == 0) { 
    NSLocalizedString(@"ObjectCountOdd", @"display odd"); 
} 

en.lproj:

अपने अनुवादक आप के लिए आता है और कहता है कि, मंगल ग्रह का निवासी समर्थन करने के लिए, तुम भी और विषम संख्या के लिए एक अलग वर्तनी की जरूरत है, तो आप अपने कोड तो, की तरह कुछ करने के लिए समायोजित कर सकते हैं /Localizable.strings:

ObjectCount1 = "1 object"; 
ObjectCountEven = "%d objects"; 
ObjectCountOdd = "%d objects"; // same as ObjectCountEven 

mars.lproj/Localizable.strings:

ObjectCount1 = "1 object-o"; 
ObjectCountEven = "%d object-e"; 
ObjectCountOdd = "%d object-o"; // same as ObjectCount1 

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

4

मैंने अभी JJPluralForm पोस्ट किया है, जो मोज़िला के बहुवचन के लिए अनुकूलन है।

इसके साथ, आपको अपने कोड में स्थानीयकरण करने के लिए सभी if-else, switch-case कोड करने की चिंता करने की आवश्यकता नहीं होगी, जो आपके स्थानीयकरण की संख्या बढ़ने के साथ असंभव हो जाता है।

[[JJPluralForm sharedManager] pluralStringForNumber:numberOfObjects 
            withPluralForms:NSLocalizedString(@"N_OBJECTS_PLURAL_STRING", @"") 
            localizeNumeral:YES]; 

प्रत्येक स्थानीय बनाने:

कुछ उदाहरण आप दे दी है की तरह से संभाला जा सकता है।स्ट्रिंग्स फ़ाइल तब N_OBJECTS_PLURAL_STRING को बहुवचन रूपों की अर्धविराम से अलग सूची के रूप में स्थानीयकृत करें। अंग्रेजी के लिए, यह "%@ object;%@ objects" होगा।

अधिक जानकारी के लिए प्रोजेक्ट देखें।

+0

प्रश्न संपादित किया है ओह अच्छा, आप अरबी के दोहरे मामले को संभालते हैं! – benzado

3

स्मार्टलिंग ने सीएलडीआर मानक के बाद बहुवचनों का समर्थन करने के लिए एक ओपन सोर्स फ्रेमवर्क जारी किया है।

https://github.com/Smartling/ios-i18n

इसका इस्तेमाल करने के लिए आप अपनी चाबी कि CLDR शैली लेबलिंग का पालन करने में एक विशेष मार्कर जोड़ने और NSLocalizedString के बजाय SLPluralizedString कहते हैं। । रनटाइम पर पुस्तकालय सही स्ट्रिंग भाषा एप्लिकेशन को वर्तमान में चल रहा है के आधार पर उपयोग करने के लिए ले जाएगा

तो अपने अंग्रेजी .strings फ़ाइल होगा:

"%@ apples##{one}" = "One apple"; 
"%@ apples##{other}" = "%@ apples"; 

रूस .strings फ़ाइल:

NSString *s2 = [NSString stringWithFormat:SLPluralizedString(@"%@ apples", number, nil), number]; 

नहीं:

"%@ apples##{one}" = "%@ яблоко"; 
"%@ apples##{few}" = "%@ яблока"; 
"%@ apples##{many}" = "%@ яблок"; 
"%@ apples##{other}" = "%@ яблока"; 

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

इस लेखन पर मैं स्मार्टलिंग के साथ एक उत्पाद प्रबंधक हूं।

0

इस समस्या का एक और अधिक शक्तिशाली समाधान है। TranslationExchange.com

से

https://github.com/tr8n/tr8n_objc_clientsdk

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

आपका विशिष्ट उदाहरण बस होगा:

Tr8nLocalizedStringWithTokens(@"{count || object}", @{@"count": objectList.count}) 

Tr8n पुस्तकालय स्वचालित रूप से किसी भी भाषा में आप के लिए सही बहुवचन रूप ले जाएगा। हा? हाँ, यह जादुई है। ऊपर टोकन उदाहरण का पूर्ण रूप वास्तव में है:

{count:number || one: object, other: objects} 

इसका मतलब है कि "गिनती" टोकन एक अंकीय प्रकार है कि कीवर्ड "एक" और "अन्य" का उपयोग कर अंग्रेजी बहुवचन को मैप किया है की है .... लेकिन Tr8n इतना स्मार्ट है कि आप इसे टाइप न करें। यह उचित नियम मानों के पैरामीटर के अनुक्रम को मैप करने के लिए पर्याप्त स्मार्ट भी है। और, ज़ाहिर है, यह जानता है कि "गिनती" नामांकन सम्मेलन के माध्यम से संख्यात्मक नियमों से जुड़ा हुआ है।तो यह बस हो जाता है:

{count || object} 

Btw, जब से तुम रूस उल्लेख किया है, इसके बाद के संस्करण के लिए रूसी अनुवाद बस होगा:

"{count || object}" = "{count || объект, объекта, объектов}" 

यह उदाहरण भी आसान था, चलो एक पर एक नज़र डालें और अधिक दिलचस्प एक:

Tr8nLocalizedStringWithTokens(
    @"{user} uploaded {count || photo} to {user | his, her} photo album.", 
    @{@"user": user, @"count": 5} 
) 

सबसे पहले, अच्छी किस्मत इस वाक्य मानक आईओएस i18n पुस्तकालय (या उस बात के लिए किसी भी अन्य पुस्तकालय) का उपयोग के अनुवाद ... यह एक मजाक है - लेकिन वास्तव में, वहाँ कोई रास्ता नहीं है इसे किसी भी चीज का उपयोग करते हैं, लेकिन Tr8n।

टीएमएल ऊपर का अनुवाद रूसी बस होगा:

@"{user || загрузил, загрузила} {count || фотографию, фотографии, фотографий} в свой фотоальбом." 

यहाँ हम लिंग के साथ सौदा उसी तरह हम संख्यात्मक नियमों से निपटने के नियम। लेकिन "एक", "कुछ", "अन्य" के बजाय, हमारे पास "पुरुष", "मादा", "अज्ञात" है - ठीक है, प्रत्येक भाषा में अलग-अलग लिंग और संख्यात्मक नियम हो सकते हैं। Tr8n इसके साथ सौदा करेगा, तो आपको करने की ज़रूरत नहीं है।

ठीक है, चलो इसे अगले स्तर पर ले जाएं। आपने तय किया है कि आपके पास बोल्ड होने के लिए फ़ोटो की संख्या होनी चाहिए। केक का टुकड़ा।

Tr8nLocalizedAttributedStringWithTokens(
    @"{user} uploaded [bold: {count || photo}] to {user | his, her} photo album.", 
    @{ 
    @"user": user, 
    @"count": 5, 
    @"bold": @{@"font":@{@"name": @"system", @"size": @12, @"type": @"bold"}} 
    } 
) 

[बोल्ड: ...] एक सजावट टोकन है। क्या आपने देखा है कि हमने मैक्रो को एट्रिब्यूटेड स्ट्रिंग संस्करण में बदल दिया है? यह मैक्रो वास्तव में आईओएस की मूल सजावट तंत्र का उपयोग कर एनएसएट्रिब्रिटेड स्ट्रिंग का उत्पादन करेगा। क्या आप अनुमान लगा सकते हैं कि रूसी में अनुवाद क्या होगा?

@"{user || загрузил, загрузила} [bold: {count || фотографию, фотографии, фотографий}] в свой фотоальбом." 

Btw, आप अपने सभी सजावट टोकन कहीं परिभाषित कर लेते हैं कर सकते हैं, ताकि आप उन्हें हर बार परिभाषित करने को रखने के लिए नहीं है।

Tr8nLocalizedAttributedStringWithTokens(
    @"{actor} sent {target} [bold: {count || gift}].", 
    @{ 
    @"actor": user1, 
    @"target": user2, 
    @"count": 5 
    } 
) 

यह अंग्रेजी में दिलचस्प नहीं लगती है:

की बस एक और अंतिम उदाहरण करते हैं ... कहते हैं, तो आपको निम्न रूप में एक न्यूज़फ़ीड कहानी है। लेकिन यह रूसी या किसी अन्य भाषा में करता है जो भाषा के मामलों का समर्थन करता है। {Target} का नाम, यदि यह रूसी में होता है, तो वास्तव में रूसी मूल भाषा केस का उपयोग करने की आवश्यकता होगी।

http://en.wikipedia.org/wiki/Dative_case

आप रूस में बात नहीं करते, तो आप शायद इसके बारे में पता करने की जरूरत नहीं है। लेकिन आपके रूसी अनुवादकों को चाहिए। चलो तो रूसी अनुवाद देखें:

@"{actor || подарил, подарила} {target::dat} [bold: {count || подарок, подарка, подарков}].", 

Tr8n बहुत चालाक अपने शक्तिशाली भाषा नियम इंजन का उपयोग और रूसी {target} टोकन के माध्यम से पारित करने के लिए नाम संप्रदान कारक भाषा मामले लागू करने के लिए है ...

कि एक साधारण संख्यात्मक प्रश्न के लिए एक लंबा जवाब था। इसे अब तक पढ़ने के लिए धन्यवाद। आशा करता हूँ की ये काम करेगा।

अस्वीकरण: मैं Tr8n ढांचे और टीएमएल भाषा का निर्माता हूं। यदि आपके कोई प्रश्न हैं, तो कृपया मुझे पिंग करें और मुझे आपके सभी अनुवाद प्रश्नों के साथ आपकी मदद करने में खुशी होगी।

2

वैसे, आईओएस 7 और मैक ओएस एक्स 10.9 में शुरू होने से, स्थानीयकरण में बहुवचन के लिए अंतर्निहित समर्थन है।16:10 से शुरू होने पर WWDC 2013 video "अपना ऐप वर्ल्ड-रेडी बनाना" देखें। बहुवचन एक .stringsdict plist फ़ाइल में स्थानीयकृत हैं, और फिर आप बस करो

NSLog(@"%@", [NSString localizedStringWithFormat: 
      NSLocalizedString(@"%d objects", @"display multiple objects"), n]); 
संबंधित मुद्दे

 संबंधित मुद्दे