{"id":1070,"date":"2012-12-17T21:37:52","date_gmt":"2012-12-17T19:37:52","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=1070"},"modified":"2012-12-18T13:03:16","modified_gmt":"2012-12-18T11:03:16","slug":"xpages-edit-localization-files-in-browser-1","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=1070","title":{"rendered":"XPages: UI for editing localization files (1)"},"content":{"rendered":"<p>For one of my customers I am developing an easy way for editing the localization\/translation of existing XPages applications: Instead of importing and exporting the property files with the Domino Designer (which is not an option for non-developers) it would be more suitable, if the users would have the possibility to edit the files directly in the browser. I am currently\u00a0 working on a XPage solution for this, and this is my current beta version.<\/p>\n<p>This is a proof-of-concept with some known bugs, f.e. HTML special chars are not encoded correctly. But this can be fixied easily. First, it is required that the users can choose a property file to edit. This can be realized with a small Java class I have created (based on a <a title=\"stackoverflow.com: How to get a list of all .properties files in an application\" href=\"http:\/\/stackoverflow.com\/questions\/13495847\/how-to-get-a-list-of-all-properties-files-in-an-application\/13497066#13497066\" target=\"_blank\">stackoverflow.com answer<\/a>):<\/p>\n<pre>package ch.hasselba.xpages.localization;\r\n\r\nimport java.util.Vector;\r\nimport javax.faces.context.FacesContext;\r\nimport lotus.domino.Database;\r\nimport lotus.domino.Document;\r\nimport lotus.domino.NoteCollection;\r\nimport lotus.domino.NotesException;\r\n\r\npublic class DesignElements {\r\n\r\n\u00a0\u00a0 \u00a0private final String EMPTY_STRING = \"\";\r\n\u00a0\u00a0 \u00a0private final String[] FLAG_PROPERTIES = { \"gC~4K2P\", \"gC~4K2\"; \"gC~4;2\" };\r\n\u00a0\u00a0 \u00a0private final String FIELD_$FLAGS = \"$Flags\";\r\n\u00a0\u00a0 \u00a0private final String FIELD_TITLE = \"$TITLE\";\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * returns Vector containing all property files of a database\r\n\u00a0\u00a0 \u00a0 * \r\n\u00a0\u00a0 \u00a0 * No error handling included!\r\n\u00a0\u00a0 \u00a0 * \r\n\u00a0\u00a0 \u00a0 * @category Domino\r\n\u00a0\u00a0 \u00a0 * @author Sven Hasselbach\r\n\u00a0\u00a0 \u00a0 * @category Tools\r\n\u00a0\u00a0 \u00a0 * @version 0.2\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public Vector&lt;String&gt; getPropertFileList() {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0FacesContext fc = FacesContext.getCurrentInstance();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Vector&lt;String&gt; data = new Vector&lt;String&gt;();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0try {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ get DB\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Database db = (Database) fc.getApplication().getVariableResolver()\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0.resolveVariable(fc, \"database\");\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ get all design docs\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0NoteCollection nc = db.createNoteCollection(false);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0nc.selectAllDesignElements(true);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0nc.buildCollection();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ process all notes\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0String noteId = \"\";\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0noteId = nc.getFirstNoteID();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Document doc = null;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ \r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while (!(EMPTY_STRING.equals(noteId))) {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ get design doc\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0doc = db.getDocumentByID(noteId);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ check if its a property file\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (int i = 0; i &lt; FLAG_PROPERTIES.length; i++) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (FLAG_PROPERTIES[i].equals(doc\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0.getItemValueString(FIELD_$FLAGS))) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ add to Vector\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0data.add(doc.getItemValueString(FIELD_TITLE));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ next one\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0noteId = nc.getNextNoteID(noteId);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ recycle doc\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0recycleObject(doc);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0} catch (NotesException e) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0e.printStackTrace();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return data;\r\n\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * recycles a domino document instance\r\n\u00a0\u00a0 \u00a0 * \r\n\u00a0\u00a0 \u00a0 * @param lotus\r\n\u00a0\u00a0 \u00a0 *\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .domino.Base obj to recycle\r\n\u00a0\u00a0 \u00a0 * @category Domino\r\n\u00a0\u00a0 \u00a0 * @author Sven Hasselbach\r\n\u00a0\u00a0 \u00a0 * @category Tools\r\n\u00a0\u00a0 \u00a0 * @version 1.1\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public static void recycleObject(lotus.domino.Base obj) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (obj != null) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0try {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0obj.recycle();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0} catch (Exception e) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}<\/pre>\n<p>The difference to the answer on stackoverflow.com is the additional property flag I have added to this class (I know it would be better to check the flags instead of comparing the strings, but it seems to work this way).<\/p>\n<p>Next step is to load the selected property file. This can be done with a managed bean and a helper class for the entries itself. Here is the helper class:<\/p>\n<pre>package ch.hasselba.xpages.localization;\r\n\r\nimport java.util.UUID;\r\n\r\n\/**\r\n\u00a0* Locale Entry of a locale file\r\n\u00a0* \r\n\u00a0* @author Sven Hasselbach\r\n\u00a0* @category Localization\r\n\u00a0* @version 1.0\r\n\u00a0* \r\n\u00a0*\/\r\n\r\npublic class LocaleEntry {\r\n\r\n\u00a0\u00a0 \u00a0private String id;\r\n\u00a0\u00a0 \u00a0private String name;\r\n\u00a0\u00a0 \u00a0private String value;\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * initializes the object and\r\n\u00a0\u00a0 \u00a0 * sets an unique identifier\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public LocaleEntry(){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.id = UUID.randomUUID().toString();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.name = \"\";\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.value = \"\";\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * returns unique identifier of the object\r\n\u00a0\u00a0 \u00a0 * @return String unique id\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public String getId() {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return id;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * sets the unique identifier of the entry\r\n\u00a0\u00a0 \u00a0 * @param id String unique id\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public void setId(final String id) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.id = id;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * returns the name of the entry\r\n\u00a0\u00a0 \u00a0 * @return String\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public String getName() {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return name;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * sets the name of the entry\r\n\u00a0\u00a0 \u00a0 * @param String\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public void setName(String name) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.name = name;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * returns the value of the entry\r\n\u00a0\u00a0 \u00a0 * @return String\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public String getValue() {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return value;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * sets the value of the entry\r\n\u00a0\u00a0 \u00a0 * @param value\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public void setValue(String value) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.value = value;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n}<\/pre>\n<p>And here comes the &#8222;Loader&#8220; class:<\/p>\n<pre>package ch.hasselba.xpages.localization;\r\n\r\nimport java.util.HashMap;\r\nimport java.util.Iterator;\r\nimport java.util.Map;\r\nimport java.util.Properties;\r\nimport java.util.Vector;\r\nimport com.ibm.xsp.context.FacesContextEx;\r\n\r\n\/**\r\n\u00a0* \"Loader\" class to access the entries\r\n\u00a0* of a .property file\r\n\u00a0* \r\n\u00a0* @author Sven Hasselbach\r\n\u00a0* @version 1.0\r\n\u00a0*\/\r\npublic class Locale {\r\n\r\n\u00a0\u00a0 \u00a0private Vector&lt;LocaleEntry&gt; locales;\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * @return vector containing the LocalEntry objects\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public Vector&lt;LocaleEntry&gt; getLocales() {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return locales;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * sets vector containing the LocalEntry objects\r\n\u00a0\u00a0 \u00a0 * @param Vector\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public void setLocales(Vector&lt;LocaleEntry&gt; locales) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.locales = locales;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * wrapper for the static method call\r\n\u00a0\u00a0 \u00a0 * \r\n\u00a0\u00a0 \u00a0 * @param fileName name of the property file to load\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public void loadFile(final String fileName) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Map&lt;String, String&gt; m = getPropertiesFromFile(fileName);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.locales = parseMap(m);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * loads a property file and parses it to a key\/value map\r\n\u00a0\u00a0 \u00a0 * \r\n\u00a0\u00a0 \u00a0 * @param fileName name of the property file to load\r\n\u00a0\u00a0 \u00a0 * @return Map containing the key\/values\r\n\u00a0\u00a0 \u00a0 * \r\n\u00a0\u00a0 \u00a0 * The loading routine is shamelessly copied from Ulrich Krause:\r\n\u00a0\u00a0 \u00a0 * http:\/\/openntf.org\/XSnippets.nsf\/snippet.xsp?id=access-.properties-files\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public static Map&lt;String, String&gt; getPropertiesFromFile(String fileName) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Properties prop = new Properties();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0try {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0prop.load(FacesContextEx.getCurrentInstance().getExternalContext()\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0.getResourceAsStream(fileName));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;((Map) prop);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return map;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0} catch (Exception e) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0e.printStackTrace();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return null;\r\n\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * parses a property map and create a vector\r\n\u00a0\u00a0 \u00a0 * with LocalEntry objects\r\n\u00a0\u00a0 \u00a0 * \r\n\u00a0\u00a0 \u00a0 * @param map to parse\r\n\u00a0\u00a0 \u00a0 * @return Vector containing the LocalEntry objects\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public static Vector&lt;LocaleEntry&gt; parseMap(final Map&lt;String, String&gt; map) {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ init new vector\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Vector&lt;LocaleEntry&gt; localEntries = new Vector&lt;LocaleEntry&gt;();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0String key;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0String value;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ get key set for iteration\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Iterator&lt;?&gt; it = map.keySet().iterator();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while (it.hasNext()) {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ extract key &amp; value\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0key = (String) it.next();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0value = (String) map.get(key);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ create new entry and add to vector\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0LocaleEntry lEntry = new LocaleEntry();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0lEntry.setName(key);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0lEntry.setValue(value);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0localEntries.add(lEntry);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ return vector\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return localEntries;\r\n\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/**\r\n\u00a0\u00a0 \u00a0 * dumps current object data to console\r\n\u00a0\u00a0 \u00a0 * Just for debugging\r\n\u00a0\u00a0 \u00a0 * \r\n\u00a0\u00a0 \u00a0 * @category Debug\r\n\u00a0\u00a0 \u00a0 *\/\r\n\u00a0\u00a0 \u00a0public void dump() {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (int i = 0; i &lt; this.locales.size(); i++) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0LocaleEntry e = this.locales.get(i);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(e.getId() + \" - \" + e.getName() + \" - \"\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0+ e.getValue());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0}\r\n\r\n}<\/pre>\n<p>Now the new managed bean can be added to the <em>faces-config.xml<\/em>:<\/p>\n<pre>&lt;managed-bean&gt;\r\n\u00a0 &lt;managed-bean-name&gt;locale&lt;\/managed-bean-name&gt;\r\n\u00a0 &lt;managed-bean-class&gt;ch.hasselba.xpages.localization.Locale&lt;\/managed-bean-class&gt;\r\n\u00a0 &lt;managed-bean-scope&gt;session&lt;\/managed-bean-scope&gt;\r\n&lt;\/managed-bean&gt;<\/pre>\n<p>The resulting XPage can look like this:<\/p>\n<pre>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;xp:view xmlns:xp=\"http:\/\/www.ibm.com\/xsp\/core\"&gt;\r\n\r\n\u00a0\u00a0 \u00a0Property File:&amp;#160;\r\n\u00a0\u00a0 \u00a0&lt;xp:comboBox id=\"comboBoxFile\" value=\"#{sessionScope.PropertyFile}\"&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;xp:selectItems&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;xp:this.value&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;![CDATA[#{javascript:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 importPackage(ch.hasselba.xpages.localization);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch.hasselba.xpages.localization.DesignElements().getPropertFileList();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }]]&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;\/xp:this.value&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;\/xp:selectItems&gt;\r\n\u00a0\u00a0 \u00a0&lt;\/xp:comboBox&gt;\r\n\u00a0\u00a0 \u00a0&amp;#160;\r\n\u00a0\u00a0 \u00a0&amp;#160;\r\n\u00a0\u00a0 \u00a0&lt;xp:button value=\"Load\" id=\"buttonLoadFile\"&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;xp:eventHandler event=\"onclick\" submit=\"true\"\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0refreshMode=\"complete\"&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;xp:this.action&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 &lt;![CDATA[#{javascript:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 importPackage(ch.hasselba.xpages.localization);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var bean = facesContext.getApplication().getVariableResolver()\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .resolveVariable(facesContext, \"locale\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bean.loadFile(sessionScope.get(\"PropertyFile\") )}]]&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/xp:this.action&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;\/xp:eventHandler&gt;\r\n\u00a0\u00a0 \u00a0&lt;\/xp:button&gt;\r\n\u00a0\u00a0 \u00a0&lt;hr \/&gt;\r\n\u00a0\u00a0 \u00a0&lt;xp:label id=\"labelSelecteFile\"&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;xp:this.value&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 &lt;![CDATA[#{javascript:sessionScope.get(\"PropertyFile\")}]]&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;\/xp:this.value&gt;\r\n\u00a0\u00a0 \u00a0&lt;\/xp:label&gt;\r\n\u00a0\u00a0 \u00a0&lt;xp:br \/&gt;\r\n\u00a0\u00a0 \u00a0&lt;xp:br \/&gt;\r\n\u00a0\u00a0 \u00a0&lt;xp:repeat id=\"repeat1\" rows=\"9999\" var=\"lMap\" value=\"#{locale.locales}\"&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;xp:label value=\"#{lMap.name}\" id=\"labelMapName\" \/&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;xp:inputText id=\"inputTextValue\" value=\"#{lMap.value}\" \/&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&lt;xp:br \/&gt;\r\n\u00a0\u00a0 \u00a0&lt;\/xp:repeat&gt;\r\n\r\n&lt;\/xp:view&gt;<\/pre>\n<p>And this is how it looks in the browser:<\/p>\n<p><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeMAAADFCAIAAADolw3wAAAgAElEQVR4nO2deXgUZb7va5gzg3NmU2HOjM7jnDmPc517z3HOnbneexy9qOPcUQc4IKsiLqCgiICyryKBUSIwR5FNVJIYQoAAWStkIZB0EkgIIYTsobN09nQSsocknYW+f7S0laq33nqreqlK+vt56slT\/b6\/7X2r6ttvKukubvqMmdu2bXsbALeybdu26TNm4uwCbsc3Ty3OAgAAwNhwlQAAAIwNV8GMuawsO+f6hbSMs0mmqLjzEbFJEbFJUXHn45JSL6RlZOdcN5eVsUcDAADACJNSFxYVn0+9FBGbdOVafl2DtaOzs7e3t7evr7evr7e3t6Ozs67BeuVafkRs0oW0jKLiEk8XDQAAPgVXTuWG2ZySnhkVd76yqra3t7evr6+np6erq6uzs7Ojo6Ojo6Ozs7Orq6unp6evr6+3t7eyqjYq7rzp4mWzuYweGQAAACNcmTwFhUXR8RfyCkt6enp6eno6OjraqXR0dDgscwuKYxNTiktKKcEBAAAwwpllyMsvjIq\/0NBgvXXrVkdHRxszHR0dt27damiwRscnb3l\/qx8AAADX4G6QyC8oDOcTm5qau7u7WzXR3d1tbWrOziu1DQzaAQAAuABXKqGouDicT6yqqe3s7LzpAp2dndbmm7lF5qHhYb2HCQAAoxiuREJSSvrVvMKurq4WeZxr55s3b1LMurq6Kqrqqmob9R4mAACMYrjikeRezwvnE9vb25ubm5tkaGlpuZR55ZEnJ7+8aEVDQyPdsqOj82p+Me6BAACAZriikcQnmUpvVLS1tVllaG5uzszKfvTpaZOem\/MfT09fuHRVc3OznLHVam1ra6utt5ZX1clV0NvbW1RUlJyczPM8z\/PJyclFRUW9vb3enAUAADAyI5Q6v6DgRHjszdY2q9XaSKKpqSkrO+fxv8x4Zsarcxcun\/bSm1NfeL2pqYlo7MBqtba1d2TmFA4ODUnT19XVxcbGZmRkXLt2rbi4+Nq1axUVFdHR0TzP19bWen86AADAgHCFAtIvXU7PuNLa2tpAwmq1Xr5yddJzs5+Z9dq8xStfenP1nIXvZl+7brVaifZOWltbi82VLa3toty1tbXx8fHNzc3d3d25ubk8z8fExFy6dCkyMpLn+aioKIg1AADY7XauQEDcuZTiG2VNTU31EqxW65WrOZOem\/3s7AXz31r98pI1LyxamZObb7VapcYimpqaqmrqRTdAbt26FR0d3draOjQ0NDg42NXVlZ6eHn6H+Pj4vLy8qKioW7duEYrmOO0D5jgXIzjx8\/Nz\/nRXNPciimn8ggEARLh8AWdi4qtr6xoaGupG0tjYeDUnd9Kzs56bs\/Dlt9cuWL5x4YqN2deuE293SN0bGhoaGq15xeXCxHl5eSkpKQMDAwMDA62treHh4adHkp+fHx4enpeXRyhaD6WWuhhc+KQBDV4wAEAOLk\/A8TN8Y2NjbW1tjYD6+vor2TlPTpn717lvvPrO+kUr33\/jvS0vLF751NR5v3v82d8+8qffPvKUY\/vN75+Y+9qS+vr6mpHU1tY2NTdfuV4sTBwXF5eTk1NbW5uXlxcdHR0mITEx0WKxxMXFEYqGUmsKaPCCAQBycNcFHA2Lampqqh5JXV3dc7NemTz3jQXLN765+gPHtnDFpnlvrpq9cPnsBcuc2\/SX335i8gt1dXXVEpqamjNyCoSJT548efbs2aioqBMkYmJiKioqbt68efLkSULRd0STu4Owi94iVGpGX+m+XaBTRMFyfgaUvUW4Q7SUppB2iQKKuoxQsNRRFARvAABI4XIFHA2LamhorKqqEj5roKam5vn5b81fsm7J2u30bdHKrVPmLa6pqRE9raCqqspqtUqVOlRAWFhYaGhoVFRUdHR0aGhoYWFhT09PY2PjiRMnCEVL1sVyLXJectpNbCEuwynCJ9VHomISbSi+0pvOoi65l8YpmLFaiDUAIkYo9bFT0dU1tVKlzsq+9uo7Gxev8Vu64UPH9uYav1eXb37p7fXCbc6iVSs27JAqdXV1dV19g+juR0xMTEhISEhIyMWLFwsKCiwWS0JCwuXLl8+cORMSElJSUlJXV5ebmxsTE0MomkGphV3CxbIqlZeTfhYhE+7Tl7Ei4ZOuLuXcpftyhRmhYKexhgoB8HG4awJORZ4tLjVXVVWJvsS6uro66+q1hSs2L1m7Y\/mmncs2frRsw4d5BUXSPyfW19dbLBaRe1VVVXlllegvilevXg0ODk5KSnJ8\/V5HR0dDQ0NiYmJwcHBwcHBISIhjPzs7m1A0s1LL2bCvx4mq7brwydlQNE4xgmjfvUrtesF20l0RxWoBAHa7ncsREH32XFpmdnV1tfR7rKurqy9n5yxYsWXpho+Wb\/Z\/bfmm6fOXXM7Ktlgsit+BXV1dnZNfLPovvZ6enpCQkKCgoPz8fOc3pubm5oaFhQUFBR07duzUqVMhISE9PT2EopnV1hWllrv7Iac1xBbFWwR2eeFjvJkgZ8niqEvB9GqJFQLg43BXBZxPTj12Oqa2tpb4jdUWiyXzytWFK7e+s2nn2xs+nLlwxZ+mzUtNv1RRUSH3JdcOamtrz6VdkX7ypaKiIiAg4OTJkzdv3nR831Nzc3NoaGhcXFxCQkJwcHBFRQW5aE1\/UaQrNcVXZCkVIOKv\/9Lf9OVapMpFtHTui3akvhRLIxQsV600DgDAAZctIOvKlUMBxysqKs1ms\/TbUEtLSysqKjKzri5atW3Fll3LNvnPWvDu5NkLysvLicYOzGZzdXXtubQrQ0OE7z4tLy8PCgqKjIy8fPnypUuXwsPDIyMjo6KigoKCysvLpfZgrAKBBoACd2Uk4dFxkWfPWywW6behOigvL8\/Murp47fYV7+95feW2dzfuKCsrkzMuKSmxWCypmdfMlTVyFXR3d2dlZZ0+fTogICAgIOD06dNZWVnd3d3enAWgO1BqAChwWSNJS7+4+0BAcemN0tLSIhnMZnN6ZtbrK7du\/PDT0hs3SkpK5CxLS0vLKirD40x9\/Ta9RwoAAKMV7rKE8Oi4oBMRFoulsLCwQIYbN25UVlZWVFQUFxfL2RQWFlZXV8enZFZWN+g9TAAAGMVwmRIuXbp08MixSP5ceXl5vguUl5enZuakZFy7ffu23sMEAIBRDEGpMzMz0y9e3LXvSGr6ZYdY56nEIdOmi5kR8akDg3jaCwAAuASXIUNyiumDXQfDIuPMZnN+fn4uM\/n5+WazOSwybtuuQ1ve3+oHAADANbhL8qSmpX1yKOhQ4MmCwsKSkpLc3NwcKrm5uSUlJfkFhQcCj39y6Ou09HRKcAAAAIxwF6mkpaUFHDu1Yccnx8\/whUVFpaWlBQUFDsl2\/Au2Q6ALCgpKS0sLi4qOn+HXb\/8kICQsPT2dHhkAAAAjXDoD55NT9h4OXrV1954DgRF8wsXMrLyCAscHW\/IKCi5mZoXHJOw5ELhq6+69h4PPX0hmiQkAAIARLo2Z5JSU0LCIPQcCNu\/8bNXW3cs2+i\/b6L9q6+4tO\/ftORAQGhaRnJLCHg0AAAAjXCoAAABjw5kAAAAYG07vAgAAACjA6V0AAAAABTi9CwAAAKAAp3cBAAAAFOD0LmAUkPfBlEvhgSaT6eiZ+C0bdq9dtPSJZUeeWHZkypoj87cEffxlhN4FAt\/i7mWPqdr0rhe4AU70+nB06ouHkmftT3JuLx5KPhydqkdtRsG8YKJ5wcSd7\/\/X3AV+5gUTTz8yPtDSE2jp2ZndMHnX+f+2KHjt4veSjx\/Qu0yvci1lbwE\/Oz96pnMriJl9PWWX3nX5BHKKPHHX5Al\/e3birslQ6rEHJ3yRcMH08pdpsSU9R652OrfYkp6Xv0xLuKBTgXpzausW84KJLdvvdeh1y\/Z7Q3\/3D7sKO3YXtG\/Lbp5zNP\/hV\/cVfP1M9Pxfmr7+SO9ivURaSmzO6Vm21uiBlgBb48eOrb8p8GrYzLSUWL2rG\/s4Jdi\/7WzncK9j+3XFukJbvd1u7xzuFYm13vUCN8AJX6yPLFgVU7Y+rnLd2W+2tXe2NbGVa2Ir18Z+074qumx9ZIFONXuVkBenl7\/785bt97bvfbDhb79o2X5vwEPjAh4a9+h3x6270jI30vzw65\/nmhZXRzwdv\/CBlPhIvev1BmbTkooLLzBuZalL9K53rCFUaue3Yv61\/lOHTDv2odRGw\/4W59i0uY9we+1EUWqlLa3SlmqxpVpspkpbSqUtudJ2odJ2rqw\/saw\/oaw\/0dyXaO6LN\/e9dqKIEI4T1yFtYelS7NWM2rDBT\/736i33te99sGX3v9Ruut+6+ZvF9dJ7x712oXFGjOWhxUH++9fcKp53ecOvTHteIWYU4q5RKEbTPPOKlMTPGeovuj3YODxYPzxYOzxQPWyzDNsqhvvNw\/2lw\/1Fw315w715w33XhzrPlcbPZizDxaoc7opBXEmqYUo9cRo7JfiBjKXHuy47pNmh1L+uWMei1HLnJOW8cv009tAV7R1cKd6p0cJNdQHCF68cy0urtJ0v64+\/0R9\/oz\/e3M8X96w4yP\/xzR2Pvrlj6QE+7HpXWF5PWF5PeEnvK8fyCOHUKDW5oDv2XlNqeqKwJ39u9f95+94HW7ZPqFl1X83q\/9F2YkPAQ+NmJNx8PrLuicPFv3n72KvvrWjInFN76g\/nl\/6WJaOq8ug2rsix5qkuiJ41PFg71Js2dCuFXz0udfdDBadnd1gCBrvjB7vODnbygx3Rgx1Rg53Rwz0Z+dGzGCt08eRhV2rGCZRLoQrXrwgpQhV2LKvvj1vo0Gj\/trN\/rf\/0gYylLGtqyvx74o0HSv3tcwEkkk1XcPF74\/zg7HSLLamsP87cH2\/ujy3tW3Yg+s\/rDn8Ynf+3qLw\/rT28+LOo0Lzu0LzusPye+cHZ5IiSt2hVozKaUkf8+QfWXRPb9z5Yv3li\/ZFH64882nVm2tHfjfu\/X5kf\/\/TKv6+L+pe3Tvzrs++1Z83sTHrs7IzxLBlVlac5oOeUOuf088M2y9At01BP4nDBjJ60SZVHxps++L45buFg+5nB9tODbScH2k4MtIUNdafmnH6ekp2uDlBqIkSl\/kXoPIcI\/LpiHeNfFBXfKRVdVOHiwPUVes3ZiQtqh1gLDRSzj7B48auMNIst0dzPl\/bxpX0xJb2Ttxzx5wvizL2x5t4dMfl\/2fRVUG5XUG5X4LXOlwKzyBHllZq7g\/Ol1My5zwmQiyD1FbZTkhIzEuGf\/Y7Vf2LXJ\/eenXRX8D9\/13GT+p4\/b7\/\/5SO\/WhD0zy\/uu2\/OwadfeNNe8lS76fcxz32HOCfERvrwiYOlBFQ1UlEXS1IhWSemDfeXDXUnDnbxnbkr+2sODbWfHbo+t\/C\/uIy9\/7O\/+euBm8EDN78eaAkcao\/LOj5drlqT\/CEjFkzslY6XPhCpmbBL5KJ2SlW5sBgTISr13csec\/xF0W63M\/5FUZSFnlTOhTLhxNGZqHNOH7tcF3He5LKbqAdLVQoWCBp9Z1kttZELIs4693BaqsWWYO6PKuqNKOo9VXBr9q6I9wIvBOR0Hc7uePuL89P9w\/dntTs2OaUm\/jSRZopooGhPMWZ0oXhJOTvtH0uW\/7TVf0L1xnviHv7OqUfG\/XTS5glTdp96\/sHQd\/7fL6b6\/2zqbr\/Vz9kzftcUfF\/czLukETgBomJUDZ8Yk2ijOFK5XPSkTjJDpw33Fg12xQx2nMn7iEtdz6X\/7YHeys+GzOuaA7iCkGcHmr4YsO631X00YA3MDJ0mjUCZCvosUcyIJ5V0IJR5ZknBOKXsLnRjInJKfc+Gpxxi7d92VoNSOwugpCZOJtGGfoCk7tJexppNShe1thbFFIxIl9LE+x6KcUZYzD5w\/kJ53+mCnq+udn5xtfNQVsfCgwn\/Z9nfZ310csZHJ\/7X0j3Lj17afbHVsWlQaiGiLlEEYqM0gpyvNLsqGyHnlkxK+esPWv0ntPpPuDJlfM7Uu67NvfvGqz\/KfvlnAQ+N+9lzO+9\/bFnj0V\/1R\/yiePX3E974V2kEytlM2ScOlhJH1Ujl5p8x6aXgqUO3cgY7Tg+2hQ42hw7d2NR9YoJpzT90l\/gNZ02r+Pu41twV\/bXb+i2rbLW7Lx39T0rZ0uyKo5M7GUQ\/5QYiNwkiL5NrU8roQslImX\/KfWrHz0JbvTallnaJJlBuMk1ssyd11+ZFGYjcCaDWRjEFO4QFtUCyHQaKQUZYzNwbH3vjVkBO598z2v5+qW3OzpN\/fPezmXsiHnv30z+u+PStwLS9GS0fpt90bBSlpu9IjRXt6fOoyoU9rIOkz96PnDS+8PUft\/pPsG6deOONCelT7or8j+8FPDTuZ49tXv\/0H9J3\/nYg9OfNu8bHP3\/XuZ1LKeVRGlmmi4iq6RUZa056MWjqUHf6YOtRW8sX7YXvt1xcNFC\/fzjyl9kf\/rLP8tHt498vDX68v3pjf+W7\/TU7LgZNJZYtukikVckVRj+yai85d508ml3oxkSISv1AxlJPKDW9XfMBksuieAYqXk0aDgRLdsZDQ8T9\/\/vx\/CexJwt7Ps\/u8E+\/OX17yO9f3\/76wcTD2a1f5bQfzmnbfbHl\/eSmbWktjs0VpSZeVJTzWO4YU3wVXYgtUpLPJfBzfnP+6bvqNt7d7DehdsM\/lb\/3yxN\/\/NGJGfdFz\/xJ7pIftPvf3eA\/MWfx+PgF96fER0sj0M8t9uETX7pruhSTCkkLmDrYHmOz7rU17Lq49sfZa7iq2Fl9197u2Mc1pr4yyD9cs++f+i2r+yre6a\/alBYgVmrFa5i+Qx+dXC\/xpTMaJSBji2YXujERyl8UHf9Pre3uB0t2ORdtA6d7KWYntrNkZzlYiinU4sr\/U3OilNP3RH+d2\/lpZtu6mPJHl+5aeDDhk4yWTUnW9UnWtecaV8Y3rEts3JLc5NjoSk1s4e4g6hI2mgSzJrKXRiD6Eg8M5eQgli0kKfTz0GfuOf\/n8eZlP23cfE\/jxntqNk9o2HJP9ZqfViz7Sc3KH5eu\/mHS\/PER+7YQ3bmRyE0LsSpRlzQmpZFyItJ35JI6ST0ydbDlqK3hY1vdDlvck7dD7u3Mfbevcqv9S64m\/JmO6Ce7DtzVX7Gir3xJf+Ua05dTpMUTW+iHhvHIKg5EOmnCfWlMDVNKd1FrLIWo1BN3TXbxL4rSehRdXJw9uo1itXJlECM7Wxiz00dK\/OlRRiT4z4\/DD19p23u57eOLNw9mNBzKbvVLbtp6oen9C02bL1g3nGvceN664bx1w3nr+iTr\/KArni7OOHz50aaDk+7mn\/pu2jPjC2b\/Y+HcHxbM\/1HRaz\/Of\/mu5FnjT0\/94d7N7+hdo\/dI+WKKrWGPrfEzW93HA40HB6xHbDUf2qo+GLR+NVC301a3a6DxYL9ldX\/lyr7yZSlfEO5+AFeQfteHc1\/4Ep9R1IwXlFctnPDFm\/ujXtkf9+rBxPn74xccSnxpX\/xL++Nf2h8\/b1\/8vH3xL+6Lf\/GzuDmObW\/s4kNndapZB\/bs2bP0pXl+\/3bPkf\/9vag\/fSfmWY5\/lot5Ztzpv3xvz7\/\/5PVp0z7++GO9a\/QeWSfmJ38+JfnzKcmfT\/5m59DkET8PT7ljMOXy8Xl61zvWwHfp+SCc8AXP82fOnDl27FgIlWPHjp05c4bneZ1q1oHIyMjAwMAdO3a8++orbz\/x2Dt\/ePid3\/\/bW08+vvSleX5+foGBgZGRPvGNHw4SEhJiYmIiIiLCqURERMTExCQkJOhd71gDSu2DcHoXAAAAQAFO7wIAAAAowOldAAAAAAU4vQsAAACgAOcHAADA2Iz8KDoAAAA94DiaGkOpAQDuQe87BKMYPz8\/KDUAwBvoLXejGCg1AMBL6C13oxgotdHhAeB5nuf1PhPdgN5yN4qBUhudsXGJAhGqrlKO48bGaeAhFfMFoNRGZ2xcokCEyWRitHRcomPjNNBb7kYxUGqjMzYuUSDCZDLZ2ZQLSg1MUGrjMzYuUSDCBKUeCbfoM8dG7NIgbc6AxMjSXqeBNJ22AhTLI9YjZ8+k1I6nHog7qG7kWCOhdDl7iXnlgngCxRT0srVVKAwlvUTdPmpPTKN3Tg9dcPHgOjBpVWpDXYyMWZwv2ZWLsUtVQGGLqnReUGrFRKxKTTwGGg6b3Eu5aIonpacvWhaldsVd0dGnlFrupb7SLMItxZhcUGq3lOSWi1FtIrXKpdilNiBl4UxxHJVK7XyTlDZqEDXFt2t2pRZVJS3JaSC3giBayvVSKpQbl2IoYgR2paasj+hmioeS8fjavX56iCzljqNcGa6cEixjpAzcJFBqjoToEiUqtZdnm+UEoHuxK5fwboBoLax4o4BFCt2i1Cy3VojtiuVJUafUopNeeiQUYnlYqeklEQ0YLSljJFbOmIiC04ZRqeUGwlIGY69i5d4\/PYSWGs5SV04JFhfK0Ewj19RyMm2SV2ojXIwsaFBqqTQThYwu1opKLXcXm1Gp5YphaddwR16jUis2Kh4zaRARFBepGaUMDcVTGun1UEKxz5LIxi1KTU\/BPhuMNSvGVHSXBpE77hpSu\/eUYHGRYpLc\/XAOjXiJUpSaZchS3HIxsiD0kpMhqZApih1d1+R63bimphTD8odKfZSacgnJHTNpELUulHZVFxv9jBQ1MtZDvJgZZ0nk6HalpoxXrkjGsr1\/eiim1mCg9pSQc7FT581Euk\/NkZ54rVapPTfbLOct3UtOhqRKR+yi\/zsHi+p5QaldeZvx3pqa\/ZgxBqG4UNpVXZaMoTiXlZpYthxOe\/cqtaLiMFal2Oud04M9tedOCbXlOTC5\/BdFI1yMahNRhqlhTU0HSk07rqrexlkc3avU9GuM\/QpXrIcxEQX3KjVxx8XZUFuDKndVjnY1w7G7bxJcmTeT55XaCxcjCy4qtRvvU9NvRjM6yjUa6z61\/c7JLTzFhY2Kx4zoLu0innlyLcR2YpH2kRcn3VLYS0lNb6TPEmXGnF1EpZabK7nREVsYi5RrlCubOEwWd+KgFIcs3KFPr9z8s4xXOhxiI\/u8mdzxX3p6zbYqhF6UYXrifz8ot0qkvZTlNsVSMbhppFgTByU3CUK0\/z+1d3BjatdDeXMenLnGxofTPI3rIuJlTG79f2rv4E2l1hEdK3GDUqs6SNL3ZM2nl3GU2ssybWSldvH4uvH0EMb0mpdbMLn1M4oU9L0YRem0iRQdyupYc0BX3D2UGt\/7YXQMqNTAdRzXHuvDTH37ez+8jC41KA4fSm10xsYlCkQQl7oUxsZp4E3tG2NAqY2Op58kAkYLep+JboD91wggBUoNAPA4an+NAFJo0+u1AwkAAEAbUGoAADA6UGoAADA6UGoAADA6UGoAADA6UGoAADA63HwAAADGhksBAABgbHD3AwAAjA6UGgAAjA6UGgAAjA6UGgAAjA6UGgAAjA6UGgAAjA6UGgAAjA6UGgAAjA6UGgAAjM43zyZ3c1APPBNaQ0zK8xRUPW3B0ziz61sGAMCwjHGllntpKE00VDEAAANCU2rKapRuJtpncZGt746ZYkyir1wLoy9xXMIgcgaMUyRa1Ltx3gAAYwlZpSYqL2VHQ69caqKLK+70GuR8icNRHBr7JGieVZb6AQBjCY1KTY6lXnEUinOT0BODiHAltQaFdfEdDgDgU7hBqaV6JyeIUheF4uRXoywRXFxT071U6S9liojuLs4bAGCM4apSs68NyemZpVbD0tI4Sq02vovzBgAYY7jtPrXcmpoSRC41Yw2q3FU52tUMx+6+SXDXvAEAxhjfKLXcb+jS37UpLXKaIufCIjfSqtjdiYMidslppTQvfRREL4qlsJfYqHneAABjCVzzZLSpITQUAOAJDKEs0hWuKslz0V0upte8AACADpQFAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpQaAACMDpSaCR4YAL3PAgB0A0rNBM\/zHUBXoNTAl4FSM8HzfBfQFSg18GWg1EzwPH8L6AqUGvgyUGomeJ7vA7oCpQa+zDdKrdfDvO13nixOjEPsUvvYckouUYvouebCfZ7nbTabzWZzNNpGIm1RRPQkdUqXs1dDFs0Qh6kvUGrgy7hNqbVXIC\/N0l67C0otlGC1jTzPDw0NDQ0NcRw3JIHYSEfkInwpF01DFlfwcjpFoNTAl\/lW++Q0UXFhS2wRLU5FxkRHohBLe+mrYGkN0l65euSS2u12nueHh4eHh4c5jhu+gyM4sVHYQkRq4GyR81WM6V68nE4RKDXwZWhaKSeCdgbBJXYp9lJeMgquXDGKYem9PM\/fvn379u3bHMdJd6SNon0p0l5iELqLR\/FyOkWg1MCXUVDqb+0kisaiicTIlCyUl15TamJYp0ywZJeLLJdFGkQES0C34+V0ikCpgS+jvOaV7gtbiJoopzJuV2ppIrmyvabUxJKk0JWa0cWjQKkBMA6eXVMTjT2xplZbldrsGtbUdKDUaoFSA1+GsBoVrRCFXVJn6b7aFTqLVrInckWpKerp6bsfLI5Qar1LAEA3yFosWvxqEF\/pr\/9uVGrp3QbKEOiqLQ1FdJEqtciFPnYpxHTELrk3G08DpQbAOKi7l+qRClTez3U9kYaVL1GpvQyUWu8SANANQyg15fd999Ygt4BVNBYqtaqSpAtkzSPypnS6feZdB0oNfBljXY2GBTKhOzgEwJeBUjMBmdAdHALgy0CpmfD000wAC3qfBQDoBpSaCb01CvA8lBr4MFBqJng8nUtvoNTAl4FSM8Hj6Vx6A6UGvgyUmgkeT+fSGyg18GWg1EzweDqX3kCpgS\/jtk8qu\/KBDrkPDRK71H7whJKLPTtvyKdzUYJ4AsUU9LK1VegMBaUGvow+3ykxogJ5aZb22l1Qauc+4xuDsJc35NO5KEE8gWJ8uoHm8hyOUGrgy4z4JqZvW6hmh0IAAAQrSURBVJW+oUmxRehFUUa7REDltFJYjLCRkkiulyLfFKV2PCOKM9LTuUQtogjCl6KSnAbSCBRLuV5KhXLjUgwljQClBr4MTSvlRNDOILjELsVeykttgqtYP2N23pBP5xK1sJdENGC0pIyRWDljIgoOGyg18GUUlPpbO8k9BxZNJEamZKG81F2p2bMTQ4mQm0\/7yN8GKG+WUkticPY61TbS66GEYp8loQ2UGvgyymte6b6whXgdyqmM25WaXae8ptTEkqTQlVqtC6Vdlf7S3x5YlJpSjIZZEjpCqYEv49k1NdHYjUpNT8SSxe1KLS2JiDGVmjGU60pNLFsOKDUAhNWoaO0j7JI6S\/cVZYKyL\/dSrdwYQanpekTJ6x2lpk+RqqPJ2KhhloQ2UGrgy5C1WLT41SC+Ii9GR7mX0uDERMQhqFIKdqUWZlccuxRuJJQuuTcVYovcKIgHkZKaGIpejGIjfZYoM8ZBqYHPo2Ld56kK1Kw93ZKIUSDsSkrtZTwxFTpGUJsLSg18GUMoNWVt6N4a5FaRisb82Ho6l4uhvCzTUGoAdFshji4gE7qDQwB8GSg1E5AJ3cEhAL4MlJoJTz\/NBLCg91kAgG5AqfVEb+kDPI83ADAagFLrCY+HfukNlBqMCqDUesLjoV96A6UGowIotZ7weOiX3kCpwagASq0nPB76pTdQajAqEH9WW8Fa65fsaHNhKYPyqWvFjMTPZ2v+fIoGF96oD\/1Sm5dSj7QGdwV3C1BqMCoY9UrtSkahgaqPL2pLJ4UfDQ\/9cgWPBncLUGowKlDxTUzSRZmzl+hLCTiiAtIaltJoV1JqYq9ckYq1yVlSAlKyiFz40fDQL3oNlEZVwfUCSg1GBeq+cI7djG4pdVGVWq1Sq8oifTOQWjJOjmIjPxoe+kWpgd4oHAI9uI5AqcGoQFl3iI3aRJCQXmlhyyKsRDF1ZSzSNwOpQGtOJ9znjfrQL3pkDUeKsX7vA6UGowKDKjVdUBhjyokU0YxSiZwNPSBLDexKLfUlQldqtS5yjRqOFD24jkCpwajAiErtrpiqzFQpNePkKNagYU1Nx8tKzd5ID64jUGowKvhGgNTKjXeUWnGlpkGp5XRZlejQK2QP5em7HyyOblFqrKkB8CgjFozS69yJsMUuuTJFvhRRk4tJTC0NJfUlDElGMlh0n1ghMZe0QnqpxJFKlZrdlwi9frn5pweRzg99HuSGIJdOX6DUYFRgrMtGLyjy4VFlISq1l\/Fyaig1ABow1mWjI3JLS48m5cfWQ79YckGpAdCAsS4bfXGL8KkCMqE7OARgVACl1hPIhO7gEIBRAZRaTzz9NBPAgt5nAQDKQKkBAMDoQKkBAMDoQKkBAMDoQKkBAMDoQKkBAMDoQKkBAMDoQKkBAMDoQKkBAMDoQKkBAMDoQKkBAMDo\/H\/NWKkSibajtQAAAABJRU5ErkJggg==\" alt=\"\" \/><\/p>\n<p>The next article describes the procedure to save the properties back the database.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For one of my customers I am developing an easy way for editing the localization\/translation of existing XPages applications: Instead of importing and exporting the property files with the Domino Designer (which is not an option for non-developers) it would &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=1070\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[89,76,81,74],"tags":[33,14,7,77,31,5,32,12,3],"class_list":["post-1070","post","type-post","status-publish","format-standard","hentry","category-java","category-ssjs","category-web","category-xpages","tag-8-5-3","tag-designer","tag-domino","tag-html","tag-java","tag-ssjs","tag-tipp","tag-web","tag-xpages"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1070","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1070"}],"version-history":[{"count":7,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1070\/revisions"}],"predecessor-version":[{"id":1075,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1070\/revisions\/1075"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}