diff --git a/components/net/sf/briar/i18n/I18nImpl.java b/components/net/sf/briar/i18n/I18nImpl.java
index f4095a359..cf258512a 100644
--- a/components/net/sf/briar/i18n/I18nImpl.java
+++ b/components/net/sf/briar/i18n/I18nImpl.java
@@ -121,8 +121,11 @@ public class I18nImpl implements I18n {
}
public void loadLocale() throws IOException {
- File root = FileUtils.getBriarDirectory();
- Scanner s = new Scanner(new File(root, "Data/locale.cfg"));
+ loadLocale(FileUtils.getBriarDirectory());
+ }
+
+ public void loadLocale(File dir) throws IOException {
+ Scanner s = new Scanner(new File(dir, "Data/locale.cfg"));
if(s.hasNextLine()) setLocale(new Locale(s.nextLine()));
s.close();
}
@@ -132,7 +135,7 @@ public class I18nImpl implements I18n {
}
public void saveLocale(File dir) throws IOException {
- File localeCfg = new File(dir, "locale.cfg");
+ File localeCfg = new File(dir, "Data/locale.cfg");
FileOutputStream out = new FileOutputStream(localeCfg);
PrintStream print = new PrintStream(out);
print.println(locale);
diff --git a/components/net/sf/briar/setup/SetupWorker.java b/components/net/sf/briar/setup/SetupWorker.java
index c51693cec..415031796 100644
--- a/components/net/sf/briar/setup/SetupWorker.java
+++ b/components/net/sf/briar/setup/SetupWorker.java
@@ -82,7 +82,7 @@ class SetupWorker implements Runnable {
createLaunchers(dir);
if(callback.isCancelled()) return;
// Save the chosen locale for the first launch
- i18n.saveLocale(data);
+ i18n.saveLocale(dir);
if(callback.isCancelled()) return;
// Installation succeeded - delete the installer
jar.deleteOnExit();
diff --git a/test/build.xml b/test/build.xml
index f5f8413e0..12f16f550 100644
--- a/test/build.xml
+++ b/test/build.xml
@@ -13,7 +13,8 @@
-
+
+
diff --git a/test/net/sf/briar/TestUtils.java b/test/net/sf/briar/TestUtils.java
index bd8397c85..32b8198f5 100644
--- a/test/net/sf/briar/TestUtils.java
+++ b/test/net/sf/briar/TestUtils.java
@@ -33,4 +33,12 @@ public class TestUtils {
public static void deleteTestDirectories() {
delete(new File("test.tmp"));
}
+
+ public static File getBuildDirectory() {
+ File build = new File("build"); // Ant
+ if(build.exists() && build.isDirectory()) return build;
+ File bin = new File("bin"); // Eclipse
+ if(bin.exists() && bin.isDirectory()) return bin;
+ throw new RuntimeException("Could not find build directory");
+ }
}
diff --git a/test/net/sf/briar/i18n/FontManagerImplTest.java b/test/net/sf/briar/i18n/FontManagerTest.java
similarity index 87%
rename from test/net/sf/briar/i18n/FontManagerImplTest.java
rename to test/net/sf/briar/i18n/FontManagerTest.java
index 3c5dbd675..0b5ebc415 100644
--- a/test/net/sf/briar/i18n/FontManagerImplTest.java
+++ b/test/net/sf/briar/i18n/FontManagerTest.java
@@ -3,15 +3,15 @@ import java.awt.Font;
import java.util.Locale;
import junit.framework.TestCase;
-import net.sf.briar.i18n.FontManagerImpl;
+import net.sf.briar.api.i18n.FontManager;
import org.junit.Test;
-public class FontManagerImplTest extends TestCase {
+public class FontManagerTest extends TestCase {
@Test
public void testBundledFontsAreLoaded() {
- FontManagerImpl fontManager = new FontManagerImpl();
+ FontManager fontManager = new FontManagerImpl();
fontManager.initialize(Locale.UK);
Font font = fontManager.getFontForLanguage("en"); // English
@@ -28,7 +28,7 @@ public class FontManagerImplTest extends TestCase {
@Test
public void testInternationalCharactersCanBeDisplayed() {
- FontManagerImpl fontManager = new FontManagerImpl();
+ FontManager fontManager = new FontManagerImpl();
fontManager.initialize(Locale.UK);
Font font = fontManager.getFontForLanguage("en"); // English
@@ -52,7 +52,7 @@ public class FontManagerImplTest extends TestCase {
@Test
public void testSetAndGetUiFont() {
- FontManagerImpl fontManager = new FontManagerImpl();
+ FontManager fontManager = new FontManagerImpl();
fontManager.initialize(Locale.UK);
Font font = fontManager.getUiFont();
assertEquals(12, font.getSize());
diff --git a/test/net/sf/briar/i18n/I18nTest.java b/test/net/sf/briar/i18n/I18nTest.java
new file mode 100644
index 000000000..23e9c8fa5
--- /dev/null
+++ b/test/net/sf/briar/i18n/I18nTest.java
@@ -0,0 +1,102 @@
+package net.sf.briar.i18n;
+
+import java.awt.Font;
+import java.io.File;
+import java.io.IOException;
+import java.util.Locale;
+
+import junit.framework.TestCase;
+import net.sf.briar.TestUtils;
+import net.sf.briar.api.i18n.FontManager;
+import net.sf.briar.api.i18n.I18n;
+
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class I18nTest extends TestCase {
+
+ final File base =
+ new File(TestUtils.getBuildDirectory(), "i18n.properties");
+ final File french =
+ new File(TestUtils.getBuildDirectory(), "i18n_fr.properties");
+ final File testDir = TestUtils.getTestDirectory();
+
+ FontManager fontManager = null;
+ I18n i18n = null;
+
+ @Before
+ public void setUp() throws IOException {
+ TestUtils.createFile(base,
+ "FOO=foo\r\n" +
+ "BAR=bar\r\n");
+ TestUtils.createFile(french,
+ "FOO=le foo\r\n" +
+ "BAR=la bar\r\n");
+ fontManager = new FontManagerImpl();
+ fontManager.initialize(Locale.UK);
+ i18n = new I18nImpl(fontManager);
+ }
+
+ @Test
+ public void testTr() {
+ i18n.setLocale(Locale.UK);
+ assertEquals("foo", i18n.tr("FOO"));
+ i18n.setLocale(Locale.FRANCE);
+ assertEquals("le foo", i18n.tr("FOO"));
+ i18n.setLocale(Locale.CHINA); // No translation - use defaul
+ assertEquals("foo", i18n.tr("FOO"));
+ }
+
+ @Test
+ public void testSettingLocaleAffectsComponentOrientation() {
+ i18n.setLocale(new Locale("en")); // English
+ assertTrue(i18n.getComponentOrientation().isLeftToRight());
+ i18n.setLocale(new Locale("ar")); // Arabic
+ assertFalse(i18n.getComponentOrientation().isLeftToRight());
+ }
+
+ @Test
+ public void testListenersAreInformedOfLocaleChanges() {
+ final Font englishFont = fontManager.getFontForLanguage("en");
+ final Font tibetanFont = fontManager.getFontForLanguage("bo");
+
+ Mockery context = new Mockery();
+ final I18n.Listener listener = context.mock(I18n.Listener.class);
+ context.checking(new Expectations() {{
+ // Listener should be called once when registered
+ oneOf(listener).localeChanged(englishFont);
+ // Listener should be called again when locale changes
+ oneOf(listener).localeChanged(tibetanFont);
+ }});
+
+ i18n.setLocale(new Locale("en"));
+ i18n.addListener(listener);
+ i18n.setLocale(new Locale("bo"));
+ i18n.removeListener(listener);
+
+ context.assertIsSatisfied();
+ }
+
+ @Test
+ public void testSaveAndLoadLocale() throws IOException {
+ testDir.mkdirs();
+ new File(testDir, "Data").mkdir();
+ i18n.setLocale(new Locale("fr"));
+ assertEquals("le foo", i18n.tr("FOO"));
+ i18n.saveLocale();
+ i18n.setLocale(new Locale("zh")); // No translation - use default
+ assertEquals("foo", i18n.tr("FOO"));
+ i18n.loadLocale();
+ assertEquals("le foo", i18n.tr("FOO"));
+ }
+
+ @After
+ public void tearDown() {
+ TestUtils.delete(base);
+ TestUtils.delete(french);
+ TestUtils.deleteTestDirectories();
+ }
+}
diff --git a/test/net/sf/briar/setup/SetupWorkerTest.java b/test/net/sf/briar/setup/SetupWorkerTest.java
index f311b8386..c597d9cf9 100644
--- a/test/net/sf/briar/setup/SetupWorkerTest.java
+++ b/test/net/sf/briar/setup/SetupWorkerTest.java
@@ -117,7 +117,7 @@ public class SetupWorkerTest extends TestCase {
oneOf(callback).extractingFile(jreFoo);
oneOf(callback).extractingFile(fooJar);
oneOf(callback).extractingFile(fooTtf);
- oneOf(i18n).saveLocale(new File(testDir, "Briar/Data"));
+ oneOf(i18n).saveLocale(new File(testDir, "Briar"));
oneOf(callback).installed(new File(testDir, "Briar"));
}});