1.1.31. fejezet, Többnyelvű felületek

A többnyelvűsítés Java-ban a ResourceBundle osztállyal valósítható meg. Segéd osztály a Locale, ami az összes nyelvi beállítást tartalmazza, a szám és dátum formázástól kezdve a megjelenített néven át mindenféle információt szolgáltat egy adott országról/nyelvről. Wildfly webalkalmazásban az erőforrásokat a webapp/WEB-INF/faces-config.xml tartalmazza:

<?xml version="1.0"?>
<faces-config version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">		
   <application>
     <action-listener>org.primefaces.application.DialogActionListener</action-listener>
       <navigation-handler>org.primefaces.application.DialogNavigationHandler</navigation-handler>
       <view-handler>org.primefaces.application.DialogViewHandler</view-handler>
       <el-resolver>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerELResolver</el-resolver>
       <locale-config>
         <default-locale>hu</default-locale>
         <supported-locale>en</supported-locale>
       </locale-config>
       <message-bundle>JsfMessageResources</message-bundle>
       <message-bundle>ValidationMessages</message-bundle>
       <resource-bundle>
         <base-name>i18n</base-name>
         <var>msg</var>
       </resource-bundle>
       <resource-bundle>
         <base-name>version</base-name>
         <var>ver</var>
       </resource-bundle>
   </application>
   <factory>
     <exception-handler-factory>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory</exception-handler-factory>
   </factory>	
</faces-config>

És pl. a magyar nyelvi fordításokat a main/resources/i18n_hu.properties fájl tartalmazza:

javax.faces.validator.BeanValidator.MESSAGE={1} {0}
application.title=Alkalmazás neve
system-menu=Rendszer
settings-menu=Be\u00E1ll\u00EDt\u00E1sok
server-info=Szerver inform\u00E1ci\u00F3k
exit-menu=Kil\u00E9p\u00E9s
empty-table-message=\u00FCres t\u00E1bla
new-button=\u00DAj
delete-button=T\u00F6rl\u00E9s
save-button=Ment\u00E9s
reset-button=Alap\u00E1llapot
select-button=V\u00E1laszt\u00E1s
cancel-button=M\u00E9gsem
clear-button=Törlés

A properties fájlban figyelni kell arra, hogy a nem ASCII karakterkészletbe tartozó karaktereket kódolni kell. Ezért vannak a fenti mintában a hosszú ékezetes karakterek helyett a \u00... sorozattal kezdődő kódok. Ha nincsen a kiválasztott nyelvnek megfelelő properties fájl az elérési útvonalon, akkor az alapértelmezett nyelvi fájl kerül betöltésre. Ha ez nem kívánatosnak tartjuk, használhatjuk az alábbi betöltési metódust:

String RESOURCE_BUNDLE_NAME = "i18n";
ResourceBundle bundle = ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale, ResourceBundle.Control.getNoFallbackControl(ResourceBundle.Control.FORMAT_DEFAULT));
String value = bundle.getString(key);

A magyar nyelvű hibaüzenetek a main/resources/JsfMessageResources_hu.properties fájlban kapnak helyet:

javax.faces.validator.BeanValidator.MESSAGE={1} {0}
javax.faces.component.UIInput.REQUIRED        = K\u00F6telez\u0151 kit\u00F6lteni 
javax.faces.component.UIInput.REQUIRED_detail = "{0}": k\u00F6telez\u0151 kit\u00F6lteni.

A magyar nyelvű validációs hibaüzeneteket a main/resources/ValidationMessages_hu.properties fájlban helyezzük el:

javax.faces.validator.BeanValidator.MESSAGE={1} {0}
javax.faces.component.UIInput.REQUIRED= \u00C9rv\u00E9nytelen \u00E9rt\u00E9k
javax.faces.component.UIInput.REQUIRED_detail="{0}": kit\u00F6lt\u00E9se k\u00F6telez\u0151
javax.faces.converter.DateTimeConverter.DATE='{2}': \'{0}\' nem \u00E9rtelmezhet\u0151 d\u00E1tum form\u00E1tum.
javax.faces.converter.DateTimeConverter.DATE_detail='{2}': \'{0}\' nem \u00E9rtelmezhet\u0151 d\u00E1tum form\u00E1tum. P\u00E9ldaul: {1}
javax.faces.converter.DateTimeConverter.TIME='{2}': \'{0}\' nem \u00E9rtelmezhet\u0151 id\u0151 form\u00E1tum.
javax.faces.converter.DateTimeConverter.TIME_detail='{2}': \'{0}\' nem \u00E9rtelmezhet\u0151 id\u0151 form\u00E1tum. Peldaul: {1}
javax.faces.converter.DateTimeConverter.DATETIME='{2}: \'{0}\' nem \u00E9rtelmezhet\u0151 datum \u00E9s id\u0151 formatum.
javax.faces.converter.DateTimeConverter.DATETIME_detail='{2}: \'{0}\' nem \u00E9rtelmezhet\u0151 datum \u00E9s id\u0151 formatum. P\u00E9ldaul: {1}