Překlady¶
Každý řetězec viditelný uživatelem, který zásuvný modul zobrazuje, musí být přeložitelný, s
katalogy pro všech patnáct podporovaných jazyků — en, pl, de, fr, es, pt_PT,
pt_BR, nl, sv, nb, da, fi, it, cs, sk — dřív, než se modul považuje za
hotový. Je to stejná laťka jako u testů.
Katalogy¶
Každý modul, který má nějaký řetězec, nese jeden katalog .ts na jazyk ve své složce
Translations/:
Zapojte je do sestavení pomocí 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
)
Sestavení spustí lrelease, aby připravilo soubory .qm; TranslationManager je za běhu načítá
podle názvu katalogu (katalogy modulů pod Plugins/Translations/<Plugin>/).
Označování řetězců k překladu¶
- U běžných řetězců rozhraní dávejte přednost
QObject::tr(...)(kontext = třída). - Pomocník
tr_()obalujeQCoreApplication::translate("<Context>", s)pro řetězce mimoQObject.
tr_() je pro lupdate neviditelné
lupdate neumí vyhodnotit kontext uvnitř tr_(), takže se tyto katalogy udržují ručně.
Text <source> držte bajt po bajtu shodný s řetězcem za běhu, jinak se překlad tiše
neuplatní.
Sledování změny jazyka při otevřené stránce¶
Uživatel může změnit jazyk rozhraní v Předvolby ▸ Obecné bez restartu. Qt pak pošle každému
widgetu QEvent::LanguageChange — ale strom widgetů, jehož řetězce byly nastaveny jednou, v kódu,
který jej postavil, si starý jazyk podrží, dokud se okno nezavře a znovu neotevře.
PluginApi/Qt/Retranslator.h to řeší, aniž byste každý řetězec psali dvakrát. Zaznamenává, jak
byl který řetězec vytvořen, a při změně jazyka záznam přehraje:
#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()svou lambdu spustí okamžitě, takže se místo volání čte přesně jako řádek »nastav text«, který nahrazuje, a každý řetězec se ve vašem zdroji objeví stále jen jednou.row()dělá totéž pro popisekQFormLayout, který je jinak nedosažitelný, jakmile jejaddRow()spotřebuje.installOn()je pro každý widget idempotentní; zapisovač je potomkem onoho widgetu a umírá s ním. Může-li vaše stránka přežít widget, který jste zachytili, držte jej vQPointer.
Stejně jako PluginApi/Qt/ISettingsPage.h jde o volitelnou hlavičku pro Qt: vkládejte ji jen z
kódu, který už staví QWidgety (potřebuje Qt6::Widgets). Části PluginApi bez Qt se to
nedotkne.
Co se nepřekládá¶
Dvě věci záměrně zůstávají v jazyce, ve kterém je napsal jejich autor:
nameadescriptionvašeho modulu zplugin.json, jak se zobrazují v Předvolby ▸ Zásuvné moduly. Manifest se čte dřív, než se modul načte — právě to umožňuje stránce vypsat i moduly, které jsou vypnuté nebo sestavené proti jiné verzi rozhraní — takže v té chvíli není katalog, ve kterém by se daly dohledat.- Popisky deklarativní stránky nastavení či ukotvitelného panelu (v Pythonu). Jsou to data, která váš pracovník posílá hostiteli, nikoli řetězce, jež by hostitel mohl vyhodnotit proti katalogu.
Vše, co modul registruje za běhu — názvy příkazů, položky nabídek, názvy doků, popisky stránek nastavení — se překládá obvyklým způsobem popsaným výše.
Tři z těchto řetězců vyhledává hostitel, nikoli váš kód, ve společném kontextu
PluginMenus: každý segment menuPath, title každého příkazu a category příkazu. Všechny
tři dodejte jako položky <source> v kontextu PluginMenus svých vlastních katalogů.
Kategorii uživatel čte ve sloupci Kategorie okna Předvolby ▸ Klávesové zkratky; když v
katalogu chybí, sloupec zobrazí surové anglické slovo vedle přeložených řádků jádra. Kategorie,
která je zároveň názvem nabídky (Search, Encoding), s ní dělí jednu položku: ponechte v ní
mnemonik & pro nabídku, hostitel jej ve sloupci odstraní.
Definice hotového¶
Lokalizace modulu je hotová, teprve když existuje všech patnáct souborů .ts, jsou zapojené a
lrelease hlásí 0 nedokončených řetězců.