Gå til innhold

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:

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

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_() pakker QCoreApplication::translate("<Context>", s) inn for tekststrenger utenfor et QObject.

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

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