Java web uygulaması nasıl uluslararası hale getirilir?


81

Google'dan, web uygulamamın tüm dilleri kullanmasını sağlama işleminin Uluslararasılaştırma olduğunu öğrendim. Uluslararasılaşma süreci için Unicode'u anlamak istiyorum, bu yüzden Unicode'u buradan ve oradan öğrendim .

Unicode hakkında, bir karakter kümesinin nasıl baytlara ve yine baytlara kodlanmış karakter kümesine nasıl çözüldüğünü anlayabiliyorum. Ama nasıl ilerleyeceğimi bilmiyorum. Dizeleri nasıl karşılaştıracağımı öğrenmek istiyorum ve web uygulamamda uluslararasılaştırmayı nasıl uygulayacağımı bilmem gerekiyor. Herhangi bir Öneriniz Lütfen? Lütfen bana yol göster.

Amacım:

Ana hedefim Çeviri için bir Web Uygulaması geliştirmektir (İngilizce'den Arapça'ya ve tersi). Uluslararasılaşmayı takip etmek istiyorum. Çeviri için web uygulamamı FF, Chrome, IE gibi üç tarayıcıda da çalıştırmak istiyorum. Bunu nasıl başarırım?

Yanıtlar:


221

Temel bir JSP / Servlet web uygulaması durumunda, temel yaklaşım JSTL fmttaglib'i kaynak paketleriyle birlikte kullanmak olacaktır . Kaynak paketleri, anahtarın tüm diller için aynı olan ve değerin dile göre farklılık gösteren bir sabit olduğu anahtar / değer çiftleri içerir. Kaynak paketleri genellikle tarafından yüklenen özellikler dosyalarıdır .ResourceBundle API . Ancak bu, örneğin bir veritabanından anahtar / değer çiftlerini yükleyebilmeniz için özelleştirilebilir.

Özellikler dosyası tabanlı kaynak paketleriyle web uygulamanızın oturum açma formunu nasıl uluslararası hale getireceğinize dair bir örnek.


  1. Aşağıdaki dosyaları oluşturun ve bunları bir pakete koyun, örneğin com.example.i18n(Maven olması durumunda, onları içerideki paket yapısına koyun src/main/resources).

    text.properties (varsayılan dilde, genellikle İngilizce olan anahtar / değer çiftlerini içerir)

     login.label.username = Kullanıcı Adı
     login.label.password = Parola
     login.button.submit = Oturum açın
     

    text_nl.properties(Hollandaca ( nl) anahtar / değer çiftlerini içerir)

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

    text_es.properties(İspanyolca ( es) anahtar / değer çiftlerini içerir)

     login.label.username = Nombre de usuario
     login.label.password = Contraseña
     login.button.submit = Kullanıcı
     

    Kaynak paketi dosya adı aşağıdaki kalıba uymalıdır name_ll_CC.properties. _llBölüm küçük harfli olmalıdır ISO 693-1 dil kodu. İsteğe bağlıdır ve yalnızca _CCparça mevcut olduğunda gereklidir . _CCParçası büyük harf olmalıdır ISO 3166-1 Alpha-2 ülke kodu. İsteğe bağlıdır ve genellikle yalnızca Amerikan İngilizcesi ( _en_US) ve İngiliz İngilizcesi ( _en_GB) gibi ülkeye özgü dil lehçelerini ayırt etmek için kullanılır .


  2. Henüz tamamlanmadıysa, JSTL'yi yükleyin. Servlet 2.5 veya daha yenisi (Tomcat 6.0 ve benzeri) üzerinde çalışıyorsanız ve web.xmlServlet 2.5 spesifikasyonuna uygun olduğu bildirilirse, jstl-1.2.jar'ı webapp /WEB-INF/libklasörüne koyun .


  3. Aşağıdaki örnek JSP dosyasını oluşturun ve web içeriği klasörüne koyun.

    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>
    

    <c:set var="language">Geçerli dil yönetir. Dil, istek parametresi olarak sağlandıysa (dil açılır listesine göre), o zaman ayarlanacaktır. Aksi takdirde, dil oturumda önceden ayarlanmışsa, bunun yerine ona bağlı kalın. Aksi takdirde, istek başlığında kullanıcı tarafından sağlanan yerel ayarı kullanın.

    Kaynak <fmt:setLocale>grubu için yerel ayarı ayarlar. Bu hat olması önemlidir önce<fmt:setBundle> .

    <fmt:setBundle>Baz adıyla kaynak paketi başlatır (olduğunu olmadan tek adıyla kadar tam nitelikli paket adı _ll_CCbelirteci).

    <fmt:message>Verilerini geri çağırır belirtilen paket anahtar tarafından mesaj değer.

    Arama <html lang="${language}">botlarına sayfanın hangi dilde olduğunu bildirir, böylece yinelenen içerik olarak işaretlenmez (dolayısıyla SEO için iyidir).

    Dil açılır menüsü, başka bir dil seçildiğinde hemen JavaScript tarafından gönderilecek ve sayfa, yeni seçilen dil ile yenilenecektir.


Bununla birlikte, özellik dosyalarının varsayılan olarak ISO-8859-1 karakter kodlaması kullanılarak okunduğunu aklınızda bulundurmanız gerekir. Unicode kaçışlarıyla onlardan kaçmanız gerekir. Bu, JDK tarafından sağlanan native2ascii.exearaç kullanılarak yapılabilir . Daha fazla ayrıntı için bu makale bölümüne de bakın .

Teorik bir alternatif, Controlbu dosyaları UTF-8 olarak yüklemek için özel bir paket sağlamak olabilir , ancak bu maalesef temel JSTL fmttaglib tarafından desteklenmiyor . Bir Filter. JSF gibi bunu daha şeffaf bir şekilde ele alabilen (MVC) çerçeveleri vardır, ayrıca bu makaleye bakın .


2
Bu güzel çözümün bir sorunu var: İstekten alınan yerel ayar, "en_US" örneğinde olduğu gibi, geçersiz HTML olan <html lang = "en_US"> verecek olan dil ve ülke olabilir. Lang niteliği için değer olarak yerelden sadece "en" dil bölümünü kullanmak gerekir.
Torsten Römer

1
Uluslararasılaştırma için yukarıda özetlenen yöntem, url'yi görüntülenen dile göre değiştirmez. Dile göre url'yi nasıl güncelleyeceğiniz konusunda herhangi bir öneriniz var mı? Endeksleme için farklı dillerin ayrı url'leri olması önerildiği için soruyorum: support.google.com/webmasters/answer/…
2016

1
Dil kaynak (test.properties ve text_en.properties dosyaları) dosyalarınızı uygulama / kaynaklar köküne koyarsanız, fmt: bundle'ı şu şekilde ayarlayabilirsiniz: <fmt: setBundle basename = "text" />
Bahadır Taşdemir

1
@bahadirT: "test" in bir yazım hatası olduğunu varsaymak, bu doğru. basenameDosya uzantısı olmadan taban adını temsil etmesi gerekir. Onu bir pakette yapılandırmamak sadece kötü bir uygulamadır.
BalusC

1
@theyuv: User has {0} review{0,choice,0#s|1#|1<s} docs.oracle.com/javase/8/docs/api/java/text/MessageFormat.html
BalusC

26

BalusC'nin söylediklerine ek olarak, yönlülüğe de dikkat etmelisiniz (çünkü İngilizce Soldan Sağa ve Arapça tam tersi yazılmıştır). En kolay yol , JSP web sayfanızın öğesine diröznitelik eklemek htmlve onu dışsallaştırmaktır, böylece değer özellikler dosyasından gelir (tıpkı diğer öğeler veya özniteliklerde olduğu gibi):

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

Ayrıca, bu tür bir uygulamanın stiliyle ilgili birkaç sorun vardır - en azından mutlak konumlandırmadan kaçınmalısınız. Herhangi bir nedenle bundan kaçınamazsanız, dil başına (her biri?) Farklı stil sayfaları kullanabilir veya verboten olan bir şey yapabilirsiniz , yani düzeni yönetmek için tablolar kullanabilirsiniz. Div öğelerini kullanmak istiyorsanız, "simetrik" sol ve sağ stil özellikleriyle (her ikisi de aynı değere sahip) göreli konumlandırmayı kullanmanızı öneririm, çünkü bu, yön değiştirmenin çalışmasını sağlayan şeydir.

Çift Yönlü web siteleri hakkında daha fazla bilgiyi burada bulabilirsiniz .


7
Evet, aslında bunun da hesaba katılması gerekiyor.
BalusC

4
<html dir="RTL">VEYA <html dir="LTR">. Varsayılan<html dir="LTR">
Fahim Parkar

2

bu eğiticiye dayanarak, GAE - Google'ın Uygulama Motoru'nda aşağıdakileri kullanıyorum:

Aşağıdaki gibi bir jsp dosyası:

<%@ 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>

Ve şu adlı dosyaları eklemek: app.properties(varsayılan) ve app_fr.properties(ve her dil için böyle devam eder). Bu dosyaların her biri aşağıdaki gibi ihtiyacınız olan dizeleri içermelidir: key: value_in_language, örneğin şunları app_fr.propertiesiçerir:

greeting=Bonjour!

app.properties içerir:

greeting=Hello!

Bu kadar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.