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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org