File: I18nManager.java

package info (click to toggle)
gpsprune 17-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 3,984 kB
  • ctags: 5,218
  • sloc: java: 39,403; sh: 25; makefile: 17; python: 15
file content (136 lines) | stat: -rw-r--r-- 3,595 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package tim.prune;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.Properties;
import java.util.ResourceBundle;

/**
 * Manager for all internationalization
 * Responsible for loading property files
 * and delivering language-specific texts
 */
public abstract class I18nManager
{
	private static final String BUNDLE_NAME = "tim.prune.lang.prune-texts";
	private static final Locale BACKUP_LOCALE = new Locale("en", "GB");

	private static ResourceBundle EnglishTexts = null;
	private static ResourceBundle LocalTexts = null;

	/** External properties file for developer testing */
	private static Properties ExternalPropsFile = null;


	/**
	 * Initialize the library using the (optional) locale
	 * @param inLocale locale to use, or null for default
	 */
	public static void init(Locale inLocale)
	{
		// Load English texts first to use as defaults
		EnglishTexts = ResourceBundle.getBundle(BUNDLE_NAME, BACKUP_LOCALE);

		// Get bundle for selected locale, if any
		try
		{
			if (inLocale != null)
			{
				LocalTexts = ResourceBundle.getBundle(BUNDLE_NAME, inLocale);
			}
			else
			{
				// locale is null so just use the system default
				LocalTexts = ResourceBundle.getBundle(BUNDLE_NAME, Locale.getDefault());
			}
		}
		catch (MissingResourceException mre) { // ignore error, default to english
		}
	}


	/**
	 * Add a language file
	 * @param inFilename filename of file
	 * @throws FileNotFoundException if load failed
	 */
	public static void addLanguageFile(String inFilename) throws FileNotFoundException
	{
		FileInputStream fis = null;
		boolean fileLoaded = false;
		try
		{
			File file = new File(inFilename);
			ExternalPropsFile = new Properties();
			fis = new FileInputStream(file);
			ExternalPropsFile.load(fis);
			fileLoaded = true; // everything worked
		}
		catch (IOException ioe) {}
		finally { try { fis.close();
			} catch (Exception e) {}
		}
		// complain if file wasn't loaded, by throwing a filenotfound exception
		if (!fileLoaded) throw new FileNotFoundException();
	}


	/**
	 * Lookup the given key and return the associated text
	 * @param inKey key to lookup
	 * @return associated text, or the key if not found
	 */
	public static String getText(String inKey)
	{
		// look in external props file if available
		if (ExternalPropsFile != null)
		{
			String extText = ExternalPropsFile.getProperty(inKey);
			if (extText != null) return extText;
		}
		// look in extra texts if available
		if (LocalTexts != null)
		{
			try
			{
				String localText = LocalTexts.getString(inKey);
				if (localText != null) return localText;
			}
			catch (MissingResourceException mre) {}
		}
		// look in english texts
		if (EnglishTexts != null)
		{
			try
			{
				String engText = EnglishTexts.getString(inKey);
				if (engText != null) return engText;
			}
			catch (MissingResourceException mre) {}
		}
		// return the key itself
		return inKey;
	}

	/**
	 * Lookup the given key and return the associated text, formatting with the number
	 * @param inKey key to lookup (text should contain a %d)
	 * @param inNumber number to substitute into the %d
	 * @return associated text, or the key if not found
	 */
	public static String getTextWithNumber(String inKey, int inNumber)
	{
		String localText = getText(inKey);
		try
		{
			localText = String.format(localText, inNumber);
		}
		catch (Exception e)
		{} // printf formatting didn't work, maybe the placeholders are wrong?
		return localText;
	}
}