/** * Licensed to The Apereo Foundation under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * * The Apereo Foundation licenses this file to you under the Educational * Community 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://opensource.org/licenses/ecl2.txt * * 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.opencastproject.adminui.util; import org.opencastproject.adminui.exception.IllegalLanguageFilenameException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import java.util.Locale; /** * A utility class which provides methods related to translation files, it * operates on its {@link #LANGUAGE_PATTERN}. * * @author ademasi * */ public final class LanguageFileUtil { private LanguageFileUtil() { // No default constructor for utility class. } /** * The convention used when naming translated json files. */ public static final String LANGUAGE_PATTERN = "^lang-(([a-z])+[_[A-Z]+]?).*.json$"; private static final Logger logger = LoggerFactory .getLogger(LanguageFileUtil.class); /** * Executes {@link #stripLanguageFromFilename(String)} on each of the * provided <code>filenames</code>. * * @param filenames * @return */ public static List<String> extractLanguagenamesFromFilenames( List<String> filenames) { List<String> result = new ArrayList<String>(); for (String filename : filenames) { try { result.add(stripLanguageFromFilename(filename)); } catch (IllegalLanguageFilenameException e) { logger.warn( "There is an illegal language filename lurking around. Excluding it from the available languages list.", e); } } return result; } /** * Finds the language substring in a translation file (e.g. lang-de_DE.json * will result in de_DE). Is gracefule for non-language-file strings, such * as de or de_DE. * * @param filename * a language code according to the patterns lang-xy_AB.json, * yy_XX, yy-QQ, yy. * @return The language substring, e.g. de_DE. * @throws IllegalLanguageFilenameException * if none of the compliant patterns are met by filename */ public static String stripLanguageFromFilename(String filename) throws IllegalLanguageFilenameException { String result = null; if (filename.matches("[a-z]{1,2}")) { result = filename; } else if (filename.matches(LANGUAGE_PATTERN)) { result = filename.replaceAll("lang-", "").replaceAll(".json", ""); } else if (filename.matches(CompositeLanguageCodeParser.COMPOSITE_LANGUAGE_NAME) && filename.length() < 4) { result = filename; } if (result != null) { return result; } throw new IllegalLanguageFilenameException( String.format("The filename %s does not comply with the expected pattern lang-xy_AB.json", filename)); } public static String safelyStripLanguageFromFilename(String filename) { try { return stripLanguageFromFilename(filename); } catch (IllegalLanguageFilenameException e) { logger.warn("Could not strip the language name from the filename {}. This indicates that the filename on the " + "server is not compliant with the naming convention.", filename, e); return filename; } } /** * Finds the part before the - or _ of a composited language code like de_DE * (as it is returned by {@link #stripLanguageFromFilename(String)} or * {@link #safelyStripLanguageFromFilename(String)}. If the languageCode is * not composited, it will be returned as is. * * @param languageCode * @return The ISO part of a composited language code, if not composited, * the languageCode. */ public static String getIsoLanguagePart(String languageCode) { CompositeLanguageCodeParser parser = new CompositeLanguageCodeParser( languageCode); if (parser.isComposite()) { return parser.getSimpleLanguage(); } else { return languageCode; } } /** * Returns the displayName from the Locale that belongs to the language * code. * * @param languageCode * @return */ public static String getDisplayLanguageFromLanguageCode(String languageCode) { CompositeLanguageCodeParser parser = new CompositeLanguageCodeParser(languageCode); Locale locale = parser.isComposite() ? new Locale(parser.getSimpleLanguage()) : new Locale(languageCode); String displayLanguage = locale.getDisplayLanguage(locale); return Character.toUpperCase(displayLanguage.charAt(0)) + displayLanguage.substring(1); } }