Ö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/:
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 inQCoreApplication::translate("<Context>", s)för strängar utanför ettQObject.
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 enQFormLayout-etikett, som annars blir onåbar näraddRow()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 enQPointer.
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
nameochdescriptionfrånplugin.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.