Spring ResourceBundleMessageSource Кодировка для чешского MessageResource.getMessage()

У меня есть конвертер, который читает свойства из файла .properties, используя ResourceBundleMessageSource для нескольких локалей, например en_US,fr_FR,cs_CZ

Ниже приведен XML для чтения свойств.

<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
    <list>
            <value>lang/beneficiaryproperty/beneficiary</value>
            <value>lang/labelsbundlesproperty/labelsbundle</value>
    </list>
    </property>
</bean>

И ниже приведен код для чтения и записи файла JavaScript с использованием File API в Яве.

String localeAr[]= lang.split("_");
Locale currentLocale = new Locale(localeAr[0].trim(),localeAr[1].trim());
file = new File(outputPath +file.separator+ jsFilename + "_" + lang + ".js");
System.out.println(file.getAbsolutePath());
System.out.println();
file.createNewFile();
buffer.append(disclaimerDetails);
buffer.append("var " + var + " = \n");
buffer.append("{ \n");

Iterator iterator = tplPropObj.keySet().iterator();
while (iterator.hasNext()) 
{
    String key = (String) iterator.next();

        System.out.println("Key : "+key+" -  Label : "+tplPropObj.getProperty(key)+"  -  Locale : "+currentLocale);

        String value = messageSource.getMessage(tplPropObj.getProperty(key), new Object[] { }, currentLocale);

        System.out.println( "- Value : "+value);

        buffer.append("\t" + "\"" + key + "\": ");
        buffer.append("\"" + value + "\"");

        if (iterator.hasNext()) 
        {
            buffer.append(",");
        }
    buffer.append("\n");
}   
buffer.append("} ");

        if(localeAr[1].equalsIgnoreCase("PL") || localeAr[1].equalsIgnoreCase("CZ"))
        {
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
            out.write(buffer.toString());
            out.flush();
            out.close();
            buffer.delete(0, buffer.length());
        }
        else
        {
            System.setProperty("file.encoding", "ISO-8859-1");
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
            bufferedWriter.write(buffer.toString());
            bufferedWriter.flush();
            bufferedWriter.close();
            buffer.delete(0, buffer.length());
        }

String value = messageSource.getMessage (tplPropObj.getProperty (key), new Object [] {}, currentLocale);

Выше определенной строки читает свойства из файла, имеющего локальный cs_CZ (Имя файла

beneficiary_cs_CZ.properties

Ниже приведено содержимое файла beneficiary_cs_CZ.properties. Они сохраняются в STS с использованием кодировки UTF-8 Для czech_language

lbl.beneficiary.name=Z technických důvodů zavřeno.
lbl.beneficiary.number=123456 
lbl.beneficiary.loc=Prosím vás, kde je
divadlo lbl.beneficiary.owner=Mã Người Ký Phát

До этого ок. Но когда я читаю эти значения из объектов Resource Message, он возвращает разные значения. Ниже приведены значения, сгенерированные из MessageSource объект.

-

Ключ: Beneficiary.Name - Метка: lbl.beneficiary.name - Язык: cs_CZ Значение: Z technických důvodů zavÅ? Eno.

Ключ: Beneficiary.Number - Метка: lbl.beneficiary.number - Язык: cs_CZ - Значение: 123456

Ключ: Beneficiary.Owner - Метка: lbl.beneficiary.owner - Язык: cs_CZ - Значение: Mã NgÆ°á "? I Ký Phát

Я не понимаю, почему это происходит, если я читаю значения из MessageResouce используя локаль.

Любая помощь.

1 ответ

М. Дейнум прав, вы не должны использовать кодировку UTF-8 для файлов свойств java. Вместо этого вы должны использовать escape-последовательности для символов utf8 в этом файле. ( /questions/42649296/kak-ispolzovat-utf-8-v-svojstvah-resursa-s-resourcebundle/42649333#42649333)

Но (я не рекомендую это) вы можете использовать UTF8 кодирует файлы сообщений с помощью Spring. Ключ в том, что вам нужно настроить MessageResource

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">     
    <property name="defaultEncoding" value="UTF-8"/>
    <property name="basenames">...</property>
</bean>
Другие вопросы по тегам