Во-первых, 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
.