Hoe een JSP/Servlet-webtoepassing internationaliseren/lokaliseren?

Ik heb van Google geleerd dat internationalisering het proces is waarmee ik mijn
webapplicatie om alle talen te gebruiken. Ik wil Unicode begrijpen voor het proces van internationalisering, dus leerde ik over Unicode van hieren daar.

Ik begrijp van Unicode dat een tekenset wordt gecodeerd naar bytes en weer bytes wordt gedecodeerd naar een tekenset. Maar ik weet niet hoe ik verder moet. Ik wil strings leren vergelijken en ik moet weten hoe ik internationalisering in mijn webapplicatie kan implementeren. Suggesties alstublieft? Leid mij alstublieft.

Mijn doel:

Mijn hoofddoel is het ontwikkelen van een webapplicatie voor vertalingen (Engels naar Arabisch en vice versa). Ik wil Internationalisering volgen. Ik wil mijn webtoepassing voor vertaling uitvoeren in alle drie de browsers, namelijk FF, Chrome, IE. Hoe bereik ik dit?


Antwoord 1, autoriteit 100%

In het geval van een eenvoudige JSP/Servlet-webtoepassing, zou de basisbenadering het gebruik van JSTLfmttaglibin combinatie met bronnenbundels. Bronbundels bevatten sleutel-waardeparen waarbij de sleutel een constante is die voor alle talen hetzelfde is en de waarde per taal verschilt. Bronbundels zijn meestal eigenschappenbestandendie worden geladen door ResourceBundle-API. Dit kan echter worden aangepast, zodat u de sleutel-waardeparen kunt laden uit bijvoorbeeld een database.

Hier is een voorbeeld van hoe u het inlogformulier van uw webapplicatie kunt internationaliseren met resourcebundels op basis van eigenschappenbestanden.


  1. Maak de volgende bestanden en plaats ze in een pakket, b.v. com.example.i18n(in het geval van Maven, plaats ze in de pakketstructuur in src/main/resources).

    text.properties(bevat sleutel-waardeparen in de standaardtaal, meestal Engels)

    login.label.username = Gebruikersnaam
     login.label.password = Wachtwoord
     login.button.submit = Aanmelden
     

    text_nl.properties(bevat Nederlandse (nl) sleutel-waardeparen)

    login.label.username = Gebruikersnaam
     login.label.password = Wachtwoord
     login.button.submit = Inloggen
     

    text_es.properties(bevat Spaanse (es) sleutel-waardeparen)

    login.label.username = Nombre de usuario
     login.label.password = Tegenstrijdigheid
     login.button.submit = Toegang
     

    De bestandsnaam van de resourcebundel moet voldoen aan het volgende patroon name_ll_CC.properties. Het _llgedeelte moet de kleine letter ISO 693-1zijn taalcode. Het is optioneel en alleen vereist wanneer het _CCdeel aanwezig is. Het _CCgedeelte moet de hoofdletters zijn ISO 3166-1 Alpha- 2landcode. Het is optioneel en wordt vaak alleen gebruikt om onderscheid te maken tussen landspecifieke taaldialecten, zoals Amerikaans Engels( _en_US) en Brits Engels(_en_GB).


  2. Indien nog niet klaar, installeer JSTL volgens de instructies in dit antwoord: Hoe installeer ik JSTL? De absolute uri: http://java.sun.com/jstl/core kan niet worden opgelost.


  3. Maak het volgende voorbeeld-JSP-bestand en plaats het in de map met webinhoud.

    login.jsp

    <%@ page pageEncoding="UTF-8" %>
     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
     <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
     <c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
     <fmt:setLocale value="${language}" />
     <fmt:setBundle basename="com.example.i18n.text" />
     <!DOCTYPE html>
     <html lang="${language}">
         <head>
             <title>JSP/JSTL i18n demo</title>
         </head>
         <body>
             <form>
                 <select id="language" name="language" onchange="submit()">
                     <option value="en" ${language == 'en' ? 'selected' : ''}>English</option>
                     <option value="nl" ${language == 'nl' ? 'selected' : ''}>Nederlands</option>
                     <option value="es" ${language == 'es' ? 'selected' : ''}>Español</option>
                 </select>
             </form>
             <form method="post">
                 <label for="username"><fmt:message key="login.label.username" />:</label>
                 <input type="text" id="username" name="username">
                 <br>
                 <label for="password"><fmt:message key="login.label.password" />:</label>
                 <input type="password" id="password" name="password">
                 <br>
                 <fmt:message key="login.button.submit" var="buttonValue" />
                 <input type="submit" name="submit" value="${buttonValue}">
             </form>
         </body>
     </html>
    

    De <c:set var="language">beheert de huidige taal. Als de taal is opgegeven als verzoekparameter (via de vervolgkeuzelijst voor talen), wordt deze ingesteld. Anders, als de taal al eerder in de sessie was ingesteld, blijf er dan bij. Gebruik anders de door de gebruiker opgegeven landinstelling in de verzoekkop.

    De <fmt:setLocale>stelt de landinstelling in voor de resourcebundel. Het is belangrijk dat deze regel vóórde <fmt:setBundle>staat.

    De <fmt:setBundle>initialiseert de bronbundel met zijn basisnaam (dat wil zeggen, de volledige gekwalificeerde pakketnaam tot met de enige naam zonder de _ll_CCspecificatie ).

    De <fmt:message>haalt de berichtwaarde op met de opgegeven bundelsleutel.

    De <html lang="${language}">informeert de zoekbots in welke taal de pagina is, zodat deze niet wordt gemarkeerd als dubbele inhoud (dus goed voor SEO ).

    De vervolgkeuzelijst voor taal wordt onmiddellijk verzonden door JavaScript wanneer een andere taal wordt gekozen en de pagina wordt vernieuwd met de nieuw gekozen taal.


Houd er echter rekening mee dat eigenschappenbestanden standaard worden gelezen met ISO-8859-1-tekencodering. Je zou aan hen moeten ontsnappen door unicode-ontsnappingen. Dit kan worden gedaan met behulp van de door JDK geleverde tool native2ascii.exe. Zie ook deze artikelsectievoor meer details.

Een theoretisch alternatief zou zijn om een ​​bundel te leveren met een aangepaste Controlom die bestanden als UTF-8 te laden, maar dat wordt helaas niet ondersteund door de basis JSTL fmttaglib. Je zou het allemaal zelf moeten beheren met behulp van een Filter. Er zijn (MVC) frameworks die dit transparanter kunnen aanpakken, zoals JSF, zie ook dit artikel.


Antwoord 2, autoriteit 12%

Naast wat BalusC zei, moet je letten op directionaliteit (aangezien Engels van links naar rechts wordt geschreven en Arabisch andersom). De eenvoudigste manier zou zijn om het kenmerk dirtoe te voegen aan het html-element van uw JSP-webpagina en het te externaliseren, zodat de waarde uit het eigenschappenbestand komt (net als bij andere elementen of kenmerken ):

<html dir="${direction}">
...
</html>

Ook zijn er weinig problemen met het stylen van een dergelijke applicatie – je moet op zijn zachtst gezegd absolute positionering vermijden. Als je dat om de een of andere reden niet kunt vermijden, kun je ofwel verschillende stylesheets per (elke?) taal gebruiken of iets doen dat verbotenis, namelijk tabellen gebruiken voor het beheren van de lay-out. Als je div-elementen wilt gebruiken, raad ik aan om relatieve positionering te gebruiken met “symmetrische” linker- en rechterstijlattributen (beide met dezelfde waarde), omdat dit het schakelen tussen directionaliteit mogelijk maakt.

U kunt hier meer vinden over bidirectionele websites .


Antwoord 3

gebaseerd op deze zelfstudie, ik gebruik het volgende op GAE – Google’s App Engine:

Een jsp-bestand als volgt:

<%@ page import="java.io.* %>
<% 
  String lang = "fr"; //Assign the correct language either by page or user-selected or browser language etc.
  ResourceBundle RB = ResourceBundle.getBundle("app", new Locale(lang));
%>                 
<!DOCTYPE html>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<head>
</head>
<body>
  <p>      
    <%= RB.getString("greeting") %>
  </p>
</body>

En het toevoegen van de bestanden met de naam: app.properties(standaard) en app_fr.properties(en zo verder voor elke taal). Elk van deze bestanden moet de volgende strings bevatten die u nodig hebt: key:value_in_language, b.v. app_fr.propertiesbevat:

greeting=Bonjour!

app.propertiesbevat:

greeting=Hello!

Dat is alles

Other episodes