Интернационализация на сайте - PullRequest
1 голос
/ 02 февраля 2010

Я использую метод ResourceBundle класса getBundle (Propertyfilename, Local.languagename), который возвращает объект ResourceBundle локального

rb = ResourceBundle.get Bundle ("Строки локали", Locale.ARABIC); -Не поддерживается

Как я могу использовать это для поддержки арабского, английского языка.

Ответы [ 2 ]

3 голосов
/ 17 марта 2010

Во-первых, java.util.Locale действительно не имеет константу Locale.ARABIC. Но это не должно помешать вам определить его самостоятельно с помощью конструктора Locale с кодом языка:

public static final Locale ARABIC = new Locale("ar");

Во-вторых, по умолчанию файлы свойств находятся под капотами ResourceBundle, читаемыми как InputStream с кодировкой ISO-8859-1. Таким образом, вам действительно нужно иметь два разных файла свойств, один в кодировке UTF-8, который вы используете для поддержки значений (например, text_ar.properties.utf8), и другой в кодировке ISO-8859-1 (например, text_ar.properties), который вы просто используете для предоставить в приложение Java. Вы можете использовать инструмент native2ascii для преобразования файла UTF-8 в файл ISO-8859-1 следующим образом:

c:\path\to\jdk\bin\native2ascii.exe -encoding UTF-8 text_ar.properties.utf8 text_ar.properties

Это преобразует не ISO-8859-1 символы в кодовые точки Unicode. Например. القيمة станет \u0627\u0644\u0642\u064a\u0645\u0629 (что делает его не подлежащим ремонту, поэтому рекомендуется сохранить оригинал для редактирования).

Или, если вы уже работаете с Java 6, вы можете использовать ResourceBundle.Control#newBundle() и конструктор PropertyResourceBundle, принимая Reader для чтения свойств файлы, использующие UTF-8 по умолчанию.

Ниже приведен пример с предположением, что в пути к классам есть «обычный» UTF-8 кодированный text_ar.properties файл со следующим содержимым:

key=القيمة

package com.stackoverflow.q2183245;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.ResourceBundle.Control;

public class Test {

    private static final Locale ARABIC = new Locale("ar");
    private static final Control UTF8CONTROL = new UTF8Control();

    public static void main(String args[]) throws Exception {
        ResourceBundle bundle = ResourceBundle.getBundle("text", ARABIC, UTF8CONTROL);
        System.out.println(bundle.getString("key")); // Prints القيمة
    }

}

class UTF8Control extends Control {
    public ResourceBundle newBundle
        (String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
            throws IllegalAccessException, InstantiationException, IOException
    {
        String bundleName = toBundleName(baseName, locale);
        String resourceName = toResourceName(bundleName, "properties");
        ResourceBundle bundle = null;
        InputStream stream = null;
        if (reload) {
            URL url = loader.getResource(resourceName);
            if (url != null) {
                URLConnection connection = url.openConnection();
                if (connection != null) {
                    connection.setUseCaches(false);
                    stream = connection.getInputStream();
                }
            }
        } else {
            stream = loader.getResourceAsStream(resourceName);
        }
        if (stream != null) {
            try {
                // This line is changed to make it to read properties files as UTF-8.
                bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
            } finally {
                stream.close();
            }
        }
        return bundle;
    }
}

Примечание: метод newBundle() копируется из оригинального источника и немного изменен, чтобы сделать пример кода менее подробным, если вы хотите, вы можете вернуть его к оригиналу и просто изменить строку с помощью конструкции PropertyResourceBundle, чтобы требуется UTF-8 кодированный Reader.

1 голос
/ 02 февраля 2010

1) Каждый файл свойств должен быть переименован в .properties, где language_code - это 2-значный строчный код языка, а country_code - это 2 буквы UPPERCASE.

Например:

MyResource_fr_FR.properties 

указывает MyResource (fr для французского, FR для FRANCE).

Чтобы поддерживать арабский в вашем файле свойств, вы должны ввести escape-последовательности для языка.

В арабском языке используется ISO 8859-6 CharSet так (например)

, если у вас есть в файле свойств:

char_ren=\u00631, 8859_6_CHARSET

char_ren будет представлять арабский символ RHEN.

PS.Наименование файла свойств будет

MyResource_ar.properties

. \ U00631 - это шестнадцатеричное значение символа RHEN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...