Ana Sayfa
EN

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.

KodDil (kendi adıyla)
enEnglish
esEspañol
zh-CN简体中文
hiहिन्दी
arالعربية
ptPortuguês
ruРусский
ja日本語
deDeutsch
frFrançais
ko한국어
itItaliano
trTürkçe
idBahasa Indonesia
viTiếng Việt
plPolski
ukУкраїнська
nlNederlands
faفارسی
thไทย
bnবাংলা
urاردو
roRomână

Not: code değeri, lang/ altındaki klasör adıyla ve Slint’in select_bundled_translation iş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:

  • zh ile başlayan bir yerel (örneğin zh-Hans-CN) zh-CN’ye eşlenir.
  • Aksi takdirde birincil alt etiket alınır (- veya _ öncesindeki kısım, yani tr-TR, tr olur) ve büyük/küçük harf duyarlılığı olmadan desteklenen kodlarla eşleştirilir.
  • Yerel eksik veya desteklenmiyorsa Snipdeck en kullanı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:

  1. Seçilen kodu settings.json içindeki language anahtarına kaydeder.
  2. Paketlenmiş Slint arayüzünü select_bundled_translation aracılığıyla anlık olarak yeniden çevirir; böylece arayüz, yeniden başlatmaya gerek kalmadan hemen güncellenir.
  3. 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 language değerini "auto" yerine sabit bir koda ayarlayın. settings.json anahtarları 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ü, .slint dosyalarındaki @tr("…") makrosu aracılığıyla.
  • Rust tarafı, src/i18n.rs içinde tanımlanan i18n::t("…") (ve yer tutucu içeren dizeler için i18n::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"), .po katalogları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ı .po dosyalarının Rust tarafındaki i18n::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_translation iş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:

  1. Yeni msgid’i her lang/<code>/LC_MESSAGES/snipdeck.po dosyasına kopyalayın.
  2. msgstr değerini çeviriyle doldurun.
  3. Ç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 koruNedir
{}, {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:

  1. lang/<code>/LC_MESSAGES/snipdeck.po dosyasını oluşturun (.pot dosyasını kopyalayın, msgstr değerlerini doldurun).
  2. src/i18n.rs içindeki LANGUAGES tablosuna bir (code, endonym) girdisi ekleyin.
  3. src/i18n.rs içindeki po_source() işlevine, yeni dosyayı include_str! ile alan eşleşen bir match kolu ekleyin.
  4. 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 LANGUAGES içine girdikten sonra araç çubuğundaki küre menüsünde otomatik olarak görünür ve resolve_language, eşleşen bir işletim sistemi yerelinden onu otomatik olarak algılar.

Ayrıca bakın

  • Ayarlarlanguage anahtarı ve settings.json dosyasının geri kalanı.
  • Mimarii18n modülünün ve lang/ 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.