Diller ve yerelleştirme
Snipdeck'in her dil için tek bir gettext .po dosyasından 23 dile nasıl yerelleştirildiği ve bir çevirinin nasıl ekleneceği veya güncelleneceği.
Snipdeck 23 dile tam olarak yerelleştirilmiştir. İlk açılışta dilinizi işletim sistemi yereline göre seçer ve dilediğiniz zaman araç çubuğundaki küre menüsünden bunu değiştirebilirsiniz. Bu sayfa, bunun arka planda nasıl çalıştığını ve bir çevirinin nasıl ekleneceğini veya güncelleneceğini açıklar.
Desteklenen diller
Snipdeck 23 arayüz diliyle gelir. Aşağıdaki liste ve sıralama doğrudan src/i18n.rs içindeki LANGUAGES tablosundan alınmıştır; İngilizce, kaynak dil olduğu için ilk sıradadır.
| Kod | Dil (kendi adıyla) |
|---|---|
en | English |
es | Español |
zh-CN | 简体中文 |
hi | हिन्दी |
ar | العربية |
pt | Português |
ru | Русский |
ja | 日本語 |
de | Deutsch |
fr | Français |
ko | 한국어 |
it | Italiano |
tr | Türkçe |
id | Bahasa Indonesia |
vi | Tiếng Việt |
pl | Polski |
uk | Українська |
nl | Nederlands |
fa | فارسی |
th | ไทย |
bn | বাংলা |
ur | اردو |
ro | Română |
Not:
codedeğeri,lang/altındaki klasör adıyla ve Slint’inselect_bundled_translationişlevine geçirilen değerle eşleşmelidir. Kendi adıyla yazılan biçim ise araç çubuğundaki dil menüsünde gösterilen etikettir.
Dil seçimi
Otomatik algılama
language ayarı "auto" (varsayılan) olduğunda Snipdeck, başlangıçta dilinizi işletim sistemi yerelinden çözer. Çözümleyici elinden gelenin en iyisini yapar ve her zaman İngilizceye geri döner:
zhile başlayan bir yerel (örneğinzh-Hans-CN)zh-CN’ye eşlenir.- Aksi takdirde birincil alt etiket alınır (
-veya_öncesindeki kısım, yanitr-TR,trolur) ve büyük/küçük harf duyarlılığı olmadan desteklenen kodlarla eşleştirilir. - Yerel eksik veya desteklenmiyorsa Snipdeck
enkullanır.
settings.json içinde language değerini açık ve desteklenen bir koda ayarlarsanız bu, otomatik algılamaya üstün gelir. Desteklenmeyen bir açık kod yok sayılır ve bunun yerine işletim sistemi yereline başvurulur.
Araç çubuğundan değiştirme
Çalışma sırasında dili değiştirmek için araç çubuğundaki küre menüsünü kullanın. Bir dil seçmek aynı anda üç iş yapar:
- Seçilen kodu
settings.jsoniçindekilanguageanahtarına kaydeder. - Paketlenmiş Slint arayüzünü
select_bundled_translationaracılığıyla anlık olarak yeniden çevirir; böylece arayüz, yeniden başlatmaya gerek kalmadan hemen güncellenir. - Rust tarafından sağlanan kart metnini (ay etiketleri ve kaynak etiketleri gibi) yeniden oluşturur; böylece bunlar da yeni dile uyar.
İpucu: Hangi makinede çalıştırırsanız çalıştırın bir dili sabitlemek için
languagedeğerini"auto"yerine sabit bir koda ayarlayın.settings.jsonanahtarları için Ayarlar bölümüne bakın.
Yerelleştirme nasıl çalışır
Snipdeck yerelleştirmesinin belirleyici özelliği, her dil için tek bir gettext .po dosyasının uygulamanın tamamını yönetmesidir — hem Slint arayüzünü hem de Rust tarafındaki mesajları — tek bir katalogdan.
Tek katalog, iki tüketici
Her çevrilebilir dize, dil başına tam olarak tek bir yerde bulunur:
lang/<code>/LC_MESSAGES/snipdeck.po
Bu dosya iki tüketiciyi besler:
- Slint arayüzü,
.slintdosyalarındaki@tr("…")makrosu aracılığıyla. - Rust tarafı,
src/i18n.rsiçinde tanımlanani18n::t("…")(ve yer tutucu içeren dizeler içini18n::t1(...)) aracılığıyla.
Her iki tüketici de aynı İngilizce metni msgid olarak arar; böylece çevrilmiş tek bir msgstr, hangi katmanın işlediğine bakılmaksızın bir dizeyi karşılar.
Derleme zamanında paketlenir, çalışma zamanında gettext yoktur
Çeviriler derleme zamanında ikili dosyaya derlenir; bu nedenle gettext C bağımlılığı ve birlikte gönderilecek harici katalog dosyaları yoktur. Slint tarafı build.rs içinde paketlenir:
let config = slint_build::CompilerConfiguration::new()
.with_bundled_translations("lang")
.with_default_translation_context(slint_build::DefaultTranslationContext::None);
Paylaşılan katalog tasarımını mümkün kılan iki ayrıntı vardır:
with_bundled_translations("lang"),.pokataloglarını çalıştırılabilir dosyaya gömer.DefaultTranslationContext::None, çeviri bağlamını devre dışı bırakır; böylece msgid’ler salt İngilizce metindir. İşte tam olarak bu, aynı.podosyalarının Rust tarafındakii18n::t()aramalarını da karşılamasını sağlar.
Derleme betiği, lang/ içinde herhangi bir şey değiştiğinde yeniden çalışır (cargo:rerun-if-changed=lang) ve paketlenmiş arayüz çevirilerini kataloglarla eşzamanlı tutar.
Rust tarafı aynı dosyaları include_str! ile bağımsız olarak gömer; po_source() içinde her dil için bir match kolu bulunur. Her katalog, o dil ilk kullanıldığında tembel biçimde bir msgid -> msgstr eşlemesine ayrıştırılır ve ardından önbelleğe alınır.
Kaynak dil İngilizcedir
İngilizcenin kataloğa ihtiyacı yoktur. msgid’ler İngilizce dizelerin kendisi olduğundan, etkin dil İngilizce olduğunda i18n::t() argümanını olduğu gibi döndürür. Aynı geri dönüş davranışı, bir çevirinin eksik olduğu veya msgstr değerinin boş olduğu başka herhangi bir dil için de geçerlidir: Snipdeck boş bir alan göstermek yerine İngilizce msgid’e geri döner. Bu, kısmen çevrilmiş bir dilin her zaman kullanılabilir olması anlamına gelir — çevrilmemiş dizeler yalnızca İngilizce görünür.
Not: Slint’in
select_bundled_translationişlevi, ana pencere oluşturulduktan sonra çağrılır; bu, Slint’in belgelenmiş sırasına uyar (bileşeni oluştur, ardından çeviriyi seç, ardından çalıştır). Bunu daha erken seçmek ilk render’a yetişmez.
Bir çeviri ekleme veya güncelleme
Şablon
lang/snipdeck.pot, ana şablondur. Çevrilebilir her İngilizce dizeyi, boş bir msgstr ile birlikte msgid olarak listeler ve bunları #. yorumlarıyla alanlara göre gruplar (araç çubuğu düğmeleri, ipuçları vb.). Neyin çevrilmesi gerektiğinin asıl listesidir.
Yeni bir dile başlamak için şablonu o dilin katalog yoluna kopyalayın ve her msgstr değerini doldurun:
Copy-Item lang\snipdeck.pot lang\<code>\LC_MESSAGES\snipdeck.po
Doldurulmuş bir girdi şöyle görünür (İspanyolca katalogdan):
msgid "New"
msgstr "Nuevo"
msgid "Take a snip and copy it to the clipboard"
msgstr "Hacer un recorte y copiarlo al portapapeles"
Her katalog başlığının Language: alanını dil koduna ayarlı bırakın (örneğin Language: es).
Mevcut bir dili güncelleme
Uygulamaya yeni dizeler eklendiğinde, bunlar @tr("…") (.slint içinde) veya i18n::t("…") (Rust içinde) ile sarmalanır ve yeni msgid lang/snipdeck.pot dosyasına eklenir. Bir çeviriyi güncellemek için:
- Yeni msgid’i her
lang/<code>/LC_MESSAGES/snipdeck.podosyasına kopyalayın. msgstrdeğerini çeviriyle doldurun.- Çevirmediğiniz herhangi bir dizeye dokunmayın — otomatik olarak İngilizceye geri döner.
Yer tutucuları ve kaçış dizilerini koruma
Çeviri yaparken en önemli kural: yapısal belirteçleri olduğu gibi, doğru yerde tutun; aksi takdirde çalışma zamanındaki değiştirme bozulur.
| Olduğu gibi koru | Nedir |
|---|---|
{}, {e}, {err}, {url}, {path} | Rust tarafından değiştirilen çalışma zamanı yer tutucuları; çevirmeyin veya anlamlarından uzaklaştıracak şekilde yeniden sıralamayın |
\r\n, \n, \t, \", \\ | .po ayrıştırıcısının çözdüğü C tarzı kaçış dizileri |
•, —, →, ·, ▾, … | Arayüzde kullanılan düz noktalama işaretleri ve simgeler |
Snipdeck’in desteklediği ayrıştırıcı, standart msgid / msgstr çiftlerini, C tarzı kaçış dizilerini ve çok satırlı devamı (art arda gelen tırnaklı satırlar) işler. Yorumları, başlığı (boş msgid’i), çoğulları ve msgctxt değerini yok sayar.
Uyarı:
{e}gibi bir yer tutucu, çalışma zamanında gerçek bir değerle (hata mesajı, URL, dosya yolu) değiştirilir. Bunu bırakırsanız değerin gidecek bir yeri kalmaz ve mesaj eksik okunur. İngilizce dizedeki her yer tutucuyu çevirinize her zaman taşıyın.
Çevirmeyin
Şu marka ve teknik belirteçleri her dilde olduğu gibi bırakın: Snipdeck, OCR, Win, Ctrl+F, Ctrl+V, Imgur, imgur.com, imgur_client_id, catbox.moe, MAPI.
Yepyeni bir dil ekleme
Henüz var olmayan bir dili kurmak için, .po dosyasını oluşturduktan sonra:
lang/<code>/LC_MESSAGES/snipdeck.podosyasını oluşturun (.potdosyasını kopyalayın,msgstrdeğerlerini doldurun).src/i18n.rsiçindekiLANGUAGEStablosuna bir(code, endonym)girdisi ekleyin.src/i18n.rsiçindekipo_source()işlevine, yeni dosyayıinclude_str!ile alan eşleşen birmatchkolu ekleyin.- Yeniden derleyin. Derleme betiği katalogları otomatik olarak yeniden paketler.
// src/i18n.rs — both edits use the same <code>
pub const LANGUAGES: &[(&str, &str)] = &[
// …existing entries…
("xx", "Endonym"),
];
fn po_source(code: &str) -> Option<&'static str> {
Some(match code {
// …existing arms…
"xx" => include_str!("../lang/xx/LC_MESSAGES/snipdeck.po"),
_ => return None,
})
}
İpucu: Dil
LANGUAGESiçine girdikten sonra araç çubuğundaki küre menüsünde otomatik olarak görünür veresolve_language, eşleşen bir işletim sistemi yerelinden onu otomatik olarak algılar.
Ayrıca bakın
- Ayarlar —
languageanahtarı vesettings.jsondosyasının geri kalanı. - Mimari —
i18nmodülünün velang/kataloglarının kod tabanında nerede durduğu. - OCR + çeviri — bir snip’in metnini çevirme; bu, arayüz dilinden ayrıdır.
- Klavye kısayolları — diller arasında olduğu gibi kalan değiştirici tuş etiketleri.