dims 01/06/01 09:15:05
Modified: . build.xml
src/org/apache/cocoon/acting LangSelect.java
src/org/apache/cocoon/transformation I18nTransformer2.java
webapp/i18n simple.xsp sitemap.xmap
webapp/i18n/translations simple_dict.xml
xdocs i18n.xml
Log:
Patch(es) for I18nTransformer from Konstantin Piroumian ([EMAIL PROTECTED])
Revision Changes Path
1.6 +1 -0 xml-cocoon2/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/build.xml,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- build.xml 2001/06/01 11:44:20 1.5
+++ build.xml 2001/06/01 16:14:52 1.6
@@ -169,6 +169,7 @@
<property name="site" value="../xml-site/targets/${name}"/>
+ <filter token="Name" value="${Name}"/>
<filter token="name" value="${fullname}"/>
<filter token="year" value="${year}"/>
<filter token="version" value="${version}"/>
1.3 +115 -15 xml-cocoon2/src/org/apache/cocoon/acting/LangSelect.java
Index: LangSelect.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/acting/LangSelect.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- LangSelect.java 2001/05/22 14:31:05 1.2
+++ LangSelect.java 2001/06/01 16:14:55 1.3
@@ -15,10 +15,14 @@
import java.util.Locale;
import java.util.Map;
import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.cocoon.Constants;
import org.apache.cocoon.acting.Action;
import org.apache.cocoon.environment.Cookie;
import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.Response;
import org.apache.cocoon.environment.Session;
import org.apache.cocoon.environment.SourceResolver;
@@ -46,14 +50,71 @@
*
*
* Creation date: (3.11.2000 14:32:19)
+ * Modification date: (29.05.2001 0:30:01)
+ * @author: <a href="mailto:[EMAIL PROTECTED]">Konstantin Piroumian</a>
* @author: <a href="mailto:[EMAIL PROTECTED]">Lassi Immonen</a>
*/
-public class LangSelect extends java.lang.Object implements Action {
+public class LangSelect extends java.lang.Object implements Action, Configurable {
+
+ /**
+ * The default language: en (English).
+ */
private final static String DEFAULT_LANG = "en";
+ /**
+ * The name that will be used as a request param or a cookie name.
+ */
+ private final static String PARAM_LANG = "lang";
+
+ /**
+ * Should we store the lang in request.
+ * Default is off.
+ */
+ private boolean storeInRequest = false;
+ /**
+ * Should we store the lang in session, if one is available.
+ * Default is off.
+ */
+ private boolean storeInSession = false;
/**
+ * Should we create a session to store the lang if it's not created yet.
+ * Not used if use-session is false.
+ * Default is off.
+ */
+ private boolean createSession = false;
+
+ /**
+ * Should we add a cookie with the lang.
+ */
+ private boolean storeInCookie = false;
+
+ /**
+ * Configure this action.
+ */
+ public void configure(Configuration conf)
+ throws ConfigurationException {
+ if (conf != null) {
+
+ Configuration child = conf.getChild("store-in-request");
+ this.storeInRequest = child.getValueAsBoolean(false);
+
+ child = conf.getChild("create-session");
+ this.createSession = child.getValueAsBoolean(false);
+// getLogger().debug("Create session is " + this.createSession + " for "
+ this);
+
+ child = conf.getChild("store-in-session");
+ this.storeInSession = child.getValueAsBoolean(false);
+// getLogger().debug("Store in session is " + this.storeInSession + "
for " + this);
+
+ child = conf.getChild("store-in-cookie");
+ this.storeInCookie = child.getValueAsBoolean(false);
+// getLogger().debug("Use cookie is " + this.storeInCookie + " for " +
this);
+ }
+ }
+
+ /**
* Selects language if it is not set already in objectModel
* Puts lang parameter to session and to objectModel
* if it is not already there.
@@ -63,30 +124,27 @@
String lang;
- if (objectModel.containsKey("lang")) {
- lang = (String)(objectModel.get("lang"));
+ if (objectModel.containsKey(PARAM_LANG)) {
+ lang = (String)(objectModel.get(PARAM_LANG));
} else {
lang = getLang(objectModel, par);
- objectModel.put("lang", lang);
+ objectModel.put(PARAM_LANG, lang);
}
+ // Creating session to store the language code
Request request =
(Request)(objectModel.get(Constants.REQUEST_OBJECT));
+ request.getSession(createSession);
- Session session = request.getSession();
- if (session != null) {
- if (session.getAttribute("lang") == null) {
- session.setAttribute("lang", lang);
- }
+ if (storeInSession || storeInCookie) {
+ storeLang(objectModel, lang);
}
Map m = new HashMap(1);
- m.put("lang", lang);
+ m.put(PARAM_LANG, lang);
return m;
}
-
-
/**
* Returns two character language code by checking environment in following
order
* <ol>
@@ -119,12 +177,12 @@
String lang = null;
- lang = request.getParameter("lang");
+ lang = request.getParameter(PARAM_LANG);
if (lang == null) {
Session session = request.getSession(false);
if (session != null) {
- Object session_lang = session.getAttribute("lang");
+ Object session_lang = session.getAttribute(PARAM_LANG);
if (session_lang != null) {
lang = session_lang.toString();
}
@@ -137,7 +195,7 @@
if (cookies != null) {
for ( int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
- if (cookie.getName().equals("lang")) {
+ if (cookie.getName().equals(PARAM_LANG)) {
lang = cookie.getValue();
}
}
@@ -171,5 +229,47 @@
}
}
return lang;
+ }
+
+ /**
+ * Stores language code in the session or a cookie
+ * @param objectModel java.util.Map
+ * @param lang String The language code to store
+ */
+ public void storeLang(Map objectModel, String lang) throws Exception {
+
+ if (lang == null) {
+ lang = DEFAULT_LANG;
+ }
+
+ Request request =
+ (Request)(objectModel.get(Constants.REQUEST_OBJECT));
+
+ if (storeInRequest) {
+ request.setAttribute(PARAM_LANG, lang);
+ }
+
+ if (storeInSession) {
+ // We do not create session here to keep this method static.
+ // Session must be created outside if needed.
+ Session session = request.getSession(false);
+ // Try to store in a session.
+ if (session != null) {
+ synchronized (session) {
+ session.setAttribute(PARAM_LANG, lang);
+ }
+ }
+ else {
+ throw new Exception("LangSelect: session is not available.");
+ }
+ }
+
+ if (storeInCookie) {
+ Response response =
+ (Response)(objectModel.get(Constants.RESPONSE_OBJECT));
+
+ Cookie langCookie = response.createCookie(PARAM_LANG, lang);
+ response.addCookie(langCookie);
+ }
}
}
1.9 +129 -46
xml-cocoon2/src/org/apache/cocoon/transformation/I18nTransformer2.java
Index: I18nTransformer2.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/org/apache/cocoon/transformation/I18nTransformer2.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- I18nTransformer2.java 2001/05/31 17:39:00 1.8
+++ I18nTransformer2.java 2001/06/01 16:14:57 1.9
@@ -30,16 +30,13 @@
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.DefaultHandler;
-import java.io.InputStream;
-import java.io.BufferedInputStream;
import java.io.IOException;
-import java.io.Reader;
-import java.io.BufferedReader;
+
import java.util.Map;
import java.util.HashMap;
-//import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.ArrayList;
+import java.util.Locale;
import java.text.MessageFormat;
@@ -91,54 +88,60 @@
* </translations><br>
* </p>
* <p>
- *
- *TODO -Add i18n:key support.<br>
- * -Caching dictionaries in memory.<br>
- * -Implementing Infozone group I18nProcessors param substitutions
- * where you can enter params in the translated text.
- *
*
+ * @todo Caching dictionaries in memory.<br>
+ * @todo Date and Number i18n.<br>
+ * @todo Multiple dictionary support. <br>
+*
* @author <a href="mailto:[EMAIL PROTECTED]">Konstantin Piroumian</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Lassi Immonen</a>
*/
-public class I18nTransformer2 extends AbstractTransformer implements Composable,
Poolable {
+public class I18nTransformer2 extends AbstractTransformer
+implements Composable, Poolable {
protected ComponentManager manager;
+ /**
+ * The parsed dictionary data.
+ */
public Map dictionary;
- //apache.org/cocoon/i18n/2.0";
+ /**
+ * The namespace for i18n is "http://apache.org/cocoon/i18n/2.0"
+ */
public final static String I18N_NAMESPACE_URI =
"http://apache.org/cocoon/i18n/2.0";
- public final static String I18N_ELEMENT = "i18n";
//
// Dictionary elements and attributes
//
public final static String I18N_DICTIONARY_ELEMENT = "dictionary";
public final static String I18N_ENTRY_ELEMENT = "entry";
-// public final static String I18N_ELEMENT_KEY_ATTRIBUTE = "key";
public final static String I18N_KEY_ELEMENT = "key";
public final static String I18N_TRANSLATION_ELEMENT = "translation";
+ //
+ // Text elements and attributes
+ //
public final static String I18N_LANG = "lang";
public final static String I18N_KEY_ATTRIBUTE = "key";
public final static String I18N_ATTR_ATTRIBUTE = "attr";
public final static String I18N_TEXT_ELEMENT = "text";
public final static String I18N_TRANSLATE_ELEMENT = "translate";
public final static String I18N_PARAM_ELEMENT = "param";
+ public final static String I18N_DATE_ELEMENT = "date";
+ public final static String I18N_NUMBER_ELEMENT = "number";
// States of the transformer
private final static int STATE_OUTSIDE = 0;
private final static int STATE_INSIDE_TEXT = 1;
private final static int STATE_INSIDE_PARAM = 2;
private final static int STATE_INSIDE_TRANSLATE = 3;
- private final static int STATE_INSIDE_PARAM_TEXT = 4;
+// private final static int STATE_INSIDE_PARAM_TEXT = 4;
private final static int STATE_INSIDE_TRANSLATE_TEXT = 5;
private final static int STATE_TRANSLATE_KEY = 6;
private final static int STATE_TRANSLATE_TEXT_KEY = 7;
- // If true - then text part of the element will be translated.
/**
* Current state of the transformer.
*/
@@ -151,64 +154,111 @@
/**
* The i18n:key attribute is stored for the current element.
+ * If no translation found for the key then the character
+ * data of element is used as default value.
*/
- protected String current_key = null;
+ private String current_key = null;
/**
* Translated text inside the i18n:text element.
*/
- protected String translated_text = null;
+ private String translated_text = null;
/**
- * If no translation found for the key then the character
- * data is used as default value.
- */
-// protected String default_value = null;
-
- /**
* Translated text, ready for param substitution.
*/
- protected String substitute_text = null;
+ private String substitute_text = null;
/**
* Current parameter value (translated or not)
*/
- protected String param_value = null;
+ private String param_value = null;
/**
- * @todo
- * i18n:params are stored in a HashMap for named substitutions.
+ * @todo Named parameter substitution.
+ * i18n:params are stored in a HashMap for named substitutions, <br>
+ * name attribute is used as a key.<br>
+ * <i>MessageFormat class does not support named params.
+ * Some kind of mapping (name to index) must be used.</i>
*/
- protected HashMap namedParams = null;
+ private HashMap namedParams = null;
/**
* i18n:params are stored for index substitutions.
*/
- protected ArrayList indexedParams = new ArrayList();
+ private ArrayList indexedParams = new ArrayList();
+ /**
+ * Message formatter for param substitution.
+ */
+ private MessageFormat formatter = new MessageFormat("");
/**
* Current language id.
+ */
+ private String lang;
+
+ /**
+ * @todo Locale full support.
+ * Do we really need it? We can use a combination of
+ * language code and country code (en_US) instead. <br>
+ * Also, different encodings can be specified: ru_RU_koi8
*/
- protected String lang;
+ private Locale locale;
+ public void setLang(String lang) {
+ this.lang = lang;
+ }
+
+ public void setLocale(Locale locale) {
+ this.locale = locale;
+ }
+
/**
* Uses <code>org.apache.cocoon.acting.LangSelect.getLang()</code>
* to get language user has selected. First it checks is lang set in
* objectModel.
*/
-
public void setup(SourceResolver resolver, Map objectModel, String source,
Parameters parameters)
throws ProcessingException, SAXException, IOException {
- lang = (String)(objectModel.get("lang"));
+ // Set current language and locale
+ String lang = (String)(objectModel.get("lang"));
if (lang == null) {
lang = LangSelect.getLang(objectModel, parameters);
}
+ setLang(lang);
+
+ Locale locale = null;
+ int ind = lang.indexOf("_");
+ if (ind != -1) {
+ int lind = lang.lastIndexOf("_");
+ if (ind == lind) {
+ locale = new Locale(lang.substring(0, ind - 1),
+ lang.substring(ind + 1));
+ }
+ else {
+ locale = new Locale(lang.substring(0, ind - 1),
+ lang.substring(ind + 1, lind - 1),
+ lang.substring(lind + 1));
+ }
+ }
+ else {
+ locale = new Locale(lang, "");
+ }
+ setLocale(locale);
+ formatter.setLocale(locale);
+ // FIXME (KP)
+ // We need another way of specifying dictionaries, e.g.
+ // <parameter name="dictionary.en" src="dict.xml" />
+ // <parameter name="dictionary.de" src="dict_de.xml" />
+ // etc.
String translations_file = parameters.getParameter("src", null);
+ // FIXME (KP)
+ // Add multiple dictionary support!
initialiseDictionary(resolver.resolve(translations_file));
}
@@ -217,7 +267,6 @@
this.manager = manager;
}
-
public void startElement(String uri, String name, String raw,
Attributes attr) throws SAXException {
@@ -255,16 +304,34 @@
// My own content handlers
- private void startI18NElement(String name, Attributes attr) {
+ private void startI18NElement(String name, Attributes attr)
+ throws SAXException {
+ this.getLogger().debug("Start i18n element: " + name);
if (I18N_TEXT_ELEMENT.equals(name)) {
+ if (current_state != STATE_OUTSIDE
+ && current_state != STATE_INSIDE_PARAM
+ && current_state != STATE_INSIDE_TRANSLATE) {
+ throw new SAXException(this.getClass().getName()
+ + ": nested i18n:text elements are not allowed. Current state:
" + current_state);
+ }
prev_state = current_state;
current_state = STATE_INSIDE_TEXT;
current_key = attr.getValue(I18N_NAMESPACE_URI, I18N_KEY_ATTRIBUTE);
}
else if (I18N_TRANSLATE_ELEMENT.equals(name)) {
+ if (current_state != STATE_OUTSIDE) {
+// throw new SAXException(this.getClass().getName()
+// + ": i18n:translate element must be used "
+// + "outside of other i18n elements. Current state: " +
current_state);
+ }
current_state = STATE_INSIDE_TRANSLATE;
}
else if (I18N_PARAM_ELEMENT.equals(name)) {
+ if (current_state != STATE_INSIDE_TRANSLATE) {
+ throw new SAXException(this.getClass().getName()
+ + ": i18n:param element can be used only inside "
+ + "i18n:translate element. Current state: " + current_state);
+ }
current_state = STATE_INSIDE_PARAM;
}
}
@@ -289,7 +356,15 @@
}
+ /*
+ */
private String stripWhitespace(String s) {
+ // FIXME (KP) Must be a better way to determine whitespace-only nodes.
+ // trim() function does not remove spaces if string does not contain
+ // anything else.
+// if (s == null) {
+// return null;
+// }
String result = (s + "!").trim();
return result.substring(0, result.length() - 1);
}
@@ -299,7 +374,8 @@
String text2translate = new String(ch, start, len);
text2translate = stripWhitespace(text2translate);
- if (text2translate.length() == 0) {
+ if (text2translate == null || text2translate.length() == 0) {
+// this.getLogger().warn(this.getClass().getName() + ": null i18n text
found");
return;
}
@@ -370,13 +446,13 @@
temp_attr.setValue(attr_index, result);
}
else {
- getLogger().warn("translation not found for attribute " +
attr_name
- + " in element: " + name);
+ getLogger().warn("translation not found for attribute "
+ + attr_name + " in element: " + name);
}
}
else {
- getLogger().warn("i18n attribute " + attr_name
- + " not found in element: " + name);
+ getLogger().warn("i18n attribute '" + attr_name
+ + "' not found in element: " + name);
}
}
return temp_attr;
@@ -390,8 +466,15 @@
switch (prev_state) {
case STATE_OUTSIDE: {
// simply translate text (key translation already performed)
- super.contentHandler.characters(translated_text.toCharArray(),
- 0, translated_text.length());
+ if (translated_text != null) {
+ super.contentHandler.characters(translated_text.toCharArray(),
+ 0, translated_text.length());
+ }
+ else {
+ // Translation not found.
+ super.contentHandler.characters("".toCharArray(),
+ 0, 0);
+ }
break;
}
case STATE_INSIDE_TRANSLATE: {
@@ -424,7 +507,7 @@
String result;
if (indexedParams.size() > 0 && substitute_text.length() > 0) {
this.getLogger().debug("Text for susbtitution: " + substitute_text);
- result = MessageFormat.format(substitute_text, indexedParams.toArray());
+ result = formatter.format(substitute_text, indexedParams.toArray());
this.getLogger().debug("Result of susbtitution: " + result);
}
else {
@@ -516,7 +599,7 @@
try
{
parser = (Parser)(manager.lookup(Roles.PARSER));
- InputSource input = inputSource.getInputSource();
+ InputSource input = new InputSource(inputSource.getInputStream());
// How this could be cached?
this.dictionary = new HashMap();
@@ -536,7 +619,7 @@
getLogger().error("Error in initialiseDictionary", e);
throw new SAXException("ComponentException in initialiseDictionary");
} finally {
- if(parser != null) this.manager.release(parser);
+ if(parser != null) this.manager.release((Component) parser);
}
}
}
1.4 +2 -2 xml-cocoon2/webapp/i18n/simple.xsp
Index: simple.xsp
===================================================================
RCS file: /home/cvs/xml-cocoon2/webapp/i18n/simple.xsp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- simple.xsp 2001/05/23 12:32:20 1.3
+++ simple.xsp 2001/06/01 16:14:59 1.4
@@ -18,9 +18,9 @@
}
Locale loc = null;
- String lang = <xsp-request:get-parameter name="lang"/>;
+ String lang = <xsp-request:get-attribute name="lang"/>;
if (lang != null) {
- request.setAttribute("lang", lang);
+ // request.setAttribute("lang", lang);
loc = new Locale(lang, lang.toUpperCase());
}
1.5 +17 -4 xml-cocoon2/webapp/i18n/sitemap.xmap
Index: sitemap.xmap
===================================================================
RCS file: /home/cvs/xml-cocoon2/webapp/i18n/sitemap.xmap,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- sitemap.xmap 2001/05/22 16:21:16 1.4
+++ sitemap.xmap 2001/06/01 16:14:59 1.5
@@ -19,23 +19,36 @@
<map:matchers default="wildcard">
<map:matcher name="wildcard"
src="org.apache.cocoon.matching.WildcardURIMatcherFactory"/>
</map:matchers>
+ <map:actions>
+ <map:action name="lang-select"
src="org.apache.cocoon.acting.LangSelect">
+ <store-in-session>true</store-in-session>
+ <create-session>true</create-session>
+ <store-in-cookie>true</store-in-cookie>
+ <store-in-request>true</store-in-request>
+ </map:action>
+ </map:actions>
+
</map:components>
<!-- =========================== Pipelines =================================
-->
<map:pipelines>
<map:pipeline>
<map:match pattern="**.xml">
- <map:generate src="{1}.xml"/>
+ <map:act type="lang-select">
+ <map:generate src="{../1}.xml"/>
<map:transform type="i18n">
- <map:parameter name="src"
value="translations/{1}_dict.xml"/>
+ <map:parameter name="src"
value="translations/{../1}_dict.xml"/>
</map:transform>
+ </map:act>
<map:transform src="simple.xsl"/>
<map:serialize/>
</map:match>
<map:match pattern="**.xsp">
- <map:generate type="serverpages" src="{1}.xsp"/>
+ <map:act type="lang-select">
+ <map:generate type="serverpages" src="{../1}.xsp"/>
<map:transform type="i18n">
- <map:parameter name="src"
value="translations/{1}_dict.xml"/>
+ <map:parameter name="src"
value="translations/{../1}_dict.xml"/>
</map:transform>
+ </map:act>
<map:transform src="simple.xsl"/>
<map:serialize/>
</map:match>
1.3 +268 -268 xml-cocoon2/webapp/i18n/translations/simple_dict.xml
Index: simple_dict.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/webapp/i18n/translations/simple_dict.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- simple_dict.xml 2001/05/18 14:05:36 1.2
+++ simple_dict.xml 2001/06/01 16:15:01 1.3
@@ -1,268 +1,268 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<translations>
-<!--
- Languages:
- en - English
- ru - Russian
- de - German
- pl - Polish (thanks to Krzysztof Zieliński)
- es - Spanish
- hy - Armenian.
--->
-
- <!-- Language links -->
- <entry>
- <key>count_title</key>
- <translation lang="en">This page was accessed {0} times. Last at:
{1}.</translation>
- <translation lang="ru">На эту страницу заходили
{0} раз(а). В последний раз {1}.</translation>
- <translation lang="de">Auf diese Seite kamen {0} Des males vorbei. In
das letzte {1}.</translation>
- <translation lang="pl">Ta strona była pobierana {0} razy. Ostatnio
{1}</translation>
- <translation lang="es">Esta página fue tenida acceso {0} veces.
Pasado en: {1}.</translation>
- <translation lang="hy">²Ûë ¿çÁ ³Ûó»É»É »Ý {0}
³Ý·³Ù. ì»ñçÇÝÁ {1}.</translation>
- </entry>
- <entry>
- <key>a_key</key>
- <translation lang="en">This is a key value.</translation>
- <translation lang="ru">Это значение по
ключу.</translation>
- <translation lang="de">Diese Bedeutung nach dem
Schlüssel.</translation>
- <translation lang="pl">To jest klucz.</translation>
- <translation lang="es">Esto es un valor clave.</translation>
- <translation lang="hy">ê³ µ³Ý³ÉÇÇ ³éÅ»ùÝ
¿£</translation>
- </entry>
- <entry>
- <key>lang_id1</key>
- <translation lang="en">ru</translation>
- <translation lang="ru">en</translation>
- <translation lang="de">en</translation>
- <translation lang="pl">en</translation>
- <translation lang="es">en</translation>
- <translation lang="hy">en</translation>
- </entry>
- <entry>
- <key>lang_id2</key>
- <translation lang="en">de</translation>
- <translation lang="ru">de</translation>
- <translation lang="de">ru</translation>
- <translation lang="pl">ru</translation>
- <translation lang="es">ru</translation>
- <translation lang="hy">ru</translation>
- </entry>
- <entry>
- <key>lang_id3</key>
- <translation lang="en">pl</translation>
- <translation lang="ru">pl</translation>
- <translation lang="de">pl</translation>
- <translation lang="pl">de</translation>
- <translation lang="es">de</translation>
- <translation lang="hy">de</translation>
- </entry>
- <entry>
- <key>lang_id4</key>
- <translation lang="en">es</translation>
- <translation lang="ru">es</translation>
- <translation lang="de">es</translation>
- <translation lang="pl">es</translation>
- <translation lang="es">pl</translation>
- <translation lang="hy">pl</translation>
- </entry>
- <entry>
- <key>lang_id5</key>
- <translation lang="en">hy</translation>
- <translation lang="ru">hy</translation>
- <translation lang="de">hy</translation>
- <translation lang="pl">hy</translation>
- <translation lang="es">hy</translation>
- <translation lang="hy">es</translation>
- </entry>
- <!-- current language -->
- <entry>
- <key>language</key>
- <translation lang="en">English</translation>
- <translation lang="ru">Русский</translation>
- <translation lang="de">Deutsch</translation>
- <translation lang="pl">Polski</translation>
- <translation lang="es">Español</translation>
- <translation lang="hy">гۻñ»Ý</translation>
- </entry>
- <entry>
- <key>language1</key>
- <translation lang="en">Russian</translation>
- <translation lang="ru">Английский</translation>
- <translation lang="de">Englische</translation>
- <translation lang="pl">Angielski</translation>
- <translation lang="es">Inglés</translation>
- <translation lang="hy">²Ý·É»ñ»Ý</translation>
- </entry>
- <entry>
- <key>language2</key>
- <translation lang="en">German</translation>
- <translation lang="ru">Немецкий</translation>
- <translation lang="de">Russe</translation>
- <translation lang="pl">Rosyjski</translation>
- <translation lang="es">Ruso</translation>
- <translation lang="hy">èáõë»ñ»Ý</translation>
- </entry>
- <entry>
- <key>language3</key>
- <translation lang="en">Polish</translation>
- <translation lang="ru">Польский</translation>
- <translation lang="de">Polnisch</translation>
- <translation lang="pl">Niemiecki</translation>
- <translation lang="es">Alemán</translation>
- <translation lang="hy">¶»ñٳݻñ»Ý</translation>
- </entry>
- <entry>
- <key>language4</key>
- <translation lang="en">Spanish</translation>
- <translation lang="ru">Испанский</translation>
- <translation lang="de">Spanisch</translation>
- <translation lang="pl">Hiszpañski</translation>
- <translation lang="es">Polaco</translation>
- <translation lang="hy">Ȼѻñ»Ý</translation>
- </entry>
- <entry>
- <key>language5</key>
- <translation lang="en">Armenian</translation>
- <translation lang="ru">Армянский</translation>
- <translation lang="de">Armenier</translation>
- <translation lang="pl">Armeñski</translation>
- <translation lang="es">Armenio</translation>
- <translation lang="hy">Æëå³Ý»ñ»Ý</translation>
- </entry>
- <entry>
- <key>Hello, internationalization!</key>
- <translation lang="en">Hello, internationalization!</translation>
- <translation lang="ru">Привет,
многоязычность!</translation>
- <translation lang="de">Hallo, die Internationalisierung!</translation>
- <translation lang="pl">Witam, oto przykład wielojęzycznej
strony!</translation>
- <translation lang="es">¡¡Hola!, internacionalización!</translation>
- <translation lang="hy">´³ñ¢°,
ÇÝï»ñݳóÛáݳÉáõÃÛáõÝ£</translation>
- </entry>
- <entry>
- <key>Documentation link:</key>
- <translation lang="en">See i18n documentation for
details:</translation>
- <translation lang="ru">Для дополнительной
информации по i18n смотри:</translation>
- <translation lang="de">Sieh i18n Dokumentation für
Details:</translation>
- <translation lang="pl">Widzą i18n dokumentacja dla
szczegółów:</translation>
- <translation lang="es">Visto la documentación i18n para
detalles:</translation>
- <translation lang="hy">سÝñ³Ù³ë µ³ó³ïñáõÃÛ³Ý
ѳٳñ ݳÇñª</translation>
- </entry>
- <entry>
- <key>first</key>
- <translation lang="en">First</translation>
- <translation lang="ru">Первый</translation>
- <translation lang="de">Ersten</translation>
- <translation lang="pl">Pierwszy</translation>
- <translation lang="es">Primero</translation>
- <translation lang="hy">²é³çÇÝ</translation>
- </entry>
- <entry>
- <key>second</key>
- <translation lang="en">Second</translation>
- <translation lang="ru">Второй</translation>
- <translation lang="de">Zwiete</translation>
- <translation lang="pl">Drugi</translation>
- <translation lang="es">Segundo</translation>
- <translation lang="hy">ºñÏñáñ¹</translation>
- </entry>
- <entry>
- <key>third</key>
- <translation lang="en">Third</translation>
- <translation lang="ru">Третий</translation>
- <translation lang="de">Dritten</translation>
- <translation lang="pl">Trzeci</translation>
- <translation lang="es">Tercio</translation>
- <translation lang="hy">ºññáñ¹</translation>
- </entry>
- <entry>
- <key>forth</key>
- <translation lang="en">Forth</translation>
- <translation lang="ru">Четвертый</translation>
- <translation lang="de">Vierten</translation>
- <translation lang="pl">Czwarty</translation>
- <translation lang="es">En adelante</translation>
- <translation lang="hy">¼áñáñ¹</translation>
- </entry>
- <entry>
- <key>article</key>
- <translation lang="en">Article</translation>
- <translation lang="ru">Статья</translation>
- <translation lang="de">Artikel</translation>
- <translation lang="pl">Artykuł</translation>
- <translation lang="es">Artículo</translation>
- <translation lang="hy">Ðá¹í³Í</translation>
- </entry>
- <entry>
- <key>article_text1</key>
- <translation lang="en">This is a i18n paragraph.</translation>
- <translation lang="ru">Это
интернационализированный абзац.</translation>
- <translation lang="de">Es i18n den Absatz.</translation>
- <translation lang="pl">To jest paragraf w i18n.</translation>
- <translation lang="es">Esto es un párrafo i18n.</translation>
- <translation lang="hy">ê³ ÇÝï»ñݳóÛáݳÉ
å³ñ³·ñ³ý ¿£</translation>
- </entry>
- <entry>
- <key>article_text2</key>
- <translation lang="en">This is another i18n paragraph and is also a
cool one.</translation>
- <translation lang="ru">Это тоже
интернационализированный абзац и такой же
классный.</translation>
- <translation lang="de">Es auch i18n den Absatz und solcher
cool.</translation>
- <translation lang="pl">To jest następny paragraf w i18n i jest takze
fajny.</translation>
- <translation lang="es">Esto es otro párrafo i18n y es también uno
'cool'.</translation>
- <translation lang="hy">ê³ ÙÇ áõñÇß ÇÝï»ñݳóÛáݳÉ
å³ñ³·ñ³ý ¿, ¢ ÝáõÛÝ å»ë ó»Ýïñ£</translation>
- </entry>
- <entry>
- <key>copyright</key>
- <translation lang="en">Copyright © 2001 Konstantin Piroumian. No
rights are reserved.</translation>
- <translation lang="ru">Авторские права © 2001
Константин Пирумян. Ничто не защищено.</translation>
- <translation lang="de">Die Urheberrechte © 2001 Konstantin Piroumian.
Nichts ist geschützt.</translation>
- <translation lang="pl">Copyright © 2001 Konstantin Piroumian i
Krzysztof Zieliński. Żadne prawa nie są zastrzeżone:)</translation>
- <translation lang="es">Copyright © 2001 Konstantin Piroumian.
Ningunos derechos son reservados.</translation>
- <translation lang="hy">Copyright © 2001 Konstantin Piroumian.
àãÇÝã ãÇ å³Ñå³Ýí³Í£</translation>
- </entry>
- <entry>
- <key>Hello, {0}! Glad to see you!</key>
- <translation lang="en">Hello, {0}! Glad to see you!</translation>
- <translation lang="ru">Привет, {0}! Рад тебя
видеть!</translation>
- <translation lang="de">Hallo, {0}! Ist dich froh, zu
sehen!</translation>
- <translation lang="pl">Witam, {0}! Miło Cię widzieć!</translation>
- <translation lang="es">¡¡Hola!, {0}! ¡Alegre de
verle!</translation>
- <translation lang="hy">´³ñ¢¯ {0}: àõñ³Ë »Ù ù»½
ï»ëݻɣ</translation>
- </entry>
- <entry>
- <key>Kot</key>
- <translation lang="en">Tomcat</translation>
- <translation lang="ru">Кот</translation>
- <translation lang="de">Der Kater</translation>
- <translation lang="pl">Tomcat</translation>
- <translation lang="es">Gato</translation>
- <translation lang="hy">γïáõ</translation>
- </entry>
- <entry>
- <key>none</key>
- <translation lang="en">None</translation>
- <translation lang="ru">Никто</translation>
- <translation lang="de">Niemand</translation>
- <translation lang="pl">Nic</translation>
- <translation lang="es">Ninguno</translation>
- <translation lang="hy">àã áù</translation>
- </entry>
- <entry>
- <key>one</key>
- <translation lang="en">one</translation>
- <translation lang="ru">раз</translation>
- <translation lang="de">einen</translation>
- <translation lang="pl">raz</translation>
- <translation lang="es">un</translation>
- <translation lang="hy">Ù»Ï</translation>
- </entry>
- <entry>
- <key>two</key>
- <translation lang="en">two</translation>
- <translation lang="ru">два</translation>
- <translation lang="de">zwei</translation>
- <translation lang="pl">dwa</translation>
- <translation lang="es">dos</translation>
- <translation lang="hy">»ñÏáõë</translation>
- </entry>
-</translations>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<translations>
+<!--
+ Languages:
+ en - English
+ ru - Russian
+ de - German
+ pl - Polish (thanks to Krzysztof Zieliński)
+ es - Spanish
+ hy - Armenian.
+-->
+
+ <!-- Language links -->
+ <entry>
+ <key>count_title</key>
+ <translation lang="en">This page was accessed {0} times. Last at:
{1}.</translation>
+ <translation lang="ru">На эту страницу заходили
{0} раз(а). В последний раз {1}.</translation>
+ <translation lang="de">Auf diese Seite kamen {0} Des males vorbei. In
das letzte {1}.</translation>
+ <translation lang="pl">Ta strona była pobierana {0} razy. Ostatnio
{1}</translation>
+ <translation lang="es">Esta página fue tenida acceso {0} veces.
Pasado en: {1}.</translation>
+ <translation lang="hy">²Ûë ¿çÁ ³Ûó»É»É »Ý {0}
³Ý·³Ù. ì»ñçÇÝÁ {1}.</translation>
+ </entry>
+ <entry>
+ <key>a_key</key>
+ <translation lang="en">This is a key value.</translation>
+ <translation lang="ru">Это значение по
ключу.</translation>
+ <translation lang="de">Diese Bedeutung nach dem
Schlüssel.</translation>
+ <translation lang="pl">To jest klucz.</translation>
+ <translation lang="es">Esto es un valor clave.</translation>
+ <translation lang="hy">ê³ µ³Ý³ÉÇÇ ³éÅ»ùÝ
¿£</translation>
+ </entry>
+ <entry>
+ <key>lang_id1</key>
+ <translation lang="en">ru</translation>
+ <translation lang="ru">en</translation>
+ <translation lang="de">en</translation>
+ <translation lang="pl">en</translation>
+ <translation lang="es">en</translation>
+ <translation lang="hy">en</translation>
+ </entry>
+ <entry>
+ <key>lang_id2</key>
+ <translation lang="en">de</translation>
+ <translation lang="ru">de</translation>
+ <translation lang="de">ru</translation>
+ <translation lang="pl">ru</translation>
+ <translation lang="es">ru</translation>
+ <translation lang="hy">ru</translation>
+ </entry>
+ <entry>
+ <key>lang_id3</key>
+ <translation lang="en">pl</translation>
+ <translation lang="ru">pl</translation>
+ <translation lang="de">pl</translation>
+ <translation lang="pl">de</translation>
+ <translation lang="es">de</translation>
+ <translation lang="hy">de</translation>
+ </entry>
+ <entry>
+ <key>lang_id4</key>
+ <translation lang="en">es</translation>
+ <translation lang="ru">es</translation>
+ <translation lang="de">es</translation>
+ <translation lang="pl">es</translation>
+ <translation lang="es">pl</translation>
+ <translation lang="hy">pl</translation>
+ </entry>
+ <entry>
+ <key>lang_id5</key>
+ <translation lang="en">hy</translation>
+ <translation lang="ru">hy</translation>
+ <translation lang="de">hy</translation>
+ <translation lang="pl">hy</translation>
+ <translation lang="es">hy</translation>
+ <translation lang="hy">es</translation>
+ </entry>
+ <!-- current language -->
+ <entry>
+ <key>language</key>
+ <translation lang="en">English</translation>
+ <translation lang="ru">Русский</translation>
+ <translation lang="de">Deutsch</translation>
+ <translation lang="pl">Polski</translation>
+ <translation lang="es">Español</translation>
+ <translation lang="hy">гۻñ»Ý</translation>
+ </entry>
+ <entry>
+ <key>language1</key>
+ <translation lang="en">Russian</translation>
+ <translation lang="ru">Английский</translation>
+ <translation lang="de">Englische</translation>
+ <translation lang="pl">Angielski</translation>
+ <translation lang="es">Inglés</translation>
+ <translation lang="hy">²Ý·É»ñ»Ý</translation>
+ </entry>
+ <entry>
+ <key>language2</key>
+ <translation lang="en">German</translation>
+ <translation lang="ru">Немецкий</translation>
+ <translation lang="de">Russe</translation>
+ <translation lang="pl">Rosyjski</translation>
+ <translation lang="es">Ruso</translation>
+ <translation lang="hy">èáõë»ñ»Ý</translation>
+ </entry>
+ <entry>
+ <key>language3</key>
+ <translation lang="en">Polish</translation>
+ <translation lang="ru">Польский</translation>
+ <translation lang="de">Polnisch</translation>
+ <translation lang="pl">Niemiecki</translation>
+ <translation lang="es">Alemán</translation>
+ <translation lang="hy">¶»ñٳݻñ»Ý</translation>
+ </entry>
+ <entry>
+ <key>language4</key>
+ <translation lang="en">Spanish</translation>
+ <translation lang="ru">Испанский</translation>
+ <translation lang="de">Spanisch</translation>
+ <translation lang="pl">Hiszpañski</translation>
+ <translation lang="es">Polaco</translation>
+ <translation lang="hy">Ȼѻñ»Ý</translation>
+ </entry>
+ <entry>
+ <key>language5</key>
+ <translation lang="en">Armenian</translation>
+ <translation lang="ru">Армянский</translation>
+ <translation lang="de">Armenier</translation>
+ <translation lang="pl">Armeñski</translation>
+ <translation lang="es">Armenio</translation>
+ <translation lang="hy">Æëå³Ý»ñ»Ý</translation>
+ </entry>
+ <entry>
+ <key>Hello, internationalization!</key>
+ <translation lang="en">Hello, internationalization!</translation>
+ <translation lang="ru">Привет,
многоязычность!</translation>
+ <translation lang="de">Hallo, die Internationalisierung!</translation>
+ <translation lang="pl">Witam, oto przykład wielojęzycznej
strony!</translation>
+ <translation lang="es">¡¡Hola!, internacionalización!</translation>
+ <translation lang="hy">´³ñ¢°,
ÇÝï»ñݳóÛáݳÉáõÃÛáõÝ£</translation>
+ </entry>
+ <entry>
+ <key>Documentation link:</key>
+ <translation lang="en">See i18n documentation for
details:</translation>
+ <translation lang="ru">Для дополнительной
информации по i18n смотри:</translation>
+ <translation lang="de">Sieh i18n Dokumentation für
Details:</translation>
+ <translation lang="pl">Zobacz wiкcej szczegуіуw w dokumentacji
I18n:</translation>
+ <translation lang="es">Visto la documentación i18n para
detalles:</translation>
+ <translation lang="hy">³Ýñ³Ù³ë µ³ó³ïñáõÃÛ³Ý
ѳٳñ ݳÇñª</translation>
+ </entry>
+ <entry>
+ <key>first</key>
+ <translation lang="en">First</translation>
+ <translation lang="ru">Первый</translation>
+ <translation lang="de">Ersten</translation>
+ <translation lang="pl">Pierwszy</translation>
+ <translation lang="es">Primero</translation>
+ <translation lang="hy">²é³çÇÝ</translation>
+ </entry>
+ <entry>
+ <key>second</key>
+ <translation lang="en">Second</translation>
+ <translation lang="ru">Второй</translation>
+ <translation lang="de">Zwiete</translation>
+ <translation lang="pl">Drugi</translation>
+ <translation lang="es">Segundo</translation>
+ <translation lang="hy">ºñÏñáñ¹</translation>
+ </entry>
+ <entry>
+ <key>third</key>
+ <translation lang="en">Third</translation>
+ <translation lang="ru">Третий</translation>
+ <translation lang="de">Dritten</translation>
+ <translation lang="pl">Trzeci</translation>
+ <translation lang="es">Tercio</translation>
+ <translation lang="hy">ºññáñ¹</translation>
+ </entry>
+ <entry>
+ <key>forth</key>
+ <translation lang="en">Forth</translation>
+ <translation lang="ru">Четвертый</translation>
+ <translation lang="de">Vierten</translation>
+ <translation lang="pl">Czwarty</translation>
+ <translation lang="es">En adelante</translation>
+ <translation lang="hy">¼áñáñ¹</translation>
+ </entry>
+ <entry>
+ <key>article</key>
+ <translation lang="en">Article</translation>
+ <translation lang="ru">Статья</translation>
+ <translation lang="de">Artikel</translation>
+ <translation lang="pl">Artykuł</translation>
+ <translation lang="es">Artículo</translation>
+ <translation lang="hy">Ðá¹í³Í</translation>
+ </entry>
+ <entry>
+ <key>article_text1</key>
+ <translation lang="en">This is a i18n paragraph.</translation>
+ <translation lang="ru">Это
интернационализированный абзац.</translation>
+ <translation lang="de">Es i18n den Absatz.</translation>
+ <translation lang="pl">To jest paragraf w i18n.</translation>
+ <translation lang="es">Esto es un párrafo i18n.</translation>
+ <translation lang="hy">ê³ ÇÝï»ñݳóÛáݳÉ
å³ñ³·ñ³ý ¿£</translation>
+ </entry>
+ <entry>
+ <key>article_text2</key>
+ <translation lang="en">This is another i18n paragraph and is also a
cool one.</translation>
+ <translation lang="ru">Это тоже
интернационализированный абзац и такой же
классный.</translation>
+ <translation lang="de">Es auch i18n den Absatz und solcher
cool.</translation>
+ <translation lang="pl">To jest następny paragraf w i18n i jest takze
fajny.</translation>
+ <translation lang="es">Esto es otro párrafo i18n y es también uno
'cool'.</translation>
+ <translation lang="hy">ê³ ÙÇ áõñÇß ÇÝï»ñݳóÛáݳÉ
å³ñ³·ñ³ý ¿, ¢ ÝáõÛÝ å»ë ó»Ýïñ£</translation>
+ </entry>
+ <entry>
+ <key>copyright</key>
+ <translation lang="en">Copyright © 2001 Konstantin Piroumian. No
rights are reserved.</translation>
+ <translation lang="ru">Авторские права © 2001
Константин Пирумян. Ничто не защищено.</translation>
+ <translation lang="de">Die Urheberrechte © 2001 Konstantin Piroumian.
Nichts ist geschützt.</translation>
+ <translation lang="pl">Copyright © 2001 Konstantin Piroumian i
Krzysztof Zieliński. Żadne prawa nie są zastrzeżone:)</translation>
+ <translation lang="es">Copyright © 2001 Konstantin Piroumian.
Ningunos derechos son reservados.</translation>
+ <translation lang="hy">Copyright © 2001 Konstantin Piroumian.
àãÇÝã ãÇ å³Ñå³Ýí³Í£</translation>
+ </entry>
+ <entry>
+ <key>Hello, {0}! Glad to see you!</key>
+ <translation lang="en">Hello, {0}! Glad to see you!</translation>
+ <translation lang="ru">Привет, {0}! Рад тебя
видеть!</translation>
+ <translation lang="de">Hallo, {0}! Ist dich froh, zu
sehen!</translation>
+ <translation lang="pl">Witam, {0}! Miło Cię widzieć!</translation>
+ <translation lang="es">¡¡Hola!, {0}! ¡Alegre de
verle!</translation>
+ <translation lang="hy">´³ñ¢¯ {0}: àõñ³Ë »Ù ù»½
ï»ëݻɣ</translation>
+ </entry>
+ <entry>
+ <key>Kot</key>
+ <translation lang="en">Tomcat</translation>
+ <translation lang="ru">Кот</translation>
+ <translation lang="de">Der Kater</translation>
+ <translation lang="pl">Tomcat</translation>
+ <translation lang="es">Gato</translation>
+ <translation lang="hy">γïáõ</translation>
+ </entry>
+ <entry>
+ <key>none</key>
+ <translation lang="en">None</translation>
+ <translation lang="ru">Никто</translation>
+ <translation lang="de">Niemand</translation>
+ <translation lang="pl">Nic</translation>
+ <translation lang="es">Ninguno</translation>
+ <translation lang="hy">àã áù</translation>
+ </entry>
+ <entry>
+ <key>one</key>
+ <translation lang="en">one</translation>
+ <translation lang="ru">раз</translation>
+ <translation lang="de">einen</translation>
+ <translation lang="pl">raz</translation>
+ <translation lang="es">un</translation>
+ <translation lang="hy">Ù»Ï</translation>
+ </entry>
+ <entry>
+ <key>two</key>
+ <translation lang="en">two</translation>
+ <translation lang="ru">два</translation>
+ <translation lang="de">zwei</translation>
+ <translation lang="pl">dwa</translation>
+ <translation lang="es">dos</translation>
+ <translation lang="hy">»ñÏáõë</translation>
+ </entry>
+</translations>
+
1.3 +15 -6 xml-cocoon2/xdocs/i18n.xml
Index: i18n.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/xdocs/i18n.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- i18n.xml 2001/05/23 12:32:22 1.2
+++ i18n.xml 2001/06/01 16:15:03 1.3
@@ -92,7 +92,7 @@
]]></code>
</note>
</s2>
- <s2 title="Translation with param susbtitution">
+ <s2 title="Translation with param substitution">
<p>
To translate the text with param substitution the
<code><![CDATA[<i18n:translate>]]></code> tag must be used.
We can specify some
<code><![CDATA[<i18n:param>]]></code>-tags which contain
@@ -176,7 +176,7 @@
</translations>]]></source>
<p>
For each text, we want to translate, we must
provide a key, where
- the key is either text as we've wrote it in
the document or the value
+ the key is either text as we have written it
in the document or the value
of the 'i18n:key' attribute. The key must be
written exactly like in
the document, including spaces, linefeeds, etc.
</p>
@@ -271,15 +271,24 @@
<li>Dictionary import and include capabilities
(like in XSLT)</li>
<li>Command line dictionary-from-source
generation</li>
<li>Dictionary caching</li>
+ <li>Date translation:
+ <code><![CDATA[
+<i18n:date src-pattern="dd/MM/yyyy" pattern="dd:MMM:yyyy" value="01/01/2001"/>
+ ]]></code>
+ - <code>'src-pattern'</code> will be used to
parse the <code>'value'</code>, then the date will be formatted according to the
current lang (Locale) using the <code>'pattern'</code> format.
+ </li>
+ <li>Number localized formatting
+ <code><![CDATA[
+<i18n:decimal pattern="0.##" value="2.0" />
+ ]]></code>
+ - this will be useful for Arabic,
Indian, etc. number formatting.
+ </li>
</ul>
- <p>
- Some other features will be considered for
implementation, like: date, currency, floating point numer formats i18n.
- </p>
</s2>
<s2 title="Contacts">
<p>
Feel free to contact for any comments and
improvement ideas either directly <link
href="mailto:[EMAIL PROTECTED]">Konstantin Piroumian</link>
- or through the <link
href="mail-lists.html">Cocoon Mail List</link>.
+ or through the <link
href="/cocoon/mail-lists.html">Cocoon Mail List</link>.
</p>
</s2>
</s1>
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]