Gå till innehållet

Översättningar

Varje användarsynlig sträng en insticksmodul visar måste gå att översätta, med kataloger för alla femton språk som stöds — en, pl, de, fr, es, pt_PT, pt_BR, nl, sv, nb, da, fi, it, cs, sk — innan insticksmodulen anses klar. Det är samma ribba som för tester.

Kataloger

Varje insticksmodul som har någon sträng bär en .ts-katalog per språk i sin mapp Translations/:

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

Koppla in dem i bygget genom 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 kör lrelease för att ställa i ordning .qm-filerna; TranslationManager läser in dem efter katalognamn under körning (insticksmodulernas kataloger under Plugins/Translations/<Plugin>/).

Märka strängar för översättning

  • Föredra QObject::tr(...) (kontext = klassen) för vanliga gränssnittssträngar.
  • Hjälparen tr_() kapslar in QCoreApplication::translate("<Context>", s) för strängar utanför ett QObject.

tr_() är osynlig för lupdate

lupdate kan inte lösa kontexten inuti tr_(), så de katalogerna underhålls för hand. Håll texten i <source> byte för byte identisk med strängen under körning, annars tillämpas översättningen tyst inte.

Följa ett språkbyte medan en sida är öppen

Användaren kan byta gränssnittsspråk i Inställningar ▸ Allmänt utan att starta om. Qt skickar då en QEvent::LanguageChange till varje widget — men ett widgetträd vars strängar sattes en gång, i koden som byggde det, behåller det gamla språket tills dialogrutan stängs och öppnas igen.

PluginApi/Qt/Retranslator.h hanterar det utan att du behöver skriva varje sträng två gånger. Den registrerar hur varje sträng producerades och spelar upp inspelningen när språket ändras:

#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ör sin lambda omedelbart, så att anropsplatsen läses precis som den rad «sätt texten» den ersätter, och varje sträng står ändå en gång i din källkod.
  • row() gör detsamma för en QFormLayout-etikett, som annars blir onåbar när addRow() väl tagit hand om den.
  • installOn() är idempotent per widget; inspelaren är ett barn till den widgeten och dör med den. Kan din sida överleva en widget du fångat, håll den i en QPointer.

Precis som PluginApi/Qt/ISettingsPage.h är detta en valfri Qt-header: inkludera den bara från kod som redan bygger QWidget-objekt (den kräver Qt6::Widgets). Den Qt-fria delen av PluginApi påverkas inte.

Vad som inte översätts

Två saker förblir, med avsikt, på det språk deras författare skrev dem:

  • Din insticksmoduls name och description från plugin.json, som de visas i Inställningar ▸ Insticksmoduler. Manifestet läses innan insticksmodulen läses in — det är det som låter sidan lista insticksmoduler som är inaktiverade eller byggda mot en annan API-version — så det finns ingen katalog att slå upp dem i vid den tidpunkten.
  • Etiketterna på en deklarativ (Python-)inställningssida eller dockpanel. De är data som din arbetare skickar till värden, inte strängar som värden kan lösa mot en katalog.

Allt en insticksmodul registrerar under körning — kommandotitlar, menyposter, docktitlar, etiketter på inställningssidor — översätts på det vanliga sätt som beskrivs ovan.

Tre av dessa strängar slås upp av värden, inte av din kod, i den delade kontexten PluginMenus: varje segment i en menuPath, varje kommandos title och kommandots category. Leverera alla tre som <source>-poster i kontexten PluginMenus i dina egna kataloger. Kategorin är vad användaren läser i kolumnen Kategori i Inställningar ▸ Kortkommandon; saknas den i katalogen visar kolumnen det råa engelska ordet intill kärnans översatta rader. En kategori som också är en menytitel (Search, Encoding) delar en enda post: behåll &-markören i den för menyn, värden tar bort den för kolumnen.

Definition av klar

En insticksmoduls lokalisering är klar först när alla femton .ts-filerna finns, är inkopplade, och lrelease rapporterar 0 oavslutade strängar.