Preklady¶
Každý používateľovi viditeľný reťazec, ktorý zásuvný modul zobrazuje, musí byť preložiteľný,
s katalógmi pre všetkých pätnásť podporovaných jazykov — en, pl, de, fr, es, pt_PT,
pt_BR, nl, sv, nb, da, fi, it, cs, sk — skôr, než sa modul považuje za
hotový. Je to tá istá latka ako pri testoch.
Katalógy¶
Každý zásuvný modul, ktorý má akýkoľvek reťazec, nesie vo svojom priečinku Translations/ jeden
katalóg .ts na jazyk:
Do zostavenia ich zapojte cez mte_add_plugin:
mte_add_plugin(NAME MyPlugin
SOURCES Src/MyPlugin.cpp
TRANSLATIONS
Translations/MyPlugin_en.ts
Translations/MyPlugin_pl.ts
Translations/MyPlugin_de.ts
Translations/MyPlugin_fr.ts
)
Zostavenie spúšťa lrelease, ktorý pripraví súbory .qm; TranslationManager ich za behu
načítava podľa názvu katalógu (katalógy zásuvných modulov z priečinka
Plugins/Translations/<Plugin>/).
Označovanie reťazcov na preklad¶
- Pri bežných reťazcoch rozhrania uprednostnite
QObject::tr(...)(kontextom je trieda). - Pomocník
tr_()obaľujeQCoreApplication::translate("<Context>", s)pre reťazce mimoQObject.
tr_() je pre lupdate neviditeľný
lupdate nedokáže vyhodnotiť kontext vnútri tr_(), takže sa tieto katalógy udržiavajú
ručne. Text v <source> udržiavajte bajt po bajte totožný s reťazcom za behu, inak sa
preklad potichu neuplatní.
Sledovanie zmeny jazyka pri otvorenej stránke¶
Používateľ môže zmeniť jazyk rozhrania v Predvoľby ▸ Všeobecné bez reštartu. Qt potom pošle
každému widgetu QEvent::LanguageChange — ale strom widgetov, ktorého reťazce boli nastavené raz,
v kóde, ktorý ho zostavil, si ponechá starý jazyk, kým sa dialóg nezatvorí a znova neotvorí.
PluginApi/Qt/Retranslator.h to rieši bez toho, aby ste každý reťazec písali dvakrát.
Zaznamenáva si, ako každý reťazec vznikol, a pri zmene jazyka záznam prehrá:
#include <PluginApi/Qt/Retranslator.h>
QWidget* MyPage::createWidget(QWidget* parent)
{
auto* page = new QWidget(parent);
auto& rt = MTE::plugin::Retranslator::installOn(page);
m_watch = new QCheckBox(page);
rt.add([this] { m_watch->setText(tr_("Watch open files")); });
m_size = new QSpinBox(page);
rt.row(form, m_size, [] { return tr_("Font size:"); }); // QFormLayout caption
return page;
}
add()spustí svoju lambdu okamžite, takže sa miesto volania číta presne ako riadok „nastav text“, ktorý nahrádza, a každý reťazec sa vo vašom zdrojovom kóde stále objaví raz.row()robí to isté s popisom vQFormLayout, ktorý je inak nedosiahnuteľný, len čo hoaddRow()prevezme.installOn()je pre každý widget idempotentné; záznamník je potomkom daného widgetu a zaniká s ním. Ak vaša stránka môže prežiť widget, ktorý ste si zachytili, držte si ho vQPointer.
Rovnako ako PluginApi/Qt/ISettingsPage.h ide o voliteľnú hlavičku pre Qt: zahrňte ju iba
z kódu, ktorý už zostavuje QWidget (potrebuje Qt6::Widgets). Časť PluginApi bez Qt to
neovplyvňuje.
Čo sa neprekladá¶
Dve veci zámerne ostávajú v jazyku, v akom ich napísal ich autor:
nameadescriptionvášho zásuvného modulu zplugin.jsontak, ako sa zobrazujú v Predvoľby ▸ Zásuvné moduly. Manifest sa číta pred načítaním modulu — práve preto môže stránka vypísať aj moduly, ktoré sú vypnuté alebo zostavené voči inej verzii API — takže v tom okamihu neexistuje žiadny katalóg, v ktorom by sa dali vyhľadať.- Popisy deklaratívnej stránky nastavení alebo ukotviteľného panela (v Pythone). Sú to údaje, ktoré váš pracovný proces posiela hostiteľovi, nie reťazce, ktoré by hostiteľ vedel vyhľadať v katalógu.
Všetko, čo zásuvný modul registruje za behu — názvy príkazov, položky ponuky, názvy panelov, popisy stránok nastavení — sa prekladá bežným spôsobom opísaným vyššie.
Tri z týchto reťazcov vyhľadáva hostiteľ, nie váš kód, v spoločnom kontexte PluginMenus:
každý segment menuPath, title každého príkazu a category príkazu. Všetky tri dodajte ako
položky <source> v kontexte PluginMenus svojich vlastných katalógov. Kategóriu používateľ
číta v stĺpci Kategória okna Predvoľby ▸ Klávesové skratky; keď v katalógu chýba, stĺpec zobrazí
surové anglické slovo vedľa preložených riadkov jadra. Kategória, ktorá je zároveň názvom
ponuky (Search, Encoding), s ňou delí jednu položku: ponechajte v nej mnemonik & pre
ponuku, hostiteľ ho v stĺpci odstráni.
Definícia hotového¶
Lokalizácia zásuvného modulu je hotová, až keď všetkých pätnásť súborov .ts existuje, sú
zapojené a lrelease hlási 0 nedokončených reťazcov.