जावा वेब एप्लिकेशन का अंतर्राष्ट्रीयकरण कैसे करें?


81

मैंने Google से सीखा कि अंतर्राष्ट्रीयकरण वह प्रक्रिया है जिसके द्वारा मैं सभी भाषाओं का उपयोग करने के लिए अपना वेब एप्लिकेशन बना सकता हूं। मैं अंतर्राष्ट्रीयकरण की प्रक्रिया के लिए यूनिकोड को समझना चाहता हूं, इसलिए मैंने यहां और वहां से यूनिकोड के बारे में सीखा ।

मैं यूनिकोड के बारे में समझने में सक्षम हूं कि कैसे बाइट्स को एन्कोडेड और फिर बाइट्स में एक चारसेट सेट अप करने के लिए डिकोड किया गया है। लेकिन मैं नहीं जानता कि आगे कैसे बढ़ना है। मैं स्ट्रिंग्स की तुलना करना सीखना चाहता हूं और मुझे यह जानना होगा कि अपने वेब एप्लिकेशन में अंतर्राष्ट्रीयकरण को कैसे लागू किया जाए। कोई सुझाव कृपया? कृपया मेरा मार्ग दर्शन कीजिए।

मेरा लक्षय:

मेरा मुख्य उद्देश्य अनुवाद के लिए एक वेब एप्लिकेशन (अंग्रेजी से अरबी और इसके विपरीत) विकसित करना है। मैं अंतर्राष्ट्रीयकरण का पालन करना चाहता हूं। मैं FF, क्रोम, IE तीनों ब्राउज़रों में अनुवाद के लिए अपना वेब एप्लिकेशन चलाना चाहता हूं। मुझे यह कैसे हासिल होगा?

जवाबों:


221

एक बुनियादी JSP / Servlet WebApplication के मामले में, बुनियादी दृष्टिकोण का उपयोग किया जाएगा JSTL fmttaglib के साथ संयोजन में संसाधन बंडलों । संसाधन बंडलों में कुंजी-मूल्य जोड़े होते हैं जहां कुंजी एक स्थिर होती है जो सभी भाषाओं के लिए समान होती है और मूल्य प्रति भाषा में भिन्न होता है। संसाधन बंडलों आमतौर पर गुण फाइलें होती हैं जो ResourceBundleएपीआई द्वारा लोड की जाती हैं। यह हालांकि अनुकूलित किया जा सकता है ताकि आप एक डेटाबेस के लिए कुंजी-मूल्य जोड़े को लोड कर सकें।

यहाँ एक उदाहरण दिया गया है कि गुण आधारित फ़ाइल बंडलों के साथ अपने वेबपृष्ठ के लॉगिन फ़ॉर्म का अंतर्राष्ट्रीयकरण कैसे करें।


  1. निम्नलिखित फाइलें बनाएं और उन्हें कुछ पैकेज में रखें, जैसे com.example.i18n(मेवेन के मामले में, उन्हें पैकेज संरचना में डालें src/main/resources)।

    text.properties (डिफ़ॉल्ट भाषा में कुंजी-मूल्य जोड़े शामिल हैं, आमतौर पर अंग्रेजी)

     login.label.username = उपयोगकर्ता नाम
     login.label.password = पासवर्ड
     login.button.submit = साइन इन करें
     

    text_nl.properties(डच में nl) ( कुंजी-मूल्य जोड़े)

     login.label.username = गबरुइकरनम
     login.label.password = वचतवोर्ड
     login.button.submit = Inloggen
     

    text_es.properties(स्पैनिश शामिल हैं es)

     login.label.username = नोमब्र डे यूसरियो
     login.label.password = Contraseña
     login.button.submit = Acceder
     

    संसाधन बंडल फ़ाइल नाम को निम्न पैटर्न का पालन करना चाहिए name_ll_CC.properties_llभाग लोअरकेस होना चाहिए आईएसओ 693-1 भाषा कोड। यह वैकल्पिक और केवल आवश्यक है जब भी _CCभाग मौजूद हो। _CCभाग अपरकेस होना चाहिए आईएसओ 3166-1 अल्फ़ा -2 देश कोड। यह वैकल्पिक है और अक्सर इसका उपयोग केवल अमेरिकी अंग्रेजी ( _en_US) और ब्रिटिश अंग्रेजी ( _en_GB) जैसी देश-विशिष्ट भाषा बोलियों के बीच भेद करने के लिए किया जाता है ।


  2. यदि अभी तक नहीं किया है, तो JSTL स्थापित करें। यदि आप एक सर्वलेट 2.5 कंटेनर या नए (टॉमकैट 6.0 और इसी तरह) पर चल रहे हैं और आपको web.xmlसर्वलेट 2.5 विनिर्देशन के अनुरूप घोषित किया गया है, तो बस वेबस्टैप/WEB-INF/lib फ़ोल्डर में jstl-1.2.jar डालें


  3. निम्न उदाहरण JSP फ़ाइल बनाएँ और इसे वेब सामग्री फ़ोल्डर में डालें।

    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">वर्तमान भाषा का प्रबंधन करता है। यदि भाषा अनुरोध पैरामीटर (भाषा ड्रॉपडाउन द्वारा) के रूप में आपूर्ति की गई थी, तो इसे सेट किया जाएगा। और यदि भाषा पहले ही सत्र में सेट हो गई थी, तो इसके बजाय उससे चिपके रहें। अनुरोध अनुरोध शीर्षलेख में उपयोगकर्ता ने आपूर्ति की गई लोकेल का उपयोग किया है।

    <fmt:setLocale>संसाधन बंडल के लिए स्थान निर्धारित करता है। यह महत्वपूर्ण है कि यह रेखा पहले है <fmt:setBundle>

    <fmt:setBundle>इसके आधार नाम से संसाधन बंडल initializes (यह है कि, बिना एकमात्र नाम के साथ जब तक पूर्ण योग्य पैकेज नाम _ll_CCविनिर्देशक)।

    <fmt:message>Retrieves निर्दिष्ट बंडल कुंजी के द्वारा संदेश मूल्य।

    <html lang="${language}">सूचित searchbots क्या भाषा पेज इतना है कि यह चिह्नित नहीं किया जाएगा में है डुप्लिकेट सामग्री (इस प्रकार, एसईओ के लिए अच्छा) के रूप में।

    भाषा ड्रॉपडाउन तुरंत जावास्क्रिप्ट द्वारा सबमिट किया जाएगा जब दूसरी भाषा चुनी जाएगी और पृष्ठ को नई चुनी गई भाषा के साथ ताज़ा किया जाएगा।


हालाँकि आपको यह ध्यान रखने की ज़रूरत है कि गुण फ़ाइलें ISO-8859-1 वर्ण एन्कोडिंग का उपयोग करके डिफ़ॉल्ट रूप से पढ़ी जाती हैं। आपको यूनिकोड से बचकर भागना होगा। यह JDK- आपूर्ति native2ascii.exeउपकरण का उपयोग करके किया जा सकता है । अधिक विस्तार के लिए यह लेख अनुभाग भी देखें ।

एक सैद्धांतिक विकल्प ControlUTF-8 के रूप में उन फ़ाइलों को लोड करने के लिए एक कस्टम के साथ एक बंडल की आपूर्ति करना होगा , लेकिन यह दुर्भाग्य से मूल JSTL टैगलीब द्वारा समर्थित नहीं है fmt। आपको एक की मदद से इसे स्वयं प्रबंधित करने की आवश्यकता होगी Filter। ऐसे (MVC) ढांचे हैं जो इसे अधिक पारदर्शी तरीके से संभाल सकते हैं, जैसे JSF, इस लेख को भी देखें


2
इस अच्छे समाधान में एक मुद्दा है: अनुरोध से लिया गया स्थान भाषा और देश हो सकता है, जैसा कि "en_US", जो <html lang = "en_US"> देगा, जो अमान्य HTML है। लैंग की विशेषता के लिए लोकेल से केवल भाषा भाग "एन" का उपयोग करना आवश्यक है।
टॉरस्टेन रोमर

1
अंतर्राष्ट्रीयकरण के लिए ऊपर उल्लिखित विधि प्रदर्शित भाषा के आधार पर यूआरएल में संशोधन नहीं करती है। क्या आपके पास भाषा के अनुसार url को अपडेट करने के लिए कोई सुझाव है। मैं पूछता हूं क्योंकि, अनुक्रमण के लिए, यह अनुशंसा की जाती है कि विभिन्न भाषाओं में अलग-अलग यूआरएल हैं: support.google.com/webmasters/answer/…
heuv

1
यदि आप अपना भाषा संसाधन (test.properties और text_en.properties फ़ाइलें) एप्लिकेशन / संसाधन रूट पर फ़ाइलें डालते हैं, तो आप fmt: बंडल को इस तरह सेट कर सकते हैं: <fmt: setBundle basename = 'text' />
Bahadir Tasdemir

1
@ बहादुर: "परीक्षण" मान लेना एक टाइपो है, यह सही है। basenameफाइल एक्सटेंशन के बिना आधार नाम से बताना होगा। पैकेज में इसे संरचित नहीं करना केवल एक खराब अभ्यास है।
बालुसक

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

बालुसक ने जो कहा, इसके अलावा, आपको निर्देशन के बारे में ध्यान रखना होगा (चूँकि अंग्रेजी को लेफ्ट-टू-राइट लिखा जाता है और दूसरे तरीके से अरबी)। सबसे आसान तरीका यह होगा कि आप अपने जेएसपी वेब पेज के तत्व में dirविशेषता को जोड़ें htmlऔर उसे एक्सटर्ाइज़ करें, इसलिए मान गुण फ़ाइल (अन्य तत्वों या विशेषताओं के साथ) से आता है:

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

इसके अलावा, इस तरह के अनुप्रयोग को स्टाइल करने के साथ कुछ समस्याएं हैं - आपको कहना चाहिए कि कम से कम पूर्ण स्थिति से बचें। यदि आप किसी कारण से टाल नहीं सकते हैं, तो आप या तो अलग-अलग स्टाइलशीट प्रति (प्रत्येक?) भाषा का उपयोग कर सकते हैं या कुछ ऐसा कर सकते हैं जो वर्बोटेन है , जो लेआउट के प्रबंधन के लिए तालिकाओं का उपयोग करता है। यदि आप दिव्य तत्वों का उपयोग करना चाहते हैं, तो मैं "सममित" बाएँ और दाएँ शैली विशेषताओं (दोनों समान मूल्य वाले) के साथ सापेक्ष स्थिति का उपयोग करने का सुझाव दूंगा, क्योंकि यह वही है जो स्विचिंग दिशात्मक कार्य करता है।

आप यहाँ द्वि-दिशात्मक वेबसाइटों के बारे में और जानकारी प्राप्त कर सकते हैं ।


7
हां, वास्तव में, इसे भी ध्यान में रखा जाना चाहिए।
बालूसी

4
<html dir="RTL">या <html dir="LTR">। डिफ़ॉल्ट है<html dir="LTR">
फहीम पारकर

2

इस ट्यूटोरियल के आधार पर , मैं GAE - Google के ऐप इंजन पर निम्नलिखित का उपयोग कर रहा हूं:

एक jsp फ़ाइल निम्नानुसार है:

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

और नाम की फ़ाइलों को जोड़ना: app.properties(डिफ़ॉल्ट) और app_fr.properties(और हर भाषा के लिए)। इन फ़ाइलों में से प्रत्येक में आपके द्वारा आवश्यक स्ट्रिंग्स शामिल होनी चाहिए: कुंजी: value_in_language, उदा। app_fr.propertiesइसमें शामिल हैं:

greeting=Bonjour!

app.properties इसमें शामिल हैं:

greeting=Hello!

बस इतना ही

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.