View Javadoc
1   /*
2    * Licensed to The Apereo Foundation under one or more contributor license
3    * agreements. See the NOTICE file distributed with this work for additional
4    * information regarding copyright ownership.
5    *
6    *
7    * The Apereo Foundation licenses this file to you under the Educational
8    * Community License, Version 2.0 (the "License"); you may not use this file
9    * except in compliance with the License. You may obtain a copy of the License
10   * at:
11   *
12   *   http://opensource.org/licenses/ecl2.txt
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
17   * License for the specific language governing permissions and limitations under
18   * the License.
19   *
20   */
21  package org.opencastproject.transcription.amberscript;
22  
23  import org.slf4j.Logger;
24  import org.slf4j.LoggerFactory;
25  
26  import java.util.HashMap;
27  import java.util.LinkedList;
28  import java.util.List;
29  import java.util.Locale;
30  import java.util.Map;
31  
32  /**
33   * Manages the available Amberscript languages and helps with finding the
34   * right code for a given language string.
35   */
36  public final class AmberscriptLangUtil {
37  
38    private static final Logger logger = LoggerFactory.getLogger(AmberscriptLangUtil.class);
39  
40    /** Contains the available amberscript lang codes */
41    private List<String> availableAmberscriptLangs;
42  
43    /** Contains different locale names and codes, that maps to the corresponding amberscript language */
44    private Map<String, String> langMap;
45  
46    /** Singleton instance */
47    private static AmberscriptLangUtil amberscriptLangUtil;
48  
49    /** Singleton method */
50    public static AmberscriptLangUtil getInstance() {
51      if (amberscriptLangUtil == null) {
52        amberscriptLangUtil = new AmberscriptLangUtil();
53      }
54      return amberscriptLangUtil;
55    }
56  
57    /** Singleton constructor */
58    private AmberscriptLangUtil() {
59      populateLangMap();
60    }
61  
62    /**
63     * Iterates through all available amberscript languages and finds the corresponding
64     * java locale object. After that a map will be created, that maps all possible
65     * spellings to the amberscript language code.
66     */
67    private void populateLangMap() {
68      langMap = new HashMap<>();
69      availableAmberscriptLangs = new LinkedList<>();
70      availableAmberscriptLangs.add("af-za");
71      availableAmberscriptLangs.add("sq-al");
72      availableAmberscriptLangs.add("am-et");
73      availableAmberscriptLangs.add("ar");
74      availableAmberscriptLangs.add("hy-am");
75      availableAmberscriptLangs.add("az-az");
76      availableAmberscriptLangs.add("id-id");
77      availableAmberscriptLangs.add("eu-es");
78      availableAmberscriptLangs.add("bn-bd");
79      availableAmberscriptLangs.add("bn-in");
80      availableAmberscriptLangs.add("bs-ba");
81      availableAmberscriptLangs.add("bg");
82      availableAmberscriptLangs.add("my-mm");
83      availableAmberscriptLangs.add("ca");
84      availableAmberscriptLangs.add("cmn");
85      availableAmberscriptLangs.add("hr");
86      availableAmberscriptLangs.add("cs");
87      availableAmberscriptLangs.add("da");
88      availableAmberscriptLangs.add("nl");
89      availableAmberscriptLangs.add("en-au");
90      availableAmberscriptLangs.add("en-uk");
91      availableAmberscriptLangs.add("en");
92      availableAmberscriptLangs.add("et-ee");
93      availableAmberscriptLangs.add("fa-ir");
94      availableAmberscriptLangs.add("fil-ph");
95      availableAmberscriptLangs.add("fi");
96      availableAmberscriptLangs.add("nl-be");
97      availableAmberscriptLangs.add("fr-ca");
98      availableAmberscriptLangs.add("fr");
99      availableAmberscriptLangs.add("gl-es");
100     availableAmberscriptLangs.add("ka-ge");
101     availableAmberscriptLangs.add("de-at");
102     availableAmberscriptLangs.add("de-ch");
103     availableAmberscriptLangs.add("de");
104     availableAmberscriptLangs.add("el");
105     availableAmberscriptLangs.add("gu-in");
106     availableAmberscriptLangs.add("iw-il");
107     availableAmberscriptLangs.add("hi");
108     availableAmberscriptLangs.add("hu");
109     availableAmberscriptLangs.add("is-is");
110     availableAmberscriptLangs.add("it");
111     availableAmberscriptLangs.add("ja");
112     availableAmberscriptLangs.add("jv-id");
113     availableAmberscriptLangs.add("kn-in");
114     availableAmberscriptLangs.add("km-kh");
115     availableAmberscriptLangs.add("ko");
116     availableAmberscriptLangs.add("lo-la");
117     availableAmberscriptLangs.add("lv");
118     availableAmberscriptLangs.add("lt");
119     availableAmberscriptLangs.add("mk-mk");
120     availableAmberscriptLangs.add("ms");
121     availableAmberscriptLangs.add("ml-in");
122     availableAmberscriptLangs.add("mr-in");
123     availableAmberscriptLangs.add("mn-mn");
124     availableAmberscriptLangs.add("ne-np");
125     availableAmberscriptLangs.add("no");
126     availableAmberscriptLangs.add("pl");
127     availableAmberscriptLangs.add("pt-br");
128     availableAmberscriptLangs.add("pt");
129     availableAmberscriptLangs.add("pa-guru-in");
130     availableAmberscriptLangs.add("ro");
131     availableAmberscriptLangs.add("ru");
132     availableAmberscriptLangs.add("sr-rs");
133     availableAmberscriptLangs.add("si-lk");
134     availableAmberscriptLangs.add("sk");
135     availableAmberscriptLangs.add("sl");
136     availableAmberscriptLangs.add("es");
137     availableAmberscriptLangs.add("su-id");
138     availableAmberscriptLangs.add("sw-ke");
139     availableAmberscriptLangs.add("sw-tz");
140     availableAmberscriptLangs.add("sv");
141     availableAmberscriptLangs.add("ta-in");
142     availableAmberscriptLangs.add("ta-my");
143     availableAmberscriptLangs.add("ta-sg");
144     availableAmberscriptLangs.add("ta-lk");
145     availableAmberscriptLangs.add("te-in");
146     availableAmberscriptLangs.add("th-th");
147     availableAmberscriptLangs.add("tr");
148     availableAmberscriptLangs.add("uk-ua");
149     availableAmberscriptLangs.add("ur-in");
150     availableAmberscriptLangs.add("ur-pk");
151     availableAmberscriptLangs.add("uz-uz");
152     availableAmberscriptLangs.add("vi-vn");
153     availableAmberscriptLangs.add("zu-za");
154 
155     // it's important that we first put in the '-' languages,
156     // so the more general languages will overwrite the first ones
157     for (String amberLang : availableAmberscriptLangs)  {
158       if (amberLang.contains("-")) {
159         addAmberLangToMap(amberLang);
160       }
161     }
162     for (String amberLang : availableAmberscriptLangs)  {
163       if (!amberLang.contains("-")) {
164         addAmberLangToMap(amberLang);
165       }
166     }
167   }
168 
169   /**
170    * Puts some different spellings of the java Local class into a map, with
171    * the corresponding Amberscript language code.
172    * @param amberLang the amberscript language code
173    */
174   private void addAmberLangToMap(String amberLang) {
175     Locale locale;
176     if (amberLang.contains("-")) {
177       locale = Locale.forLanguageTag(amberLang);
178     } else {
179       locale = Locale.forLanguageTag(amberLang + "-" + amberLang);
180     }
181     if (locale.getDisplayCountry().equals("")) {
182       logger.warn("Locale not found for code '{}'", amberLang);
183       return;
184     }
185     langMap.put(amberLang, amberLang);
186     langMap.put(locale.toString().toLowerCase(), amberLang);
187     langMap.put(locale.getDisplayLanguage().toLowerCase(), amberLang);
188     langMap.put(locale.getDisplayName().toLowerCase(), amberLang);
189     langMap.put(locale.getLanguage().toLowerCase(), amberLang);
190     langMap.put(locale.getISO3Language().toLowerCase(), amberLang);
191   }
192 
193   /**
194    * Tries to determine which amberscript language code should be taken for a
195    * given language name or code.
196    * @return the amberscript language code or null if nothing was found.
197    */
198   public String getLanguageCodeOrNull(String languageWithRandomFormat) {
199     return langMap.get(languageWithRandomFormat.toLowerCase());
200   }
201 
202   /**
203    * Adds a custom mapping entry. Can be configured in the amberscript config file.
204    * @param customKey The key
205    * @param amberscriptLangCode Amberscript Language Code
206    */
207   public void addCustomMapping(String customKey, String amberscriptLangCode) {
208     langMap.put(customKey, amberscriptLangCode);
209   }
210 }