You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by gi...@apache.org on 2001/01/09 00:24:11 UTC
cvs commit: xml-cocoon/src/org/apache/cocoon/transformation I18nTransformer.java
giacomo 01/01/08 15:24:10
Modified: src/org/apache/cocoon/transformation Tag: xml-cocoon2
I18nTransformer.java
Log:
Enhanced by Victors Rotanovs. Styled to conform to Apache Coding Conventions
Revision Changes Path
No revision
No revision
1.1.2.2 +299 -253 xml-cocoon/src/org/apache/cocoon/transformation/Attic/I18nTransformer.java
Index: I18nTransformer.java
===================================================================
RCS file: /home/cvs/xml-cocoon/src/org/apache/cocoon/transformation/Attic/I18nTransformer.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- I18nTransformer.java 2000/12/13 13:53:34 1.1.2.1
+++ I18nTransformer.java 2001/01/08 23:24:05 1.1.2.2
@@ -1,271 +1,317 @@
-/*****************************************************************************
+/**
+ ****************************************************************************
* Copyright (C) The Apache Software Foundation. All rights reserved. *
* ------------------------------------------------------------------------- *
* This software is published under the terms of the Apache Software License *
* version 1.1, a copy of which has been included with this distribution in *
* the LICENSE file. *
- *****************************************************************************/
+ ****************************************************************************
+ */
package org.apache.cocoon.transformation;
import org.apache.cocoon.Roles;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.parser.Parser;
-
-import javax.servlet.http.*;
-import org.apache.avalon.*;
-import org.w3c.dom.*;
-import org.xml.sax.helpers.*;
-import java.io.*;
-import java.util.*;
-import org.apache.cocoon.transformation.*;
-import org.xml.sax.*;
-import java.net.*;
-
-import org.apache.cocoon.acting.LangSelect;
-
-/**
-* I18nTransformer. Cocoon2 port of Infozone groups I18nProcessor.
-*
-* Sitemap configuration:
-*
-* <map:transformer
-* name="translate"
-* src="org.apache.cocoon.transformation.I18nTransformer"/>
-*
-*
-* <map:match pattern="file">
-* <map:generate src="file.xml"/>
-* <map:transform type="translate">
-* <parameter name="default_lang" value="fi"/>
-* <parameter name="available_lang_1" value="fi"/>
-* <parameter name="available_lang_2" value="en"/>
-* <parameter name="available_lang_3" value="sv"/>
-* <parameter name="src"
-* value="translations/file_trans.xml"/>
-* </map:transform>
-*
-*
-* When user requests .../file?lang=fi
-* transformer substitutes text surrounded <i:tr> or <some-elem i:tr="y"> with
-* translations from file_trans.xml.
-*
-* file.xml:
-* <root xmlns:i="http://apache.org/cocoon/i18n">
-* <elem i:tr="y">Translate me</elem>
-* <elem><i:tr>Translate me</i:tr></elem>
-* </root>
-*
-* file_trans.xml:
-* <translations>
-* <entry><key>Translate me</key>
-* <translation lang="sv">�vers�tta mej</translation>
-* <translation lang="fi">K��nn� minut</translation>
-* </entry>
-* </translations>
-*
-*It also provides path substitution to images that has to be translated:
-*
-*<elem><i:image>image.jpg</i:image></elem>
-*
-* is substituted to be according to language
-*
-*<elem>en/image.jpg</elem>,<elem>fi/image.jpg</elem>,etc
-*
-*
-*TODO -Caching dictionaries in memory.
-* -Implementing Infozone group I18nProcessors param substitutions
-* where you can enter params in the translated text.
-*
-*
-* @author <a href="mailto:lassi.immonen@valkeus.com">Lassi Immonen</a>
-*/
-public class I18nTransformer extends AbstractTransformer implements Composer {
-
- protected ComponentManager manager = null;
- public Map dictionary = null;
+import org.apache.avalon.ComponentManager;
+import org.apache.avalon.Composer;
+import org.apache.avalon.Parameters;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+import org.xml.sax.helpers.DefaultHandler;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Map;
+import java.util.Hashtable;
- public static final String I18N_NAMESPACE_URI = "http://apache.org/cocoon/i18n";
- public static final String I18N_ELEMENT = "i18n";
+import java.net.URL;
+import java.net.MalformedURLException;
- public static final String I18N_ELEMENT_KEY_ATTRIBUTE = "key";
- public static final String I18N_ENTRY_ELEMENT = "entry";
- public static final String I18N_TRANSLATION_ELEMENT = "translation";
- public static final String I18N_LANG = "lang";
- public static final String I18N_KEY_ELEMENT = "key";
- public static final String I18N_TR_ATTRIBUTE = "tr";
- public static final String I18N_TR_ELEMENT = "tr";
- public static final String I18N_IMAGE_ELEMENT = "image";
-
- protected boolean translate_image = false;
- protected boolean translate = false;
- protected String lang = null;
+import org.apache.cocoon.acting.LangSelect;
-/**
-* 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(
- EntityResolver resolver,
- Map objectModel,
- String source,
- Parameters parameters)
- throws ProcessingException, SAXException, IOException {
-
- lang = (String)objectModel.get("lang");
- if (lang == null) {
- lang = LangSelect.getLang(objectModel,parameters);
- }
-
- String translations_file = parameters.getParameter("src", null);
-
- URL tr = new URL(resolver.resolveEntity(null, translations_file).getSystemId());
- initialiseDictionary(tr);
- }
-
- public void compose(ComponentManager manager) {
- this.manager = manager;
- }
-
- public void startElement(String uri, String name, String raw, Attributes attr)
- throws SAXException {
-
- if (attr.getValue(I18N_NAMESPACE_URI, I18N_TR_ATTRIBUTE) != null) {
- translate = true;
- }
- if (uri.equals(I18N_NAMESPACE_URI) && name.equals(I18N_TR_ELEMENT)) {
- translate = true;
- }
- if(uri.equals(I18N_NAMESPACE_URI) && name.equals(I18N_IMAGE_ELEMENT)) {
- translate_image = true;
- return;
- }
- super.startElement(uri, name, raw, attr);
- }
-
- public void endElement(String uri, String name, String raw)
- throws SAXException {
- if (translate)
- translate = false;
- if (translate_image) {
- translate_image = false;
- return;
- }
-
- super.endElement(uri, name, raw);
- }
-
- /**
- *Gets translations from xml file to dictionary.
- */
- class I18nContentHandler extends DefaultHandler {
- boolean in_entry = false;
- boolean in_key = false;
- boolean in_translation = false;
-
- String key = null;
- String translation = null;
-
- public void startElement(
- String namespace,
- String name,
- String raw,
- Attributes attr)
- throws SAXException {
-
- if (name.equals(I18N_ENTRY_ELEMENT)) {
- in_entry = true;
- } else if (in_entry) {
- if (name.equals(I18N_KEY_ELEMENT)) {
- in_key = true;
- } else if (
- name.equals(I18N_TRANSLATION_ELEMENT)
- && attr.getValue(I18N_LANG).equals(lang)) {
- in_translation = true;
- }
- }
- }
-
- public void endElement(String namespace, String name, String raw)
- throws SAXException {
-
- if (name.equals(I18N_ENTRY_ELEMENT)) {
- if (key != null && translation != null) {
- dictionary.put(key, translation);
- key = null;
- translation = null;
- }
- in_entry = false;
- } else if (name.equals(I18N_KEY_ELEMENT)) {
- in_key = false;
- } else if (name.equals(I18N_TRANSLATION_ELEMENT)) {
- in_translation = false;
- }
-
- }
-
- public void characters(char ary[], int start, int length) throws SAXException {
- if (in_key) {
- key = new String(ary, start, length);
-
- } else if (in_translation) {
- translation = new String(ary, start, length);
- }
- }
-
- }
-
-public void characters(char ch[], int start, int len) throws SAXException {
- if (translate) {
-
- String text2translate = new String(ch, start, len);
- String result = (String) dictionary.get(text2translate);
- if (result != null) {
- super.contentHandler.characters(result.toCharArray(), 0, result.length());
- return;
- }
- }
- if (translate_image) {
- String image_name = new String(ch, start, len);
- String result = lang + "/" + image_name;
- super.contentHandler.characters(result.toCharArray(), 0, result.length());
- return;
- }
- super.characters(ch, start, len);
-}
/**
-*Loads translations from given URL
-*/
-private void initialiseDictionary(URL url)
- throws SAXException, MalformedURLException, IOException {
-
- Object object = url.getContent();
- Parser parser=null;
- try {
- parser = (Parser) manager.lookup(Roles.PARSER);
-
- } catch (Exception e) {
- log.error("Could not find component", e);
- return;
- }
- InputSource input;
- if (object instanceof Reader) {
- input = new InputSource((Reader) object);
- } else if (object instanceof InputStream) {
- input = new InputSource((InputStream) object);
- } else {
- throw new SAXException("Unknown object type: " + object);
- }
-
- // How this could be cached?
- dictionary = new Hashtable();
- I18nContentHandler i18n_handler = new I18nContentHandler();
- parser.setContentHandler(i18n_handler);
- parser.parse(input);
-
- }
+ * I18nTransformer. Cocoon2 port of Infozone groups I18nProcessor.
+ *
+ * Sitemap configuration:
+ *
+ * <map:transformer
+ * name="translate"
+ * src="org.apache.cocoon.transformation.I18nTransformer"/>
+ *
+ *
+ * <map:match pattern="file">
+ * <map:generate src="file.xml"/>
+ * <map:transform type="translate">
+ * <parameter name="default_lang" value="fi"/>
+ * <parameter name="available_lang_1" value="fi"/>
+ * <parameter name="available_lang_2" value="en"/>
+ * <parameter name="available_lang_3" value="sv"/>
+ * <parameter name="src"
+ * value="translations/file_trans.xml"/>
+ * </map:transform>
+ *
+ *
+ * When user requests .../file?lang=fi
+ * transformer substitutes text surrounded <i:tr> or <some-elem i:tr="y"> with
+ * translations from file_trans.xml.
+ *
+ * file.xml:
+ * <root xmlns:i="http://apache.org/cocoon/i18n">
+ * <elem i:tr="y">Translate me</elem>
+ * <elem><i:tr>Translate me</i:tr></elem>
+ * </root>
+ *
+ * file_trans.xml:
+ * <translations>
+ * <entry><key>Translate me</key>
+ * <translation lang="sv">�vers�tta mej</translation>
+ * <translation lang="fi">K��nn� minut</translation>
+ * </entry>
+ * </translations>
+ *
+ *It also provides path substitution to images that has to be translated:
+ *
+ *<elem><i:image>image.jpg</i:image></elem>
+ *
+ * is substituted to be according to language
+ *
+ *<elem>en/image.jpg</elem>,<elem>fi/image.jpg</elem>,etc
+ *
+ *
+ *TODO -Caching dictionaries in memory.
+ * -Implementing Infozone group I18nProcessors param substitutions
+ * where you can enter params in the translated text.
+ *
+ *
+ * @author <a href="mailto:lassi.immonen@valkeus.com">Lassi Immonen</a>
+ */
+public class I18nTransformer extends AbstractTransformer implements Composer {
+
+ protected ComponentManager manager;
+
+ public Map dictionary;
+
+ //apache.org/cocoon/i18n";
+ public final static String I18N_NAMESPACE_URI =
+ "http://apache.org/cocoon/i18n";
+ public final static String I18N_ELEMENT = "i18n";
+
+ public final static String I18N_ELEMENT_KEY_ATTRIBUTE = "key";
+ public final static String I18N_ENTRY_ELEMENT = "entry";
+ public final static String I18N_TRANSLATION_ELEMENT = "translation";
+ public final static String I18N_LANG = "lang";
+ public final static String I18N_KEY_ELEMENT = "key";
+ public final static String I18N_TR_ATTRIBUTE = "tr";
+ public final static String I18N_TR_ELEMENT = "tr";
+ public final static String I18N_IMAGE_ELEMENT = "image";
+
+ protected boolean translate_image = false;
+ protected boolean translate = false;
+ protected boolean is_element = false;
+ protected String lang;
+
+
+ /**
+ * 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(EntityResolver resolver, Map objectModel, String source,
+ Parameters parameters)
+ throws ProcessingException, SAXException, IOException {
+
+ lang = (String)(objectModel.get("lang"));
+ if (lang == null) {
+ lang = LangSelect.getLang(objectModel, parameters);
+ }
+
+ String translations_file = parameters.getParameter("src", null);
+
+ URL tr =
+ new URL(resolver.resolveEntity(null,
+ translations_file).getSystemId());
+ initialiseDictionary(tr);
+ }
+
+
+ public void compose(ComponentManager manager) {
+ this.manager = manager;
+ }
+
+
+ public void startElement(String uri, String name, String raw,
+ Attributes attr) throws SAXException {
+
+ if (I18N_NAMESPACE_URI.equals(uri) && I18N_TR_ELEMENT.equals(name)) {
+ translate = true;
+ is_element = true;
+ return;
+ }
+ if (I18N_NAMESPACE_URI.equals(uri) && I18N_IMAGE_ELEMENT.equals(name)) {
+ translate_image = true;
+ is_element = true;
+ return;
+ }
+ if (attr != null) {
+ AttributesImpl temp_attr = new AttributesImpl(attr);
+ int attr_index =
+ temp_attr.getIndex(I18N_NAMESPACE_URI, I18N_TR_ATTRIBUTE);
+ if (attr_index != -1) {
+ translate = true;
+ temp_attr.removeAttribute(attr_index);
+ super.startElement(uri, name, raw, temp_attr);
+ return;
+ }
+ }
+ super.startElement(uri, name, raw, attr);
+ }
+
+
+ public void endElement(String uri, String name, String raw)
+ throws SAXException {
+ if (translate) {
+ translate = false;
+ }
+ if (translate_image) {
+ translate_image = false;
+ }
+ if (is_element) {
+ is_element = false;
+ return;
+ }
+
+ super.endElement(uri, name, raw);
+ }
+
+
+
+ /**
+ *Gets translations from xml file to dictionary.
+ */
+ class I18nContentHandler extends DefaultHandler {
+ boolean in_entry = false;
+ boolean in_key = false;
+ boolean in_translation = false;
+
+ String key = null;
+ String translation = null;
+
+
+ public void startElement(String namespace, String name, String raw,
+ Attributes attr) throws SAXException {
+
+ if (name.equals(I18N_ENTRY_ELEMENT)) {
+ in_entry = true;
+ } else {
+ if (in_entry) {
+ if (name.equals(I18N_KEY_ELEMENT)) {
+ in_key = true;
+ } else {
+ if (name.equals(I18N_TRANSLATION_ELEMENT)
+ && attr.getValue(I18N_LANG).equals(lang)) {
+ in_translation = true;
+ }
+ }
+ }
+ }
+ }
+
+
+ public void endElement(String namespace, String name, String raw)
+ throws SAXException {
+
+ if (name.equals(I18N_ENTRY_ELEMENT)) {
+ if (key != null && translation != null) {
+ dictionary.put(key, translation);
+ key = null;
+ translation = null;
+ }
+ in_entry = false;
+ } else if (name.equals(I18N_KEY_ELEMENT)) {
+ in_key = false;
+ } else {
+ if (name.equals(I18N_TRANSLATION_ELEMENT)) {
+ in_translation = false;
+ }
+ }
+
+ }
+
+
+ public void characters(char[] ary, int start, int length)
+ throws SAXException {
+ if (in_key) {
+ key = new String(ary, start, length);
+
+ } else {
+ if (in_translation) {
+ translation = new String(ary, start, length);
+ }
+ }
+ }
+
+ }
+
+
+ public void characters(char[] ch, int start, int len) throws SAXException {
+ if (translate) {
+
+ String text2translate = new String(ch, start, len);
+ String result = (String)(dictionary.get(text2translate));
+ if (result != null) {
+ super.contentHandler.characters(result.toCharArray(), 0, result.length());
+ return;
+ }
+ }
+ if (translate_image) {
+ String image_name = new String(ch, start, len);
+ String result = lang + "/" + image_name;
+ super.contentHandler.characters(result.toCharArray(), 0, result.length());
+ return;
+ }
+ super.characters(ch, start, len);
+
+ }
+
+
+ /**
+ *Loads translations from given URL
+ */
+ private void initialiseDictionary(URL url)
+ throws SAXException, MalformedURLException, IOException {
+
+ Object object = url.getContent();
+ Parser parser = null;
+ try {
+ parser = (Parser)(manager.lookup(Roles.PARSER));
+
+ } catch (Exception e) {
+ log.error("Could not find component", e);
+ return;
+ }
+ InputSource input;
+ if (object instanceof Reader) {
+ input = new InputSource((Reader)(object));
+ } else if (object instanceof InputStream) {
+ input = new InputSource((InputStream)(object));
+ } else {
+ throw new SAXException("Unknown object type: " + object);
+ }
+
+ // How this could be cached?
+ dictionary = new Hashtable();
+ I18nContentHandler i18n_handler = new I18nContentHandler();
+ parser.setContentHandler(i18n_handler);
+ parser.parse(input);
+
+ }
}