Přeskočit obsah

Překlady

Každý řetězec viditelný uživatelem, který zásuvný modul zobrazuje, musí být přeložitelný, s katalogy pro všech patnáct podporovaných jazyků — en, pl, de, fr, es, pt_PT, pt_BR, nl, sv, nb, da, fi, it, cs, sk — dřív, než se modul považuje za hotový. Je to stejná laťka jako u testů.

Katalogy

Každý modul, který má nějaký řetězec, nese jeden katalog .ts na jazyk ve své složce Translations/:

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

Zapojte je do sestavení pomocí 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
)

Sestavení spustí lrelease, aby připravilo soubory .qm; TranslationManager je za běhu načítá podle názvu katalogu (katalogy modulů pod Plugins/Translations/<Plugin>/).

Označování řetězců k překladu

  • U běžných řetězců rozhraní dávejte přednost QObject::tr(...) (kontext = třída).
  • Pomocník tr_() obaluje QCoreApplication::translate("<Context>", s) pro řetězce mimo QObject.

tr_() je pro lupdate neviditelné

lupdate neumí vyhodnotit kontext uvnitř tr_(), takže se tyto katalogy udržují ručně. Text <source> držte bajt po bajtu shodný s řetězcem za běhu, jinak se překlad tiše neuplatní.

Sledování změny jazyka při otevřené stránce

Uživatel může změnit jazyk rozhraní v Předvolby ▸ Obecné bez restartu. Qt pak pošle každému widgetu QEvent::LanguageChange — ale strom widgetů, jehož řetězce byly nastaveny jednou, v kódu, který jej postavil, si starý jazyk podrží, dokud se okno nezavře a znovu neotevře.

PluginApi/Qt/Retranslator.h to řeší, aniž byste každý řetězec psali dvakrát. Zaznamenává, jak byl který řetězec vytvořen, a při změně jazyka záznam přehraje:

#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() svou lambdu spustí okamžitě, takže se místo volání čte přesně jako řádek »nastav text«, který nahrazuje, a každý řetězec se ve vašem zdroji objeví stále jen jednou.
  • row() dělá totéž pro popisek QFormLayout, který je jinak nedosažitelný, jakmile jej addRow() spotřebuje.
  • installOn() je pro každý widget idempotentní; zapisovač je potomkem onoho widgetu a umírá s ním. Může-li vaše stránka přežít widget, který jste zachytili, držte jej v QPointer.

Stejně jako PluginApi/Qt/ISettingsPage.h jde o volitelnou hlavičku pro Qt: vkládejte ji jen z kódu, který už staví QWidgety (potřebuje Qt6::Widgets). Části PluginApi bez Qt se to nedotkne.

Co se nepřekládá

Dvě věci záměrně zůstávají v jazyce, ve kterém je napsal jejich autor:

  • name a description vašeho modulu z plugin.json, jak se zobrazují v Předvolby ▸ Zásuvné moduly. Manifest se čte dřív, než se modul načte — právě to umožňuje stránce vypsat i moduly, které jsou vypnuté nebo sestavené proti jiné verzi rozhraní — takže v té chvíli není katalog, ve kterém by se daly dohledat.
  • Popisky deklarativní stránky nastavení či ukotvitelného panelu (v Pythonu). Jsou to data, která váš pracovník posílá hostiteli, nikoli řetězce, jež by hostitel mohl vyhodnotit proti katalogu.

Vše, co modul registruje za běhu — názvy příkazů, položky nabídek, názvy doků, popisky stránek nastavení — se překládá obvyklým způsobem popsaným výše.

Tři z těchto řetězců vyhledává hostitel, nikoli váš kód, ve společném kontextu PluginMenus: každý segment menuPath, title každého příkazu a category příkazu. Všechny tři dodejte jako položky <source> v kontextu PluginMenus svých vlastních katalogů. Kategorii uživatel čte ve sloupci Kategorie okna Předvolby ▸ Klávesové zkratky; když v katalogu chybí, sloupec zobrazí surové anglické slovo vedle přeložených řádků jádra. Kategorie, která je zároveň názvem nabídky (Search, Encoding), s ní dělí jednu položku: ponechte v ní mnemonik & pro nabídku, hostitel jej ve sloupci odstraní.

Definice hotového

Lokalizace modulu je hotová, teprve když existuje všech patnáct souborů .ts, jsou zapojené a lrelease hlásí 0 nedokončených řetězců.