Added translation support + first language (nl).

This commit is contained in:
mathiasdm
2010-12-09 17:22:08 +00:00
parent ac74befd83
commit 36d555523d
9 changed files with 199 additions and 8 deletions

View File

@@ -1,7 +1,12 @@
HIGH PRIORITY:
- Allow desktopgui to start, stop and restart I2P. - DONE
- Correct logging system - DONE
- Internationalisation
- Internationalisation:
* Add strings
* Add Windows support
* Might need some kind of trigger to reload the menu (for live language switching)
* Language choice is not actually set as a parameter in I2P config?
As a result, desktopgui always starts with the default, unless you manually set the language.
- Modify installer to set I2P directory parameter; or use $I2P?
UNKNOWN:
- API to allow applications to add themselves to the menu?

View File

@@ -39,6 +39,13 @@
</target>
<target name="jar" depends="compile">
<exec executable="sh" osfamily="unix" failifexecutionfails="true" >
<arg value="./bundle-messages.sh" />
</exec>
<exec executable="sh" osfamily="mac" failifexecutionfails="true" >
<arg value="./bundle-messages.sh" />
</exec>
<jar basedir="${build}" destfile="${dist}/${jar}">
<manifest>
<attribute name="Main-Class" value="net.i2p.desktopgui.Main"/>
@@ -62,6 +69,17 @@
</javadoc>
</target>
<target name="poupdate">
<exec executable="sh" osfamily="unix" failifexecutionfails="true" >
<arg value="./bundle-messages.sh" />
<arg value="-p" />
</exec>
<exec executable="sh" osfamily="mac" failifexecutionfails="true" >
<arg value="./bundle-messages.sh" />
<arg value="-p" />
</exec>
</target>
<target name="dist" depends="jar" />
<target name="all" depends="jar" />
</project>

View File

@@ -0,0 +1,95 @@
#
# Update messages_xx.po and messages_xx.class files,
# from both java and jsp sources.
# Requires installed programs xgettext, msgfmt, msgmerge, and find.
#
# usage:
# bundle-messages.sh (generates the resource bundle from the .po file)
# bundle-messages.sh -p (updates the .po file from the source tags, then generates the resource bundle)
#
# zzz - public domain
# Mathiasdm - modifications for desktopgui
#
CLASS=net.i2p.desktopgui.messages
TMPFILE=build/javafiles.txt
export TZ=UTC
if [ "$1" = "-p" ]
then
POUPDATE=1
fi
# add ../java/ so the refs will work in the po file
JPATHS="src"
for i in locale/messages_*.po
do
# get language
LG=${i#locale/messages_}
LG=${LG%.po}
if [ "$POUPDATE" = "1" ]
then
# make list of java files newer than the .po file
find $JPATHS -name *.java -newer $i > $TMPFILE
fi
echo $LG
if [ -s build/net/i2p/desktopgui/messages_$LG.class -a \
build/net/i2p/desktopgui/messages_$LG.class -nt $i -a \
! -s $TMPFILE ]
then
continue
fi
if [ "$POUPDATE" = "1" ]
then
echo "Updating the $i file from the tags..."
# extract strings from java and jsp files, and update messages.po files
# translate calls must be one of the forms:
# _("foo")
# _x("foo")
# intl._("foo")
# intl.title("foo")
# handler._("foo")
# formhandler._("foo")
# net.i2p.router.web.Messages.getString("foo")
# In a jsp, you must use a helper or handler that has the context set.
# To start a new translation, copy the header from an old translation to the new .po file,
# then ant distclean updater.
find $JPATHS -name *.java > $TMPFILE
xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\
--keyword=_ --keyword=_x --keyword=intl._ --keyword=intl.title \
--keyword=handler._ --keyword=formhandler._ \
--keyword=net.i2p.router.web.Messages.getString \
-o ${i}t
if [ $? -ne 0 ]
then
echo 'Warning - xgettext failed, not updating translations'
rm -f ${i}t
break
fi
msgmerge -U --backup=none $i ${i}t
if [ $? -ne 0 ]
then
echo 'Warning - msgmerge failed, not updating translations'
rm -f ${i}t
break
fi
rm -f ${i}t
# so we don't do this again
touch $i
fi
echo "Generating ${CLASS}_$LG ResourceBundle..."
# convert to class files in build
msgfmt --java --statistics -r $CLASS -l $LG -d build $i
if [ $? -ne 0 ]
then
echo 'Warning - msgfmt failed, not updating translations'
break
fi
done
rm -f $TMPFILE
# todo: return failure
exit 0

View File

@@ -0,0 +1,31 @@
#: src/net/i2p/desktopgui/TrayManager.java:73
msgid "Launch I2P Browser"
msgstr "Start I2P Browser"
#: src/net/i2p/desktopgui/TrayManager.java:99
msgid "Browser not found"
msgstr "Browser niet gevonden"
#: src/net/i2p/desktopgui/TrayManager.java:100
msgid "The default browser for your system was not found."
msgstr "De standaard webbrowser voor je systeem werd niet gevonden."
#: src/net/i2p/desktopgui/TrayManager.java:111
msgid "Start I2P"
msgstr "I2P starten"
#: src/net/i2p/desktopgui/TrayManager.java:126
msgid "I2P is starting!"
msgstr "I2P is aan het starten!"
#: src/net/i2p/desktopgui/TrayManager.java:126
msgid "Starting"
msgstr "Bezig met starten"
#: src/net/i2p/desktopgui/TrayManager.java:140
msgid "Restart I2P"
msgstr "I2P herstarten"
#: src/net/i2p/desktopgui/TrayManager.java:161
msgid "Stop I2P"
msgstr "I2P stoppen"

View File

@@ -31,6 +31,7 @@ public class Main {
* Main method launching the application.
*/
public static void main(String[] args) {
System.setProperty("java.awt.headless", "false");
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {

View File

@@ -18,6 +18,7 @@ import java.net.URL;
import javax.swing.SwingWorker;
import net.i2p.desktopgui.i18n.DesktopguiTranslator;
import net.i2p.desktopgui.router.RouterManager;
import net.i2p.desktopgui.util.ConfigurationManager;
import net.i2p.util.Log;
@@ -69,7 +70,7 @@ public class TrayManager {
boolean inI2P = ConfigurationManager.getInstance().getBooleanConfiguration("startWithI2P", false);
PopupMenu popup = new PopupMenu();
MenuItem browserLauncher = new MenuItem("Launch I2P Browser");
MenuItem browserLauncher = new MenuItem(_("Launch I2P Browser"));
browserLauncher.addActionListener(new ActionListener() {
@Override
@@ -95,8 +96,8 @@ public class TrayManager {
}
}
else {
trayIcon.displayMessage("Browser not found",
"The default browser for your system was not found.",
trayIcon.displayMessage(_("Browser not found"),
_("The default browser for your system was not found."),
TrayIcon.MessageType.WARNING);
}
}
@@ -107,7 +108,7 @@ public class TrayManager {
});
popup.add(browserLauncher);
popup.addSeparator();
MenuItem startItem = new MenuItem("Start I2P");
MenuItem startItem = new MenuItem(_("Start I2P"));
startItem.addActionListener(new ActionListener() {
@Override
@@ -122,7 +123,7 @@ public class TrayManager {
@Override
protected void done() {
trayIcon.displayMessage("Starting", "I2P is starting!", TrayIcon.MessageType.INFO);
trayIcon.displayMessage(_("Starting"), _("I2P is starting!"), TrayIcon.MessageType.INFO);
//Hide the tray icon.
//We cannot stop the desktopgui program entirely,
//since that risks killing the I2P process as well.
@@ -136,7 +137,7 @@ public class TrayManager {
if(!inI2P) {
popup.add(startItem);
}
MenuItem restartItem = new MenuItem("Restart I2P");
MenuItem restartItem = new MenuItem(_("Restart I2P"));
restartItem.addActionListener(new ActionListener() {
@Override
@@ -157,7 +158,7 @@ public class TrayManager {
if(inI2P) {
popup.add(restartItem);
}
MenuItem stopItem = new MenuItem("Stop I2P");
MenuItem stopItem = new MenuItem(_("Stop I2P"));
stopItem.addActionListener(new ActionListener() {
@Override
@@ -190,4 +191,8 @@ public class TrayManager {
Image image = Toolkit.getDefaultToolkit().getImage(url);
return image;
}
private static String _(String s) {
return DesktopguiTranslator._(s);
}
}

View File

@@ -0,0 +1,26 @@
package net.i2p.desktopgui.i18n;
import net.i2p.router.RouterContext;
import net.i2p.util.Translate;
public class DesktopguiTranslator {
private static final String BUNDLE_NAME = "net.i2p.desktopgui.messages";
private static RouterContext ctx;
private static RouterContext getRouterContext() {
if(ctx == null) {
ctx = RouterContext.listContexts().get(0);
}
return ctx;
}
public static String _(String s) {
return Translate.getString(s, getRouterContext(), BUNDLE_NAME);
}
public static String _(String s, Object o) {
return Translate.getString(s, o, getRouterContext(), BUNDLE_NAME);
}
}

View File

@@ -0,0 +1,5 @@
<html>
<body>
<p>Desktopgui is a graphical interface to I2P that allows managing the lifecycle of I2P from the system tray.</p>
</body>
</html>

View File

@@ -2,6 +2,7 @@ package net.i2p.desktopgui.router;
import java.io.IOException;
import net.i2p.desktopgui.i18n.DesktopguiTranslator;
import net.i2p.desktopgui.util.ConfigurationManager;
import net.i2p.router.Router;
import net.i2p.router.RouterContext;
@@ -56,4 +57,8 @@ public class RouterManager {
public static void shutDown() {
getRouter().shutdownGracefully();
}
private static String _(String s) {
return DesktopguiTranslator._(s);
}
}