Farklı diller için ip yapmak için en iyi yaklaşım hangisi olmalıdır? Bu problemim var, 'ay', 'ay', 'yıl', 'yıl' gibi dizeleri görüntülemeye çalışıyorum. Şu anda bildiğim 3 dilde çalışıyorum: ispanyolca, ingilizce ve lehçe. İngilizce ve ispanyolca için bu doğru. Ama örneğin, Polonya 'yıllarında' lata '(2'den 4'e kadar rakamlar) veya' lat '(5'den sonraki rakamlardan sonra) olabilir. Bunun için fazladan bir dize eklemeyi ve diğer dillerde boş bırakmayı düşünüyordum. Ancak bu, bilmediğim diğer diller hakkında düşünmemi sağladı, ki bu da daha fazla farklılığa sahip olabilir. Gelecekte daha fazla dil eklemeyi düşünürsem, bu durumda en iyi yaklaşım hangisi olmalıdır?Gerçekten çok dilli dizelerle bir uygulama nasıl yapılır?
cevap
bir ChoiceFormat
istediğiniz gibi geliyor, ya da en azından bir MessageFormat
içinden birini kullanarak:
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();
}
}
, elbette dize dosyasından format
dize tanınacak.
teşekkürler örneğin ilk başta yüzden ChoiceFormat sahip Android dizeleri sistemini entegre etmek mümkün değildi size düşündüm gerçeği söylemek gerekirse, (örneğin dizeleri sahip olan tek xml kullanarak) daha android tabanlı bir çözüm arıyordu ama sen her ikisini de karıştırmanın harika bir fikrini verdin. BTW Bu tam olarak istediğim şey, belirli sayılardan sonra çoğul değişiklikler. Tek uyarı, özel çoğul değişikliklere sahip yeni diller eklemek, kaynak kodunda değişiklik yapılmasını gerektirmesidir. –
Bu kesinlikle gitmek için bir yol değil. Dizelerinizi kaynak dosyalarında/res/string dizininde bulundurun. Ama Kayıt için ChoiceFormat ziyade thna çoğul çünkü http://stackoverflow.com/questions/5651902/android-plurals-treatment-of-zero – rds
kullanmak iyi, burada kod örneği sadece 'ChoiceFormat nasıl kullanılacağını göstermek için tasarlanmıştır '. Dil dizelerinizi kodlamanız gerektiğini önermiyorum. Netleştirmek için düzenlenmiş kod. – gustafc
Android'e özgü herhangi bir deneyimim olmadığına dikkat edin ... ancak genellikle destekleyeceğim her dil için ayrı görüntüleme dosyaları seçmeyi tercih ediyorum, bu yalnızca dilden daha geniş yerelleştirmeye izin veriyor, artık Başka bir dilde metin, örneğin daha geniş düğmeler, hatta farklı görüntüler gerektirdiğini biliyorsanız, biraz değiştirilmiş düzenler.
Android ile bunu yapmak mümkündür. Çalışma zamanında ayarlamanız gereken dizelerle nasıl çalışırsınız? –
i zamanında yapmanız gereken şeyler oldukça sınırlıdır ama like'String kendi sınıf yöntemlerden bazıları içinden "normal" bir i18n tablo kullanmak :: stringWithLocalizedString ('İyi {timeofday} {username} adlı) 've böyle o kutunun biçimlendirme fonksiyonları ile kullanılabilir. – Kris
Oh, anladım, teşekkürler! –
İyi belgelenmemiş yerleşik bir "çoğul" desteği var.
Belirtilen here ve onu Browser sources'da görebilirsiniz.
Teşekkürler, bence ihtiyacım olan şey bu! Xliff kullanmanın arasındaki farkı biliyor musunuz? bağlantılardan birini onlar bu kullan: Diğer yılında
, bunun <öğe miktarının gibi bir şey desteklediğini görünmüyor = "üç"> (I 2'den 4'e miktarlarda çoğul diğerlerinden farklı olduğu için cila buna ihtiyaç duyarlar) . Bunu başarabileceğim bir yol var mı? –
Bunu kendim kullanmıyorum, örnekler için Android kaynaklarını aramanız gerekir. – yanchenko
Sahip olduğum cevaplar sayesinde, 2 Android tabanlı çözüm yazıyorum. Kullandığım ilk çoğullar vardı. İlk bakışta Plurals belgelerini/örneklerini kontrol ederken, sources'da yalnızca 'cs' için çalışan bir miktar = "birkaç" (2-4 çoğul için) olduğunu düşünebilirsiniz. Yerellerin geri kalanı için, sadece "bir" ve "diğer" çalışıyor. Yani strings.xml dosyalarında :
<plurals name ="years">
<item quantity="one">1 year</item>
<item quantity="other"><xliff:g id="number">%d</xliff:g> years</item>
</plurals>
Yani cilası için ben olurdu:
<plurals name ="years">
<item quantity="one">1 rok</item>
<item quantity="other"><xliff:g id="number">%d</xliff:g> lat</item>
</plurals>
Sonra benim kodunda olurdu:
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);
}
Ve dizeleri
. polish locale için xml dosyası eksik dizeyi ekleyelim:<string name="years_pl"><xliff:g id="number">%d</xliff:g> lata</string>
İkinci çözümüm, çok sayıda çoğul değişiklik içermeyen ingilizce, ispanyolca ve diğer diller için çoğul öğeye sahiptir. Daha sonra, bu tür değişikliklere sahip olan dillerin geri kalanı için, ChoiceFormat'ı kullanırdım. Benim kodunda Yani:
...
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);
}
Bunları yolları en iyi yolu olup olmadığını bilmiyorum, ancak Google daha iyi bir şey yapana kadar şu an için veya bu benim için çalışıyor.
Neden çoğulları ve "MessageFormat" karıştırma neden rahatsız anlayamıyorum? Ben sizin yerinizde olsam denemek ve sadece çoğul düzgün bunu nasıl anlamaya, yoksa tamamen çoğul ekmesi ve sadece tüm diller için MessageFormat' 'için gider ya -' MessageFormat.format (getString (R gibi bir şey söyleyerek .string.year_format), n) 'şu an sahip olduğunuzdan çok daha kolay görünüyor. – gustafc
Evet, haklısınız, sadece MessageFormat'a gideceğim. Sadece çoğulları kodunu atmak istemedim. Sadece çoğulları kullanamıyorum (ki bu en iyisi olurdu). Yardım için THanks :) –
Plurals kullanmayın. Onlar yüklendi. http://stackoverflow.com/questions/5651902/android-plurals-treatment-of-zero – rds
- 1. Gerçekten çok dilli bir web sitesi için CodeIgniter nasıl kurulur?
- 2. ASP.Net kullanarak çok dilli web sitesi uygulama
- 3. Çok iş parçacıklı bir uygulama nasıl yapılır?
- 4. Çok dilli veriler nasıl saklanır?
- 5. Çok Dilli Jade şablonları?
- 6. Drupal çok dilli
- 7. Çok dilli flask uygulaması
- 8. POD çok dilli dokümanlar
- 9. Django unicode Çok dilli
- 10. Çok dilli bir dizinin içinden geçerek Handlebars.js
- 11. Özel QuickFIX 4.2'de çok dilli seçenek siparişleri uygulama
- 12. PowerShell regex, çok satırlı dizelerle nasıl çalışır?
- 13. Reaksiyon yönlendiricisinde çok dilli destek
- 14. Çok dilli bir site için CMS'yi bağlar
- 15. Laravel ile çok dilli veritabanı yönetimi
- 16. Gerçekten eşzamansız iki SQL sorgusu nasıl yapılır
- 17. Çok dilli bir PrincipalPermission rol adı nasıl belirlenir?
- 18. Android - sqlite içerik sağlayıcılar ve çok dilli
- 19. Robots.txt, çok dilli URL'ye izin verme
- 20. Çok dilli site için PHP date() çevirme
- 21. Çok dilli dizilerin pandalarda saklanması DataFrame sütunları
- 22. Gerçekten çok meşgul olduğunda MATLAB'u nasıl kesebilirim?
- 23. Spring 3 Aynı içeriğe sahip çok dilli URL'yi nasıl yönetirim
- 24. OpenCart e-ticaret sitemi nasıl çok dilli yapabilirim?
- 25. Çok Dilli Bir Linux İşlemi için Adres Yerleşim Düzeni
- 26. Çok dilli verilerin alınmasında bir geri dönüş uygulanması
- 27. Dizelerle kaynak dosyası el ile oluşturma Kaynak uygulama
- 28. Çok değişkenli metin nasıl yapılır?
- 29. Yerleşik uygulama değiştirme animasyonu nasıl yapılır?
- 30. Web Tarayıcısı Aktarımı için Yerel Bir Uygulama nasıl yapılır?
Sadece sizin için açık bir dize dosyasıyla çalıştığınızı fark ettiğinizi fark ettiğinizde, şu soruya yanıt verirsiniz: durumunuza atıfta bulunduğunuz zaman, koşuyu seçtiniz mi? eğer bu yüzden localizion kullanarak düşünmek bile kullanıcı sormadan size yardımcı olacaktır ... –
Evet, dizeleri dosyası ile çalışıyorum. Ancak dizeleri kullanarak temiz bir şekilde istediğimi başarabilir miyim bilmiyorum.Evet, belirli mesajların çalışma zamanında gösterilmesi ile ilgilidir, daha spesifik olarak çoğulları ele almakla ilgilidir. Bu, bazı dillerde bunları yazmanın 1 yolundan daha fazlasına sahip olabilir. –