/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * Free SoftwareFoundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.util; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; /** * Localization */ public class L10N { private static Logger _log; private static HashMap<String,HashMap<String,String>> l10nMap = new HashMap<String,HashMap<String,String>>(); HashMap<String,String> messages; public L10N(Class cl) { String name = cl.getName().replace('.', '/'); int p = name.lastIndexOf('/'); if (p > 0) init(name.substring(0, p) + "/messages"); else init("/messages"); } /* public L10N(String path) { init(path); } */ private void init(String path) { if (! path.startsWith("/")) path = "/" + path; messages = l10nMap.get(path); /* XXX InputStream is = null; Locale locale = Locale.getDefault(); */ try { /* XXX String language = locale.getLanguage(); */ /* XXX: punt for now String xmlName = path + "_" + language + ".xml"; is = getClass().getResourceAsStream(xmlName); if (is != null) { RegistryNode registry = null; try { ReadStream rs = Vfs.openRead(is); Registry root = Registry.parse(rs); registry = root.getTop(); rs.close(); } finally { is.close(); } messages = new HashMap<String,String>(); l10nMap.put(path, messages); RegistryNode localization = registry.lookup("localization"); Iterator iter = localization.select("message"); while (iter.hasNext()) { RegistryNode msg = (RegistryNode) iter.next(); String key = msg.getString("key", null); String value = msg.getString("value", null); if (key != null && value != null) messages.put(key, value); } } */ } catch (Exception e) { log().log(Level.FINE, e.toString(), e); } } public String l(String msg) { msg = getTranslated(msg); return msg; } public String l(String msg, long l) { return l(msg, String.valueOf(l)); } public String l(String msg, Object o) { msg = getTranslated(msg); CharBuffer cb = CharBuffer.allocate(); int length = msg.length(); int i = 0; while (i < length) { char ch = msg.charAt(i); if (ch != '{' || i + 2 >= length) { cb.append(ch); i++; } else { ch = msg.charAt(i + 1); if (ch == '{') { cb.append('{'); i += 2; } else if (msg.charAt(i + 2) != '}') { cb.append('{'); i++; } else if (ch == '0') { cb.append(o); i += 3; } else { cb.append('{'); i++; } } } return cb.close(); } public String l(String msg, Object o1, Object o2) { msg = getTranslated(msg); CharBuffer cb = CharBuffer.allocate(); int length = msg.length(); int i = 0; while (i < length) { char ch = msg.charAt(i); if (ch != '{' || i + 2 >= length) { cb.append(ch); i++; } else { ch = msg.charAt(i + 1); if (ch == '{') { cb.append('{'); i += 2; } else if (msg.charAt(i + 2) != '}') { cb.append('{'); i++; } else if (ch == '0') { cb.append(o1); i += 3; } else if (ch == '1') { cb.append(o2); i += 3; } else { cb.append('{'); i++; } } } return cb.close(); } public String l(String msg, Object o1, int i2) { return l(msg, o1, String.valueOf(i2)); } public String l(String msg, int i1, int i2) { return l(msg, String.valueOf(i1), String.valueOf(i2)); } public String l(String msg, Object o1, Object o2, Object o3) { msg = getTranslated(msg); CharBuffer cb = CharBuffer.allocate(); int length = msg.length(); int i = 0; while (i < length) { char ch = msg.charAt(i); if (ch != '{' || i + 2 >= length) { cb.append(ch); i++; } else { ch = msg.charAt(i + 1); if (ch == '{') { cb.append('{'); i += 2; } else if (msg.charAt(i + 2) != '}') { cb.append('{'); i++; } else if (ch == '0') { cb.append(o1); i += 3; } else if (ch == '1') { cb.append(o2); i += 3; } else if (ch == '2') { cb.append(o3); i += 3; } else { cb.append('{'); i++; } } } return cb.close(); } public String l(String msg, Object o1, Object o2, Object o3, Object o4) { msg = getTranslated(msg); CharBuffer cb = CharBuffer.allocate(); int length = msg.length(); int i = 0; while (i < length) { char ch = msg.charAt(i); if (ch != '{' || i + 2 >= length) { cb.append(ch); i++; } else { ch = msg.charAt(i + 1); if (ch == '{') { cb.append('{'); i += 2; } else if (msg.charAt(i + 2) != '}') { cb.append('{'); i++; } else if (ch == '0') { cb.append(o1); i += 3; } else if (ch == '1') { cb.append(o2); i += 3; } else if (ch == '2') { cb.append(o3); i += 3; } else if (ch == '3') { cb.append(o4); i += 3; } else { cb.append('{'); i++; } } } return cb.close(); } public String l(String msg, Object o1, Object o2, Object o3, Object o4, Object o5) { msg = getTranslated(msg); CharBuffer cb = CharBuffer.allocate(); int length = msg.length(); int i = 0; while (i < length) { char ch = msg.charAt(i); if (ch != '{' || i + 2 >= length) { cb.append(ch); i++; } else { ch = msg.charAt(i + 1); if (ch == '{') { cb.append('{'); i += 2; } else if (msg.charAt(i + 2) != '}') { cb.append('{'); i++; } else if (ch == '0') { cb.append(o1); i += 3; } else if (ch == '1') { cb.append(o2); i += 3; } else if (ch == '2') { cb.append(o3); i += 3; } else if (ch == '3') { cb.append(o4); i += 3; } else if (ch == '4') { cb.append(o5); i += 3; } else { cb.append('{'); i++; } } } return cb.close(); } public String l(String msg, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6) { msg = getTranslated(msg); CharBuffer cb = CharBuffer.allocate(); int length = msg.length(); int i = 0; while (i < length) { char ch = msg.charAt(i); if (ch != '{' || i + 2 >= length) { cb.append(ch); i++; } else { ch = msg.charAt(i + 1); if (ch == '{') { cb.append('{'); i += 2; } else if (msg.charAt(i + 2) != '}') { cb.append('{'); i++; } else if (ch == '0') { cb.append(o1); i += 3; } else if (ch == '1') { cb.append(o2); i += 3; } else if (ch == '2') { cb.append(o3); i += 3; } else if (ch == '3') { cb.append(o4); i += 3; } else if (ch == '4') { cb.append(o5); i += 3; } else if (ch == '5') { cb.append(o6); i += 3; } else { cb.append('{'); i++; } } } return cb.close(); } private String getTranslated(String msg) { if (messages == null) return msg; String translated = (String) messages.get(msg); if (translated == null) { return msg; } else return translated; } private Logger log() { if (_log == null) _log = Log.open(L10N.class); return _log; } }