Oversettelser¶
Hver tekststreng et programtillegg viser brukeren, må kunne oversettes, og det må finnes
kataloger for alle femten språkene som støttes — en, pl, de, fr, es,
pt_PT, pt_BR, nl, sv, nb, da, fi, it, cs, sk — før
programtillegget regnes som ferdig. Det er det samme kravet som til tester.
Kataloger¶
Hvert programtillegg som har noen tekststreng, bærer én .ts-katalog per språk i
Translations/-mappen sin:
Knytt dem til bygget gjennom 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
)
Bygget kjører lrelease for å klargjøre .qm-filer; TranslationManager laster dem inn
etter katalognavn under kjøringen (programtilleggskataloger under
Plugins/Translations/<Plugin>/).
Å merke tekststrenger for oversettelse¶
- Foretrekk
QObject::tr(...)(konteksten = klassen) til alminnelige tekststrenger i grensesnittet. - Hjelperen
tr_()pakkerQCoreApplication::translate("<Context>", s)inn for tekststrenger utenfor etQObject.
tr_() er usynlig for lupdate
lupdate kan ikke avgjøre konteksten inne i tr_(), så de katalogene vedlikeholdes
for hånd. Hold <source>-teksten byte for byte lik tekststrengen under kjøringen,
ellers slår oversettelsen i stillhet ikke gjennom.
Å følge et språkbytte mens en side er åpen¶
Brukeren kan bytte grensesnittets språk under Innstillinger ▸ Generelt uten å starte
på nytt. Qt sender da QEvent::LanguageChange til hver kontroll — men et kontrolltre der
tekststrengene ble satt én gang, i den koden som bygget det, beholder det gamle språket
inntil vinduet lukkes og åpnes igjen.
PluginApi/Qt/Retranslator.h håndterer det uten at du må skrive hver tekststreng to
ganger. Den noterer hvordan hver tekststreng ble laget, og spiller opptaket av igjen når
språket endrer seg:
#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()kjører lambdaen sin med det samme, så kallstedet leses nøyaktig som den linjen som «setter teksten», og som den erstatter, og hver tekststreng står fortsatt én gang i kildekoden din.row()gjør det samme for en overskrift i etQFormLayout, som ellers ikke kan nås nåraddRow()først har tatt den.installOn()kan gjentas per kontroll; opptakeren er barn av den kontrollen og dør med den. Kan siden din overleve en kontroll du har fanget, så hold den i enQPointer.
Som PluginApi/Qt/ISettingsPage.h er dette en valgfri Qt-hodefil: inkluder den bare fra
kode som alt bygger QWidget-kontroller (den krever Qt6::Widgets). Den Qt-frie delen av
PluginApi er upåvirket.
Hva som ikke oversettes¶
To ting blir med vilje værende på det språket forfatteren skrev dem på:
- Programtilleggets
nameogdescriptionfraplugin.json, slik de vises på Innstillinger ▸ Programtillegg. Manifestet leses før programtillegget lastes inn — det er dét som lar siden liste programtillegg som er slått av eller bygget mot en annen API-versjon — så det finnes ingen katalog å slå dem opp i på det tidspunktet. - Merkelappene på en deklarativ (Python-)innstillingsside eller et deklarativt dokkpanel. De er data arbeideren din sender til verten, og ikke tekststrenger verten kan slå opp i en katalog.
Alt et programtillegg registrerer under kjøringen — kommandotitler, menyposter, paneltitler, overskrifter på innstillingssider — oversettes på den vanlige måten som er beskrevet ovenfor.
Tre av disse tekststrengene slås opp av verten, ikke av koden din, i den delte
konteksten PluginMenus: hvert ledd i en menuPath, hver kommandos title og
kommandoens category. Lever alle tre som <source>-poster i konteksten
PluginMenus i dine egne kataloger. Kategorien er hva brukeren leser i kolonnen
Kategori i Innstillinger ▸ Hurtigtaster; mangler den i katalogen, viser kolonnen
det rå engelske ordet ved siden av kjernens oversatte rader. En kategori som også er en
menytittel (Search, Encoding), deler én post: behold &-markøren i den for menyen,
verten fjerner den for kolonnen.
Når det er ferdig¶
Et programtilleggs oversettelse er først ferdig når alle femten .ts-filene finnes,
er knyttet til bygget, og lrelease melder 0 uferdige tekststrenger.