2010-06-28 26 views
6

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?

+0

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 ... –

+0

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. –

cevap

3

bir ChoiceFormat istediğiniz gibi geliyor, ya da en azından bir MessageFormat içinden birini kullanarak:

Programınızda
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.

+0

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. –

+1

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

+0

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

0

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.

+0

Android ile bunu yapmak mümkündür. Çalışma zamanında ayarlamanız gereken dizelerle nasıl çalışırsınız? –

+0

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

+0

Oh, anladım, teşekkürler! –

1

İyi belgelenmemiş yerleşik bir "çoğul" desteği var.
Belirtilen here ve onu Browser sources'da görebilirsiniz.

+0

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 % s şey kullandıkları: <öğe miktarı = "Birkaç">% d maçları bu denedikten sonra –

+0

, 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ı? –

+0

Bunu kendim kullanmıyorum, örnekler için Android kaynaklarını aramanız gerekir. – yanchenko

2

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.

+0

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

+0

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 :) –

+0

Plurals kullanmayın. Onlar yüklendi. http://stackoverflow.com/questions/5651902/android-plurals-treatment-of-zero – rds

İlgili konular