Динамическая локализация с использованием JSTL [duplicate]

самый простой способ,

использовать комплект (). разница (комплект ())

list_a = [1,2,3]
list_b = [2,3]
print set(list_a).difference(set(list_b))

ответ есть set([1])

можно напечатать как список,

print list(set(list_a).difference(set(list_b)))
76
задан informatik01 7 November 2013 в 00:22
поделиться

3 ответа

В случае базового веб-приложения JSP / Servlet основной подход будет использовать JSTL fmt taglib в сочетании с ресурсными пучками , Пакеты ресурсов содержат пары «ключ-значение», где ключ является константой, которая одинакова для всех языков, и значение отличается на каждый язык. Пакеты ресурсов обычно представляют собой файлы свойств , которые загружаются API ResourceBundle . Однако это можно настроить так, чтобы вы могли загружать пары ключ-значение из базы данных.

Вот пример того, как интернационализировать форму входа в систему вашего веб-приложения с помощью пакетов ресурсов на основе файлов.


  1. Создайте следующие файлы и поместите их в некоторый пакет, например com.example.i18n (в случае Maven, поместите их в структуру пакета внутри src/main/resources). text.properties (содержит пары ключ-значение на языке по умолчанию, обычно на английском языке)
    login.label.username = Username
    login.label.password = Password
    login.button.submit = Sign in
    
    text_nl.properties (содержит пары ключ-значение из голландской (nl)
    login.label.username = Gebruikersnaam
    login.label.password = Wachtwoord
    login.button.submit = Inloggen
    
    text_es.properties (содержит испанский (es) пары ключ-значение)
    login.label.username = Nombre de usuario
    login.label.password = Contraseña
    login.button.submit = Acceder
    
    Имя файла ресурса должно соответствовать следующему шаблону name_ll_CC.properties. Часть _ll должна быть нижним регистром ISO 693-1 . Это необязательно и требуется только, когда присутствует _CC. Часть _CC должна быть в верхнем регистре ISO 3166-1 Alpha-2 код страны. Это необязательно и часто используется для различения языковых диалектов, характерных для конкретной страны, например Американский английский (_en_US) и Британский английский (_en_GB).
  2. Если этого еще не сделано, установите JSTL. Если вы работаете на контейнере Servlet 2.5 или новее (Tomcat 6.0 и т. Д.), И ваш web.xml объявлен соответствующим спецификации Servlet 2.5, тогда просто поставьте jstl-1.2.jar в webapp /WEB-INF/lib.
  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">. Если язык был предоставлен как параметр запроса (по выпадающему языку), он будет установлен. Иначе, если язык уже был предварительно установлен в сеансе, тогда придерживайтесь его. Else использует локализованный пользователем язык в заголовке запроса. <fmt:setLocale> устанавливает языковой стандарт для набора ресурсов. Важно, чтобы эта строка была до <fmt:setBundle>. <fmt:setBundle> инициализирует пакет ресурсов по его базовому имени (то есть полное имя пакета до тех пор, пока его имя не будет указано без спецификатора _ll_CC). <fmt:message> извлекает значение сообщения указанным ключом пакета. <html lang="${language}"> сообщает поисковым роботам, на каком языке находится страница, чтобы он не был помечен как дублирующийся контент (таким образом, это полезно для SEO). Выпадающий язык сразу же будет отправлен JavaScript, когда будет выбран другой язык, и страница будет обновлена ​​с помощью выбранного языка.

Однако вам нужно иметь в виду, что файлы свойств по умолчанию читать с использованием кодировки ISO-8859-1. Вам нужно будет избежать их путем unicode-экранов. Это можно сделать с помощью инструмента native2ascii.exe, поставляемого JDK. Дополнительную информацию см. Также в разделе в этой статье .

Теоретической альтернативой было бы предоставление пакета с пользовательским Control для загрузки этих файлов в виде UTF-8, но это, к сожалению, не поддерживается базовым JSTL fmt TagLib. Вам нужно будет управлять всем этим с помощью Filter. Существуют рамки (MVC), которые могут обрабатывать это более прозрачным образом, например JSF, см. Также в этой статье .

212
ответ дан debugger 22 August 2018 в 13:24
поделиться
  • 1
    Вау, уважение. Кажется, больше похоже на учебник, чем на простой ответ :) – Paweł Dyda 25 November 2010 в 17:24
  • 2
    @BalusC. Ваш ответ выше - это действительно мудрость, а затем знание. :) Большое уважение к вам, сэр. – Punith Raj 3 October 2013 в 09:40
  • 3
    Это приятное решение имеет одну проблему: локаль, взятая из запроса, может быть языком и страной, как в «en_US», которая будет давать & lt; html lang = «en_US» & gt ;, что является недопустимым HTML. Необходимо использовать только часть языка "en" из языкового стандарта в качестве значения атрибута lang. – Torsten Römer 21 November 2013 в 22:47
  • 4
    Метод, описанный выше для интернационализации, не изменяет URL-адрес на основе отображаемого языка. У вас есть предложения по обновлению URL-адреса в соответствии с языком. Я спрашиваю, потому что для индексирования рекомендуется, чтобы на разных языках были отдельные URL-адреса: support.google.com/webmasters/answer/… – theyuv 23 February 2016 в 16:20
  • 5
    Если вы поместите файлы своего языка (файлы test.properties и text_en.properties) в корневой каталог приложений / ресурсов, вы можете установить fmt: bundle следующим образом: & lt; fmt: setBundle basename = & quot; text & quot; / & GT; – Bahadir Tasdemir 28 April 2016 в 08:43

В дополнение к тому, что сказал BalusC, вам нужно позаботиться о направленности (поскольку английский язык написан слева направо, а арабский - наоборот). Самый простой способ - добавить атрибут dir к элементу html вашей веб-страницы JSP и выполнить его экстернализацию, поэтому значение происходит из файла свойств (как и с другими элементами или атрибутами):

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

Кроме того, есть несколько проблем с дизайном такого приложения - вы должны сказать, что наименее избегать абсолютного позиционирования. Если вы не можете избежать этого по какой-либо причине, вы можете использовать разные таблицы стилей на каждый (каждый?) Язык или сделать что-то, что verboten , то есть использовать таблицы для управления макетом. Если вы хотите использовать элементы div, я бы предложил использовать относительное позиционирование с «симметричными» атрибутами стиля слева и справа (оба имеют одинаковое значение), так как это то, что делает работу направленности направленности.

Вы можно найти больше о сайтах Bi-Directional здесь .

25
ответ дан Paweł Dyda 22 August 2018 в 13:24
поделиться

на основе этого учебника , я использую следующее в GAE - Google App Engine:

. Файл 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 (и так далее для каждого языка). Каждый из этих файлов должен содержать необходимые вам строки: key: value_in_language, например. app_fr.properties содержит:

greeting=Bonjour!

app.properties содержит:

greeting=Hello!

Это все

2
ответ дан Ronen Rabinovici 22 August 2018 в 13:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: