İçindekiler
Diller Arası Çoğullama Kuralları: Bir Geliştirici Rehberi
Bir özelliği yayına aldınız. Çeviriler tamamlandı. İngilizce her şey harika görünüyor. Sonra biri bir hata bildiriyor: "Uygulama 'sepette 1 ürünler' ve '5 ürün sepette' diyor." Hızlıca bir üçlü ifadeyle düzeltiyorsunuz. Altı ay sonra, Polonya'dan bir kullanıcı uygulamanın her yerde dilbilgisel açıdan hatalı metin gösterdiğini bildiriyor. Çoğullamayı bozmadınız — aslında hiç çözmediniz.
Çoğullama, uluslararasılaştırmadaki en küçümsenen sorunlardan biridir. Çoğu geliştirici bunu ikili bir İngilizce sorunu olarak ele alır: tekil ve çoğul. Ancak doğal diller bundan çok daha karmaşıktır ve üretim i18n'de bu karmaşıklık sert biçimde geri vurur. Bu rehber, çoğullamanın diller arasında nasıl gerçekten çalıştığını, doğru nasıl uygulanacağını ve kod incelemesinden her seferinde sızan hataları nasıl önleyeceğinizi ele alır.
Uluslararasılaştırma kavramlarına daha geniş bir bakış açısıyla yeniyseniz, yerelleştirme ve uluslararasılaştırma rehberi dile özgü çoğullama mekaniklerine dalmadan önce faydalı bir temel sunar.
Çoğullama Neden Düşündüğünüzden Daha Önemli
Kod tabanlarında yaygın bir kalıp şudur:
const label = count === 1 ? 'öğe' : 'öğeler';
Bu İngilizce için çalışır. Tam olarak iki dil için: İngilizce ve buna benzer birkaç dil. Türkçe, Arapça, Rusça veya Lehçe'ye geçtiğiniz anda bu yaklaşım saçmalık üretir — ya da daha kötüsü, anadil konuşucularına saygısızlık gibi hissettiren biçimde ince ama yanlış metinler ortaya çıkar.
Üretimdeki çoğullama hataları gerçek sonuçlar doğurur:
- Güven erozyonu: Anadil konuşucuları kötü dilbilgisini anında fark eder. Bu, ürünün onlar için inşa edilmediğini gösterir.
- Hukuki risk: Bazı bölgelerde, sözleşmelerdeki, faturalardaki veya uyumluluk metinlerindeki miktar ifadeleri dilbilgisel açıdan doğru olmak zorundadır.
- Erişilebilirlik sorunları: Ekran okuyucular ve yardımcı araçlar dilbilgisel açıdan doğru metne bağımlıdır.
Temel neden neredeyse her zaman aynıdır: geliştiriciler İngilizce çoğul mantığını doğrudan yazarlar, ardından çevirmenler hangi formu kullanacakları hakkında bağlam içermeyen bir dize alır.
İngilizce Çoğullar: Aldatıcı Biçimde Basit
İngilizce'nin iki çoğul formu vardır: tekil (1) ve çoğul (diğer her şey). Bu, üçlü bir ifadeyle temiz biçimde örtüşür; bu yüzden geliştiriciler bunu varsayılan olarak kullanır.
// İngilizce: iki form, tekil ve çoğul
`${count} ${count === 1 ? 'dosya' : 'dosyalar'} yüklendi`
Ancak kenar durumlarla İngilizce'de bile bu karmaşıklaşır:
- Sıfır: "0 dosya" doğal okunur, ancak bazı kullanıcı arayüzleri "Dosya yok" ifadesini tercih eder. Bu bir tasarım kararıdır, çeviri kararı değil — ama yine de çoğul form desteği gerektirir.
- Kesirler: "1,5 dosya" dilbilgisel açıdan belirsizdir. İngilizce genellikle tamsayı olmayan değerler için çoğul kullanır, ancak bu alana göre değişir.
- Düzensiz isimler: "1 kişi" / "2 kişi", "1 çocuk" / "2 çocuk". Bunlar basit ek kurallarıyla ele alınamaz.
İngilizce basit hissettiriyor çünkü göreceli olarak öyle. Onu terk ettiğiniz anda karmaşıklık dramatik biçimde artar.
Diğer Diller Çoğulları Nasıl Ele Alır
Arapça: Altı Form
Arapça'nın sayıya bağlı olarak dilbilgisel açıdan altı farklı çoğul formu vardır:
| Form | Sayılar |
|---|---|
| zero | 0 |
| one | 1 |
| two | 2 |
| few | 3–10 |
| many | 11–99 |
| other | 100+ (ve ondalıklar) |
Her form farklı bir sözcük veya ek gerektirir. "X mesajınız var" dizesi Arapça'da iki değil, altı çeviri gerektirir. Arapça bir çevirmene yalnızca tekil ve çoğul göndermek, ondan tahmin etmesini istemektir — ve bunu yapamazlar, çünkü mesaj yapısı her form için farklılık gösterir.
Rusça ve Lehçe: Karmaşık Kurallarla Üç ila Dört Form
Rusça üç form kullanır: tekil (1), az (2–4 ve 2–4 ile biten sayılar, 12–14 hariç) ve çok (diğer her şey).
Rusça kuralı önemsiz değildir:
n % 10 === 1 && n % 100 !== 11 → tekil n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) → az diğer her şey → çok
Yani: "21 файл" (tekil), "22 файла" (az), "25 файлов" (çok), "11 файлов" (çok — tekil değil, çünkü 11 bir istisnadır).
Lehçe, dört form ve biraz farklı sınırlarla daha fazla karmaşıklık ekler. Bunu yanlış yaparsanız, bir Rus veya Polonyalı kullanıcı bunu anında fark eder. Bunlar belirsiz kenar durumlar değil — günlük kullanıcı arayüzlerinde görünen sayılardır.
Japonca, Çince, Korece: Hiç Çoğul Yok
Bu diller dilbilgisel olarak tekil ile çoğulu ayırt etmez. "1 dosya" ve "100 dosya" aynı isim formunu kullanır. Bunun yerine, miktar sayılar, sayaçlar (sınıflandırıcılar) veya bağlam aracılığıyla ifade edilir.
Bu şu anlama gelir:
- Bu diller için çevirmenlere çoğul formlar göndermeyin — var olmayan ayrımları çevirmelerini istiyorsunuz.
- Sayı hâlâ görüntülenir, ancak ismi çekmez.
- Buradaki hatalı çoğul işleme genellikle çevirmenlerin "other" formunu kopyalaması olarak kendini gösterir; bu teknik olarak sorun yaratmaz ancak gereksiz veya doğal olmayan ifadeler üretebilir.
Diğer Dikkat Çekici Durumlar
- Slav dilleri genel olarak (Çekçe, Slovakça, Hırvatça): Üç ila dört form, karmaşık modülo kuralları.
- Galce: Yüksek düzeyde düzensiz sınırlarla altı form.
- Galik (İskoç ve İrlandalı): 1, 2, 3–10, 11–19 ve 20+ üzerinde ayrışan formlar.
- İbranice: Tekil, ikili (tam olarak 2) ve çoğul için ayrı formlar.
CLDR Çoğul Kuralları Standardı
Unicode Ortak Yerel Veri Deposu (CLDR), her büyük dil için çoğul kurallarını tanımlar. Bunlar, tarayıcılar, işletim sistemleri ve i18n kütüphaneleri tarafından kullanılan kurallardır. CLDR çoğul formlarını altı adlandırılmış kategoriye ayırır:
zeroonetwofewmanyother
Her dil bunların bir alt kümesini kullanır. İngilizce one ve other kullanır. Arapça altısını da kullanır. Japonca yalnızca other kullanır.
Bu kurallar makine tarafından okunabilir formda mevcuttur ve çoğu olgun i18n kütüphanesine zaten gömülüdür. Matematiği kendiniz uygulamanız gerekmez. Bu kategorilerin var olduğunu ve çeviri iş akışınızın belirli bir dilin gerektirdiği tüm formları hesaba katması gerektiğini anlamanız gerekir.
ICU MessageFormat: Doğru Soyutlama
ICU MessageFormat, çeviri dizelerinde çoğullamayı ifade etmek için en yaygın desteklenen standarttır. Çoğul mantığını mesajın içine gömer; böylece çevirmenler her formu bağımsız olarak ele alabilir.
İngilizce sözdizimi:
{count, plural,
one {# dosya yüklendi}
other {# dosyalar yüklendi}
}
Rusça için (dili bilen bir çevirmen tarafından sağlandığı gibi):
{count, plural,
one {Загружен # файл}
few {Загружено # файла}
many {Загружено # файлов}
other {Загружено # файлов}
}
# gerçek sayıyla değiştirilir. Kütüphane, etkin yerel için çoğul kuralını değerlendirir ve doğru formu seçer.
Bu yaklaşım, dize birleştirme yerine kritik avantajlar sunar:
- Her form tam bir cümledir, bu nedenle çevirmenler tam dilbilgisel bağlama sahiptir.
- Çalışma zamanı dize birleştirmesi yoktur — mesaj görüntülenmeden önce nihai bir dizeye çözümlenir.
- Dile uygun formlar — çevirmenler tam olarak dillerinin ihtiyaç duyduğu formları sağlar.
- Araç desteği — linterlar, çıkarma araçları ve çeviri platformları bu formatı anlar.
i18next ile Çoğullama Uygulama
i18next, JavaScript ekosisteminde en yaygın kullanılan i18n kütüphanelerinden biridir ve CLDR çoğul kurallarını yerel olarak işler.
Temel Kurulum
import i18next from 'i18next';
i18next.init({
lng: 'en',
resources: {
en: {
translation: {
file_count: '{{count}} dosya',
file_count_other: '{{count}} dosyalar',
},
},
},
});
i18next bir anahtar sonek kuralı kullanır: tekil form için key, varsayılan çoğul için key_other ve ek CLDR formları için key_zero, key_one, key_two, key_few, key_many. count'u interpolasyon değişkeni olarak iletirsiniz ve kütüphane doğru anahtarı otomatik olarak seçer.
i18next.t('file_count', { count: 1 }); // "1 dosya"
i18next.t('file_count', { count: 5 }); // "5 dosyalar"
React Entegrasyonu
react-i18next ile:
import { useTranslation } from 'react-i18next';
function FileCount({ count }: { count: number }) {
const { t } = useTranslation();
return <span>{t('file_count', { count })}</span>;
}
/i18n/react kurulumları için bu önerilen kalıptır. count değişkeni hem interpolasyonu (sayıyı görüntüleme) hem de çoğul form seçimini yönlendirir.
Birden Fazla CLDR Formu İşleme
Rusça için çeviri dosyanızın gerekli tüm formları içermesi gerekir:
{
"file_count_one": "{{count}} файл",
"file_count_few": "{{count}} файла",
"file_count_many": "{{count}} файлов",
"file_count_other": "{{count}} файлов"
}
i18next yerel için doğru CLDR kuralını uygular ve doğru anahtarı seçer. Kural değerlendirmesi yerleşiktir — modülo mantığını kendiniz yazmazsınız.
next-i18next ile Next.js
next-i18next kullanan /i18n/nextjs uygulamaları için, kalıp aynıdır ancak çeviriler public/locales/{lng}/{ns}.json dizininde yer alır:
// public/locales/ru/common.json
{
"file_count_one": "{{count}} файл",
"file_count_few": "{{count}} файла",
"file_count_many": "{{count}} файлов",
"file_count_other": "{{count}} файлов"
}
import { useTranslation } from 'next-i18next';
export function FileCount({ count }: { count: number }) {
const { t } = useTranslation('common');
return <p>{t('file_count', { count })}</p>;
}
Yaygın Tuzaklar
1. Yanlış Değişken Adı
i18next çoğul form seçimini tetiklemek için özellikle count kullanır. Başka bir değişken adı kullanmak çoğul mantığını tamamen atlar:
// YANLIŞ — çoğul seçimi tetiklenmez
t('file_count', { number: 5 });
// DOĞRU
t('file_count', { count: 5 });
Bu sessiz bir hatadır. Geri dönüş formu (_other) kullanılır, bu yüzden İngilizce iyi görünebilirken diğer diller sessizce bozulur.
2. Hedef Yerel için Eksik Çoğul Formlar
Bir Rusça yerel için yalnızca key ve key_other tanımlarsanız, kütüphane tüm formlar için key_other'a geri döner. Rus kullanıcılar dilbilgisel açıdan hatalı metin alır ve konsolda hiçbir hata yoktur. Bu, gönderilen yazılımdaki en yaygın çoğullama hatasıdır.
Düzeltme, göndermeden önce her yerel için gerekli tüm CLDR formlarını zorunlu kılmaktır. Bu kontrolü otomatikleştirin — manuel incelemeye güvenmeyin.
3. Çoğul Anahtarlar Yerine Dize Birleştirme
// YANLIŞ
const message = t('you_have') + ' ' + count + ' ' + t('messages');
// DOĞRU — sayı ve çevresindeki sözcükler tek bir çevrilebilir birimdir
t('you_have_messages', { count });
Birleştirme, sayıyla birlikte kelime sırası, isim formu veya fiil uyumunun değiştiği dilleri yapısal olarak imkansız kılar. Sayıyı içeren tüm ifade tek bir çeviri anahtarı olmalıdır.
4. Çoğullarla Sıralamaları Doğrudan Kodlama
Sıra sayıları ("1.'inci'", "2.'nci'", "3.'üncü'") temel çoğullardan tamamen farklı kurallar izler. i18next, ordinal: true seçeneğiyle ayrı sıralama desteğine sahiptir:
t('position', { count: 1, ordinal: true }); // "1. yer"
t('position', { count: 2, ordinal: true }); // "2. yer"
Sıralama kuralları da yerel özgüdür — örneğin Fransızca, birincisi için "1er" kullanır ve ardından tüm sonraki sıralamalar için aynı eki kullanır.
5. Sıfırı Özel Bir Çoğul Formu Olarak Ele Alma
Bazı tasarımlar "0 dosya" yerine "Dosya yok" ister. Bu bir çoğul formu değildir — bir kullanıcı arayüzü kararıdır. Bunu çeviri işlevini çağırmadan önce kodda açıkça ele alın veya ayrı bir çeviri anahtarı kullanın:
const key = count === 0 ? 'no_files' : 'file_count';
t(key, { count });
Kullanıcı arayüzü kopya kararları için zero CLDR formuna güvenmeyin. zero formu, sıfırı diğer değerlerden dilbilgisel olarak ayırt eden diller için vardır, bir tasarım kancası olarak değil.
Çoğul Çevirileri Test Etme
Çoğul işleme, son derece az test edilir. i18n kalite sürecinizi nasıl yapılandıracağınıza daha geniş bir bakış açısıyla bakmak için, i18n test araçları ve otomasyon stratejileri rehberi bu kalıpların yanı sıra entegre edilebilecek araçları kapsar.
Sınır Testi
Her yerel için her sınır değerini test edin:
const testCounts = [0, 1, 2, 3, 4, 5, 11, 12, 21, 22, 100, 101];
for (const count of testCounts) {
console.log(`${count}: ${t('file_count', { count })}`);
}
Rusça için özellikle: 1, 2, 5, 11, 12, 21, 22, 25, 100, 101, 111, 121.
Her Yerel için Anlık Görüntü Testleri
describe('file_count çoğullama', () => {
it.each([
['en', 1, '1 file'],
['en', 5, '5 files'],
['ru', 1, '1 файл'],
['ru', 2, '2 файла'],
['ru', 5, '5 файлов'],
['ru', 11, '11 файлов'],
['ru', 21, '21 файл'],
['ar', 1, '1 ملف'],
['ar', 3, '3 ملفات'],
])('yerel %s, sayı %d → %s', (lng, count, expected) => {
i18next.changeLanguage(lng);
expect(i18next.t('file_count', { count })).toBe(expected);
});
});
Bu, eksik formları, yanlış CLDR sınırlarını ve çevirmen hatalarını kullanıcılara ulaşmadan önce yakalar.
Eksik Formlar için Lint
Kaynak yerel anahtarlarınızı okuyan, tüm çoğul anahtarları (_other ile bitenleri) tanımlayan ve ardından her hedef yereli için o yerel tarafından gereken CLDR formlarını kontrol eden bir betik yazın. Formlar eksikse CI'ı başarısız kılın. Bu, sessiz geri dönüş hata sınıfını tamamen önler.
Tür Güvenliği Oyunu Nasıl Değiştirir
Anahtar dizesi tabanlı i18n'in bir zayıflığı, çağrı noktasında doğru kullanımı zorunlu kılan hiçbir şeyin olmamasıdır. count yerine number iletebilir, sayıyı tamamen atlayabilir veya var olmayan bir anahtara başvurabilirsiniz — ve bunların hepsi çalışma zamanında sessizce başarısız olur.
Tür güvenli i18n araçları, çeviri anahtarlarınızdan TypeScript türleri oluşturur; böylece derleyici şunları yakalar:
- Eksik zorunlu interpolasyon değişkenleri
- Yanlış değişken adı kullanımı (
numbervscount) - Var olmayan anahtarlara başvurma
Better i18n, çeviri şemanızı anlayan ve yayımlama zamanında çoğul tamlığını zorunlu kılan SDK'larla bu kalıp üzerine inşa edilmiştir. Yeni bir çoğul anahtar eklediğinizde, SDK güncellenmiş türler oluşturur — ve gerekli count değişkenini sağlamayan herhangi bir çağrı noktası bir tür hatasına dönüşür. Yüzlerce anahtara sahip düzinelerce yerel yöneten ekipler için bu, kod incelemesinden önce tüm bir çoğullama hatası sınıfını yakalar.
Platformun çoğullama için en önemli özellikleri şunlardır: zorunlu form tamlığı (yayımlamadan önce gerekli tüm CLDR formlarının mevcut olması gerekir), bağlamı anlayan AI çevirisi ("bu bir dosya sayısıdır, uygun çoğul formu kullanın") ve etki alanına özgü isimlerin tutarlı biçimde çekilmesini sağlayan sözlük uygulama.
Çoğullama doğruluğu aynı zamanda iyi yapılandırılmış bir web sitesi çevirisi ve yerelleştirme iş akışıyla da derin biçimde bağlantılıdır — çoğul formlar, çevirinin geri kalanıyla aynı sürecin parçası olarak toplandığında ve incelendiğinde eksik kalma ihtimalleri çok daha düşük olur.
Pratik Özet
Doğru yapılmış çoğullama şunları gerektirir:
ICU MessageFormat veya CLDR kurallarını uygulayan bir kütüphane kullanın. Kendi çoğul mantığınızı yazmayın.
i18next'te interpolasyon değişkeni olarak her zaman
countkullanın. Diğer adlar çoğul seçimini atlar.Her yerel için tüm CLDR formlarını sağlayın. Çevirmenlere dizeler göndermeden önce bir dilin hangi formları gerektirdiğini kontrol edin.
Sayılarla asla dize birleştirme yapmayın. Sayıyı içeren tüm ifade tek bir çeviri anahtarıdır.
Her yerel için sınır değerlerini test edin. Özellikle Rusça, Lehçe, Arapça ve karmaşık kurallara sahip diğer diller için.
CI'da form tamlığını zorunlu kılın. Eksik çoğul formlar, İngilizce testlerde görünmez olan sessiz geri dönüşlere neden olur.
Sıralamaları temel çoğullardan ayırt edin. Farklı kurallara uyarlar ve ayrı işleme gerektirir.
Bunu doğru yapmak için araçlar mevcuttur. CLDR kuralları standartlaştırılmıştır. Kütüphaneler bunları uygular. Çoğu kod tabanındaki başarısızlık modu teknik değildir — İngilizce çoğul mantığının genelleştiğini varsaymak ve bunun genelleşmediğini yakalamak için iş akışı oluşturmamaktır.
Uygulamanızı better-i18n ile Küresel Hale Getirin
better-i18n, AI destekli çevirileri, git tabanlı iş akışlarını ve küresel CDN dağıtımını tek bir geliştirici öncelikli platformda birleştirir. Elektronik tablolar yönetmeyi bırakın ve her dilde göndermeye başlayın.
Ücretsiz başlayın → · Özellikleri keşfedin · Belgeleri okuyun