You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2018/11/09 10:16:18 UTC

svn commit: r1846226 - in /tomcat/trunk/java/org/apache/tomcat/buildutil/translate: ./ Constants.java Export.java

Author: markt
Date: Fri Nov  9 10:16:18 2018
New Revision: 1846226

URL: http://svn.apache.org/viewvc?rev=1846226&view=rev
Log:
Add the code I've been using to export translations to a single file per language. Plenty of scope for improvement.

Added:
    tomcat/trunk/java/org/apache/tomcat/buildutil/translate/
    tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Constants.java   (with props)
    tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Export.java   (with props)

Added: tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Constants.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Constants.java?rev=1846226&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Constants.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Constants.java Fri Nov  9 10:16:18 2018
@@ -0,0 +1,27 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.tomcat.buildutil.translate;
+
+public class Constants {
+
+    public static final String L10N_PREFIX = "LocalStrings";
+    public static final String L10N_SUFFIX = ".properties";
+
+    public static final String[] SEARCH_DIRS = new String[] { "java", "webapps" };
+
+    public static final String END_PACKAGE_MARKER = ".zzz.";
+}

Propchange: tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Constants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Export.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Export.java?rev=1846226&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Export.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Export.java Fri Nov  9 10:16:18 2018
@@ -0,0 +1,162 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.tomcat.buildutil.translate;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.regex.Pattern;
+
+/**
+ * Generates a single properties file per language for import into a translation
+ * tool.
+ */
+public class Export {
+
+    private static final Map<String,Properties> translations = new HashMap<>();
+    private static final Pattern ADD_CONTINUATION = Pattern.compile("\\n", Pattern.MULTILINE);
+    private static final Pattern ESCAPE_LEADING_SPACE = Pattern.compile("^(\\s)", Pattern.MULTILINE);
+
+    public static void main(String... args) {
+        for (String dir : Constants.SEARCH_DIRS) {
+            processRoot(dir);
+        }
+
+        outputTranslations();
+    }
+
+
+    private static void processRoot(String dir) {
+        // Run from within IDE so working dir is root of project.
+        File root = new File(dir);
+
+        // Assumes no l18n files directly in roots
+        for (File f : root.listFiles()) {
+            if (f.isDirectory()) {
+                processDirectory(f);
+            }
+        }
+    }
+
+
+    private static void processDirectory(File dir) {
+        for (File f : dir.listFiles()) {
+            if (f.isDirectory()) {
+                processDirectory(f);
+            } else if (f.isFile()) {
+                processFile(f);
+            }
+        }
+    }
+
+
+    private static void processFile(File f) {
+        String name = f.getName();
+
+        // non-l10n files
+        if (!name.startsWith(Constants.L10N_PREFIX)) {
+            return;
+        }
+
+        // Determine language
+        String language = name.substring(Constants.L10N_PREFIX.length(), name.length() - Constants.L10N_SUFFIX.length());
+        if (language.length() == 0) {
+            // Default
+        } else if (language.length() == 3) {
+            language = language.substring(1);
+        }
+
+        String keyPrefix = getKeyPrefix(f);
+
+        Properties props = new Properties();
+
+        try (FileInputStream fis = new FileInputStream(f);
+                Reader r = new InputStreamReader(fis, StandardCharsets.UTF_8)) {
+            props.load(r);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        // Create a Map for the language if one does not exist.
+        Properties translation = translations.get(language);
+        if (translation == null) {
+            translation = new Properties();
+            translations.put(language, translation);
+        }
+
+        // Add the properties from this file to the combined file, prefixing the
+        // key with the package name to ensure uniqueness.
+        for (Object obj : props.keySet()) {
+            String key = (String) obj;
+            String value = props.getProperty(key);
+
+            translation.put(keyPrefix + key, value);
+        }
+    }
+
+
+    private static String getKeyPrefix(File f) {
+        File wd = new File(".");
+        String prefix = f.getParentFile().getAbsolutePath();
+        prefix = prefix.substring(wd.getAbsolutePath().length() - 1);
+        prefix = prefix.replace(File.separatorChar, '.');
+        prefix = prefix + Constants.END_PACKAGE_MARKER;
+        return prefix;
+    }
+
+
+    private static void outputTranslations() {
+        for (Map.Entry<String,Properties> translationEntry : translations.entrySet()) {
+            Properties translation = translationEntry.getValue();
+
+            String language = translationEntry.getKey();
+            if (language.length() > 0) {
+                language = "_" + language;
+            }
+
+            File out = new File(Constants.L10N_PREFIX + language + Constants.L10N_SUFFIX);
+            try (FileOutputStream fos = new FileOutputStream(out);
+                    Writer w = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
+                for (Object key : translation.keySet()) {
+                    w.write(key + "=" + formatValue(translation.getProperty((String) key)) + "\n");
+                }
+            } catch (IOException ioe) {
+                ioe.printStackTrace();
+            }
+        }
+    }
+
+
+    private static String formatValue(String in) {
+        String result = ADD_CONTINUATION.matcher(in).replaceAll("\\\\n\\\\\n");
+        if (result.endsWith("\\\n")) {
+            result = result.substring(0, result.length() - 2);
+        }
+        result = ESCAPE_LEADING_SPACE.matcher(result).replaceAll("\\\\$1");
+        return result;
+    }
+}
+

Propchange: tomcat/trunk/java/org/apache/tomcat/buildutil/translate/Export.java
------------------------------------------------------------------------------
    svn:eol-style = native



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org