Gå til indholdet

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:

Translations/
  MyPlugin_en.ts
  MyPlugin_pl.ts
  MyPlugin_de.ts
  MyPlugin_fr.ts

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_() pakker QCoreApplication::translate("<Context>", s) ind til tekststrenge uden for et QObject.

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 et QFormLayout, som ellers ikke kan nås, når addRow() 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 en QPointer.

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 name og description fra plugin.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.