2010-11-01 10 views
34

मैं यूरोप में एक ग्राहक के लिए एक ऐप विकसित कर रहा हूं। मैं अमेरिका में एक अंग्रेजी स्पीकर हूं। हमारा ऐप कई भाषाओं का समर्थन करने जा रहा है, लेकिन अंग्रेजी नहीं। मेरे पास हमारे ऐप में सभी स्ट्रिंग्स का अनुवाद स्थानीयकृत.स्ट्रिंग्स फाइलों में किया गया है, जो अलग-अलग भाषाओं के लिए सही तरीके से स्थापित होते हैं, और जब डिवाइस सही भाषा पर सेट होता है तो वे सभी ठीक काम करते हैं (डिवाइस की भाषा जर्मन = ऐप जर्मन के लिए सही ढंग से स्थानीयकृत है) ।आईओएस ऐप के लिए गैर-अंग्रेजी डिफ़ॉल्ट भाषा?

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

मैं कैसे सुनिश्चित कर सकता हूं कि ऐप गैर-समर्थित भाषाओं के लिए जर्मन पर डिफ़ॉल्ट है? मैंने प्रोजेक्ट के लिए लोकेशंस सेट अप करने के लिए this tutorial का उपयोग किया। इसमें डिफ़ॉल्ट "अंग्रेज़ी" लोकेल को हटाया जाता है जिसे पहली बार फ़ाइल को स्थानीयकृत करते समय बनाया जाता है। प्रोजेक्ट फ़ाइल में, मैं जोड़ दिया है:

developmentRegion = de; 

इसके अलावा, Info.plist में, मैं

<key>CFBundleDevelopmentRegion</key> 
<string>de</string> 

है कोई सफलता के साथ।

किसी भी विचार की सराहना की जाएगी!

उत्तर

42

किसी विशेष भाषा को डिफॉल्ट करना आपको यह नहीं करना चाहिए कि आपको किसके लिए प्रयास करना चाहिए। मान लीजिए कि फ्रांस में रहने वाले जापानी उपयोगकर्ता और फ्रांसीसी बोलने वाले फ्रांसीसी के पास जापानी फोन है। फ्रांसीसी अनुवाद होने के बावजूद आपका ऐप जर्मन पर डिफ़ॉल्ट होगा; मुझे लगता है कि आप जो चाहते हैं वह नहीं है और यह निश्चित रूप से नहीं है कि उपयोगकर्ता क्या चाहता है।

इस कारण से मैं उपयोगकर्ता द्वारा निर्धारित भाषा प्राथमिकता का सम्मान करने का सुझाव देता हूं।

जब से तुम अंग्रेजी का समर्थन नहीं करना चाहती लेकिन अंग्रेजी में अनुप्रयोग विकसित किया है, सबसे आसान काम आप कर सकते हैं सिर्फ सही संकलन के बाद en.lproj से छुटकारा पाने के लिए है। यह ऐप को केवल उन्हीं भाषाओं के साथ छोड़ देगा जिन्हें आप समर्थन देने की योजना बना रहे हैं, और आईफोन के आईफोन के डिफ़ॉल्ट रूप में सेट किए गए आईफोन के लिए उपयुक्त उपयोगकर्ता चुना जाएगा।


वहाँ करने के लिए एक बिल्कुल स्पष्ट समाधान एक विशिष्ट स्थानीयकरण को हटाने है:

Let Xcode सभी उपस्थित स्थानीयकरणों साथ अनुप्रयोग का निर्माण और बस से पहले कोड हस्ताक्षर में en.lproj फ़ोल्डर हटाना और किक सभी स्थानीय उस भाषा के लिए फाइलें चली गई हैं। आप आसानी से एक रन स्क्रिप्ट लक्षित करने के लिए चरण का निर्माण जोड़ने, कोड के इस एक पंक्ति से युक्त करके ऐसा कर सकते हैं (यह एक बैश स्क्रिप्ट है):

rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj" 

कोड हस्ताक्षर हमेशा किक में सब के बाद निर्माण चरणों को पूरा कर लिया है, तो बस अपने वर्तमान चरणों के अंत में उस निर्माण चरण को रखें।

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

मुझे आशा है कि यह आपके लिए एक व्यवहार्य समाधान है।


के संबंध में "एप्लिकेशन मामले में वापस जर्मन पड़ना चाहिए कि एक उचित स्थानीयकरण मौजूद नहीं है":

प्रश्न क्या एक उपयुक्त स्थानीयकरण है? यदि उपयोगकर्ता की तीसरी पसंद फ़्रेंच है (2 असमर्थित भाषाओं के बाद), यह समाधान ऐप को फ़्रेंच पर वापस कर देगा, जो उपयुक्त स्थानीयकरण है। हाथ से उपयोगकर्ता की पांचवीं पसंद, जर्मन सेट करने से अधिक उपयुक्त है।

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

+0

पास्कल सही जवाब है: आवेदन अगले सबसे उचित स्थानीयकरण करना प्रारंभ कर देगा; यह डिज़ाइन द्वारा है, और जिस तरह से आईओएस और मैक ओएस एक्स पर सभी एप्लिकेशन काम करना चाहते हैं। आपका ऐप विशेष नहीं है। –

+2

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

+2

नहीं, अंग्रेजी भी सिस्टम डिफ़ॉल्ट नहीं है। यह आसान है, ओएस में प्राथमिकताओं में सेट के रूप में स्थानीयकरण की एक सूची है। ऐप शुरू करते समय, यह संबंधित * .lproj फ़ोल्डरों की तलाश करता है और सूची में से किसी एक भाषा से मेल खाता पहला उपयोग करता है। यही कारण है कि यह अंग्रेजी का उपयोग करता है जब कुछ और नहीं होता है। ;) लेकिन मुझे एक और चाल पता है, एक नया जवाब तैयार करेगा ... – Pascal

13

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

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

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

NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil]; 
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"]; 

ध्यान दें कि आप main.mUIApplicationMain से पहले में ऐसा करने की जरूरत है, अन्यथा आप के लिए यह परिवर्तन लेने के लिए एप्लिकेशन को पुनः प्रारंभ करने की आवश्यकता है प्रभाव।

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

+3

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

+1

यह उपयोगी है लेकिन अगर मैंने अंतर्राष्ट्रीयकरण के साथ लॉन्च स्प्लैश स्क्रीन लॉन्च की है, तो यह सही छवि लागू नहीं करता है, भले ही मैं मुख्य.एम पर कोड डालूं, क्या आप जानते हैं कि मैं कैसे इसे ठीक कर सकते हैं? धन्यवाद – JERC

+0

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

-1

अपने didFinishLaunchingWithOptions में इस प्रयास करें() फ़ंक्शन

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
int retVal = UIApplicationMain(argc, argv, nil, nil); 
संबंधित मुद्दे