Siirry pääsisältöön

Käännös 25.12

Avaa ChatGPT:ssä

webforJ sisältää sisäänrakennetun käännösjärjestelmän lokalisoitujen merkkijonojen etsimistä varten avaimen avulla. Järjestelmä koostuu käännösresolversista, joka yhdistää avaimet lokalisoituihin teksteihin, HasTranslation -huolenaiherajapinnasta, joka tarjoaa kätevän t()-metodin, App.getTranslation()-pääsyn mihin tahansa, automaattisesta paikallisen havaitsemisesta selaimesta ja tuesta mukautetuille käännöslähteille, kuten tietokannoille.

AI skill available

The webforj-localizing-apps skill can add multi-language support and translate component labels. After installing the webforJ AI plugin, ask your assistant:

  • "Add multi-language support with English and Spanish."
  • "Detect the user's browser locale and apply it on startup."
  • "Move all hardcoded strings into a messages bundle."

Käännösresolveri

Käännösresolveri on järjestelmä, joka etsii lokalisoituja merkkijonoja tietyn avaimen ja paikallisen mukaan. webforJ tarjoaa oletusresolverin, BundleTranslationResolver, joka lataa käännöksiä Java ResourceBundle -ominaisuus tiedostoista luokkapolussa. Tämä toimii heti ilman lisäriippuvuuksia.

Ominaisuuspaketit

Sijoita käännöstiedostosi src/main/resources -hakemistoon. Oletusresolveri etsii messages-nimisiä tiedostoja, joissa on paikallisliitteet noudattaen Java ResourceBundle -nimikointikäytäntöä:

messages.properties        # Oletus/varavalmisteet
messages_en.properties # Englanti
messages_de.properties # Saksa
messages_fr_CA.properties # Ranska (Kanada)

Jokainen tiedosto sisältää avain-arvo-parit. Avaimet ovat tunnisteita, joita käytät koodissa, ja arvot ovat käännettyjä merkkijonoja. Voit sisällyttää MessageFormat -paikkoja, kuten {0}, {1} dynaamisille arvoille:

messages.properties
app.title=Postilaatikko
menu.inbox=Saapuneet
menu.outbox=Lähetetyt
greeting=Hei {0}, sinulla on {1} uutta viestiä
messages_de.properties
app.title=Postfach
menu.inbox=Posteingang
menu.outbox=Postausgang
greeting=Hallo {0}, Sie haben {1} neue Nachrichten

Resolveri delegoi Java:n standardin ResourceBundle ratkaisuputkeen, joka käsittelee paikallisten vastaavuuksien ja varatäytön automaattisesti.

Tuettujen lokaliteettien määrittäminen

supported-locales -asetuksella kerrotaan webforJ:lle, mitkä paikalliset asetukset sovelluksesi tukee. Tämä luetteloa käytetään automaattisessa tunnistamisessa käyttäjän selaimen localea vastaan saatavilla olevien käännösten osalta. Luettelon ensimmäistä localea käytetään oletusvaratäytteenä, kun parempaa vastaavuutta ei löydy. Ominaisuusavain on webforj.i18n.supported-locales ja se hyväksyy luettelon BCP 47 kielitunnisteista, esimerkiksi en, de.

Lisätietoja

Katso Konfigurointi -osio oppiaksesi, kuinka asettaa ominaisuuksia eri ympäristöille.

t()-metodi

Komponentit, jotka toteuttavat HasTranslation -huolenaiherajapinnan, saavat pääsyn t()-metodiin tekstin kääntämistä varten. Metodi ottaa käännösavaimen ja palauttaa lokalisoidun merkkijonon nykyisen sovelluksen paikallisen mukaan:

public class MainLayout extends Composite<AppLayout> implements HasTranslation {

public MainLayout() {
// Yksinkertainen käännös
String title = t("app.title");

// Käännös MessageFormat -parametreilla
String greeting = t("greeting", userName, messageCount);

// Käännös tietylle paikalliselle
String germanTitle = t(Locale.GERMAN, "app.title");
}
}

Voit myös käyttää App.getTranslation() suoraan missä tahansa ilman rajapinnan toteuttamista:

String title = App.getTranslation("app.title");
Sujuva varatäyttö

Jos käännösavainta ei löydy, t() palauttaa avaimen itsessään sen sijaan, että heittäisi poikkeuksen. Tämä tarkoittaa, että sovelluksesi ei katkea, jos käännös puuttuu. Avain näytetään sellaisenaan ja varoitus tallennetaan, jotta voit seurata puuttuvia käännöksiä kehityksen aikana.

Käännettyjen komponenttien toteuttaminen

Käännetty komponentti yhdistää tyypillisesti HasTranslation ja LocaleObserver. Käytä t() metodia, kun luot UI-elementtejä asetaksesi alkuperäisen käännetyn tekstin. Tukeaksesi aikarajan kielellistä vaihtamista, toteuta LocaleObserver ja päivitä sama teksti onLocaleChange() -metodissa.

MainLayout.java
@Route
public class MainLayout extends Composite<AppLayout>
implements HasTranslation, LocaleObserver {

private final AppLayout self = getBoundComponent();
private AppNavItem inboxItem;
private AppNavItem outboxItem;

public MainLayout() {
inboxItem = new AppNavItem(t("menu.inbox"), InboxView.class, TablerIcon.create("inbox"));
outboxItem = new AppNavItem(t("menu.outbox"), OutboxView.class, TablerIcon.create("send-2"));

AppNav appNav = new AppNav();
appNav.addItem(inboxItem);
appNav.addItem(outboxItem);

self.addToDrawer(appNav);
}

@Override
public void onLocaleChange(LocaleEvent event) {
inboxItem.setText(t("menu.inbox"));
outboxItem.setText(t("menu.outbox"));
}
}
Datan sitominen

Datan sitomusjärjestelmä tukee käännettyjä validoitus- ja muunnosviestejä käyttäen Supplier<String> yhdistettynä t()-metodiin. Katso dynaamiset validoitusviestit, dynaamiset muuntajaviestit ja paikallisesti tietoisa Jakarta Validointi.

Mukautetut käännösresolverit

Oletusresolveri lataa käännöksiä Java ResourceBundle -ominaistiedostoista. Ladataaksesi käännöksiä erilaisista lähteistä, kuten tietokannasta tai etäpalvelusta, toteuta TranslationResolver:

DatabaseTranslationResolver.java
public class DatabaseTranslationResolver implements TranslationResolver {
private final TranslationRepository repository;
private final List<Locale> supportedLocales;

public DatabaseTranslationResolver(TranslationRepository repository,
List<Locale> supportedLocales) {
this.repository = repository;
this.supportedLocales = List.copyOf(supportedLocales);
}

@Override
public String resolve(String key, Locale locale, Object... args) {
String value = repository
.findByKeyAndLocale(key, locale.getLanguage())
.map(Translation::getValue)
.orElse(key);

if (args != null && args.length > 0) {
value = new MessageFormat(value, locale).format(args);
}

return value;
}

@Override
public List<Locale> getSupportedLocales() {
return supportedLocales;
}
}

Mukautetun resolverin rekisteröinti

Yksinkertaisessa webforJ-sovelluksessa aseta resolveri ennen sovelluksen käynnistymistä, esimerkiksi käyttämällä sovelluksen elinkaarikuuntelijaa:

App.setTranslationResolver(new DatabaseTranslationResolver(repository, supportedLocales));

Spring Boot -sovelluksessa, tarjoa resolveri beanina:

MessageSourceConfig.java
@Configuration
public class MessageSourceConfig {

@Bean
TranslationResolver translationResolver(TranslationRepository repository,
SpringConfigurationProperties properties) {
List<Locale> supportedLocales = properties.getI18n().getSupportedLocales().stream()
.map(Locale::forLanguageTag)
.toList();
return new DatabaseTranslationResolver(repository, supportedLocales);
}
}
Oletusresolveri Spring Bootissa

Kun mukautettua TranslationResolver -beania ei ole määritelty, Springin automaattinen konfigurointi tarjoaa oletus BundleTranslationResolver -resolverin, joka on määritetty tuettujen lokaliteettien mukaan application.properties-tiedostossa.