package com.limegroup.gnutella.i18n; import java.util.Properties; /** * Struct-like container for language information. */ class LanguageInfo implements Comparable { private final String languageCode; private final String countryCode; private final String variantCode; private final String scriptCode; private final String languageName; private final String countryName; private final String variantName; private final String scriptName; private boolean isRightToLeft; private final String displayName; private final String fileName; private final Properties properties; private double percentage; private final String alternateFileName; private final String nsisName; private static final String CHARSET_UTF8 = "UTF-8"; private static final String CHARSET_8859_1 = "ISO-8859-1"; private final String sourceCharset; /** * Constructs a new LanguageInfo object with the given languageCode, * countryCode, variantCode, languageName, countryName, and variantName. * * @param lc * ISO-639 language code * @param cc * ISO-3166 country or region code * @param vc * locale variant code * @param sc * ISO-10644 script code * @param ln * localized language name * @param cn * localized country name * @param vn * localized variant name * @param sn * English script name * @param dn * English language name * @param rtl * true if locale layout is right-to-left * @param fn * name of localized source (ISO-8859-1 or UTF-8) file * @param props * properties loaded from localized file * @param alternateFile * name of generated ISO-8859-1 file */ public LanguageInfo(String lc, String cc, String vc, String sc, String ln, String cn, String vn, String sn, String dn, String nsName, boolean rtl, String fn, Properties props, String alternateFile) { languageCode = lc.trim(); countryCode = cc.trim(); variantCode = vc.trim(); scriptCode = sc.trim(); languageName = ln.trim(); countryName = cn.trim(); variantName = vn.trim(); scriptName = sn.trim(); isRightToLeft = rtl; displayName = dn.trim(); fileName = fn.trim(); nsisName = nsName.trim(); properties = props; alternateFileName = alternateFile.trim(); sourceCharset = alternateFileName.equals(fileName) ? CHARSET_8859_1 : CHARSET_UTF8; } /** * Used to map the list of locales codes to their LanguageInfo data and * props. Must be unique per loaded localized properties file. * * @see Comparable#compareTo(Object) */ public int compareTo(Object other) { final LanguageInfo o = (LanguageInfo) other; int comp = languageCode.compareTo(o.languageCode); if (comp != 0) return comp; comp = countryCode.compareTo(o.countryCode); if (comp != 0) return comp; return variantCode.compareTo(o.variantCode); } /** * @return true if getCode()==getBaseCode() */ public boolean isVariant() { return !"".equals(variantCode) || !"".equals(countryCode); } /** * @return the reduced Java locale code with format "lc" */ public String getBaseCode() { return languageCode; } /** * @return the standard Java locale code with format: "lc[_CC[_vc]]" */ public String getCode() { if (!variantCode.equals("")) return languageCode + "_" + countryCode + "_" + variantCode; if (!countryCode.equals("")) return languageCode + "_" + countryCode; return languageCode; } /** * @param percentage * a completion level value to associate with this. */ public void setPercentage(double percentage) { this.percentage = percentage; } /** * @return the percentage previously stored. * @see #setPercentage(double) */ public double getPercentage() { return percentage; } /** * @return the properties loaded from the source file */ public Properties getProperties() { return properties; } /** * Returns a native description of this language. If the variantName is not * 'international' or '', then the display is: languageName, variantName * (countryName) Otherwise, the display is: languageName (countryName) If * the language is Right-To-Left, the whole string is returned surrounded by * BiDi embedding controls. * * @return the internationalized description string. * @see #getName() */ public String toString() { final String bidi1, bidi2; if (isRightToLeft) { bidi1 = "\u202b"; /* RLE control: Right-To-Left Embedding */ bidi2 = "\u202c"; /* PDF control: Pop Directional Format */ } else { bidi1 = ""; bidi2 = ""; } if (variantName != null && !variantName.toLowerCase().equals("international") && !variantName.equals("")) return bidi1 + languageName + ", " + variantName + " (" + countryName + ')' + bidi2; return bidi1 + languageName + " (" + countryName + ')' + bidi2; } /** * @return the English script name */ public String getScript() { return scriptName; } /** * @return the ISO script code */ public String getScriptCode() { return scriptCode; } /** * @return the source file name */ public String getFileName() { return fileName; } /** * @return the name in the NSIS installer. */ public String getNSISName() { return nsisName; } /** * @return the source charset name */ public String getSourceCharset() { return sourceCharset; } /** * @return true if the source charset is UTF-8, and there's no alternate * file. */ public boolean isUTF8() { return sourceCharset.equals(CHARSET_UTF8); } /** * @return the alternate file name, when the source file is not UTF-8 * encoded. */ public String getAlternateFileName() { return alternateFileName; } /** * @return the descriptive English language name * @see #toString() */ public String getName() { return displayName; } /** * @return a link to the source file in the repository */ public String getLink() { return "<a href=\"" + HTMLOutput.PRE_LINK + fileName + "\" title=\"" + toString() + "\">" + displayName + "</a>"; } }