Web uygulamasının gösterdiği her metin ya webapp/i18n/ içindeki bir dil dosyasından ya da sunucu metadata'sındaki bir etiket sözlüğünden gelir. Bu sayfa dil manifestosunu, webapp/js/i18n.js dosyasının bir dili nasıl seçip yüklediğini, anahtarların, parametrelerin ve çoğulların nasıl çözüldüğünü ve dil değiştiğinde ne olduğunu açıklar. Dil eklemek web uygulamasına dil ekleyin sayfasındaki bir görevdir.
Kısaca¶
- Kullanılabilir diller veridir:
webapp/i18n/languages.jsontr(Türkçe) veen(English) dillerini listeler (webapp/i18n/languages.json:1-4). en.jsonvetr.jsondosyalarının her biri 68 üst düzey grup altında 2.853 anahtar içerir ve iki dosyanın anahtar kümesi aynıdır (iki dosya bir JSON ayrıştırıcısıyla düzleştirilip anahtar kümeleri karşılaştırılarak sayıldı).t(key, params)noktalı bir anahtarı çözer ve{name}yer tutucularını doldurur; eksik bir anahtar anahtarın kendisini döndürür (webapp/js/i18n.js:101-109).tp(key, n)çoğul biçiminiIntl.PluralRulesile seçer (webapp/js/i18n.js:112-127).- Metadata etiketleri İngilizceye geri düşen
resolveLabelile çözülür (webapp/js/meta.js:284-288).
Nasıl çalışır¶
Dili seçme¶
initI18n() manifestoyu yükler, sonra setLang(pick()) çağırır (webapp/js/i18n.js:54-72). pick() sırasıyla şunları kullanır (webapp/js/i18n.js:46-52):
- manifestoda varsa yerel depoda
cluster_langaltında saklanan kod; - manifestoda varsa tarayıcı dilinin ilk iki harfi;
- manifestoda varsa
tr(DEFAULT_LANG); - manifestonun ilk girdisi.
Manifesto yüklenemezse liste yalnız tr diline düşer; böylece uygulama yine açılır (webapp/js/i18n.js:14-16, webapp/js/i18n.js:32-44). Sözlük yüklenemezse uygulama işaretlemenin kendi metniyle devam eder (webapp/js/i18n.js:56-62).
Dil değiştirme¶
setLang(code) i18n/<code>.json dosyasını yükler, kodu saklar, kök öğede lang değerini ayarlar, görünür işaretlemeyi apply() ile çevirir ve cluster:lang-changed yayar (webapp/js/i18n.js:74-87). Dili üç yer değiştirir:
| Yer | Davranış | Kaynak |
|---|---|---|
| Giriş ekranındaki dil düğmesi | Manifestodaki her girdi arasında döner | webapp/js/main.js:152-159, webapp/js/i18n.js:91-95 |
| Ana ekran durum satırındaki dil düğmesi | Manifestodaki her girdinin bir menüsü | webapp/js/home.js:167-215 |
Ayarlar › Dil (common.language) |
Etkin girdide onay işareti olan bir liste | webapp/js/home.js:3670-3712 |
cluster:lang-changed dinleyicileri:
gen-api.jsönbelleğe alınmış her seçenek listesini ve etiketi temizler, çünkü sunucunun çözdüğü adlar dile bağlıdır (webapp/js/gen-api.js:366-371).home.jsçalışan her uygulamayı bayat işaretler; bayat bir uygulama kullanıcı ona döndüğünde yeniden çizilir (webapp/js/home.js:2334-2342,webapp/js/home.js:2501-2511).
Çoğaltılmış ana ekran kutuları başka bir kutuda yapılan değişikliği storage olayıyla izler (webapp/js/i18n.js:63-71).
Metni uygulama¶
apply(root) sözlükten dört nitelik ailesini doldurur (webapp/js/i18n.js:129-144):
| Nitelik | Hedef |
|---|---|
data-i18n |
Metin içeriği |
data-i18n-ph |
placeholder |
data-i18n-aria |
aria-label |
data-i18n-title |
title |
Kodda kurulan ekranlar t() işlevini doğrudan çağırır. apiErrorText sunucu hata kodlarını error.<code> biçimindeki anahtarlarla çevirir ve çeviri yoksa sunucunun İngilizce iletisini kullanır (webapp/js/gen-api.js:11-35).
Sunucuya gönderilen dil¶
Her API çağrısı geçerli kodla Accept-Language taşır; böylece sunucunun çözdüğü adlar (birimler, kategoriler, referans etiketleri) aynı dilde döner (webapp/js/api.js:18-22). Bkz. referans verisi ve çekirdek i18n.
Metadata etiketleri ve referans satırları¶
Metadata'daki etiketler {"en": "...", "tr": "..."} gibi sözlüklerdir. resolveLabel önce geçerli dili, sonra İngilizceyi döndürür (webapp/js/meta.js:283-288). Dil başına bir sütun taşıyan referans satırları langLabel kullanır; bu label_<lang>, sonra label_en, sonra code okur (webapp/js/meta.js:416-421). Uygulama manifestosu etiketleri aynı kuralı izler (webapp/js/home.js:520).
Tarihler ve sayılar¶
Listelerdeki tarihler kullanıcının saat diliminde sabit bir YYYY-MM-DD kalıbı kullanır (webapp/js/prefs.js:150-154). Bileşenlerdeki kısa tarih ve saat sayfa diliyle Intl.DateTimeFormat kullanır; sıra ve ayırıcılar tarayıcının yerel ayar verisinden gelir (webapp/js/prefs.js:156-170). Durum satırı saati geçerli dille toLocaleTimeString ve toLocaleDateString kullanır (webapp/js/home.js:110-116).
Neden böyle kurulu¶
- Projenin yazılı mühendislik kuralları dil seçiminin veri güdümlü olduğunu belirtir: yeni bir dil yeni bir JSON dosyası ve
languages.jsondosyasına bir satırdır, kod değişikliği gerekmez.webapp/js/i18n.js:4-7içindeki yorum aynı kuralı belirtir. webapp/js/api.js:18-21içindeki yorum, dil başlığının Türkçe bir ekran sunucudan İngilizce birim adları aldığı için eklendiğini belirtir.webapp/js/i18n.js:112-115içindeki yorum, çoğul seçimininn === 1sınamaması gerektiğini ve kategoriyi CLDR verisinden aldığını belirtir.
Kurallar ve sınırlar¶
- Projenin yazılı mühendislik kuralları kullanıcıya görünen her metnin bir i18n anahtarından gelmesini, iki dil dosyasının birlikte güncellenmesini ve Türkçe metnin doğru Türkçe karakterler kullanmasını ister.
- Genel web dosyaları dil başına sütunları okumamalı veya bir dil koduna göre dallanmamalıdır.
tests/test_metadata_driven_rules.py:85bunu on bir dosya için zorunlu kılar. - Tarayıcı testleri:
web-client/_e2e_lang.mjs,web-client/_e2e_lang_background.mjs,web-client/_e2e_intranet_notif_i18n.mjs,web-client/_e2e_ui_a11y.mjs(çoğullar).
Diğer parçalarla etkileşim¶
- Masaüstü istemcinin kendi çevirmeni ve sözlükleri vardır; bkz. masaüstü bölümü.
- Sunucu tarafı çeviri yardımcıları referans verisi ve çekirdek i18n sayfasında anlatılır.
Sınırlar ve açık noktalar¶
- Dil seçimi yalnız tarayıcıda saklanır (
webapp/js/i18n.js:80). Kullanıcı hesabının parçası değildir; bkz. kullanıcı arayüz durumu. - Metadata etiket sözlükleri her modülün Python metadata'sında yazılıdır. Web sözlüğü olan ama metadata girdisi olmayan bir dil İngilizce metadata etiketlerini gösterir (
webapp/js/meta.js:287).
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| language manifest | languages.json |
Web uygulamasının sunduğu dil kodlarının ve kendi dillerindeki adlarının listesi. | dil manifestosu | webapp/i18n/languages.json:1 |
| translation key | t |
Dil dosyasında bir metni adlandıran noktalı yol. | çeviri anahtarı | webapp/js/i18n.js:104 |
| plural form | tp |
Bir sayının CLDR çoğul kategorisine göre seçilen metin biçimi. | çoğul biçimi | webapp/js/i18n.js:116 |
İlgili sayfalar¶
- Web uygulaması platformu
- Web uygulamasına dil ekleyin
- Veri güdümlü diller
- Referans verisi ve çekirdek i18n
- Metadata çizimi
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.