Käännös 25.12
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.
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:
app.title=Postilaatikko
menu.inbox=Saapuneet
menu.outbox=Lähetetyt
greeting=Hei {0}, sinulla on {1} uutta viestiä
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.
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");
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.
@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 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:
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:
@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);
}
}
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.