विभिन्न भाषाओं के लिए तार बनाने का सबसे अच्छा तरीका क्या होना चाहिए? मुझे यह समस्या है, मैं 'महीना', 'महीने', 'वर्ष', 'साल' जैसे तार प्रदर्शित करने की कोशिश कर रहा हूं। वर्तमान में मैं 3 भाषाओं पर काम कर रहा हूं जो मुझे पता है: स्पेनिश, अंग्रेजी और पॉलिश। अंग्रेजी और स्पेनिश के लिए यह सीधे आगे है। लेकिन उदाहरण के लिए, पॉलिश 'वर्षों' में 'लता' (संख्या 2 - 4 के बाद) या 'लेट' (5 से संख्याओं के बाद) बन सकता है। मैं इसके लिए एक अतिरिक्त स्ट्रिंग जोड़ने पर विचार कर रहा था, और इसे अन्य भाषाओं में खाली कर रहा था। हालांकि इसने मुझे उन अन्य भाषाओं के बारे में सोचा जो मुझे नहीं पता, जिनमें और भी अंतर हो सकते हैं। यदि मैं भविष्य में और भाषाओं को जोड़ने पर विचार कर रहा हूं, तो इस मामले में सबसे अच्छा तरीका कौन सा होना चाहिए?वास्तव में बहुभाषी तारों के साथ एक ऐप कैसे करें?
उत्तर
लगता है कि आपका ChoiceFormat
चाहते हैं, या कम से कम एक MessageFormat
के माध्यम से एक का उपयोग कर:
public static void main(String... args) {
String[] formats = {
// NOTE - In a real app, you'd fetch the format strings from a language,
// file, not hard-code them in your program. Obviously.
"{0,number} {0,choice,0#years|1#year|1<years}", // english
"{0,number} {0,choice,0#años|1#año|1<años}", // spanish
"{0,number} {0,choice,1#[fewer than 2]|2#lata|4<lat}", // polish
"{0,number} år", // swedish - singular and plural forms look the same!
};
int[] years = {0, 1, 2, 3, 4, 5, 6};
for (int year : years) {
for (String format : formats) {
System.out.println(MessageFormat.format(format, year));
}
System.out.println();
}
}
अपने कार्यक्रम में, आप निश्चित रूप से अपने स्ट्रिंग फ़ाइल से format
स्ट्रिंग मिलेगा।
उदाहरण के लिए धन्यवाद, सबसे पहले मैं एक और एंड्रॉइड आधारित समाधान (उदाहरण के लिए केवल एक्सएमएल का उपयोग तारों के लिए कर रहा था) देख रहा था, इसलिए आपको सच कहने के लिए मैंने सोचा था कि एंड्रॉइड स्ट्रिंग्स सिस्टम को चॉइसफॉर्मेट के साथ एकीकृत करना संभव नहीं था , लेकिन आपने मुझे दोनों को मिश्रण करने के बारे में एक अच्छा विचार दिया। बीटीडब्ल्यू यह वही है जो मैं चाहता था, कुछ संख्याओं के बाद बहुवचन परिवर्तन। एकमात्र चेतावनी यह है कि विशेष भाषागत परिवर्तन वाले नए भाषाओं को जोड़ने के लिए स्रोत कोड में संशोधन की आवश्यकता होगी। –
यह निश्चित रूप से जाने का रास्ता नहीं है। संसाधनों में/स्ट्रिंग/स्ट्रिंग में संसाधनों में अपने तार हैं। लेकिन ChoiceFormat बल्कि thna plurals का उपयोग करना अच्छा है क्योंकि http://stackoverflow.com/questions/5651902/android-plurals-treatment-of-zero – rds
रिकॉर्ड के लिए, यहां कोड नमूना केवल यह दिखाने का इरादा है कि 'ChoiceFormat का उपयोग कैसे करें '। मैं सुझाव नहीं देता कि आपको अपनी भाषा तारों को कड़ी-कोड करना चाहिए। स्पष्ट करने के लिए संपादित कोड। – gustafc
ध्यान दें कि मेरे पास कोई एंड्रॉइड विशिष्ट अनुभव नहीं है ... लेकिन मैं आमतौर पर प्रत्येक भाषा के लिए अलग-अलग दृश्य फ़ाइलों को चुनने का विकल्प चुनता हूं, जो कि मैं समर्थन करने जा रहा हूं, यह अकेले भाषा की तुलना में व्यापक स्थानीयकरण की अनुमति देता है, अब आप भी यदि आप किसी अन्य भाषा में टेक्स्ट जानते हैं तो उदाहरण के लिए व्यापक बटन, या यहां तक कि अलग-अलग छवियों की आवश्यकता हो सकती है, तो थोड़ा बदलाव किए गए लेआउट हैं।
एंड्रॉइड के साथ ऐसा करना संभव है। आप स्ट्रिंग्स के साथ कैसे करते हैं जिन्हें आपको रनटाइम पर सेट अप करने की आवश्यकता होती है? –
रनटाइम पर मुझे जो सामान करना है, वह काफी सीमित है, लेकिन मैं अपनी कुछ क्लास विधियों जैसे 'स्ट्रिंग :: स्ट्रिंगविथलोकलाइज्डस्ट्रिंग (' अच्छा {टाइमफॉडे} {उपयोगकर्ता नाम} ') के माध्यम से "सामान्य" i18n तालिका का उपयोग करता हूं और ऐसा कुछ भी कर सकता है स्वरूपण कार्यों के साथ प्रयोग किया जाना चाहिए। – Kris
ओह, मैं देखता हूं, धन्यवाद! –
एक अंतर्निहित "बहुवचन" समर्थन है जो अच्छी तरह से प्रलेखित नहीं है।
here का उल्लेख किया गया है और आप इसे Browser sources में देख सकते हैं।
धन्यवाद, मुझे लगता है कि मुझे यही चाहिए! क्या आप xliff का उपयोग करने के बीच अंतर जानते हैं और नहीं? लिंक में से एक में वे इसका उपयोग करते हैं:
ऐसा करने के बाद, ऐसा प्रतीत नहीं होता है कि यह
मैं इसका उपयोग नहीं कर रहा हूं, आपको उदाहरणों के लिए एंड्रॉइड स्रोतों की खोज करनी होगी। – yanchenko
मुझे मिले उत्तरों के लिए धन्यवाद, मैं 2 एंड्रॉइड आधारित समाधान लिख रहा हूं। मैंने जो पहले इस्तेमाल किया था वह बहुवचन था। पहली नज़र में प्लुरल्स डॉक्स/उदाहरणों की जांच करते हुए, आप सोच सकते हैं कि मात्रा = "कुछ" (2-4 बहुवचन के लिए) है जो sources पर जांच कर केवल लोकेल 'सीएस' के लिए काम करता है। बाकी के स्थानीय लोगों के लिए, केवल "एक" और "अन्य" काम कर रहे हैं। तो अपना strings.xml फाइलों में:
<plurals name ="years">
<item quantity="one">1 year</item>
<item quantity="other"><xliff:g id="number">%d</xliff:g> years</item>
</plurals>
तो पॉलिश के लिए मैं होगा:
<plurals name ="years">
<item quantity="one">1 rok</item>
<item quantity="other"><xliff:g id="number">%d</xliff:g> lat</item>
</plurals>
तब मैं अपने कोड पर होगा:
int n = getYears(...);
if (Locale.getDefault().getLanguage().equalsIgnoreCase("pl") && n >= 2 && n <= 4) {
return getString(R.string.years_pl, n);
} else {
return getResources().getQuantityString(R.plurals.years, n, n);
}
और मेरे तार में। पॉलिश लोकेल के लिए एक्सएमएल फाइल मैं लापता स्ट्रिंग जोड़ूंगा:
<string name="years_pl"><xliff:g id="number">%d</xliff:g> lata</string>
मेरा दूसरा समाधान अंग्रेजी, स्पेनिश और अन्य भाषाओं के लिए बहुवचन तत्व है जिसमें बहुत अधिक बहुवचन परिवर्तन नहीं हैं। फिर बाकी भाषाओं के लिए जिनके पास इस प्रकार के बदलाव हैं, मैं चॉइसफॉर्मैट का उपयोग करूंगा। मेरी कोड में तो:
...
private static final int LANG_PL = 0;
// add more languages here if needed
...
String formats[] = {
"{0,number} {0,choice,1#" + getString(R.string.year_1) + "|2#" + getString(R.string.years_2_4) + "|4<" + getString(R.string.years_lots) +"}", // polish
// more to come
};
...
// Here I would add more for certain languages
if (Locale.getDefault().getLanguage().equalsIgnoreCase("pl")) {
return MessageFormat.format(formats[LANG_PL], n);
} else {
return getResources().getQuantityString(R.plurals.years, n, n);
}
मैं अगर इन तरीकों का सबसे अच्छा तरीका हैं पता नहीं है, लेकिन इस समय के लिए, या जब तक गूगल कुछ बेहतर बनाता है, यह मेरे लिए काम करता है।
मुझे वास्तव में समझ में नहीं आता है कि आप मिश्रण plurals और 'MessageFormat' क्यों परेशान करते हैं? अगर मैं आप थे तो मैं या तो कोशिश करता हूं और यह पता लगाता हूं कि इसे केवल बहुवचन के साथ कैसे किया जाए, या मैं पूरी तरह से बहुवचन खो देता हूं और बस सभी भाषाओं के लिए 'संदेशफॉर्मैट' के लिए जाता हूं - कुछ कह रहा हूं 'MessageFormat.format (getString (R .string.year_format), n) आपके पास अब जो कुछ है उससे कहीं अधिक आसान लगता है। – gustafc
हाँ, मुझे लगता है कि आप सही हैं, मैं केवल संदेशफॉर्मेट जा रहा हूं। मैं सिर्फ plurals कोड फेंकना नहीं चाहता था। मैं केवल plurals का उपयोग नहीं कर सकता (जो सबसे अच्छा होगा)। मदद के लिए धन्यवाद :) –
Plurals का उपयोग न करें। वे बग हैं। http://stackoverflow.com/questions/5651902/android-plurals-treatment-of-zero – rds
सिर्फ आपके लिए नोटिस करने के लिए मुझे आशा है कि आप अपने प्रश्न के लिए मेनिफेस्ट स्ट्रिंग फ़ाइल के साथ काम कर रहे हैं: आप परिस्थितियों पर प्रतिक्रिया दे रहे हैं कि आप अपना लांग चुनते समय दौड़ रहे थे? यदि ऐसा है तो मुझे लगता है कि स्थानीयकरण का उपयोग करके प्रतिबिंब आपके उपयोगकर्ता से पूछे बिना आपकी मदद करेगा ... –
हाँ, मैं स्ट्रिंग्स फ़ाइल के साथ काम कर रहा हूं। हालांकि मुझे नहीं पता कि मैं स्ट्रिंग्स फ़ाइल का उपयोग करके एक साफ तरीके से क्या हासिल कर सकता हूं।हां यह रनटाइम पर कुछ संदेश दिखाने के बारे में है, अधिक विशेष रूप से बहुवचनों को संभालने के बारे में है, जो कुछ भाषाओं में उन्हें लिखने के 1 से अधिक तरीके से हो सकते हैं। –