Oversættelser¶
Hver tekststreng, et udvidelsesmodul viser brugeren, skal kunne oversættes, og der
skal være kataloger til alle femten understøttede sprog — en, pl, de, fr, es,
pt_PT, pt_BR, nl, sv, nb, da, fi, it, cs, sk — inden modulet regnes
for færdigt. Det er samme krav som til tests.
Kataloger¶
Hvert udvidelsesmodul, der har nogen tekststreng, bærer ét .ts-katalog pr. sprog i
sin Translations/-mappe:
Knyt dem til bygningen via 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
)
Bygningen kører lrelease for at klargøre .qm-filer; TranslationManager indlæser
dem efter katalognavn under kørslen (modulkataloger under
Plugins/Translations/<Plugin>/).
At markere tekststrenge til oversættelse¶
- Foretræk
QObject::tr(...)(konteksten = klassen) til almindelige tekststrenge i brugerfladen. - Hjælperen
tr_()pakkerQCoreApplication::translate("<Context>", s)ind til tekststrenge uden for etQObject.
tr_() er usynlig for lupdate
lupdate kan ikke afgøre konteksten inde i tr_(), så de kataloger
vedligeholdes i hånden. Hold <source>-teksten byte for byte den samme som
tekststrengen under kørslen, ellers slår oversættelsen i stilhed ikke igennem.
At følge et sprogskifte, mens en side er åben¶
Brugeren kan skifte brugerfladens sprog under Indstillinger ▸ Generelt uden at
genstarte. Qt sender så QEvent::LanguageChange til hver kontrol — men et kontroltræ,
hvis tekststrenge blev sat én gang, i den kode, der byggede det, beholder det gamle
sprog, indtil vinduet lukkes og åbnes igen.
PluginApi/Qt/Retranslator.h klarer det, uden at du skal skrive hver tekststreng to
gange. Den noterer, hvordan hver tekststreng blev frembragt, og spiller optagelsen
af igen, når sproget skifter:
#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()kører sin lambda med det samme, så kaldstedet læses præcis som den linje, der »sætter teksten«, og som den erstatter, og hver tekststreng står stadig én gang i din kildekode.row()gør det samme for en overskrift i etQFormLayout, som ellers ikke kan nås, nåraddRow()først har taget den.installOn()kan gentages pr. kontrol; optageren er barn af den kontrol og dør med den. Kan din side overleve en kontrol, du har fanget, så hold den i enQPointer.
Ligesom PluginApi/Qt/ISettingsPage.h er dette en valgfri Qt-headerfil: inkludér den
kun fra kode, der allerede bygger QWidget-kontroller (den kræver Qt6::Widgets).
Den Qt-fri del af PluginApi er upåvirket.
Hvad der ikke oversættes¶
To ting bliver med vilje ved med at være på det sprog, deres forfatter skrev dem på:
- Dit udvidelsesmoduls
nameogdescriptionfraplugin.json, som de vises på Indstillinger ▸ Udvidelsesmoduler. Manifestet læses, inden modulet indlæses — det er dét, der lader siden opregne moduler, der er slået fra eller bygget mod en anden API-version — så der er intet katalog at slå dem op i på det tidspunkt. - Mærkaterne på en deklarativ (Python-)indstillingsside eller et deklarativt dokpanel. De er data, din arbejder sender til værten, og ikke tekststrenge, værten kan slå op i et katalog.
Alt, hvad et udvidelsesmodul registrerer under kørslen — kommandotitler, menupunkter, paneltitler, overskrifter på indstillingssider — oversættes på den almindelige måde, der er beskrevet ovenfor.
Tre af de tekststrenge bliver slået op af værten, ikke af din kode, i den delte
kontekst PluginMenus: hvert led i en menuPath, hver kommandos title og kommandoens
category. Lever alle tre som <source>-poster i konteksten PluginMenus i dine egne
kataloger. Kategorien er, hvad brugeren læser i kolonnen Kategori i Indstillinger ▸
Genvejstaster; mangler den i kataloget, viser kolonnen det rå engelske ord ved siden af
kernens oversatte rækker. En kategori, der også er en menutitel (Search, Encoding),
deler én post: behold &-markøren i den til menuen, værten fjerner den til kolonnen.
Hvornår det er færdigt¶
Et udvidelsesmoduls oversættelse er først færdig, når alle femten .ts-filer findes, er
knyttet til bygningen, og lrelease melder 0 ufærdige tekststrenge.