Preskočiť na obsah

Preklady

Každý používateľovi viditeľný reťazec, ktorý zásuvný modul zobrazuje, musí byť preložiteľný, s katalógmi pre všetkých pätnásť podporovaných jazykov — en, pl, de, fr, es, pt_PT, pt_BR, nl, sv, nb, da, fi, it, cs, sk — skôr, než sa modul považuje za hotový. Je to tá istá latka ako pri testoch.

Katalógy

Každý zásuvný modul, ktorý má akýkoľvek reťazec, nesie vo svojom priečinku Translations/ jeden katalóg .ts na jazyk:

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

Do zostavenia ich zapojte cez 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
)

Zostavenie spúšťa lrelease, ktorý pripraví súbory .qm; TranslationManager ich za behu načítava podľa názvu katalógu (katalógy zásuvných modulov z priečinka Plugins/Translations/<Plugin>/).

Označovanie reťazcov na preklad

  • Pri bežných reťazcoch rozhrania uprednostnite QObject::tr(...) (kontextom je trieda).
  • Pomocník tr_() obaľuje QCoreApplication::translate("<Context>", s) pre reťazce mimo QObject.

tr_() je pre lupdate neviditeľný

lupdate nedokáže vyhodnotiť kontext vnútri tr_(), takže sa tieto katalógy udržiavajú ručne. Text v <source> udržiavajte bajt po bajte totožný s reťazcom za behu, inak sa preklad potichu neuplatní.

Sledovanie zmeny jazyka pri otvorenej stránke

Používateľ môže zmeniť jazyk rozhrania v Predvoľby ▸ Všeobecné bez reštartu. Qt potom pošle každému widgetu QEvent::LanguageChange — ale strom widgetov, ktorého reťazce boli nastavené raz, v kóde, ktorý ho zostavil, si ponechá starý jazyk, kým sa dialóg nezatvorí a znova neotvorí.

PluginApi/Qt/Retranslator.h to rieši bez toho, aby ste každý reťazec písali dvakrát. Zaznamenáva si, ako každý reťazec vznikol, a pri zmene jazyka záznam prehrá:

#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() spustí svoju lambdu okamžite, takže sa miesto volania číta presne ako riadok „nastav text“, ktorý nahrádza, a každý reťazec sa vo vašom zdrojovom kóde stále objaví raz.
  • row() robí to isté s popisom v QFormLayout, ktorý je inak nedosiahnuteľný, len čo ho addRow() prevezme.
  • installOn() je pre každý widget idempotentné; záznamník je potomkom daného widgetu a zaniká s ním. Ak vaša stránka môže prežiť widget, ktorý ste si zachytili, držte si ho v QPointer.

Rovnako ako PluginApi/Qt/ISettingsPage.h ide o voliteľnú hlavičku pre Qt: zahrňte ju iba z kódu, ktorý už zostavuje QWidget (potrebuje Qt6::Widgets). Časť PluginApi bez Qt to neovplyvňuje.

Čo sa neprekladá

Dve veci zámerne ostávajú v jazyku, v akom ich napísal ich autor:

  • name a description vášho zásuvného modulu z plugin.json tak, ako sa zobrazujú v Predvoľby ▸ Zásuvné moduly. Manifest sa číta pred načítaním modulu — práve preto môže stránka vypísať aj moduly, ktoré sú vypnuté alebo zostavené voči inej verzii API — takže v tom okamihu neexistuje žiadny katalóg, v ktorom by sa dali vyhľadať.
  • Popisy deklaratívnej stránky nastavení alebo ukotviteľného panela (v Pythone). Sú to údaje, ktoré váš pracovný proces posiela hostiteľovi, nie reťazce, ktoré by hostiteľ vedel vyhľadať v katalógu.

Všetko, čo zásuvný modul registruje za behu — názvy príkazov, položky ponuky, názvy panelov, popisy stránok nastavení — sa prekladá bežným spôsobom opísaným vyššie.

Tri z týchto reťazcov vyhľadáva hostiteľ, nie váš kód, v spoločnom kontexte PluginMenus: každý segment menuPath, title každého príkazu a category príkazu. Všetky tri dodajte ako položky <source> v kontexte PluginMenus svojich vlastných katalógov. Kategóriu používateľ číta v stĺpci Kategória okna Predvoľby ▸ Klávesové skratky; keď v katalógu chýba, stĺpec zobrazí surové anglické slovo vedľa preložených riadkov jadra. Kategória, ktorá je zároveň názvom ponuky (Search, Encoding), s ňou delí jednu položku: ponechajte v nej mnemonik & pre ponuku, hostiteľ ho v stĺpci odstráni.

Definícia hotového

Lokalizácia zásuvného modulu je hotová, až keď všetkých pätnásť súborov .ts existuje, sú zapojené a lrelease hlási 0 nedokončených reťazcov.