Käännös 25.12
webforJ sisältää sisäänrakennetun käännösjärjestelmän, jolla voidaan etsiä lokalisoituja merkkijonoja avaimen mukaan. Järjestelmä koostuu käännöksen ratkaisemisesta, joka kartoittaa avaimet lokalisoituun tekstiin, HasTranslation -välittämisliittymästä, joka tarjoaa kätevän t()-metodin, App.getTranslation() suorasta pääsystä missä tahansa, automaattisesta kielentunnistuksesta selaimelta 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öksen ratkaiseminen
Käännöksen ratkaiseminen on järjestelmä, joka etsii lokalisoituja merkkijonoja annetulle avaimelle ja paikalle. webforJ tarjoaa oletusarvoisen ratkaisimisen, BundleTranslationResolver, joka lataa käännöksiä Java ResourceBundle -ominaisuustiedostoista luokka-polussa. Tämä toimii heti ilman lisäriippuvuuksia.
Ominaisuuspakettitiedostot
Sijoita käännöstiedostosi hakemistoon src/main/resources. Oletusarvoinen ratkaisija etsii tiedostoja, joiden nimet ovat messages paikalliskatseilla, jotka noudattavat Java ResourceBundle -nimikettä:
messages.properties # Oletus/varakohtaiset käännökset
messages_en.properties # Englanti
messages_de.properties # Saksa
messages_fr_CA.properties # Ranska (Kanada)
Jokainen tiedosto sisältää avain-arvo-pareja. Avaimet ovat tunnisteita, joita käytät koodissa, ja arvot ovat käännetyt merkkijonot. Voit sisällyttää MessageFormat -paikkamerkkejä 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
Ratkaisija delegoi Java:n standardin ResourceBundle ratkaisu ketjulle, joka käsittelee paikantamis ja varakohtaus automaattisesti.
Tuettujen paikojen määrittäminen
supported-locales -asetuksella kerrotaan webforJ:lle, mitkä paikalliset kielet sovelluksesi tukee. Tätä luetteloa käytetään automaattisesti tunnistamiseen käyttäjän selaimen kielen yhteensattumien osalta saatavilla olevia käännöksiä vastaan. Luettelon ensimmäistä paikallista käytetään oletusvarakohtana, kun parempaa vastaavuutta ei löydy. Ominaisuuden avain on webforj.i18n.supported-locales ja se hyväksyy luettelon BCP 47 kielitunnuksista, esimerkiksi en, de.
Katso Konfigurointi -osiosta, kuinka määrittää ominaisuuksia eri ympäristöille.
t()-metodi
Komponentit, jotka toteuttavat HasTranslation -välittämisliittymän, saavat käyttöönsä t()-metodin tekstin kääntämiseen. Metodi ottaa vastaan käännöksen avaimen ja palauttaa lokalisoidun merkkijonon nykyiselle sovelluskielelle:
public class MainLayout extends Composite<AppLayout> implements HasTranslation {
public MainLayout() {
// Yksinkertainen käännös
String title = t("app.title");
// Käännös MessageFormat-parametrien kanssa
String greeting = t("greeting", userName, messageCount);
// Käännös tietylle kielelle
String germanTitle = t(Locale.GERMAN, "app.title");
}
}
Voit myös käyttää App.getTranslation() suoraan missä tahansa ilman, että sinun tarvitsee toteuttaa liittymää:
String title = App.getTranslation("app.title");
Jos käännöksen avainta ei löydy, t() palauttaa avaimen itsessään eikä heitä poikkeusta. Tämä tarkoittaa, että sovelluksesi ei riko, jos käännös puuttuu. Avainta näytetään sellaisenaan, ja varoitus kirjataan, jotta voit seurata puuttuvia käännöksiä kehityksen aikana.
Käännettyjen komponenttien toteuttaminen
Käännetty komponentti yhdistää tyypillisesti HasTranslation ja LocaleObserver. Käytä t() luodessasi UI-elementtejä asettaaksesi alkuperäinen käännetty teksti. Tukeaksesi aikarajan kielen vaihtamista, toteuta LocaleObserver ja päivitä sama teksti onLocaleChange()-menetelmässä.
@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"));
}
}
Tietosidontajärjestelmä tukee käännettyjä validointiviestejä ja muunnosviestejä käyttämällä Supplier<String> ja t(). Katso dynaamiset validointiviestit, dynaamiset muunnosviestit ja kielelle tietoiset Jakarta Validointi.
Mukautetut käännöksen ratkaisijat
Oletusratkaisija lataa käännökset Java ResourceBundle -ominaisuustiedostoista. Kuvitellaksesi käännöksiä eri 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 ratkaisijan rekisteröinti
Varsinaisessa webforJ-sovelluksessa aseta ratkaisija ennen sovelluksen käynnistämistä, esimerkiksi käyttämällä sovelluksen elinkaaren kuuntelijaa:
App.setTranslationResolver(new DatabaseTranslationResolver(repository, supportedLocales));
Spring Boot -sovelluksessa, tuo ratkaisija beaniksi:
@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 määritetä, Springin automaattinen konfigurointi tarjoaa oletus BundleTranslationResolver -ratkaisijan, joka on määritetty tuetuilla kielillä application.properties -tiedostosta.