/* Copyright 2012 SionEngine * * Licensed 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 com.siondream.core; import java.io.InputStream; import java.io.InputStreamReader; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.Logger; import com.badlogic.gdx.utils.ObjectMap; import com.csvreader.CsvReader; /** * @class LanguageManager * @author David Saltares Márquez * @date 05/09/2012 * * @brief Provides i18n support * */ public class LanguageManager { private static final String DEFAULT_LANGUAGE = "en"; private static final int COLUMN_KEY = 0; private static final int COLUMN_VALUE = 1; private static final char DELIMITER = ','; private Logger logger; private String folder; private ObjectMap<String, String> strings = new ObjectMap<String, String>(); private String languageName; private static final String TAG = "LanguageManager"; /** * Will load lang/en.csv */ public LanguageManager() { this("data/lang", DEFAULT_LANGUAGE); } /** * Will load the folder + / + language + .csv file * * @param folder * @param language * @param loggingLevel */ public LanguageManager(String folder, String language) { this.logger = new Logger(TAG, Env.debugLevel); this.folder = folder; this.languageName = language; if (!loadLanguage(languageName) && !languageName.equals(DEFAULT_LANGUAGE)) { loadLanguage(DEFAULT_LANGUAGE); } } /** * @return current language name */ public String getLanguage() { return languageName; } /** * @param key key for the string to translate * @return translated string in the current language, the key if it's not found */ public String getString(String key) { String string = strings.get(key); if (string != null) { return string; } logger.error("string " + key + " not found"); return key; } /** * @param key formatted string as the key to translate * @params args list of arguments to be inserted in the formatted translated string * @return translated string in the current language, the key if it's not found */ public String getString(String key, Object... args) { return String.format(getString(key), args); } /** * Tries to load a new language replacing the old one. If it fails, nothing it's done. * * @param languageName name of the language to load * @return true if succeeded, false in any other case */ public boolean loadLanguage(String languageName) { logger.info("loading " + languageName); try { InputStream inputStream = Gdx.files.internal(folder + "/" + languageName + ".csv").read(); InputStreamReader streamReader = new InputStreamReader(inputStream, "UTF-8"); CsvReader reader = new CsvReader(streamReader, DELIMITER); boolean skip = true; ObjectMap<String, String> newStrings = new ObjectMap<String, String>(strings.size); while (reader.readRecord()) { if (skip) { skip = false; continue; } String key = reader.get(COLUMN_KEY); String value = reader.get(COLUMN_VALUE); value = value.replace("<br />", "\n"); newStrings.put(key, value); logger.info("LanguageManager: loading key " + key); } reader.close(); // Swap the languages now that is safe to do so this.languageName = languageName; this.strings = newStrings; logger.info(languageName + " language sucessfully loaded"); } catch (Exception e) { logger.error("error loading " + languageName + " we keep the previous one"); return false; } return true; } }