Index: binaries/data/mods/public/gui/common/init.xml
===================================================================
--- binaries/data/mods/public/gui/common/init.xml (revision 13483)
+++ binaries/data/mods/public/gui/common/init.xml (working copy)
@@ -24,4 +24,6 @@
+
+
Index: binaries/data/mods/public/gui/common/sprintf.js
===================================================================
--- binaries/data/mods/public/gui/common/sprintf.js (revision 0)
+++ binaries/data/mods/public/gui/common/sprintf.js (working copy)
@@ -0,0 +1,183 @@
+/**
+sprintf() for JavaScript 0.7-beta1
+http://www.diveintojavascript.com/projects/javascript-sprintf
+
+Copyright (c) Alexandru Marasteanu
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of sprintf() for JavaScript nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Changelog:
+2010.09.06 - 0.7-beta1
+ - features: vsprintf, support for named placeholders
+ - enhancements: format cache, reduced global namespace pollution
+
+2010.05.22 - 0.6:
+ - reverted to 0.4 and fixed the bug regarding the sign of the number 0
+ Note:
+ Thanks to Raphael Pigulla (http://www.n3rd.org/)
+ who warned me about a bug in 0.5, I discovered that the last update was
+ a regress. I appologize for that.
+
+2010.05.09 - 0.5:
+ - bug fix: 0 is now preceeded with a + sign
+ - bug fix: the sign was not at the right position on padded results (Kamal Abdali)
+ - switched from GPL to BSD license
+
+2007.10.21 - 0.4:
+ - unit test and patch (David Baird)
+
+2007.09.17 - 0.3:
+ - bug fix: no longer throws exception on empty paramenters (Hans Pufal)
+
+2007.09.11 - 0.2:
+ - feature: added argument swapping
+
+2007.04.03 - 0.1:
+ - initial release
+**/
+
+var sprintf = (function() {
+ function get_type(variable) {
+ return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
+ }
+ function str_repeat(input, multiplier) {
+ for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
+ return output.join('');
+ }
+
+ var str_format = function() {
+ if (!str_format.cache.hasOwnProperty(arguments[0])) {
+ str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
+ }
+ return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
+ };
+
+ str_format.format = function(parse_tree, argv) {
+ var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
+ for (i = 0; i < tree_length; i++) {
+ node_type = get_type(parse_tree[i]);
+ if (node_type === 'string') {
+ output.push(parse_tree[i]);
+ }
+ else if (node_type === 'array') {
+ match = parse_tree[i]; // convenience purposes only
+ if (match[2]) { // keyword argument
+ arg = argv[cursor];
+ for (k = 0; k < match[2].length; k++) {
+ if (!arg.hasOwnProperty(match[2][k])) {
+ throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
+ }
+ arg = arg[match[2][k]];
+ }
+ }
+ else if (match[1]) { // positional argument (explicit)
+ arg = argv[match[1]];
+ }
+ else { // positional argument (implicit)
+ arg = argv[cursor++];
+ }
+
+ if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
+ throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
+ }
+ switch (match[8]) {
+ case 'b': arg = arg.toString(2); break;
+ case 'c': arg = String.fromCharCode(arg); break;
+ case 'd': arg = parseInt(arg, 10); break;
+ case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
+ case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
+ case 'o': arg = arg.toString(8); break;
+ case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
+ case 'u': arg = Math.abs(arg); break;
+ case 'x': arg = arg.toString(16); break;
+ case 'X': arg = arg.toString(16).toUpperCase(); break;
+ }
+ arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
+ pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
+ pad_length = match[6] - String(arg).length;
+ pad = match[6] ? str_repeat(pad_character, pad_length) : '';
+ output.push(match[5] ? arg + pad : pad + arg);
+ }
+ }
+ return output.join('');
+ };
+
+ str_format.cache = {};
+
+ str_format.parse = function(fmt) {
+ var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
+ while (_fmt) {
+ if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
+ parse_tree.push(match[0]);
+ }
+ else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
+ parse_tree.push('%');
+ }
+ else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
+ if (match[2]) {
+ arg_names |= 1;
+ var field_list = [], replacement_field = match[2], field_match = [];
+ if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
+ field_list.push(field_match[1]);
+ while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
+ if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
+ field_list.push(field_match[1]);
+ }
+ else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
+ field_list.push(field_match[1]);
+ }
+ else {
+ throw('[sprintf] huh?');
+ }
+ }
+ }
+ else {
+ throw('[sprintf] huh?');
+ }
+ match[2] = field_list;
+ }
+ else {
+ arg_names |= 2;
+ }
+ if (arg_names === 3) {
+ throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
+ }
+ parse_tree.push(match);
+ }
+ else {
+ throw('[sprintf] huh?');
+ }
+ _fmt = _fmt.substring(match[0].length);
+ }
+ return parse_tree;
+ };
+
+ return str_format;
+})();
+
+var vsprintf = function(fmt, argv) {
+ argv.unshift(fmt);
+ return sprintf.apply(null, argv);
+};
Index: binaries/data/mods/public/gui/pregame/mainmenu.xml
===================================================================
--- binaries/data/mods/public/gui/pregame/mainmenu.xml (revision 13483)
+++ binaries/data/mods/public/gui/pregame/mainmenu.xml (working copy)
@@ -339,9 +339,9 @@
style="StoneButtonFancy"
size="4 4 100%-4 32"
tooltip_style="pgToolTip"
- tooltip="The 0 A.D. Game Manual"
>
- Learn To Play
+ Learn To Play
+ The 0 A.D. Game Manual
closeMenu();
- Single Player
+ Single Player
+ Challenge the computer player to a single player match.
closeMenu();
openMenu("submenuSinglePlayer", (this.parent.size.top+this.size.top), (this.size.bottom-this.size.top), 3);
@@ -371,9 +371,9 @@
type="button"
size="4 68 100%-4 96"
tooltip_style="pgToolTip"
- tooltip="Fight against one or more human players in a multiplayer game."
>
- Multiplayer
+ Multiplayer
+ Fight against one or more human players in a multiplayer game.
closeMenu();
openMenu("submenuMultiplayer", (this.parent.size.top+this.size.top), (this.size.bottom-this.size.top), 2);
@@ -386,9 +386,9 @@
type="button"
size="4 100 100%-4 128"
tooltip_style="pgToolTip"
- tooltip="Game options and scenario design tools."
>
- Tools Options
+ Tools & Options
+ Game options and scenario design tools.
closeMenu();
openMenu("submenuToolsAndOptions", (this.parent.size.top+this.size.top), (this.size.bottom-this.size.top), 2);
@@ -401,9 +401,9 @@
type="button"
size="4 132 100%-4 160"
tooltip_style="pgToolTip"
- tooltip="Learn about the many civilizations featured in 0 A.D."
>
- History
+ History
+ Learn about the many civilizations featured in 0 A.D.
closeMenu();
- Exit
+ Exit
+ Exit Game
closeMenu();
-[font="serif-bold-16"]Alpha XIII: Magadha[/font]
-
-WARNING: This is an early development version of the game. Many features have not been added yet.
-
-Get involved at: play0ad.com
+
+ [font="serif-bold-16"]Alpha XIII: Magadha[/font]\n\nWARNING: This is an early development version of the game. Many features have not been added yet.\n\nGet involved at: play0ad.com
+ >
+ WILDFIRE GAMES
+
@@ -527,9 +526,9 @@
ghost="true"
size="50%-128 100%-36 50%+128 100%"
>
-
+
+ this.caption = sprintf("Build: %(buildDate)s - %(buildDetails)s", { buildDate: buildTime(0), buildDetails: buildTime(2) });
+
Index: binaries/data/mods/public/po/gl.public.po
===================================================================
--- binaries/data/mods/public/po/gl.public.po (revision 0)
+++ binaries/data/mods/public/po/gl.public.po (working copy)
@@ -0,0 +1,140 @@
+# Adrián Chaves Fernández , 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2013-05-29 08:24+0200\n"
+"PO-Revision-Date: 2013-05-29 08:35+0200\n"
+"Last-Translator: Adrián Chaves Fernández \n"
+"Language-Team: Galician \n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Lokalize 1.5\n"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:343
+msgid "Learn To Play"
+msgstr "Aprender a xogar"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:344
+msgid "The 0 A.D. Game Manual"
+msgstr "Manual do xogo."
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:360
+msgid "Single Player"
+msgstr "Un xogador"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:361
+msgid "Challenge the computer player to a single player match."
+msgstr "Xoga unha partida contra a intelixencia artificial."
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:375
+msgid "Multiplayer"
+msgstr "Varios xogadores"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:376
+msgid "Fight against one or more human players in a multiplayer game."
+msgstr "Xoga contra outras persoas."
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:390
+msgid "Tools & Options"
+msgstr "Ferramentas e opcións"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:391
+msgid "Game options and scenario design tools."
+msgstr "Opcións do xogo e ferramentas de deseño de escenarios."
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:405
+msgid "History"
+msgstr "Historia"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:406
+msgid "Learn about the many civilizations featured in 0 A.D."
+msgstr "Infórmate sobre as civilizacións do xogo."
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:422
+msgid "Exit"
+msgstr "Saír"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:423
+msgid "Exit Game"
+msgstr "Saír do xogo."
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:450
+msgid ""
+"[font=\"serif-bold-16\"]Alpha XIII: Magadha[/font]\\n\\nWARNING: This is an "
+"early development version of the game. Many features have not been added yet."
+"\\n\\nGet involved at: play0ad.com"
+msgstr ""
+"[font=\"serif-bold-16\"]Alfa XIII: Magadha[/font]\\n"
+"\\n"
+"Advertencia: Esta versión do xogo aínda está en pleno desenvolvemento. Queda "
+"moito por facer.\\n"
+"\\n"
+"Colabora: play0ad.com"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:459
+msgid "Website"
+msgstr "Sitio web"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:460
+msgid "Click to open play0ad.com in your web browser."
+msgstr "Preme aquí para abrir play0ad.com nun navegador web."
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:473
+msgid "Chat"
+msgstr "Conversa"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:474
+msgid ""
+"Click to open the 0 A.D. IRC chat in your browser. (#0ad on webchat.quakenet."
+"org)"
+msgstr ""
+"Preme aquí para abrir una xanela de conversa IRC de 0 A.D. nun navegador web "
+"(#0ad en webchat.quakenet.org)."
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:487
+msgid "Report a Bug"
+msgstr "Informar dun erro"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:488
+msgid "Click to visit 0 A.D. Trac to report a bug, crash, or error"
+msgstr ""
+"Preme aquí para visitar o sitio Trac de 0 A.D., no que poderás informar dun "
+"erro, fallo ou quebra."
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:518
+msgid "WILDFIRE GAMES"
+msgstr "WILDFIRE GAMES"
+
+#. (itstool) path: action/localize
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:530
+msgid "Build: %(buildDate)s - %(buildDetails)s"
+msgstr "Versión: %(buildDate)s (%(buildDetails)s)"
+
+#~ msgid "Alpha XIII: Magadha"
+#~ msgstr "Alfa XIII: Magadha"
+
+#~ msgid "Get involved at: play0ad.com"
+#~ msgstr "Axúdanos: play0ad.com"
Index: binaries/data/mods/public/po/public.pot
===================================================================
--- binaries/data/mods/public/po/public.pot (revision 0)
+++ binaries/data/mods/public/po/public.pot (working copy)
@@ -0,0 +1,116 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2013-06-15 21:58+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:343
+msgid "Learn To Play"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:344
+msgid "The 0 A.D. Game Manual"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:360
+msgid "Single Player"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:361
+msgid "Challenge the computer player to a single player match."
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:375
+msgid "Multiplayer"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:376
+msgid "Fight against one or more human players in a multiplayer game."
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:390
+msgid "Tools & Options"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:391
+msgid "Game options and scenario design tools."
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:405
+msgid "History"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:406
+msgid "Learn about the many civilizations featured in 0 A.D."
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:422
+msgid "Exit"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:423
+msgid "Exit Game"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:450
+msgid "[font=\"serif-bold-16\"]Alpha XIII: Magadha[/font]\\n\\nWARNING: This is an early development version of the game. Many features have not been added yet.\\n\\nGet involved at: play0ad.com"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:459
+msgid "Website"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:460
+msgid "Click to open play0ad.com in your web browser."
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:473
+msgid "Chat"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:474
+msgid "Click to open the 0 A.D. IRC chat in your browser. (#0ad on webchat.quakenet.org)"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:487
+msgid "Report a Bug"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:488
+msgid "Click to visit 0 A.D. Trac to report a bug, crash, or error"
+msgstr ""
+
+#. (itstool) path: object/localizableAttribute
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:518
+msgid "WILDFIRE GAMES"
+msgstr ""
+
+#. (itstool) path: action/localize
+#: binaries/data/mods/public/gui/pregame/mainmenu.xml:530
+msgid "Build: %(buildDate)s - %(buildDetails)s"
+msgstr ""
+
Index: build/premake/extern_libs4.lua
===================================================================
--- build/premake/extern_libs4.lua (revision 13483)
+++ build/premake/extern_libs4.lua (working copy)
@@ -567,6 +567,22 @@
end
end,
},
+ tinygettext = {
+ compile_settings = function()
+ if not _OPTIONS["with-system-tinygettext"] then
+ includedirs { libraries_source_dir .. "tinygettext" }
+ end
+ end,
+ link_settings = function()
+ if not _OPTIONS["with-system-tinygettext"] then
+ add_source_lib_paths("tinygettext")
+ end
+ add_default_links({
+ win_names = { "tinygettext" },
+ unix_names = { "tinygettext" },
+ })
+ end,
+ },
valgrind = {
compile_settings = function()
add_source_include_paths("valgrind")
Index: build/premake/premake4.lua
===================================================================
--- build/premake/premake4.lua (revision 13483)
+++ build/premake/premake4.lua (working copy)
@@ -13,6 +13,7 @@
newoption { trigger = "with-system-nvtt", description = "Search standard paths for nvidia-texture-tools library, instead of using bundled copy" }
newoption { trigger = "with-system-enet", description = "Search standard paths for libenet, instead of using bundled copy" }
newoption { trigger = "with-system-mozjs185", description = "Search standard paths for libmozjs185, instead of using bundled copy" }
+newoption { trigger = "with-system-tinygettext", description = "Search standard paths for tinygettext, instead of using bundled copy" }
newoption { trigger = "sysroot", description = "Set compiler system root path, used for building against a non-system SDK. For example /usr/local becomes SYSROOT/user/local" }
newoption { trigger = "macosx-version-min", description = "Set minimum required version of the OS X API, the build will possibly fail if an older SDK is used, while newer API functions will be weakly linked (i.e. resolved at runtime)" }
newoption { trigger = "macosx-bundle", description = "Enable OSX bundle, the argument is the bundle identifier string (e.g. com.wildfiregames.0ad)" }
@@ -622,7 +623,8 @@
"spidermonkey",
"sdl", -- key definitions
"opengl",
- "boost"
+ "boost",
+ "tinygettext",
}
setup_static_lib_project("gui", source_dirs, extern_libs, {})
@@ -653,6 +655,7 @@
"libjpg",
"valgrind",
"cxxtest",
+ "tinygettext",
}
-- CPU architecture-specific
@@ -743,6 +746,7 @@
"cxxtest",
"comsuppw",
"enet",
+ "tinygettext",
"libcurl",
"valgrind",
Index: build/workspaces/update-workspaces.sh
===================================================================
--- build/workspaces/update-workspaces.sh (revision 13483)
+++ build/workspaces/update-workspaces.sh (working copy)
@@ -37,6 +37,7 @@
with_system_nvtt=false
with_system_enet=false
with_system_mozjs185=false
+with_system_tinygettext=false
enable_atlas=true
for i in "$@"
@@ -46,6 +47,7 @@
--with-system-nvtt ) with_system_nvtt=true; premake_args="${premake_args} --with-system-nvtt" ;;
--with-system-enet ) with_system_enet=true; premake_args="${premake_args} --with-system-enet" ;;
--with-system-mozjs185 ) with_system_mozjs185=true; premake_args="${premake_args} --with-system-mozjs185" ;;
+ --with-system-tinygettext ) with_system_tinygettext=true; premake_args="${premake_args} --with-system-tinygettext" ;;
--enable-atlas ) enable_atlas=true ;;
--disable-atlas ) enable_atlas=false ;;
-j* ) JOBS=$i ;;
@@ -91,6 +93,10 @@
(cd ../../libraries/source/enet && MAKE=${MAKE} JOBS=${JOBS} ./build.sh) || die "ENet build failed"
fi
echo
+ if [ "$with_system_tinygettext" = "false" ]; then
+ (cd ../../libraries/source/tinygettext && JOBS=${JOBS} ./build.sh) || die "TinyGettext build failed"
+ fi
+ echo
fi
# Now build premake and run it to create the makefiles
Index: libraries/LICENSE.txt
===================================================================
--- libraries/LICENSE.txt (revision 13483)
+++ libraries/LICENSE.txt (working copy)
@@ -23,6 +23,9 @@
source/spidermonkey
MPL / GPL / LGPL
+ source/tinygettext
+ GNU GPL v2 (see COPYING)
+
source/valgrind
BSD
Index: libraries/source/tinygettext/CMakeLists.txt
===================================================================
--- libraries/source/tinygettext/CMakeLists.txt (revision 0)
+++ libraries/source/tinygettext/CMakeLists.txt (working copy)
@@ -0,0 +1,177 @@
+#
+# TinyGetText build script
+# Copyright (C) 2006 Christoph Sommer
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+
+#
+# INSTRUCTIONS:
+# -------------
+#
+# Create a directory build/ and change to it. Run
+#
+# cmake ..
+#
+# This creates a set of Makefiles to build the project. Run
+#
+# make
+#
+
+
+CMAKE_POLICY(SET CMP0005 NEW)
+
+## Project name to use as command prefix
+
+PROJECT(tinygettext)
+SET(VERSION "0.1")
+
+### CMake configuration
+
+CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
+IF(COMMAND cmake_policy)
+ CMAKE_POLICY(SET CMP0003 NEW)
+ENDIF(COMMAND cmake_policy)
+SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${tinygettext_SOURCE_DIR})
+
+# move some config clutter to the advanced section
+MARK_AS_ADVANCED(
+ CMAKE_BACKWARDS_COMPATIBILITY
+ CMAKE_BUILD_TYPE
+ CMAKE_INSTALL_PREFIX
+ EXECUTABLE_OUTPUT_PATH
+ CMAKE_OSX_ARCHITECTURES
+ CMAKE_OSX_SYSROOT
+)
+
+## Reveal library type choice to users
+OPTION(BUILD_SHARED_LIBS "Produce dynamic library instead of static archive" ON)
+
+## Add iconv to include directories
+
+FIND_PACKAGE(ICONV REQUIRED)
+INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR})
+
+## Check iconv_const
+
+INCLUDE(CheckCXXSourceCompiles)
+
+SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${ICONV_INCLUDE_DIR})
+CHECK_CXX_SOURCE_COMPILES(
+ "
+ #include
+ // this declaration will fail when there already exists a non const char** version which returns size_t
+ double iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
+ int main() { return 0; }
+ "
+ HAVE_ICONV_CONST
+)
+
+# TODO: better way of config
+
+IF(HAVE_ICONV_CONST)
+ ADD_DEFINITIONS(-DHAVE_ICONV_CONST)
+ELSE(HAVE_ICONV_CONST)
+ REMOVE_DEFINITIONS(-DHAVE_ICONV_CONST)
+ENDIF(HAVE_ICONV_CONST)
+
+## TinyGetText library compilation
+
+## build list of source files
+
+FILE(GLOB TINYGETTEXT_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tinygettext/*.cpp)
+FILE(GLOB TINYGETTEXT_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tinygettext/*.hpp)
+
+## define a target for building the library
+
+ADD_LIBRARY(tinygettext ${TINYGETTEXT_SOURCES})
+
+## Add tinygettext dir to search path
+
+INCLUDE_DIRECTORIES(${tinygettext_SOURCE_DIR})
+
+## Debug options
+
+OPTION(WERROR "Stops on first compiler warning in debug mode" OFF)
+IF(CMAKE_COMPILER_IS_GNUCC)
+ ADD_DEFINITIONS(-O3 -Wall -Wextra -Weffc++ -pedantic)
+ # -ansi fails in MinGW
+ OPTION(WARNINGS "Enable long list of warnings for compiler to check" ON)
+ IF(WARNINGS)
+ ADD_DEFINITIONS(
+ -Wabi -Wctor-dtor-privacy
+ -Wstrict-null-sentinel
+ -Wold-style-cast
+ -Woverloaded-virtual
+ -Wsign-promo -Wswitch-enum
+ -Wcast-align -Wcast-qual
+ -Wdisabled-optimization
+ -Wfloat-equal
+ -Wformat=2
+ -Winit-self
+ -Winvalid-pch -Wunsafe-loop-optimizations
+ -Wlogical-op
+ -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn
+ -Wpacked
+ -Wredundant-decls
+ -Wshadow
+ -Wsign-conversion -Wstack-protector
+ -Wstrict-overflow=5
+ -Wswitch-default -Wswitch-enum
+ -Wundef)
+ # Still left:
+ # -Wconversion (find alternative to using toupper(int) on char)
+ # -Wpadded (DictionaryManager has a bool that sticks out)
+ ENDIF(WARNINGS)
+ IF(WERROR)
+ ADD_DEFINITIONS(-Werror)
+ ENDIF(WERROR)
+ENDIF(CMAKE_COMPILER_IS_GNUCC)
+
+## Extra definitions
+
+ADD_DEFINITIONS(-DVERSION=\\\"${VERSION}\\\")
+
+## Generate test executables in the right place
+
+SET(EXECUTABLE_OUTPUT_PATH ${tinygettext_BINARY_DIR}/test)
+
+## Build tinygettext tests
+
+FOREACH(TEST tinygettext_test po_parser_test)
+ ## Add target for tinygettext test
+ ADD_EXECUTABLE(${TEST} test/${TEST}.cpp)
+ ## Link with tinygettext library
+ TARGET_LINK_LIBRARIES(${TEST} tinygettext)
+ TARGET_LINK_LIBRARIES(${TEST} ${ICONV_LIBRARY})
+ENDFOREACH(TEST)
+
+## Install tinygettext
+
+# use standardized variable name
+SET(LIB_SUBDIR "lib${LIB_SUFFIX}"
+ CACHE STRING "Subdirectory of prefix into which libraries are installed (e.g., lib32, lib64)")
+
+## prepare tinygettext.pc
+CONFIGURE_FILE(tinygettext.pc.in tinygettext.pc @ONLY)
+
+INSTALL(TARGETS tinygettext
+ ARCHIVE DESTINATION ${LIB_SUBDIR}
+ LIBRARY DESTINATION ${LIB_SUBDIR})
+INSTALL(FILES ${TINYGETTEXT_HEADERS}
+ DESTINATION include/tinygettext)
+INSTALL(FILES ${tinygettext_BINARY_DIR}/tinygettext.pc
+ DESTINATION ${LIB_SUBDIR}/pkgconfig)
Index: libraries/source/tinygettext/COPYING
===================================================================
--- libraries/source/tinygettext/COPYING (revision 0)
+++ libraries/source/tinygettext/COPYING (working copy)
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ tinygettext - A gettext replacement that works directly on .po files
+ Copyright (C) 2006 Ingo Ruhnke
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
Index: libraries/source/tinygettext/FindICONV.cmake
===================================================================
--- libraries/source/tinygettext/FindICONV.cmake (revision 0)
+++ libraries/source/tinygettext/FindICONV.cmake (working copy)
@@ -0,0 +1,100 @@
+#
+# Copyright (c) 2006, Peter Kmmel,
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
+
+if (ICONV_INCLUDE_DIR)
+ # Already in cache, be silent
+ set(ICONV_FIND_QUIETLY TRUE)
+endif()
+
+find_path(ICONV_INCLUDE_DIR iconv.h
+ /usr/include
+ /usr/local/include)
+
+set(POTENTIAL_ICONV_LIBS iconv libiconv libiconv2)
+
+find_library(ICONV_LIBRARY NAMES ${POTENTIAL_ICONV_LIBS}
+ PATHS /usr/lib /usr/local/lib)
+
+if(WIN32)
+ set(ICONV_DLL_NAMES iconv.dll libiconv.dll libiconv2.dll)
+ find_file(ICONV_DLL
+ NAMES ${ICONV_DLL_NAMES}
+ PATHS ENV PATH
+ NO_DEFAULT_PATH)
+ find_file(ICONV_DLL_HELP
+ NAMES ${ICONV_DLL_NAMES}
+ PATHS ENV PATH
+ ${ICONV_INCLUDE_DIR}/../bin)
+ if(ICONV_FIND_REQUIRED)
+ if(NOT ICONV_DLL AND NOT ICONV_DLL_HELP)
+ message(FATAL_ERROR "Could not find iconv.dll, please add correct your PATH environment variable")
+ endif()
+ if(NOT ICONV_DLL AND ICONV_DLL_HELP)
+ get_filename_component(ICONV_DLL_HELP ${ICONV_DLL_HELP} PATH)
+ message(STATUS)
+ message(STATUS "Could not find iconv.dll in standard search path, please add ")
+ message(STATUS "${ICONV_DLL_HELP}")
+ message(STATUS "to your PATH environment variable.")
+ message(STATUS)
+ message(FATAL_ERROR "exit cmake")
+ endif()
+ endif()
+ if(ICONV_INCLUDE_DIR AND ICONV_LIBRARY AND ICONV_DLL)
+ set(ICONV_FOUND TRUE)
+ endif()
+else()
+ include(CheckFunctionExists)
+ check_function_exists(iconv HAVE_ICONV_IN_LIBC)
+ if(ICONV_INCLUDE_DIR AND HAVE_ICONV_IN_LIBC)
+ set(ICONV_FOUND TRUE)
+ set(ICONV_LIBRARY CACHE TYPE STRING FORCE)
+ endif()
+ if(ICONV_INCLUDE_DIR AND ICONV_LIBRARY)
+ set(ICONV_FOUND TRUE)
+ endif()
+endif()
+
+
+
+if(ICONV_FOUND)
+ if(NOT ICONV_FIND_QUIETLY)
+ message(STATUS "Found iconv library: ${ICONV_LIBRARY}")
+ #message(STATUS "Found iconv dll : ${ICONV_DLL}")
+ endif()
+else()
+ if(ICONV_FIND_REQUIRED)
+ message(STATUS "Looked for iconv library named ${POTENTIAL_ICONV_LIBS}.")
+ message(STATUS "Found no acceptable iconv library. This is fatal.")
+ message(STATUS "iconv header: ${ICONV_INCLUDE_DIR}")
+ message(STATUS "iconv lib : ${ICONV_LIBRARY}")
+ message(FATAL_ERROR "Could NOT find iconv library")
+ endif()
+endif()
+
+mark_as_advanced(ICONV_LIBRARY ICONV_INCLUDE_DIR)
Index: libraries/source/tinygettext/NEWS
===================================================================
--- libraries/source/tinygettext/NEWS (revision 0)
+++ libraries/source/tinygettext/NEWS (working copy)
@@ -0,0 +1,6 @@
+tinygettext 0.0.1 - (??. Feb 2009)
+==================================
+
+* initial release
+
+# EOF #
Index: libraries/source/tinygettext/README
===================================================================
--- libraries/source/tinygettext/README (revision 0)
+++ libraries/source/tinygettext/README (working copy)
@@ -0,0 +1,21 @@
+tinygettext
+===========
+
+tinygettext is a minimal gettext() replacement written in C++. It can
+read .po files directly and doesn't need .mo files generated from .po.
+It also can read the .po files from arbitary locations, so its much
+better suited for non-Unix systems and situations in which one wants
+to store or distrubite .po files seperatly from the software itself.
+
+
+
+Detecting the locale setting
+============================
+
+Different operating systems store the default locale in different
+places; a portable way to find it is provided by FindLocale:
+
+ * http://icculus.org/~aspirin/findlocale/
+
+
+# EOF #
Index: libraries/source/tinygettext/SConstruct
===================================================================
--- libraries/source/tinygettext/SConstruct (revision 0)
+++ libraries/source/tinygettext/SConstruct (working copy)
@@ -0,0 +1,37 @@
+# -*- python -*-
+
+env = Environment(CXXFLAGS=['-O0',
+ '-g3',
+ '-Wall',
+ '-Wcast-qual',
+ '-Wconversion',
+ '-Weffc++',
+ '-Werror',
+ '-Wextra',
+ '-Winit-self',
+ '-Wno-unused-parameter',
+ '-Wnon-virtual-dtor',
+ '-Wshadow',
+ '-ansi',
+ '-pedantic',
+ ],
+ CPPPATH=['tinygettext', '.'])
+
+# env.ParseConfig("sdl-config --cflags --libs")
+# env['CPPDEFINES'] += HAVE_SDL
+
+libtinygettext = env.SharedLibrary('tinygettext/tinygettext',
+ ['tinygettext/tinygettext.cpp',
+ 'tinygettext/language.cpp',
+ 'tinygettext/plural_forms.cpp',
+ 'tinygettext/dictionary.cpp',
+ 'tinygettext/dictionary_manager.cpp',
+ 'tinygettext/unix_file_system.cpp',
+ 'tinygettext/po_parser.cpp',
+ 'tinygettext/iconv.cpp',
+ 'tinygettext/log.cpp'])
+
+env.Program('test/tinygettext_test', ['test/tinygettext_test.cpp', libtinygettext])
+env.Program('test/po_parser_test', ['test/po_parser_test.cpp', libtinygettext])
+
+# EOF #
Index: libraries/source/tinygettext/TODO
===================================================================
--- libraries/source/tinygettext/TODO (revision 0)
+++ libraries/source/tinygettext/TODO (working copy)
@@ -0,0 +1,76 @@
+tinygettext API related stuff:
+==============================
+
+* translate, translate_ctxt, translate_ctxt_plural, ... could be
+ unified via overloading, not sure if that is a good idea. For the
+ same reason add_translation() could be de-overloaded, to
+ add_translation_ctxt, ...
+
+* iconv handling needs cleanup and more flexibility, since some
+ systems don't provide iconv or only through SDL
+
+* Customizability could use grouping and documentation or other means
+ to make it more obvious:
+
+ - POParser::pedantic
+ - iconv (???)
+ - logging (log_callback(std::string))
+
+* handle errors better, not with log_* stream, cases of errors:
+
+ - couldn't translate
+ - collision while adding translation
+ - failure to open file or directory
+ - unknown language
+ - iconv failure to convert charset
+
+* ABI management/freezing. If tinygettext is to benefit other projects,
+ it should be able to provide a stable API (and, better, ABI).
+
+
+tinygettext implementation details:
+===================================
+
+* with PluralForms moved into Dictionary a lot of the Langugae stuff
+ is pointless
+
+* get rid of goto
+
+* POParser can handle Big5, but needs testing.
+ Big5 is one byte for ASCII letters and two bytes for chinese ones,
+ this means some two byte characters collide with '\', some .po files
+ seem to escape the \ properly so that the string can be read as
+ usual, while others don't.
+
+* _() -> getext() (gettext default)
+ N_(id) -> gettext_noop(id) (gettext default)
+ C_(ctxt, id) -> pgettext(ctxt, id) (Gnome does this: http://library.gnome.org/devel/glib/2.16/glib-I18N.html#Q-:CAPS)
+ NC_(ctxt, id) -> pgettext(ctxt, id) (Gnome does this: http://library.gnome.org/devel/glib/2.16/glib-I18N.html#Q-:CAPS)
+
+* figure out how up-to-date other tinygettext implementations in the
+ wild are (LinCity):
+
+ Pingus:
+ -------
+ dictionary.hpp (synced with Pingus)
+ dictionary_manager.hpp (PhysFS vs opendir())
+ language_def.hpp (synced with Pingus)
+ po_file_reader.hpp (UTF-8 0xef-'header', lots of stuff from mathner)
+ tinygettext.hpp (iconv vs convert)
+
+
+Random Unimportant Stuff
+========================
+
+* a hashmap instead of std::map might be a good idea
+
+* support for .gmo files would be cool
+
+tinygettext Documentation:
+==========================
+
+* recommend a way to handle translation of speech and other data files
+
+* document how to use tinygettext and make it work like gettext
+
+# EOF #
Index: libraries/source/tinygettext/build.sh
===================================================================
--- libraries/source/tinygettext/build.sh (revision 0)
+++ libraries/source/tinygettext/build.sh (working copy)
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+set -e
+
+JOBS=${JOBS:="-j2"}
+
+echo "Building TinyGettext…"
+echo
+
+scons ${JOBS}
+
+mkdir -p lib/
+
+if [ "`uname -s`" = "Darwin" ]
+then
+ extension=dylib
+else
+ extension=so
+fi
+
+filepath=tinygettext/libtinygettext.${extension}
+cp $filepath lib/
+cp $filepath ../../../binaries/system/
Property changes on: libraries/source/tinygettext/build.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: libraries/source/tinygettext/test/broken.po
===================================================================
--- libraries/source/tinygettext/test/broken.po (revision 0)
+++ libraries/source/tinygettext/test/broken.po (working copy)
@@ -0,0 +1,57 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-01-30 08:01+0100\n"
+"PO-Revision-Date: 2009-01-30 08:39+0100\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: helloworld.cpp:7
+msgid "Short Hello World"
+msgstr "kurzes Hallo Welt
+
+#: helloworld.cpp:8 helloworld.cpp:14
+#, fuzzy
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] "Hallo Welt (singular)"
+msgstr[1] "Hallo Welt (plural)"
+msgstr[10] "Hallo Welt (plural)"
+
+#: helloworld.cpp:10 helloworld.cpp:16
+#, fuzzy
+msgctxt ""
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] Hallo Welt (singular) mit leerem Kontext"
+msgstr[1] "Hallo Welt (plural) mit leerem Kontext"
+
+#: helloworld.cpp:11 helloworld.cpp:17
+msgctxt "console"
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0]"Hallo Welt (singular) in der Console"
+msgstr[1] "Hallo Welt (plural) in der Console"
+
+#: helloworld.cpp:13
+msgid "gui"
+msgid_plural "Hello World"
+msgstr[0] "Hallo Welt (singular)"
+msgstr[1] "Hallo Welt (plural)"
+
+#: helloworld.cpp:18
+#, fuzzy
+msgctxt "gui"
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] "Hallo Welt im GUI"
+msgstr[1] "Hallo Welt (plural) im GUI"
Index: libraries/source/tinygettext/test/game/de.po
===================================================================
--- libraries/source/tinygettext/test/game/de.po (revision 0)
+++ libraries/source/tinygettext/test/game/de.po (working copy)
@@ -0,0 +1,1040 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Pingus 0.6.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2004-04-09 18:37+0000\n"
+"PO-Revision-Date: 2003-04-15 17:31+0200\n"
+"Last-Translator: David Philippi \n"
+"Language-Team: David Philippi , Ingo Ruhnke , Giray Devlet \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/actions/bridger.cxx:48 src/actions/bridger.cxx:232
+#: src/pingu_enums.cxx:40
+msgid "Bridger"
+msgstr "Bridger"
+
+#: src/config.cxx:73
+msgid "Couldn't open: "
+msgstr "Datei oder Verzeichnis konnte nicht geffnet werden: "
+
+#: src/config.cxx:172
+msgid "Unexpected char: '"
+msgstr "Unerwartetes Zeichen: '"
+
+#: src/config.cxx:206
+msgid "Unexpected char '"
+msgstr "Unerwartetes Zeichen: '"
+
+#: src/credits.cxx:48
+msgid "-Idea"
+msgstr "-Idee"
+
+#: src/credits.cxx:52
+msgid "-Maintaining"
+msgstr "-Verwaltung"
+
+#: src/credits.cxx:56
+msgid "-Programming"
+msgstr "-Programmierung"
+
+#: src/credits.cxx:62
+msgid "-Porting (Win32)"
+msgstr "-Portierung (Win32)"
+
+#: src/credits.cxx:70
+msgid "-Gfx"
+msgstr "-Grafiken"
+
+#: src/credits.cxx:82
+msgid "-Music"
+msgstr "-Musik"
+
+#: src/credits.cxx:88
+msgid "-Level Design"
+msgstr "-Level Design"
+
+#: src/credits.cxx:93
+msgid "-Story"
+msgstr "-Geschichte"
+
+#: src/credits.cxx:97
+msgid "-Translation"
+msgstr "-bersetzung"
+
+#: src/credits.cxx:112
+msgid "-Special"
+msgstr "-Besonderen"
+
+#: src/credits.cxx:113
+msgid "-Thanks to"
+msgstr "-Dank an"
+
+#: src/credits.cxx:154
+msgid "_And a very Special Thanks"
+msgstr "_Und einen besonderen Dank"
+
+#: src/credits.cxx:155
+msgid "_to all the people who"
+msgstr "_an alle Leute die"
+
+#: src/credits.cxx:156
+msgid "_contribute to"
+msgstr "_an Freier Software"
+
+#: src/credits.cxx:157
+msgid "_Free Software!"
+msgstr "_mitarbeiten!"
+
+#: src/credits.cxx:163
+msgid "_Thank you for"
+msgstr "_Dankeschn frs"
+
+#: src/credits.cxx:164
+msgid "_playing!"
+msgstr "_spielen!"
+
+#: src/editor/editor_event.cxx:588
+msgid "Enter filename to save as:"
+msgstr "Datei speichern als: "
+
+#: src/editor/editor_help_screen.cxx:43
+msgid "Editor Helpscreen (hide with F1)"
+msgstr "Editor Hilfe (ausblenden mit F1)"
+
+#: src/editor/editor_help_screen.cxx:51
+msgid "F1 - show/hide this help screen"
+msgstr "F1 - Hilfe anzeigen/verstecken"
+
+#: src/editor/editor_help_screen.cxx:52
+msgid "F2 - launch level building tutorial"
+msgstr "F2 - Starte Levelbau Tutorial"
+
+#: src/editor/editor_help_screen.cxx:53
+msgid "F3 - toggle background color"
+msgstr "F3 - Hintergrundfarbe aendern"
+
+#: src/editor/editor_help_screen.cxx:54
+msgid "F4 - play/test the level"
+msgstr "F4 - Level starten/testen"
+
+#: src/editor/editor_help_screen.cxx:55
+msgid "F5 - load a level"
+msgstr "Level Laden (F5)"
+
+#: src/editor/editor_help_screen.cxx:56
+msgid "F6 - save this level"
+msgstr "Level Speichern (F6)"
+
+#: src/editor/editor_help_screen.cxx:57
+msgid "F7 - [unset]"
+msgstr "F7 - [nicht belegt]"
+
+#: src/editor/editor_help_screen.cxx:58
+msgid "F8 - quick save/backup save?!"
+msgstr "F8 - Schnellspeichern/Backup"
+
+#: src/editor/editor_help_screen.cxx:59
+msgid "F9 - change level width and height"
+msgstr "F9 - Level Hhe und Breite ndern"
+
+#: src/editor/editor_help_screen.cxx:60
+msgid "F10 - [unset]"
+msgstr "F10 - [nicht belegt]"
+
+#: src/editor/editor_help_screen.cxx:61
+msgid "F11 - toggle fps counter"
+msgstr "F11 - fps Zhler an/aus"
+
+#: src/editor/editor_help_screen.cxx:62
+msgid "F12 - make screenshot"
+msgstr "F12 - Screenshot erstellen"
+
+#: src/editor/editor_help_screen.cxx:66
+msgid "Home - increase object size"
+msgstr "Einfg - Objekt vergrern"
+
+#: src/editor/editor_help_screen.cxx:67
+msgid "End - decrease object size"
+msgstr "Ende - Objekt verkleinern"
+
+#: src/editor/editor_help_screen.cxx:68
+msgid "Cursor Keys - Move object"
+msgstr "Cursor Tasten - Objekt bewegen"
+
+#: src/editor/editor_help_screen.cxx:69
+msgid "Shift 'Cursor Keys' - Move objects fast "
+msgstr "Shift Cursor Tasten - Objekt schneller bewegen"
+
+#: src/editor/editor_help_screen.cxx:70
+msgid "PageUp - level object up"
+msgstr "Bild rauf - Objekt nach oben"
+
+#: src/editor/editor_help_screen.cxx:71
+msgid "PageDown - level object down"
+msgstr "Bild runter - Objekt nach unten"
+
+#: src/editor/editor_help_screen.cxx:72
+msgid "Shift PageUp - increase objects z-pos by 50"
+msgstr "Shift Bild rauf - Objekt nach oben"
+
+#: src/editor/editor_help_screen.cxx:73
+msgid "Shift PageDown - decrease objects z-pos by 50"
+msgstr "Shift Bild runter - Objekt nach unten"
+
+#: src/editor/editor_help_screen.cxx:74
+msgid "Enter - Set default zoom (1:1)"
+msgstr "Eingabe - Setze Standard Zoom (1:1)"
+
+#: src/editor/editor_help_screen.cxx:75
+msgid "d - duplicate object"
+msgstr "d - Objekt kopieren"
+
+#: src/editor/editor_help_screen.cxx:76
+msgid "a - mark all objects"
+msgstr "a - Alle Objekte markieren"
+
+#: src/editor/editor_help_screen.cxx:77
+msgid "shift leftmouseclick - add object to selection"
+msgstr "Shift + linke Maustaste - Objekt zur Auswahl tun"
+
+#: src/editor/editor_help_screen.cxx:78
+msgid "leftmouseclick - select object"
+msgstr "linke Maustaste - Objekt auswhlen"
+
+#: src/editor/editor_help_screen.cxx:79
+msgid "Insert - insert new object"
+msgstr "Einfgen - neues Objekt einfgen"
+
+#: src/editor/editor_help_screen.cxx:80
+msgid "Remove - remove selected object"
+msgstr "Entfernen - entferne ausgewhltes Objekt"
+
+#: src/editor/editor_help_screen.cxx:81
+msgid "g - ungroup/group current selection"
+msgstr "g - Auswahl gruppieren / Gruppierung aufheben"
+
+#: src/editor/editor_help_screen.cxx:82
+msgid "Ctrl PageUp - increase objects z-pos by 1"
+msgstr "Strg Bild rauf - z-pos des Objekts um 1 erhhen"
+
+#: src/editor/editor_help_screen.cxx:83
+msgid "Ctrl PageDown - decrease objects z-pos by 1"
+msgstr "Strg Bild runter - z-pos des Objekts um 1 senken"
+
+#: src/editor/editor_help_screen.cxx:89
+msgid "Naming Convention: -.plf"
+msgstr "Dateinamensvorgabe: -.pfl"
+
+#: src/editor/editor_help_screen.cxx:91
+msgid ""
+"When you have created a level and want to have it in the next Pingus "
+"release,\n"
+"please mail it to pingus-devel@nongnu.org."
+msgstr ""
+"Falls Du einen Level erstellt hast und ihn gerne im nchsten Pingus\n"
+"Release httest, schicke ihn an pingus-devel@nongnu.org."
+
+#: src/editor/object_selector.cxx:106
+msgid "1 - guillotine"
+msgstr "1 - Guillotine"
+
+#: src/editor/object_selector.cxx:107
+msgid "2 - hammer"
+msgstr "2 - Hammer"
+
+#: src/editor/object_selector.cxx:108
+msgid "3 - spike"
+msgstr "3 - Stacheln"
+
+#: src/editor/object_selector.cxx:109
+msgid "4 - laser_exit"
+msgstr "4 - Laser Ausgang"
+
+#: src/editor/object_selector.cxx:110
+msgid "5 - fake_exit"
+msgstr "5 - Tusch Ausgang"
+
+#: src/editor/object_selector.cxx:111
+msgid "6 - smasher"
+msgstr "6 - Stampfer"
+
+#: src/editor/object_selector.cxx:112
+msgid "7 - bumper"
+msgstr "7 - Stosser"
+
+#: src/editor/object_selector.cxx:186
+msgid "Select a WorldObj"
+msgstr "Whle ein WeltObjekt"
+
+#: src/editor/object_selector.cxx:187
+msgid "1 - teleporter"
+msgstr "1 - Teleporter"
+
+#: src/editor/object_selector.cxx:188
+msgid "2 - switch and door"
+msgstr "2 - Schalter und Tr"
+
+#: src/editor/object_selector.cxx:189
+msgid "3 - ConveyorBelt"
+msgstr "3 - Frderband"
+
+#: src/editor/object_selector.cxx:190
+msgid "4 - IceBlock"
+msgstr "4 - Eisblock"
+
+#: src/editor/object_selector.cxx:191
+msgid "5 - InfoBox"
+msgstr "5 - InfoBox"
+
+#: src/editor/object_selector.cxx:232
+msgid "Select a weather"
+msgstr "Whle ein Wetter"
+
+#: src/editor/object_selector.cxx:233
+msgid "1 - snow"
+msgstr "1 - Schnee"
+
+#: src/editor/object_selector.cxx:234
+msgid "2 - rain"
+msgstr "2 - Regen"
+
+#: src/editor/object_selector.cxx:265
+msgid "Select an entrance"
+msgstr "Whle einen Eingang"
+
+#: src/editor/object_selector.cxx:266
+msgid "1 - generic"
+msgstr "1 - allgemein"
+
+#: src/editor/object_selector.cxx:267
+msgid "2 - woodthing"
+msgstr "2 - hlzern"
+
+#: src/editor/object_selector.cxx:268
+msgid "3 - cloud"
+msgstr "3 - Wolke"
+
+#: src/editor/object_selector.cxx:269
+msgid "h - entrance surface (hotspot)"
+msgstr "h - Eingangs Grafik (hotspot)"
+
+#: src/editor/object_selector.cxx:343
+msgid "What object type do you want?"
+msgstr "Was fr ein Objekt willst du?"
+
+#: src/editor/object_selector.cxx:344 src/editor/object_selector.cxx:400
+msgid "h - Hotspot"
+msgstr "h - Grafikelement (hotspot)"
+
+#: src/editor/object_selector.cxx:345
+msgid "g - Groundpiece (ground) [not implemented]"
+msgstr "g - Bodenstck (ground) [nicht implementiert]"
+
+#: src/editor/object_selector.cxx:394 src/editor/object_selector.cxx:562
+msgid "Which object do you want?"
+msgstr "Welches Objekt willst du?"
+
+#: src/editor/object_selector.cxx:395
+msgid "g - Groundpiece (ground)"
+msgstr "g - Bodenstck (ground)"
+
+#: src/editor/object_selector.cxx:396
+msgid "s - Groundpiece (solid)"
+msgstr "s - Bodenelement (Stahl)"
+
+#: src/editor/object_selector.cxx:397
+msgid "b - Groundpiece (bridge)"
+msgstr "b - Bodenelement (Bruecke)"
+
+#: src/editor/object_selector.cxx:398
+msgid "n - Groundpiece (transparent)"
+msgstr "n - Bodenelement (transparent)"
+
+#: src/editor/object_selector.cxx:399
+msgid "r - Groundpiece (remove)"
+msgstr "r - Bodenelement (entfernen)"
+
+#: src/editor/object_selector.cxx:401
+msgid "e - Entrance"
+msgstr "e - Eingang"
+
+#: src/editor/object_selector.cxx:402
+msgid "x - Exit"
+msgstr "x - Ausgang"
+
+#: src/editor/object_selector.cxx:403
+msgid "l - Liquid"
+msgstr "l - Flssigkeit"
+
+#: src/editor/object_selector.cxx:404
+msgid "w - Weather"
+msgstr "w - Wetter"
+
+#: src/editor/object_selector.cxx:405
+msgid "t - Traps"
+msgstr "t - Falle"
+
+#: src/editor/object_selector.cxx:406
+msgid "o - WorldObject"
+msgstr "o - WeltObjekt"
+
+#: src/editor/object_selector.cxx:407
+msgid "z - Background"
+msgstr "z - Hintergrund"
+
+#: src/editor/object_selector.cxx:408
+msgid "p - Prefab (ObjectGroup)"
+msgstr "p - Prefab (Objekt Gruppe)"
+
+#: src/editor/object_selector.cxx:409
+msgid "f - something from file (~/.pingus/images/)"
+msgstr "f - etwas aus einer Datei (~/.pingus/images/)"
+
+#: src/editor/object_selector.cxx:498
+msgid "Which prefab do you want?"
+msgstr "Welche Prefab willst du?"
+
+#: src/editor/object_selector.cxx:563
+msgid "1 - Surface Background"
+msgstr "1 - Bild Hintergrund"
+
+#: src/editor/object_selector.cxx:564
+msgid "2 - Solid Color Background"
+msgstr "2 - Farb Hintergrund"
+
+#: src/editor/object_selector.cxx:565
+msgid "3 - Starfield Background"
+msgstr "3 - Sternen Hintergrund"
+
+#: src/editor/object_selector.cxx:566
+msgid "4 - Thunderstorm Background"
+msgstr "4 - Gewitter Hintergrund"
+
+#: src/editor/panel_icons.cxx:33
+msgid "Load a level (F5)"
+msgstr "Level laden (F5)"
+
+#: src/editor/panel_icons.cxx:46
+msgid "Exit the editor (Escape)"
+msgstr "Editor Beenden (Esc)"
+
+#: src/editor/panel_icons.cxx:58
+msgid "Save this level (F6)"
+msgstr "Level Speichern (F6)"
+
+#: src/editor/panel_icons.cxx:70
+msgid "Delete marked objects (delete)"
+msgstr "Markierte Objekte Lschen (Entfernen)"
+
+#: src/editor/panel_icons.cxx:82
+msgid "Duplicate current object (d)"
+msgstr "Aktuelles Object kopieren (d)"
+
+#: src/editor/panel_icons.cxx:94
+msgid "Edit Level Properties"
+msgstr "Leveleigenschaften ndern"
+
+#: src/editor/panel_icons.cxx:106
+msgid "Edit Object Properties"
+msgstr "Objekteigenschaften ndern"
+
+#: src/editor/panel_icons.cxx:118
+msgid "Start the level and test it (F4)"
+msgstr "Level starten und testen (F4)"
+
+#: src/editor/panel_icons.cxx:130
+msgid "Create a new level from scratch"
+msgstr "Neuen Level erstellen"
+
+#: src/editor/panel_icons.cxx:142
+msgid "Insert an object (Insert)"
+msgstr "Objekt einfuegen (Einfg)"
+
+#: src/editor/panel_icons.cxx:154
+msgid "Zoom into a region"
+msgstr "Einen Bereich vergrssern"
+
+#: src/editor/panel_icons.cxx:166
+msgid "Zoom in"
+msgstr "Vergroessern"
+
+#: src/editor/panel_icons.cxx:179
+msgid "Zoom out"
+msgstr "Verkleinern"
+
+#: src/editor/panel_icons.cxx:192
+msgid "Setup Number of Actions"
+msgstr "Stelle die Anzahl der Fhigkeiten ein"
+
+#: src/editor/panel_icons.cxx:204
+msgid "Display Help Screen (F1)"
+msgstr "Hilfe Anzeigen (F1)"
+
+#: src/exit_menu.cxx:48
+msgid "Yes"
+msgstr "Ja"
+
+#: src/exit_menu.cxx:81
+msgid "No"
+msgstr "Nein"
+
+#: src/exit_menu.cxx:114
+msgid "Exit Pingus?"
+msgstr "Pingus beenden?"
+
+#: src/fps_counter.cxx:48
+msgid "unknown"
+msgstr "unbekannt"
+
+#: src/game_time.cxx:70
+msgid "unlimited"
+msgstr "unbegrenzt"
+
+#: src/level_desc.cxx:74
+msgid "Designed by "
+msgstr "Erstellt von "
+
+#: src/level_desc.cxx:79
+#, c-format
+msgid "Pingus to Save: %d"
+msgstr "Zu rettende Pingus: %d"
+
+#: src/level_desc.cxx:81
+#, c-format
+msgid "Number of Pingus: %d"
+msgstr "Anzahl an Pingus: %d"
+
+#: src/level_desc.cxx:86
+msgid "Loading..."
+msgstr "Ladevorgang luft..."
+
+#: src/level_desc.cxx:89
+msgid "Loading finished. Press a mouse button to start the level"
+msgstr ""
+"Ladevorgang abgeschlossen. Drcke eine Maus Taste um den Level zu starten"
+
+#: src/level_result.cxx:61
+msgid "Results:"
+msgstr "Ergebnisse:"
+
+#: src/level_result.cxx:67
+#, c-format
+msgid "Pingus saved: %3d/%3d"
+msgstr "Gerettete Pingus: %3d/%3d"
+
+#: src/level_result.cxx:72
+#, c-format
+msgid "Pingus died: %3d/%3d"
+msgstr "Tote Pingus: %3d/%3d"
+
+#: src/level_result.cxx:88
+msgid "Press button to continue..."
+msgstr "Knopf drcken um fortzufahren"
+
+#: src/level_result.cxx:102
+msgid ""
+"As many Pingus escaped as entered the level. That's going to be hard to "
+"beat.... unless this game becomes pornographic."
+msgstr ""
+"Es wurden alle Pingu dieses Levels gerettet. Das wird hart zu schlagen "
+"sein... es sei denn dieses Spiel wird pornographisch."
+
+#: src/level_result.cxx:104
+msgid "Very impressive indeed."
+msgstr "In der Tat sehr eindrucksvoll."
+
+#: src/level_result.cxx:106
+msgid "Good work. Still room for improvement though."
+msgstr "Gute Arbeit. Aber bung macht den Meiser!"
+
+#: src/level_result.cxx:108
+msgid "Not too shabby, not too shabby at all."
+msgstr "Nicht schlecht, nicht schlecht!"
+
+#: src/level_result.cxx:110
+msgid ""
+"That was OK, but Pingu life insurance premiums have just gotten more "
+"expensive."
+msgstr ""
+"Das war ok, aber die Lebensversicherungsprmien fr Pingus sind gerade "
+"gestiegen."
+
+#: src/level_result.cxx:112
+msgid "Maybe this level calls for a different strategy."
+msgstr "Mglicherweise verlangt dieser Level eine andere Strategie."
+
+#: src/level_result.cxx:114
+msgid "Exactly half. Are you saving only the female ones?"
+msgstr "Genau die Hlfte! Rettest du nur die Weibchen?"
+
+#: src/level_result.cxx:116
+msgid "If I were a Pingu, I never would have left that entrance."
+msgstr "Wenn ich ein Pingu wre, htte ich den Eingang nie verlassen."
+
+#: src/level_result.cxx:118
+msgid "Maybe you would feel more at home playing Quake."
+msgstr "Mglicherweise wre es besser Quake zu spielen?"
+
+#: src/level_result.cxx:120
+msgid ""
+"Maybe this level calls for a different strategy. Like attempting to save "
+"them, for example."
+msgstr ""
+"Es kann sein, dass wir etwas anderes versuchen sollten. Vielleicht knnten "
+"wir ja die Pingus retten?"
+
+#: src/level_result.cxx:122
+msgid "Ever considered a career as a Pingu exterminator?"
+msgstr "Hast du mal ber eine Karriere als Pingu Zerstrer nachgedacht?"
+
+#: src/level_result.cxx:124
+msgid "You missed one! What's your excuse!?"
+msgstr "Du hast einen vergessen! Was ist deine Entschuldigung?"
+
+#: src/level_result.cxx:126
+msgid "Please reassure me that you hit the Armageddon button."
+msgstr "Besttige mir bitte, dass das die Armageddon Taste war."
+
+#: src/level_result.cxx:128
+msgid "You've got a negative save/total value, something is buggy."
+msgstr "Ein negativer Wert? Hier liegt ein Fehler vor."
+
+#: src/menu_button.cxx:181
+msgid "..:: The people who brought this game to you ::.."
+msgstr "..:: Die Leute, die fuer dieses Spiel verantwortlich sind... ::.."
+
+#: src/menu_button.cxx:184
+msgid "Credits"
+msgstr "Mitwirkende"
+
+#: src/menu_button.cxx:216
+msgid "..:: Takes you to the options menu ::.."
+msgstr "..:: Einstellungen, Cheats und Debugging stuff ::.."
+
+#: src/menu_button.cxx:219
+msgid "Options"
+msgstr "Einstellungen"
+
+#: src/menu_button.cxx:252
+msgid "..:: Bye, bye ::.."
+msgstr "..:: Auf Wiedersehen ::.."
+
+#: src/menu_button.cxx:255
+msgid "Exit"
+msgstr "Beenden"
+
+#: src/menu_button.cxx:306
+msgid "..:: Launch the level editor ::.."
+msgstr "..:: Erstelle deinen eigenen Level ::.."
+
+#: src/menu_button.cxx:309
+msgid "Create a"
+msgstr "Bau einen"
+
+#: src/menu_button.cxx:310
+msgid "Level"
+msgstr "Level"
+
+#: src/menu_button.cxx:344
+msgid "..:: Start the game ::.."
+msgstr "..:: das Spiel starten ::.."
+
+#: src/menu_button.cxx:345
+msgid "Start"
+msgstr "Start"
+
+#: src/menu_button.cxx:375
+msgid "..:: Start a contrib level ::.."
+msgstr "..:: Contrib level Spielen ::.."
+
+#: src/menu_button.cxx:377
+msgid "Contrib"
+msgstr "Levels"
+
+#: src/menu_button.cxx:399
+msgid "..:: Multiplayer Modes... experimental stuff ::.."
+msgstr "..:: Mehrspieler Modus ::.. Experimentelles Zeug ::.."
+
+#: src/menu_button.cxx:401
+msgid "Multi"
+msgstr "Multi"
+
+#: src/pingu_enums.cxx:35
+msgid "Angel"
+msgstr "Angel"
+
+#: src/pingu_enums.cxx:36
+msgid "Basher"
+msgstr "Basher"
+
+#: src/pingu_enums.cxx:37
+msgid "Blocker"
+msgstr "Blocker"
+
+#: src/pingu_enums.cxx:38
+msgid "Boarder"
+msgstr "Boarder"
+
+#: src/pingu_enums.cxx:39
+msgid "Bomber"
+msgstr "Bomber"
+
+#: src/pingu_enums.cxx:41
+msgid "Climber"
+msgstr "Climber"
+
+#: src/pingu_enums.cxx:42
+msgid "Digger"
+msgstr "Digger"
+
+#: src/pingu_enums.cxx:43
+msgid "Drown"
+msgstr "Drown"
+
+#: src/pingu_enums.cxx:44
+msgid "Exiter"
+msgstr "Exiter"
+
+#: src/pingu_enums.cxx:45
+msgid "Faller"
+msgstr "Faller"
+
+#: src/pingu_enums.cxx:46
+msgid "Floater"
+msgstr "Floater"
+
+#: src/pingu_enums.cxx:47
+msgid "Jumper"
+msgstr "Jumper"
+
+#: src/pingu_enums.cxx:48
+msgid "Laserkill"
+msgstr "Laserkill"
+
+#: src/pingu_enums.cxx:49
+msgid "Miner"
+msgstr "Miner"
+
+#: src/pingu_enums.cxx:50
+msgid "Rocketlauncher"
+msgstr "Rocketlauncher"
+
+#: src/pingu_enums.cxx:51
+msgid "Slider"
+msgstr "Slider"
+
+#: src/pingu_enums.cxx:52
+msgid "Smashed"
+msgstr "Smashed"
+
+#: src/pingu_enums.cxx:53
+msgid "Splashed"
+msgstr "Splashed"
+
+#: src/pingu_enums.cxx:54
+msgid "Superman"
+msgstr "Superman"
+
+#: src/pingu_enums.cxx:55
+msgid "Teleported"
+msgstr "Teleported"
+
+#: src/pingu_enums.cxx:56
+msgid "Waiter"
+msgstr "Waiter"
+
+#: src/pingu_enums.cxx:57
+msgid "Walker"
+msgstr "Walker"
+
+#: src/pingus_counter.cxx:52
+#, c-format
+msgid "Released:%3d/%-3d Out:%3d Saved:%3d/%-3d"
+msgstr "Rein: %3d/%-3d Raus: %3d Gerettet: %3d/%-3d"
+
+#: src/pingus_main.cxx:90
+msgid "| segfault_handler: catched a SIGSEGV."
+msgstr "| segfault_handler: SIGSEGV abgefangen."
+
+#: src/pingus_main.cxx:92
+msgid "| Woops, Pingus just crashed, congratulations you've found a bug."
+msgstr ""
+"| Woops, Pingus ist abgestrzt. Gratuliere, du hast einen Bug gefunden."
+
+#: src/pingus_main.cxx:93
+msgid ""
+"| Please write a little bug report to , include informations"
+msgstr ""
+"| Bitte schreibe einen kleinen Report an 0=slower)"
+msgstr "Setze die Geschwindigkeit (0=schnellste, >0=langsamer)"
+
+#: src/pingus_main.cxx:529
+msgid "Prints the fps to stdout"
+msgstr "Schreibe die fps auf stdout"
+
+#: src/pingus_main.cxx:530
+msgid "Set the size of the map tiles (default: 32)"
+msgstr "Setze die Gre der Kartenteile (Standard: 32)"
+
+#: src/pingus_main.cxx:531
+msgid "Disable some cpu intensive features"
+msgstr "Deaktivere einige CPU intensive Funktionen"
+
+#: src/pingus_main.cxx:532
+msgid "Reduces the CPU usage by issuing sleep()"
+msgstr "Reduziert die CPU Belastung durch Verwendung von sleep()"
+
+#: src/pingus_main.cxx:534
+msgid "Demo playing and recording:"
+msgstr "Demo aufzeichnung und wiedergabe:"
+
+#: src/pingus_main.cxx:535
+msgid "FILE "
+msgstr "Datei "
+
+#: src/pingus_main.cxx:535
+msgid "Plays a demo session from FILE"
+msgstr "Spielt eine Demo Sitzung aus FILE"
+
+#: src/pingus_main.cxx:537
+msgid "Record demos for each played level"
+msgstr "Nehme Demos fr jeden gespielten Level auf"
+
+#: src/pingus_main.cxx:539
+msgid "Sound:"
+msgstr "Sound"
+
+#: src/pingus_main.cxx:540
+msgid "Disable sound"
+msgstr "Sound deaktivieren"
+
+#: src/pingus_main.cxx:541
+msgid "Disable music"
+msgstr "Musik deaktivieren"
+
+#: src/pingus_main.cxx:720
+msgid "clanVorbis support: ok"
+msgstr "clanVorbis Untersttzung: ok"
+
+#: src/pingus_main.cxx:722
+msgid "clanVoribs support: missing (.ogg music files will not be playable)"
+msgstr ""
+"clanVorbis Untersttzung: fehlt (.ogg Musik Datein knnen nicht abgespielt "
+"werden)"
+
+#: src/pingus_main.cxx:726
+msgid "clanMikMod support: ok"
+msgstr "clanMikMod Untersttzung: ok"
+
+#: src/pingus_main.cxx:728
+msgid "clanMikMod support: missing (music files will not be playable)"
+msgstr ""
+"clanMikMod Unterstzung: fehlt (Musikdateien knnen nicht abgespielt werden)"
+
+#: src/pingus_main.cxx:732
+msgid "getext support: ok"
+msgstr "gettext Untersttzung: ok"
+
+#: src/pingus_main.cxx:733
+msgid "gettext language: english"
+msgstr "gettext Sprache: deutsch"
+
+#: src/pingus_main.cxx:739
+msgid "sound support: enabled"
+msgstr "Sound Untersttzung: an"
+
+#: src/pingus_main.cxx:741
+msgid "sound support: disabled"
+msgstr "Sound Untersttzung: aus"
+
+#: src/pingus_main.cxx:744
+msgid "music support: enabled"
+msgstr "Musik Untersttzung: an"
+
+#: src/pingus_main.cxx:746
+msgid "music support: disabled"
+msgstr "Musik Untersttzung: aus"
+
+#: src/pingus_main.cxx:748
+msgid "resolution set to: "
+msgstr "Auflsung: "
+
+#: src/pingus_main.cxx:749
+msgid "fullscreen: "
+msgstr "Vollbild: "
+
+#: src/pingus_main.cxx:750
+msgid " enabled"
+msgstr "aktiviert"
+
+#: src/pingus_main.cxx:750
+msgid "disabled"
+msgstr "deaktiviert"
+
Index: libraries/source/tinygettext/test/helloworld/de.po
===================================================================
--- libraries/source/tinygettext/test/helloworld/de.po (revision 0)
+++ libraries/source/tinygettext/test/helloworld/de.po (working copy)
@@ -0,0 +1,56 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-01-30 08:01+0100\n"
+"PO-Revision-Date: 2009-01-30 08:39+0100\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: helloworld.cpp:7
+msgid "Short Hello World"
+msgstr "kurzes Hallo Welt"
+
+#: helloworld.cpp:8 helloworld.cpp:14
+#, fuzzy
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] "Hallo Welt (singular)"
+msgstr[1] "Hallo Welt (plural)"
+
+#: helloworld.cpp:10 helloworld.cpp:16
+#, fuzzy
+msgctxt ""
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] "Hallo Welt (singular) mit leerem Kontext"
+msgstr[1] "Hallo Welt (plural) mit leerem Kontext"
+
+#: helloworld.cpp:11 helloworld.cpp:17
+msgctxt "console"
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] "Hallo Welt (singular) in der Console"
+msgstr[1] "Hallo Welt (plural) in der Console"
+
+#: helloworld.cpp:13
+msgid "gui"
+msgid_plural "Hello World"
+msgstr[0] "Hallo Welt (singular)"
+msgstr[1] "Hallo Welt (plural)"
+
+#: helloworld.cpp:18
+#, fuzzy
+msgctxt "gui"
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] "Hallo Welt im GUI"
+msgstr[1] "Hallo Welt (plural) im GUI"
Index: libraries/source/tinygettext/test/helloworld/helloworld.pot
===================================================================
--- libraries/source/tinygettext/test/helloworld/helloworld.pot (revision 0)
+++ libraries/source/tinygettext/test/helloworld/helloworld.pot (working copy)
@@ -0,0 +1,55 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-01-30 08:10+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: helloworld.cpp:7
+msgid "Short Hello World"
+msgstr ""
+
+#: helloworld.cpp:8 helloworld.cpp:14
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helloworld.cpp:10 helloworld.cpp:16
+msgctxt ""
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helloworld.cpp:11 helloworld.cpp:17
+msgctxt "console"
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helloworld.cpp:13
+msgid "gui"
+msgid_plural "Hello World"
+msgstr[0] ""
+msgstr[1] ""
+
+#: helloworld.cpp:18
+msgctxt "gui"
+msgid "Hello World"
+msgid_plural "Hello Worlds"
+msgstr[0] ""
+msgstr[1] ""
Index: libraries/source/tinygettext/test/helloworld.cpp
===================================================================
--- libraries/source/tinygettext/test/helloworld.cpp (revision 0)
+++ libraries/source/tinygettext/test/helloworld.cpp (working copy)
@@ -0,0 +1,24 @@
+#include
+
+#define _(x) gettext(x)
+
+int main()
+{
+ std::cout << _("Short Hello World") << std::endl;
+ std::cout << gettext("Hello World") << std::endl;
+ std::cout << gettext("Hello Worlds") << std::endl;
+
+ std::cout << pgettext("", "Hello World") << std::endl;
+ std::cout << pgettext("console", "Hello World") << std::endl;
+
+ std::cout << ngettext("gui", "Hello World") << std::endl;
+ std::cout << ngettext("Hello World", "Hello Worlds", 5) << std::endl;
+
+ std::cout << npgettext("", "Hello World", "Hello Worlds", 5) << std::endl;
+ std::cout << npgettext("console", "Hello World", "Hello Worlds", 5) << std::endl;
+ std::cout << npgettext("gui", "Hello World", "Hello Worlds", 5) << std::endl;
+
+ return 0;
+}
+
+/* EOF */
Index: libraries/source/tinygettext/test/level/de.po
===================================================================
--- libraries/source/tinygettext/test/level/de.po (revision 0)
+++ libraries/source/tinygettext/test/level/de.po (working copy)
@@ -0,0 +1,379 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/pingus_main.cxx:760
+msgid "PingusMain: Starting Main: "
+msgstr "PingusMain: Hauptteil wird gestartet: "
+
+#: src/pingus_main.cxx:805
+msgid "PingusMain: Levelfile not found, ignoring: "
+msgstr "PingusMain: Leveldatei nicht gefunden, Fehler wird ignoriert: "
+
+#: src/pingus_main.cxx:909
+msgid "Error caught from ClanLib: "
+msgstr "ClanLib Fehler abgefangen: "
+
+#: src/pingus_main.cxx:913
+msgid "Error caught from Pingus: "
+msgstr "Pingus Fehler wurde abgefangen: "
+
+#: src/pingus_main.cxx:917
+msgid "Pingus: Out of memory!"
+msgstr "Pingus: Speicher ist ausgegangen"
+
+#: src/pingus_main.cxx:921
+msgid "Pingus: Standard exception caught!:\n"
+msgstr "Pingus: Standard Ausnahme abgefangen!:\n"
+
+#: src/pingus_main.cxx:925
+msgid "Pingus: Unknown throw caught!"
+msgstr "Pingus: Unbekannte Ausnahme abgefangen!"
+
+#: src/result_screen.cxx:99 src/start_screen.cxx:111
+msgid "Abort"
+msgstr "Abbruch"
+
+#: src/result_screen.cxx:167
+msgid "Retry"
+msgstr "Versuche erneut"
+
+#: src/result_screen.cxx:175
+msgid "Success!"
+msgstr "Erfolg!"
+
+#: src/result_screen.cxx:182
+msgid "Failure!"
+msgstr "Fehler!"
+
+#: src/result_screen.cxx:191
+msgid "Perfect! You saved everyone possible - great!"
+msgstr "Perfekt! Du hast alle gerettet!"
+
+#: src/result_screen.cxx:193
+msgid "No-one got killed, pretty good work."
+msgstr "Keiner wurde gettet, sehr gute Arbeit."
+
+#: src/result_screen.cxx:195
+msgid ""
+"You saved exactly what you needed - you made it, but\n"
+"maybe you can do better?"
+msgstr ""
+"Du hast so viele gerettet wie ntig. Du hast es\n"
+"geschafft, aber vielleicht kannst Du es noch besser?"
+
+#: src/result_screen.cxx:198
+msgid "Not everybody was saved, but still good work!"
+msgstr "Nicht alle wurden gerettet, aber trotzdem noch gute Arbeit!"
+
+#: src/result_screen.cxx:200
+msgid "What can I say, you made it - congratulations!"
+msgstr "Was soll ich sagen, Du hast es geschafft. Gratuliere!"
+
+#: src/result_screen.cxx:205
+msgid "You killed everybody, not good."
+msgstr "Du hast alle gettet, nicht gut."
+
+#: src/result_screen.cxx:207
+msgid "No-one got saved - I know you can do better."
+msgstr "Keiner wurde gerettet, ich wei, dass du es besser kannst."
+
+#: src/result_screen.cxx:209
+msgid ""
+"You didn't save enough, but you saved a few. Next\n"
+"time you might do better."
+msgstr ""
+"Du hast nicht genug gerettet, aber immerhin ein paar.\n"
+"Nchstes Mal machst du es bestimmt besser."
+
+#: src/result_screen.cxx:212
+msgid "Only one more and you would have made it - try again!"
+msgstr "Einer mehr und du hast es, versuch es nochmal!"
+
+#: src/result_screen.cxx:214
+msgid "Only a handful more and you would have made it - try again!"
+msgstr "Nur ein paar mehr und du httest es, versuch es nochmal!"
+
+#: src/result_screen.cxx:216
+msgid "Better luck next time!"
+msgstr "Mehr Glck frs nchste Mal!"
+
+#: src/result_screen.cxx:232
+msgid "Saved: "
+msgstr "Gerettet: "
+
+#: src/result_screen.cxx:236
+msgid "Died: "
+msgstr "Gettet: "
+
+#: src/result_screen.cxx:240
+msgid "Time left: "
+msgstr "Verbliebene Zeit: "
+
+#: src/screenshot.cxx:45
+msgid "Screenshot: Saving screenshot to: "
+msgstr "Screenshot: Speichere Screenshot als: "
+
+#: src/screenshot.cxx:47
+msgid "Screenshot: Screenshot is done."
+msgstr "Screenshot: Screenshot wurde erstellt."
+
+#: src/screenshot.cxx:53
+msgid "Screenshot: Couldn't save screenshot"
+msgstr "Screenshot: Screenshot konnte nicht gespeichert werden"
+
+#: src/screenshot.cxx:138
+msgid "Screenshot: Couldn't write file: "
+msgstr "Screenshot: Datei konnte nicht geschrieben werden: "
+
+#: src/spot_map.cxx:286
+#, c-format
+msgid "Image has wrong color depth: %d"
+msgstr "Bild hat falsche Farbtiefe: %d"
+
+#: src/start_screen.cxx:75
+msgid "Ok"
+msgstr "Ok"
+
+#: src/start_screen.cxx:158
+msgid "Number of Pingus: "
+msgstr "Anzahl an Pingus: "
+
+#: src/start_screen.cxx:161
+msgid "Number to Save: "
+msgstr "Zu rettende Pingus: "
+
+#: src/start_screen.cxx:164
+msgid "Time: "
+msgstr "Zeit: "
+
+#: src/start_screen.cxx:167
+msgid "Difficulty:"
+msgstr "Schwierigkeitsgrad:"
+
+#: src/start_screen.cxx:175
+msgid "Author: "
+msgstr "Autor: "
+
+#: src/start_screen.cxx:178
+msgid "Filename: "
+msgstr "Dateiname: "
+
+#: src/story.cxx:41
+msgid "The Journey Continues"
+msgstr "Die Reise geht weiter"
+
+#: src/story.cxx:46
+msgid ""
+"Now after you and the Pingus have learned the basics and\n"
+"practiced a bit it is time to move on and begin the journey into\n"
+"the world. Since the ice floe with which the Pingus traveled to the\n"
+"Tutorial Island isn't going to hold on the whole way into the warmer\n"
+"climates the Pingus have to find something else to guide\n"
+"them on their journey.\n"
+msgstr ""
+"Nachdem Du und die Pingus nun die Grundlagen gelernt und\n"
+"ein wenig bung haben, ist es an der Zeit, weiter zu gehen und die\n"
+"Reise in die Welt zu beginnen. Da die Scholle, mit der die Pingus zum\n"
+"Tutorial Island reisten, nicht den ganzen Weg in die wrmeren Regionen\n"
+"halten wird, mssen die Pingus etwas anderes finden, um sie auf der\n"
+"Reise zu begleiten.\n"
+
+#: src/story.cxx:58
+msgid ""
+"But as the eldest have said, the Tutorial Island provides not\n"
+"only a good way to practice, but it is also the starting point into\n"
+"the world. After some searching the Pingus discovered the meaning\n"
+"of this, and they found the large tree at the end of the island\n"
+"which gave them wood to construct a float.\n"
+msgstr ""
+"Aber wie die Weisen sagten, ist Tutorial Island nicht nur\n"
+"eine Mglichkeit zum ben, es ist auch der erste Schritt in\n"
+"die Welt, denn das Holz der Bume am Ende der Insel liefert\n"
+"gutes Material, um ein Flo zu bauen.\n"
+
+#: src/story.cxx:69
+msgid ""
+"So the Pingus set out and constructed some large rafts, enough\n"
+"to carry them all. After also packing a bunch of provisions\n"
+"they were prepared to start their journey and leave\n"
+"their familiar ground and enter the unknown parts of the world.\n"
+msgstr ""
+"So gingen die Pingus hin und bauten ein paar groe\n"
+"Fle, genug, um alle zu tragen. Nachdem sie auch noch einigen\n"
+"Proviant eingepackt hatten, waren sie endlich bereit, ihre Reise zu\n"
+"beginnen, den bekannten Bereich zu verlassen und die unbekannten\n"
+"Bereiche der Welt zu betreten.\n"
+
+#: src/story.cxx:79
+msgid ""
+"So the Pingus sit on their raft, worrying about what's to come and\n"
+"where to go, while floating into the sunset.\n"
+"\n"
+"To be continued..."
+msgstr ""
+"So saen die Pingus nur auf ihrem Flo und sorgten sich, was denn nun\n"
+"kommen mge, whrend sie in den Sonnenuntergang trieben.\n"
+"\n"
+"Fortsetzung folgt..."
+
+#: src/story.cxx:91
+msgid "The Journey Begins"
+msgstr "Die Reise beginnt"
+
+#: src/story.cxx:96
+msgid ""
+"For a long time, the Pingus have lived happily in peace on the\n"
+"South Pole along with all the other animals. Everything was in\n"
+"balance and it seemed like nothing could disrupt their peace. The\n"
+"Pingus were happy and it seemed like this could never end.\n"
+msgstr ""
+"Die Pingus lebten schon lange glcklich und in Frieden am Sdpol,\n"
+"zusammen mit all den anderen Tieren. Alles war im Gleichgewicht und\n"
+"es schien, als knnte nichts ihren Frieden stren. Die Pingus waren\n"
+"glcklich und es schien, als wrde dies niemals enden.\n"
+
+#: src/story.cxx:106
+msgid ""
+"But then one day, things began to change slowly: the sky got darker\n"
+"and the earth got warmer. Firstly, they thought this was just a\n"
+"normal fluctuation in the world's climate, but things seemed to get\n"
+"worse and worse with every year."
+msgstr ""
+"Aber dann, eines Tages, vernderten sich die Dinge langsam. Der\n"
+"Himmel wurde dunkler und die Erde wrmer. Zuerst dachten sie, dies\n"
+"wre nur eine normale Schwankung im Klima, aber es wurde von Jahr \n"
+"zu Jahr immer schlimmer."
+
+#: src/story.cxx:117
+msgid ""
+"The snow began to melt away in a few areas and food became an\n"
+"issue. Other animals tried to leave the region to search\n"
+"for colder areas, but the Pingus knew that this wouldn't help:\n"
+"they knew that they had to do something about it."
+msgstr ""
+"Der Schnee begann in einigen Bereichen zu schmelzen und Nahrung\n"
+"wurde ein Problem. Andere Tiere begannen bereits, die Region zu\n"
+"verlassen, um kltere Gebiete zu suchen. Aber die Pingus wussten,\n"
+"dass dies nicht helfen wrde, sie wussten, es musste etwas gegen\n"
+"dieses Problem getan werden."
+
+#: src/story.cxx:127
+msgid ""
+"So the circle of the eldest came together to decide what to do\n"
+"about it. They decided to send out an expedition around the world\n"
+"to find the cause of this warming. The expedition consisted of\n"
+"hundreds of the bravest Pingus on the South Pole."
+msgstr ""
+"Darum traf sich der Rat der ltesten, um zu entscheiden, was dagegen\n"
+"getan werden sollte. Sie entschieden, eine Expedition um die Welt\n"
+"zu senden, um den Grund fr die Erwrmung zu finden. Die Expedition\n"
+"bestand aus hunderten der mutigsten Pingus des ganzen Sdpols."
+
+#: src/story.cxx:137
+msgid ""
+"And they picked you to lead them on their journey around the\n"
+"world. Since the journey will be dangerous and difficult, your\n"
+"first goal is the Island of Mogorok, also known as the Tutorial\n"
+"Island. According to the eldest, this island has always been the\n"
+"first stop of Pingus that were sent out into the world."
+msgstr ""
+"Und sie whlten dich, um sie auf der Reise um die Welt zu fhren.\n"
+"Denn die Reise wird gefhrlich und schwierig werden. Dein erstes Ziel ist\n"
+"die Insel Mogorok, auch bekannt als Tutorial Island. Den Weisen\n"
+"zufolge war diese Insel immer der erste Anlaufpunkt fr Pingus,\n"
+"die in die Welt gesandt wurden."
+
+#: src/story.cxx:148
+msgid ""
+"The island consists of many areas that are ideal to teach the\n"
+"Pingus their abilities. The Pingus can learn to build\n"
+"bridges, climb, bash and use many other talents which they\n"
+"will need on their long and dangerous journey."
+msgstr ""
+"Die Insel besteht aus verschiedenen Regionen, die ideal sind, um die\n"
+"Fhigkeiten der Pingus zu trainieren. Sie knnen dort ihre Fhig-\n"
+"keiten im Brckenbau, klettern, graben und all die anderen Talente\n"
+"trainieren, die sie sicher auf der langen und gefhrlichen Reise\n"
+"bentigen werden."
+
+#: src/story.cxx:158
+msgid ""
+"While there, you can practice your abilities in commanding\n"
+"and guiding the Pingus. You can also get familiar with\n"
+"all the abilities the Pingus provide and learn to master them,\n"
+"since you will need all of them on your journey around the\n"
+"world."
+msgstr ""
+"Whrenddessen kannst Du auf der anderen Seite deine Fhigkeit, die\n"
+"Pingus zu leiten und zu fhren, trainieren. Du kannst dich dort auch mit\n"
+"allen Fhigkeiten vertraut machen, die die Pingus besitzen und\n"
+"erlernen, sie zu meistern, denn du wirst sie sicher alle auf der\n"
+"Reise um die Welt bentigen."
+
+#: src/story.cxx:169
+msgid ""
+"Now that you and the Pingus have arrived at Tutorial Island it\n"
+"is time to take command and begin your mission.\n"
+"\n"
+"Good Luck!"
+msgstr ""
+"Nun da du und die Pingus im Tutorial Island angekommen sind,\n"
+"musst du das Kommando bernehmen und deine Mission beginnen.\n"
+"\n"
+"Viel Glck!"
+
+#: src/system.cxx:273
+msgid "Environment variable $HOME not set, fix that and start again."
+msgstr ""
+"Umgebungs Variable $HOME ist nicht gesetzt. Setze sie und starte erneut."
+
+#: src/worldmap/level_dot.cxx:174 src/worldmap/level_dot.cxx:184
+msgid "locked"
+msgstr "gesperrt"
+
+#: src/worldmap/manager.cxx:103
+msgid "Show Ending?"
+msgstr "Ende anzeigen?"
+
+#: src/worldmap/manager.cxx:133
+msgid "Show Story?"
+msgstr "Story zeigen?"
+
+#: src/worldmap/manager.cxx:161
+msgid "Leave?"
+msgstr "Verlassen?"
+
+#: src/worldmap/manager.cxx:201
+msgid "Enter?"
+msgstr "Betreten?"
+
+#: src/worldmap/worldmap.cxx:77
+msgid "WorldMap: File not found: "
+msgstr "Worldmap: Datei nicht gefunden: "
+
+#: src/worldmap/worldmap.cxx:261
+msgid "...walking..."
+msgstr "...laufe..."
+
+msgid "You got %d error.\n"
+msgid_plural "You got %d error.\n"
+msgstr[0] "Du hast %d fehler\n"
+msgstr[1] "Du hast %d fehlers\n"
+
+msgid "found %d fatal error"
+msgid_plural "found %d fatal errors"
+msgstr[0] "s'ha trobat %d error fatal"
+msgstr[1] "s'han trobat %d errors fatals"
+
Index: libraries/source/tinygettext/test/po/de.po
===================================================================
--- libraries/source/tinygettext/test/po/de.po (revision 0)
+++ libraries/source/tinygettext/test/po/de.po (working copy)
@@ -0,0 +1,1047 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Pingus 0.6.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2004-04-09 18:37+0000\n"
+"PO-Revision-Date: 2009-02-01 17:44+0100\n"
+"Last-Translator: David Philippi \n"
+"Language-Team: David Philippi , Ingo Ruhnke , Giray Devlet \n"
+"MIME-Version: 1.0\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "umlaut"
+msgstr "ÄÖÜäöüß"
+
+#: src/actions/bridger.cxx:48 src/actions/bridger.cxx:232
+#: src/pingu_enums.cxx:40
+msgid "Bridger"
+msgstr "Bridger"
+
+#: src/config.cxx:73
+msgid "Couldn't open: "
+msgstr "Datei oder Verzeichnis konnte nicht geffnet werden: "
+
+#: src/config.cxx:172
+msgid "Unexpected char: '"
+msgstr "Unerwartetes Zeichen: '"
+
+#: src/config.cxx:206
+msgid "Unexpected char '"
+msgstr "Unerwartetes Zeichen: '"
+
+#: src/credits.cxx:48
+msgid "-Idea"
+msgstr "-Idee"
+
+#: src/credits.cxx:52
+msgid "-Maintaining"
+msgstr "-Verwaltung"
+
+#: src/credits.cxx:56
+msgid "-Programming"
+msgstr "-Programmierung"
+
+#: src/credits.cxx:62
+msgid "-Porting (Win32)"
+msgstr "-Portierung (Win32)"
+
+#: src/credits.cxx:70
+msgid "-Gfx"
+msgstr "-Grafiken"
+
+#: src/credits.cxx:82
+msgid "-Music"
+msgstr "-Musik"
+
+#: src/credits.cxx:88
+msgid "-Level Design"
+msgstr "-Level Design"
+
+#: src/credits.cxx:93
+msgid "-Story"
+msgstr "-Geschichte"
+
+#: src/credits.cxx:97
+msgid "-Translation"
+msgstr "-bersetzung"
+
+#: src/credits.cxx:112
+msgid "-Special"
+msgstr "-Besonderen"
+
+#: src/credits.cxx:113
+msgid "-Thanks to"
+msgstr "-Dank an"
+
+#: src/credits.cxx:154
+msgid "_And a very Special Thanks"
+msgstr "_Und einen besonderen Dank"
+
+#: src/credits.cxx:155
+msgid "_to all the people who"
+msgstr "_an alle Leute die"
+
+#: src/credits.cxx:156
+msgid "_contribute to"
+msgstr "_an Freier Software"
+
+#: src/credits.cxx:157
+msgid "_Free Software!"
+msgstr "_mitarbeiten!"
+
+#: src/credits.cxx:163
+msgid "_Thank you for"
+msgstr "_Dankeschn frs"
+
+#: src/credits.cxx:164
+msgid "_playing!"
+msgstr "_spielen!"
+
+#: src/editor/editor_event.cxx:588
+msgid "Enter filename to save as:"
+msgstr "Datei speichern als: "
+
+#: src/editor/editor_help_screen.cxx:43
+msgid "Editor Helpscreen (hide with F1)"
+msgstr "Editor Hilfe (ausblenden mit F1)"
+
+#: src/editor/editor_help_screen.cxx:51
+msgid "F1 - show/hide this help screen"
+msgstr "F1 - Hilfe anzeigen/verstecken"
+
+#: src/editor/editor_help_screen.cxx:52
+msgid "F2 - launch level building tutorial"
+msgstr "F2 - Starte Levelbau Tutorial"
+
+#: src/editor/editor_help_screen.cxx:53
+msgid "F3 - toggle background color"
+msgstr "F3 - Hintergrundfarbe aendern"
+
+#: src/editor/editor_help_screen.cxx:54
+msgid "F4 - play/test the level"
+msgstr "F4 - Level starten/testen"
+
+#: src/editor/editor_help_screen.cxx:55
+msgid "F5 - load a level"
+msgstr "Level Laden (F5)"
+
+#: src/editor/editor_help_screen.cxx:56
+msgid "F6 - save this level"
+msgstr "Level Speichern (F6)"
+
+#: src/editor/editor_help_screen.cxx:57
+msgid "F7 - [unset]"
+msgstr "F7 - [nicht belegt]"
+
+#: src/editor/editor_help_screen.cxx:58
+msgid "F8 - quick save/backup save?!"
+msgstr "F8 - Schnellspeichern/Backup"
+
+#: src/editor/editor_help_screen.cxx:59
+msgid "F9 - change level width and height"
+msgstr "F9 - Level Hhe und Breite ndern"
+
+#: src/editor/editor_help_screen.cxx:60
+msgid "F10 - [unset]"
+msgstr "F10 - [nicht belegt]"
+
+#: src/editor/editor_help_screen.cxx:61
+msgid "F11 - toggle fps counter"
+msgstr "F11 - fps Zhler an/aus"
+
+#: src/editor/editor_help_screen.cxx:62
+msgid "F12 - make screenshot"
+msgstr "F12 - Screenshot erstellen"
+
+#: src/editor/editor_help_screen.cxx:66
+msgid "Home - increase object size"
+msgstr "Einfg - Objekt vergrern"
+
+#: src/editor/editor_help_screen.cxx:67
+msgid "End - decrease object size"
+msgstr "Ende - Objekt verkleinern"
+
+#: src/editor/editor_help_screen.cxx:68
+msgid "Cursor Keys - Move object"
+msgstr "Cursor Tasten - Objekt bewegen"
+
+#: src/editor/editor_help_screen.cxx:69
+msgid "Shift 'Cursor Keys' - Move objects fast "
+msgstr "Shift Cursor Tasten - Objekt schneller bewegen"
+
+#: src/editor/editor_help_screen.cxx:70
+msgid "PageUp - level object up"
+msgstr "Bild rauf - Objekt nach oben"
+
+#: src/editor/editor_help_screen.cxx:71
+msgid "PageDown - level object down"
+msgstr "Bild runter - Objekt nach unten"
+
+#: src/editor/editor_help_screen.cxx:72
+msgid "Shift PageUp - increase objects z-pos by 50"
+msgstr "Shift Bild rauf - Objekt nach oben"
+
+#: src/editor/editor_help_screen.cxx:73
+msgid "Shift PageDown - decrease objects z-pos by 50"
+msgstr "Shift Bild runter - Objekt nach unten"
+
+#: src/editor/editor_help_screen.cxx:74
+msgid "Enter - Set default zoom (1:1)"
+msgstr "Eingabe - Setze Standard Zoom (1:1)"
+
+#: src/editor/editor_help_screen.cxx:75
+msgid "d - duplicate object"
+msgstr "d - Objekt kopieren"
+
+#: src/editor/editor_help_screen.cxx:76
+msgid "a - mark all objects"
+msgstr "a - Alle Objekte markieren"
+
+#: src/editor/editor_help_screen.cxx:77
+msgid "shift leftmouseclick - add object to selection"
+msgstr "Shift + linke Maustaste - Objekt zur Auswahl tun"
+
+#: src/editor/editor_help_screen.cxx:78
+msgid "leftmouseclick - select object"
+msgstr "linke Maustaste - Objekt auswhlen"
+
+#: src/editor/editor_help_screen.cxx:79
+msgid "Insert - insert new object"
+msgstr "Einfgen - neues Objekt einfgen"
+
+#: src/editor/editor_help_screen.cxx:80
+msgid "Remove - remove selected object"
+msgstr "Entfernen - entferne ausgewhltes Objekt"
+
+#: src/editor/editor_help_screen.cxx:81
+msgid "g - ungroup/group current selection"
+msgstr "g - Auswahl gruppieren / Gruppierung aufheben"
+
+#: src/editor/editor_help_screen.cxx:82
+msgid "Ctrl PageUp - increase objects z-pos by 1"
+msgstr "Strg Bild rauf - z-pos des Objekts um 1 erhhen"
+
+#: src/editor/editor_help_screen.cxx:83
+msgid "Ctrl PageDown - decrease objects z-pos by 1"
+msgstr "Strg Bild runter - z-pos des Objekts um 1 senken"
+
+#: src/editor/editor_help_screen.cxx:89
+msgid "Naming Convention: -.plf"
+msgstr "Dateinamensvorgabe: -.pfl"
+
+#: src/editor/editor_help_screen.cxx:91
+msgid ""
+"When you have created a level and want to have it in the next Pingus "
+"release,\n"
+"please mail it to pingus-devel@nongnu.org."
+msgstr ""
+"Falls Du einen Level erstellt hast und ihn gerne im nchsten Pingus\n"
+"Release httest, schicke ihn an pingus-devel@nongnu.org."
+
+#: src/editor/object_selector.cxx:106
+msgid "1 - guillotine"
+msgstr "1 - Guillotine"
+
+#: src/editor/object_selector.cxx:107
+msgid "2 - hammer"
+msgstr "2 - Hammer"
+
+#: src/editor/object_selector.cxx:108
+msgid "3 - spike"
+msgstr "3 - Stacheln"
+
+#: src/editor/object_selector.cxx:109
+msgid "4 - laser_exit"
+msgstr "4 - Laser Ausgang"
+
+#: src/editor/object_selector.cxx:110
+msgid "5 - fake_exit"
+msgstr "5 - Tusch Ausgang"
+
+#: src/editor/object_selector.cxx:111
+msgid "6 - smasher"
+msgstr "6 - Stampfer"
+
+#: src/editor/object_selector.cxx:112
+msgid "7 - bumper"
+msgstr "7 - Stosser"
+
+#: src/editor/object_selector.cxx:186
+msgid "Select a WorldObj"
+msgstr "Whle ein WeltObjekt"
+
+#: src/editor/object_selector.cxx:187
+msgid "1 - teleporter"
+msgstr "1 - Teleporter"
+
+#: src/editor/object_selector.cxx:188
+msgid "2 - switch and door"
+msgstr "2 - Schalter und Tr"
+
+#: src/editor/object_selector.cxx:189
+msgid "3 - ConveyorBelt"
+msgstr "3 - Frderband"
+
+#: src/editor/object_selector.cxx:190
+msgid "4 - IceBlock"
+msgstr "4 - Eisblock"
+
+#: src/editor/object_selector.cxx:191
+msgid "5 - InfoBox"
+msgstr "5 - InfoBox"
+
+#: src/editor/object_selector.cxx:232
+msgid "Select a weather"
+msgstr "Whle ein Wetter"
+
+#: src/editor/object_selector.cxx:233
+msgid "1 - snow"
+msgstr "1 - Schnee"
+
+#: src/editor/object_selector.cxx:234
+msgid "2 - rain"
+msgstr "2 - Regen"
+
+#: src/editor/object_selector.cxx:265
+msgid "Select an entrance"
+msgstr "Whle einen Eingang"
+
+#: src/editor/object_selector.cxx:266
+msgid "1 - generic"
+msgstr "1 - allgemein"
+
+#: src/editor/object_selector.cxx:267
+msgid "2 - woodthing"
+msgstr "2 - hlzern"
+
+#: src/editor/object_selector.cxx:268
+msgid "3 - cloud"
+msgstr "3 - Wolke"
+
+#: src/editor/object_selector.cxx:269
+msgid "h - entrance surface (hotspot)"
+msgstr "h - Eingangs Grafik (hotspot)"
+
+#: src/editor/object_selector.cxx:343
+msgid "What object type do you want?"
+msgstr "Was fr ein Objekt willst du?"
+
+#: src/editor/object_selector.cxx:344 src/editor/object_selector.cxx:400
+msgid "h - Hotspot"
+msgstr "h - Grafikelement (hotspot)"
+
+#: src/editor/object_selector.cxx:345
+msgid "g - Groundpiece (ground) [not implemented]"
+msgstr "g - Bodenstck (ground) [nicht implementiert]"
+
+#: src/editor/object_selector.cxx:394 src/editor/object_selector.cxx:562
+msgid "Which object do you want?"
+msgstr "Welches Objekt willst du?"
+
+#: src/editor/object_selector.cxx:395
+msgid "g - Groundpiece (ground)"
+msgstr "g - Bodenstck (ground)"
+
+#: src/editor/object_selector.cxx:396
+msgid "s - Groundpiece (solid)"
+msgstr "s - Bodenelement (Stahl)"
+
+#: src/editor/object_selector.cxx:397
+msgid "b - Groundpiece (bridge)"
+msgstr "b - Bodenelement (Bruecke)"
+
+#: src/editor/object_selector.cxx:398
+msgid "n - Groundpiece (transparent)"
+msgstr "n - Bodenelement (transparent)"
+
+#: src/editor/object_selector.cxx:399
+msgid "r - Groundpiece (remove)"
+msgstr "r - Bodenelement (entfernen)"
+
+#: src/editor/object_selector.cxx:401
+msgid "e - Entrance"
+msgstr "e - Eingang"
+
+#: src/editor/object_selector.cxx:402
+msgid "x - Exit"
+msgstr "x - Ausgang"
+
+#: src/editor/object_selector.cxx:403
+msgid "l - Liquid"
+msgstr "l - Flssigkeit"
+
+#: src/editor/object_selector.cxx:404
+msgid "w - Weather"
+msgstr "w - Wetter"
+
+#: src/editor/object_selector.cxx:405
+msgid "t - Traps"
+msgstr "t - Falle"
+
+#: src/editor/object_selector.cxx:406
+msgid "o - WorldObject"
+msgstr "o - WeltObjekt"
+
+#: src/editor/object_selector.cxx:407
+msgid "z - Background"
+msgstr "z - Hintergrund"
+
+#: src/editor/object_selector.cxx:408
+msgid "p - Prefab (ObjectGroup)"
+msgstr "p - Prefab (Objekt Gruppe)"
+
+#: src/editor/object_selector.cxx:409
+msgid "f - something from file (~/.pingus/images/)"
+msgstr "f - etwas aus einer Datei (~/.pingus/images/)"
+
+#: src/editor/object_selector.cxx:498
+msgid "Which prefab do you want?"
+msgstr "Welche Prefab willst du?"
+
+#: src/editor/object_selector.cxx:563
+msgid "1 - Surface Background"
+msgstr "1 - Bild Hintergrund"
+
+#: src/editor/object_selector.cxx:564
+msgid "2 - Solid Color Background"
+msgstr "2 - Farb Hintergrund"
+
+#: src/editor/object_selector.cxx:565
+msgid "3 - Starfield Background"
+msgstr "3 - Sternen Hintergrund"
+
+#: src/editor/object_selector.cxx:566
+msgid "4 - Thunderstorm Background"
+msgstr "4 - Gewitter Hintergrund"
+
+#: src/editor/panel_icons.cxx:33
+msgid "Load a level (F5)"
+msgstr "Level laden (F5)"
+
+#: src/editor/panel_icons.cxx:46
+msgid "Exit the editor (Escape)"
+msgstr "Editor Beenden (Esc)"
+
+#: src/editor/panel_icons.cxx:58
+msgid "Save this level (F6)"
+msgstr "Level Speichern (F6)"
+
+#: src/editor/panel_icons.cxx:70
+msgid "Delete marked objects (delete)"
+msgstr "Markierte Objekte Lschen (Entfernen)"
+
+#: src/editor/panel_icons.cxx:82
+msgid "Duplicate current object (d)"
+msgstr "Aktuelles Object kopieren (d)"
+
+#: src/editor/panel_icons.cxx:94
+msgid "Edit Level Properties"
+msgstr "Leveleigenschaften ndern"
+
+#: src/editor/panel_icons.cxx:106
+msgid "Edit Object Properties"
+msgstr "Objekteigenschaften ndern"
+
+#: src/editor/panel_icons.cxx:118
+msgid "Start the level and test it (F4)"
+msgstr "Level starten und testen (F4)"
+
+#: src/editor/panel_icons.cxx:130
+msgid "Create a new level from scratch"
+msgstr "Neuen Level erstellen"
+
+#: src/editor/panel_icons.cxx:142
+msgid "Insert an object (Insert)"
+msgstr "Objekt einfuegen (Einfg)"
+
+#: src/editor/panel_icons.cxx:154
+msgid "Zoom into a region"
+msgstr "Einen Bereich vergrssern"
+
+#: src/editor/panel_icons.cxx:166
+msgid "Zoom in"
+msgstr "Vergroessern"
+
+#: src/editor/panel_icons.cxx:179
+msgid "Zoom out"
+msgstr "Verkleinern"
+
+#: src/editor/panel_icons.cxx:192
+msgid "Setup Number of Actions"
+msgstr "Stelle die Anzahl der Fhigkeiten ein"
+
+#: src/editor/panel_icons.cxx:204
+msgid "Display Help Screen (F1)"
+msgstr "Hilfe Anzeigen (F1)"
+
+#: src/exit_menu.cxx:48
+msgid "Yes"
+msgstr "Ja"
+
+#: src/exit_menu.cxx:81
+msgid "No"
+msgstr "Nein"
+
+#: src/exit_menu.cxx:114
+msgid "Exit Pingus?"
+msgstr "Pingus beenden?"
+
+#: src/fps_counter.cxx:48
+msgid "unknown"
+msgstr "unbekannt"
+
+#: src/game_time.cxx:70
+msgid "unlimited"
+msgstr "unbegrenzt"
+
+#: src/level_desc.cxx:74
+msgid "Designed by "
+msgstr "Erstellt von "
+
+#: src/level_desc.cxx:79
+#, c-format
+msgid "Pingus to Save: %d"
+msgstr "Zu rettende Pingus: %d"
+
+#: src/level_desc.cxx:81
+#, c-format
+msgid "Number of Pingus: %d"
+msgstr "Anzahl an Pingus: %d"
+
+#: src/level_desc.cxx:86
+msgid "Loading..."
+msgstr "Ladevorgang luft..."
+
+#: src/level_desc.cxx:89
+msgid "Loading finished. Press a mouse button to start the level"
+msgstr ""
+"Ladevorgang abgeschlossen. Drcke eine Maus Taste um den Level zu starten"
+
+#: src/level_result.cxx:61
+msgid "Results:"
+msgstr "Ergebnisse:"
+
+#: src/level_result.cxx:67
+#, c-format
+msgid "Pingus saved: %3d/%3d"
+msgstr "Gerettete Pingus: %3d/%3d"
+
+#: src/level_result.cxx:72
+#, c-format
+msgid "Pingus died: %3d/%3d"
+msgstr "Tote Pingus: %3d/%3d"
+
+#: src/level_result.cxx:88
+msgid "Press button to continue..."
+msgstr "Knopf drcken um fortzufahren"
+
+#: src/level_result.cxx:102
+msgid ""
+"As many Pingus escaped as entered the level. That's going to be hard to "
+"beat.... unless this game becomes pornographic."
+msgstr ""
+"Es wurden alle Pingu dieses Levels gerettet. Das wird hart zu schlagen "
+"sein... es sei denn dieses Spiel wird pornographisch."
+
+#: src/level_result.cxx:104
+msgid "Very impressive indeed."
+msgstr "In der Tat sehr eindrucksvoll."
+
+#: src/level_result.cxx:106
+msgid "Good work. Still room for improvement though."
+msgstr "Gute Arbeit. Aber bung macht den Meiser!"
+
+#: src/level_result.cxx:108
+msgid "Not too shabby, not too shabby at all."
+msgstr "Nicht schlecht, nicht schlecht!"
+
+#: src/level_result.cxx:110
+msgid ""
+"That was OK, but Pingu life insurance premiums have just gotten more "
+"expensive."
+msgstr ""
+"Das war ok, aber die Lebensversicherungsprmien fr Pingus sind gerade "
+"gestiegen."
+
+#: src/level_result.cxx:112
+msgid "Maybe this level calls for a different strategy."
+msgstr "Mglicherweise verlangt dieser Level eine andere Strategie."
+
+#: src/level_result.cxx:114
+msgid "Exactly half. Are you saving only the female ones?"
+msgstr "Genau die Hlfte! Rettest du nur die Weibchen?"
+
+#: src/level_result.cxx:116
+msgid "If I were a Pingu, I never would have left that entrance."
+msgstr "Wenn ich ein Pingu wre, htte ich den Eingang nie verlassen."
+
+#: src/level_result.cxx:118
+msgid "Maybe you would feel more at home playing Quake."
+msgstr "Mglicherweise wre es besser Quake zu spielen?"
+
+#: src/level_result.cxx:120
+msgid ""
+"Maybe this level calls for a different strategy. Like attempting to save "
+"them, for example."
+msgstr ""
+"Es kann sein, dass wir etwas anderes versuchen sollten. Vielleicht knnten "
+"wir ja die Pingus retten?"
+
+#: src/level_result.cxx:122
+msgid "Ever considered a career as a Pingu exterminator?"
+msgstr "Hast du mal ber eine Karriere als Pingu Zerstrer nachgedacht?"
+
+#: src/level_result.cxx:124
+msgid "You missed one! What's your excuse!?"
+msgstr "Du hast einen vergessen! Was ist deine Entschuldigung?"
+
+#: src/level_result.cxx:126
+msgid "Please reassure me that you hit the Armageddon button."
+msgstr "Besttige mir bitte, dass das die Armageddon Taste war."
+
+#: src/level_result.cxx:128
+msgid "You've got a negative save/total value, something is buggy."
+msgstr "Ein negativer Wert? Hier liegt ein Fehler vor."
+
+#: src/menu_button.cxx:181
+msgid "..:: The people who brought this game to you ::.."
+msgstr "..:: Die Leute, die fuer dieses Spiel verantwortlich sind... ::.."
+
+#: src/menu_button.cxx:184
+msgid "Credits"
+msgstr "Mitwirkende"
+
+#: src/menu_button.cxx:216
+msgid "..:: Takes you to the options menu ::.."
+msgstr "..:: Einstellungen, Cheats und Debugging stuff ::.."
+
+#: src/menu_button.cxx:219
+msgid "Options"
+msgstr "Einstellungen"
+
+#: src/menu_button.cxx:252
+msgid "..:: Bye, bye ::.."
+msgstr "..:: Auf Wiedersehen ::.."
+
+#: src/menu_button.cxx:255
+msgid "Exit"
+msgstr "Beenden"
+
+#: src/menu_button.cxx:306
+msgid "..:: Launch the level editor ::.."
+msgstr "..:: Erstelle deinen eigenen Level ::.."
+
+#: src/menu_button.cxx:309
+msgid "Create a"
+msgstr "Bau einen"
+
+#: src/menu_button.cxx:310
+msgid "Level"
+msgstr "Level"
+
+#: src/menu_button.cxx:344
+msgid "..:: Start the game ::.."
+msgstr "..:: das Spiel starten ::.."
+
+#: src/menu_button.cxx:345
+msgid "Start"
+msgstr "Start"
+
+#: src/menu_button.cxx:375
+msgid "..:: Start a contrib level ::.."
+msgstr "..:: Contrib level Spielen ::.."
+
+#: src/menu_button.cxx:377
+msgid "Contrib"
+msgstr "Levels"
+
+#: src/menu_button.cxx:399
+msgid "..:: Multiplayer Modes... experimental stuff ::.."
+msgstr "..:: Mehrspieler Modus ::.. Experimentelles Zeug ::.."
+
+#: src/menu_button.cxx:401
+msgid "Multi"
+msgstr "Multi"
+
+#: src/pingu_enums.cxx:35
+msgid "Angel"
+msgstr "Angel"
+
+#: src/pingu_enums.cxx:36
+msgid "Basher"
+msgstr "Basher"
+
+#: src/pingu_enums.cxx:37
+msgid "Blocker"
+msgstr "Blocker"
+
+#: src/pingu_enums.cxx:38
+msgid "Boarder"
+msgstr "Boarder"
+
+#: src/pingu_enums.cxx:39
+msgid "Bomber"
+msgstr "Bomber"
+
+#: src/pingu_enums.cxx:41
+msgid "Climber"
+msgstr "Climber"
+
+#: src/pingu_enums.cxx:42
+msgid "Digger"
+msgstr "Digger"
+
+#: src/pingu_enums.cxx:43
+msgid "Drown"
+msgstr "Drown"
+
+#: src/pingu_enums.cxx:44
+msgid "Exiter"
+msgstr "Exiter"
+
+#: src/pingu_enums.cxx:45
+msgid "Faller"
+msgstr "Faller"
+
+#: src/pingu_enums.cxx:46
+msgid "Floater"
+msgstr "Floater"
+
+#: src/pingu_enums.cxx:47
+msgid "Jumper"
+msgstr "Jumper"
+
+#: src/pingu_enums.cxx:48
+msgid "Laserkill"
+msgstr "Laserkill"
+
+#: src/pingu_enums.cxx:49
+msgid "Miner"
+msgstr "Miner"
+
+#: src/pingu_enums.cxx:50
+msgid "Rocketlauncher"
+msgstr "Rocketlauncher"
+
+#: src/pingu_enums.cxx:51
+msgid "Slider"
+msgstr "Slider"
+
+#: src/pingu_enums.cxx:52
+msgid "Smashed"
+msgstr "Smashed"
+
+#: src/pingu_enums.cxx:53
+msgid "Splashed"
+msgstr "Splashed"
+
+#: src/pingu_enums.cxx:54
+msgid "Superman"
+msgstr "Superman"
+
+#: src/pingu_enums.cxx:55
+msgid "Teleported"
+msgstr "Teleported"
+
+#: src/pingu_enums.cxx:56
+msgid "Waiter"
+msgstr "Waiter"
+
+#: src/pingu_enums.cxx:57
+msgid "Walker"
+msgstr "Walker"
+
+#: src/pingus_counter.cxx:52
+#, c-format
+msgid "Released:%3d/%-3d Out:%3d Saved:%3d/%-3d"
+msgstr "Rein: %3d/%-3d Raus: %3d Gerettet: %3d/%-3d"
+
+#: src/pingus_main.cxx:90
+msgid "| segfault_handler: catched a SIGSEGV."
+msgstr "| segfault_handler: SIGSEGV abgefangen."
+
+#: src/pingus_main.cxx:92
+msgid "| Woops, Pingus just crashed, congratulations you've found a bug."
+msgstr ""
+"| Woops, Pingus ist abgestrzt. Gratuliere, du hast einen Bug gefunden."
+
+#: src/pingus_main.cxx:93
+msgid ""
+"| Please write a little bug report to , include informations"
+msgstr ""
+"| Bitte schreibe einen kleinen Report an 0=slower)"
+msgstr "Setze die Geschwindigkeit (0=schnellste, >0=langsamer)"
+
+#: src/pingus_main.cxx:529
+msgid "Prints the fps to stdout"
+msgstr "Schreibe die fps auf stdout"
+
+#: src/pingus_main.cxx:530
+msgid "Set the size of the map tiles (default: 32)"
+msgstr "Setze die Gre der Kartenteile (Standard: 32)"
+
+#: src/pingus_main.cxx:531
+msgid "Disable some cpu intensive features"
+msgstr "Deaktivere einige CPU intensive Funktionen"
+
+#: src/pingus_main.cxx:532
+msgid "Reduces the CPU usage by issuing sleep()"
+msgstr "Reduziert die CPU Belastung durch Verwendung von sleep()"
+
+#: src/pingus_main.cxx:534
+msgid "Demo playing and recording:"
+msgstr "Demo aufzeichnung und wiedergabe:"
+
+#: src/pingus_main.cxx:535
+msgid "FILE "
+msgstr "Datei "
+
+#: src/pingus_main.cxx:535
+msgid "Plays a demo session from FILE"
+msgstr "Spielt eine Demo Sitzung aus FILE"
+
+#: src/pingus_main.cxx:537
+msgid "Record demos for each played level"
+msgstr "Nehme Demos fr jeden gespielten Level auf"
+
+#: src/pingus_main.cxx:539
+msgid "Sound:"
+msgstr "Sound"
+
+#: src/pingus_main.cxx:540
+msgid "Disable sound"
+msgstr "Sound deaktivieren"
+
+#: src/pingus_main.cxx:541
+msgid "Disable music"
+msgstr "Musik deaktivieren"
+
+#: src/pingus_main.cxx:720
+msgid "clanVorbis support: ok"
+msgstr "clanVorbis Untersttzung: ok"
+
+#: src/pingus_main.cxx:722
+msgid "clanVoribs support: missing (.ogg music files will not be playable)"
+msgstr ""
+"clanVorbis Untersttzung: fehlt (.ogg Musik Datein knnen nicht abgespielt "
+"werden)"
+
+#: src/pingus_main.cxx:726
+msgid "clanMikMod support: ok"
+msgstr "clanMikMod Untersttzung: ok"
+
+#: src/pingus_main.cxx:728
+msgid "clanMikMod support: missing (music files will not be playable)"
+msgstr ""
+"clanMikMod Unterstzung: fehlt (Musikdateien knnen nicht abgespielt werden)"
+
+#: src/pingus_main.cxx:732
+msgid "getext support: ok"
+msgstr "gettext Untersttzung: ok"
+
+#: src/pingus_main.cxx:733
+msgid "gettext language: english"
+msgstr "gettext Sprache: deutsch"
+
+#: src/pingus_main.cxx:739
+msgid "sound support: enabled"
+msgstr "Sound Untersttzung: an"
+
+#: src/pingus_main.cxx:741
+msgid "sound support: disabled"
+msgstr "Sound Untersttzung: aus"
+
+#: src/pingus_main.cxx:744
+msgid "music support: enabled"
+msgstr "Musik Untersttzung: an"
+
+#: src/pingus_main.cxx:746
+msgid "music support: disabled"
+msgstr "Musik Untersttzung: aus"
+
+#: src/pingus_main.cxx:748
+msgid "resolution set to: "
+msgstr "Auflsung: "
+
+#: src/pingus_main.cxx:749
+msgid "fullscreen: "
+msgstr "Vollbild: "
+
+#: src/pingus_main.cxx:750
+msgid " enabled"
+msgstr "aktiviert"
+
+#: src/pingus_main.cxx:750
+msgid "disabled"
+msgstr "dktiviert"
+
+
+#: src/pingus_main.cxx:751
+msgid "reenabled"
+msgstr ""
Index: libraries/source/tinygettext/test/po/de_AT.po
===================================================================
--- libraries/source/tinygettext/test/po/de_AT.po (revision 0)
+++ libraries/source/tinygettext/test/po/de_AT.po (working copy)
@@ -0,0 +1,33 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"PO-Revision-Date: 2009-02-02 12:07+0100\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=( n != 1);\n"
+
+msgid "umlaut"
+msgstr "ÄÖÜäöü߀¢"
+
+msgid "You got %d error."
+msgid_plural "You got %d error."
+msgstr[0] "Du hast %d fehler"
+msgstr[1] "Du hast %d fehlers"
+
+msgid "found %d fatal error"
+msgid_plural "found %d fatal errors"
+msgstr[0] "s'ha trobat %d error fätal"
+msgstr[1] "s'han trobat %d errors fätals"
+
+
+msgid "I ate %d pizza."
+msgid_plural "I ate %d pizzas."
+msgstr[0] ""
Index: libraries/source/tinygettext/test/po/fr.po
===================================================================
--- libraries/source/tinygettext/test/po/fr.po (revision 0)
+++ libraries/source/tinygettext/test/po/fr.po (working copy)
@@ -0,0 +1,20 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"PO-Revision-Date: 2009-01-28 08:45+0100\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/actions/bridger.cxx:48 src/actions/bridger.cxx:232
+#: src/pingu_enums.cxx:40
+msgid "invalid"
+msgstr "ungütig"
+
Index: libraries/source/tinygettext/test/po_parser_test.cpp
===================================================================
--- libraries/source/tinygettext/test/po_parser_test.cpp (revision 0)
+++ libraries/source/tinygettext/test/po_parser_test.cpp (working copy)
@@ -0,0 +1,71 @@
+// tinygettext - A gettext replacement that works directly on .po files
+// Copyright (C) 2009 Ingo Ruhnke
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+#include
+#include
+#include
+#include
+#include
+
+#include "tinygettext/po_parser.hpp"
+#include "tinygettext/tinygettext.hpp"
+#include "tinygettext/log.hpp"
+
+void my_log_callback(const std::string& err)
+{
+ std::cerr << err;
+}
+
+int main(int argc, char** argv)
+{
+ if (argc < 2)
+ {
+ std::cout << argv[0] << " FILENAME..." << std::endl;
+ }
+ else
+ {
+ tinygettext::Log::set_log_info_callback(my_log_callback);
+ tinygettext::Log::set_log_warning_callback(my_log_callback);
+ tinygettext::Log::set_log_error_callback(my_log_callback);
+
+ for(int i = 1; i < argc; ++i)
+ {
+ std::ifstream in(argv[i]);
+ if (!in)
+ {
+ std::cerr << argv[0] << ": cannot access " << argv[i] << ": " << strerror(errno) << std::endl;
+ }
+ else
+ {
+ try
+ {
+ tinygettext::Dictionary dict1;
+ tinygettext::POParser::parse(argv[i], in, dict1);
+
+ //tinygettext::Dictionary dict2;
+ //tinygettext::POFileReader::read(in, dict2);
+ }
+ catch(std::runtime_error& err)
+ {
+ std::cout << argv[i] << ": exception: " << err.what() << std::endl;
+ }
+ }
+ }
+ }
+}
+
+/* EOF */
Index: libraries/source/tinygettext/test/test.sh
===================================================================
--- libraries/source/tinygettext/test/test.sh (revision 0)
+++ libraries/source/tinygettext/test/test.sh (working copy)
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+./tinygettext_test translate po/fr.po "invalid"
+./tinygettext_test directory po/ umlaut Deutsch
+./tinygettext_test directory po/ umlaut deutsch
+./tinygettext_test directory po/ umlaut de
+
+# EOF #
Property changes on: libraries/source/tinygettext/test/test.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: libraries/source/tinygettext/test/tinygettext_test.cpp
===================================================================
--- libraries/source/tinygettext/test/tinygettext_test.cpp (revision 0)
+++ libraries/source/tinygettext/test/tinygettext_test.cpp (working copy)
@@ -0,0 +1,204 @@
+// TinyGetText
+// Copyright (C) 2009 Ingo Ruhnke
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include "tinygettext/po_parser.hpp"
+#include "tinygettext/tinygettext.hpp"
+
+using namespace tinygettext;
+
+void print_msg(const std::string& msgid, const std::vector& msgstrs)
+{
+ std::cout << "Msgid: " << msgid << std::endl;
+ for(std::vector::const_iterator i = msgstrs.begin(); i != msgstrs.end(); ++i)
+ {
+ std::cout << *i << std::endl;
+ }
+}
+
+void print_msg_ctxt(const std::string& ctxt, const std::string& msgid, const std::vector& msgstrs)
+{
+ std::cout << "Msgctxt: " << ctxt << std::endl;
+ std::cout << "Msgid: " << msgid << std::endl;
+ for(std::vector::const_iterator i = msgstrs.begin(); i != msgstrs.end(); ++i)
+ {
+ std::cout << *i << std::endl;
+ }
+}
+
+void print_usage(int /*argc*/, char** argv)
+{
+ std::cout << "Usage: " << argv[0] << " translate FILE MESSAGE" << std::endl;
+ std::cout << " " << argv[0] << " translate FILE MESSAGE_S MESSAGE_P NUM" << std::endl;
+ std::cout << " " << argv[0] << " directory DIRECTORY MESSAGE [LANG]" << std::endl;
+ std::cout << " " << argv[0] << " language LANGUAGE" << std::endl;
+ std::cout << " " << argv[0] << " language-dir DIR" << std::endl;
+ std::cout << " " << argv[0] << " list-msgstrs FILE" << std::endl;
+}
+
+void read_dictionary(const std::string& filename, Dictionary& dict)
+{
+ std::ifstream in(filename.c_str());
+
+ if (!in)
+ {
+ throw std::runtime_error("Couldn't open " + filename);
+ }
+ else
+ {
+ POParser::parse(filename, in, dict);
+ in.close();
+ }
+}
+
+int main(int argc, char** argv)
+{
+ try
+ {
+ if (argc == 3 && strcmp(argv[1], "language-dir") == 0)
+ {
+ DictionaryManager dictionary_manager;
+ dictionary_manager.add_directory(argv[2]);
+ const std::set& languages = dictionary_manager.get_languages();
+ std::cout << "Number of languages: " << languages.size() << std::endl;
+ for (std::set::const_iterator i = languages.begin(); i != languages.end(); ++i)
+ {
+ const Language& language = *i;
+ std::cout << "Env: " << language.str() << std::endl
+ << "Name: " << language.get_name() << std::endl
+ << "Language: " << language.get_language() << std::endl
+ << "Country: " << language.get_country() << std::endl
+ << "Modifier: " << language.get_modifier() << std::endl
+ << std::endl;
+ }
+ }
+ else if (argc == 3 && strcmp(argv[1], "language") == 0)
+ {
+ Language language = Language::from_name(argv[2]);
+
+ if (language)
+ std::cout << "Env: " << language.str() << std::endl
+ << "Name: " << language.get_name() << std::endl
+ << "Language: " << language.get_language() << std::endl
+ << "Country: " << language.get_country() << std::endl
+ << "Modifier: " << language.get_modifier() << std::endl;
+ else
+ std::cout << "not found" << std::endl;
+ }
+ else if (argc == 4 && strcmp(argv[1], "translate") == 0)
+ {
+ const char* filename = argv[2];
+ const char* message = argv[3];
+
+ Dictionary dict;
+ read_dictionary(filename, dict);
+ std::cout << "TRANSLATION: \"\"\"" << dict.translate(message) << "\"\"\""<< std::endl;
+ }
+ else if (argc == 5 && strcmp(argv[1], "translate") == 0)
+ {
+ const char* filename = argv[2];
+ const char* context = argv[3];
+ const char* message = argv[4];
+
+ Dictionary dict;
+ read_dictionary(filename, dict);
+ std::cout << dict.translate_ctxt(context, message) << std::endl;
+ }
+ else if (argc == 6 && strcmp(argv[1], "translate") == 0)
+ {
+ const char* filename = argv[2];
+ const char* message_singular = argv[3];
+ const char* message_plural = argv[4];
+ int num = atoi(argv[5]);
+
+ Dictionary dict;
+ read_dictionary(filename, dict);
+ std::cout << dict.translate_plural(message_singular, message_plural, num) << std::endl;
+ }
+ else if (argc == 7 && strcmp(argv[1], "translate") == 0)
+ {
+ const char* filename = argv[2];
+ const char* context = argv[3];
+ const char* message_singular = argv[4];
+ const char* message_plural = argv[5];
+ int num = atoi(argv[6]);
+
+ Dictionary dict;
+ read_dictionary(filename, dict);
+ std::cout << dict.translate_ctxt_plural(context, message_singular, message_plural, num) << std::endl;
+ }
+ else if ((argc == 4 || argc == 5) && strcmp(argv[1], "directory") == 0)
+ {
+ const char* directory = argv[2];
+ const char* message = argv[3];
+ const char* language = (argc == 5) ? argv[4] : NULL;
+
+ DictionaryManager manager;
+ manager.add_directory(directory);
+
+ if (language)
+ {
+ Language lang = Language::from_name(language);
+ if (lang)
+ {
+ manager.set_language(lang);
+ }
+ else
+ {
+ std::cout << "Unknown language: " << language << std::endl;
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ std::cout << "Directory: '" << directory << "'" << std::endl;
+ std::cout << "Message: '" << message << "'" << std::endl;
+ std::cout << "Language: '" << manager.get_language().str() << "' (name: '"
+ << manager.get_language().get_name() << "', language: '"
+ << manager.get_language().get_language() << "', country: '"
+ << manager.get_language().get_country() << "', modifier: '"
+ << manager.get_language().get_modifier() << "')"
+ << std::endl;
+ std::cout << "Translation: '" << manager.get_dictionary().translate(message) << "'" << std::endl;
+ }
+ else if ((argc == 3) && strcmp(argv[1], "list-msgstrs") == 0)
+ {
+ const char* filename = argv[2];
+
+ Dictionary dict;
+ read_dictionary(filename, dict);
+ dict.foreach(print_msg);
+ dict.foreach_ctxt(print_msg_ctxt);
+ }
+ else
+ {
+ print_usage(argc, argv);
+ }
+ }
+ catch(std::exception& err)
+ {
+ std::cout << "Exception: " << err.what() << std::endl;
+ }
+
+ return 0;
+}
+
+/* EOF */
Index: libraries/source/tinygettext/tinygettext/dictionary.cpp
===================================================================
--- libraries/source/tinygettext/tinygettext/dictionary.cpp (revision 0)
+++ libraries/source/tinygettext/tinygettext/dictionary.cpp (working copy)
@@ -0,0 +1,208 @@
+// tinygettext - A gettext replacement that works directly on .po files
+// Copyright (C) 2006 Ingo Ruhnke
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+#include
+#include "log_stream.hpp"
+#include "dictionary.hpp"
+
+namespace tinygettext {
+
+Dictionary::Dictionary(const std::string& charset_) :
+ entries(),
+ ctxt_entries(),
+ charset(charset_),
+ plural_forms()
+{
+}
+
+Dictionary::~Dictionary()
+{
+}
+
+std::string
+Dictionary::get_charset() const
+{
+ return charset;
+}
+
+void
+Dictionary::set_plural_forms(const PluralForms& plural_forms_)
+{
+ plural_forms = plural_forms_;
+}
+
+PluralForms
+Dictionary::get_plural_forms() const
+{
+ return plural_forms;
+}
+
+std::string
+Dictionary::translate_plural(const std::string& msgid, const std::string& msgid_plural, int num)
+{
+ return translate_plural(entries, msgid, msgid_plural, num);
+}
+
+std::string
+Dictionary::translate_plural(const Entries& dict, const std::string& msgid, const std::string& msgid_plural, int count)
+{
+ Entries::const_iterator i = dict.find(msgid);
+ const std::vector& msgstrs = i->second;
+
+ if (i != dict.end())
+ {
+ unsigned int n = 0;
+ n = plural_forms.get_plural(count);
+ assert(/*n >= 0 &&*/ n < msgstrs.size());
+
+ if (!msgstrs[n].empty())
+ return msgstrs[n];
+ else
+ if (count == 1) // default to english rules
+ return msgid;
+ else
+ return msgid_plural;
+ }
+ else
+ {
+ log_info << "Couldn't translate: " << msgid << std::endl;
+ log_info << "Candidates: " << std::endl;
+ for (i = dict.begin(); i != dict.end(); ++i)
+ log_info << "'" << i->first << "'" << std::endl;
+
+ if (count == 1) // default to english rules
+ return msgid;
+ else
+ return msgid_plural;
+ }
+}
+
+std::string
+Dictionary::translate(const std::string& msgid)
+{
+ return translate(entries, msgid);
+}
+
+std::string
+Dictionary::translate(const Entries& dict, const std::string& msgid)
+{
+ Entries::const_iterator i = dict.find(msgid);
+ if (i != dict.end() && !i->second.empty())
+ {
+ return i->second[0];
+ }
+ else
+ {
+ log_info << "Couldn't translate: " << msgid << std::endl;
+ return msgid;
+ }
+}
+
+std::string
+Dictionary::translate_ctxt(const std::string& msgctxt, const std::string& msgid)
+{
+ CtxtEntries::iterator i = ctxt_entries.find(msgctxt);
+ if (i != ctxt_entries.end())
+ {
+ return translate(i->second, msgid);
+ }
+ else
+ {
+ log_info << "Couldn't translate: " << msgid << std::endl;
+ return msgid;
+ }
+}
+
+std::string
+Dictionary::translate_ctxt_plural(const std::string& msgctxt,
+ const std::string& msgid, const std::string& msgidplural, int num)
+{
+ CtxtEntries::iterator i = ctxt_entries.find(msgctxt);
+ if (i != ctxt_entries.end())
+ {
+ return translate_plural(i->second, msgid, msgidplural, num);
+ }
+ else
+ {
+ log_info << "Couldn't translate: " << msgid << std::endl;
+ if (num != 1) // default to english
+ return msgidplural;
+ else
+ return msgid;
+ }
+}
+
+void
+Dictionary::add_translation(const std::string& msgid, const std::string& ,
+ const std::vector& msgstrs)
+{
+ // Do we need msgid2 for anything? its after all supplied to the
+ // translate call, so we just throw it away here
+ entries[msgid] = msgstrs;
+}
+
+void
+Dictionary::add_translation(const std::string& msgid, const std::string& msgstr)
+{
+ std::vector& vec = entries[msgid];
+ if (vec.empty())
+ {
+ vec.push_back(msgstr);
+ }
+ else
+ {
+ log_warning << "collision in add_translation: '"
+ << msgid << "' -> '" << msgstr << "' vs '" << vec[0] << "'" << std::endl;
+ vec[0] = msgstr;
+ }
+}
+
+void
+Dictionary::add_translation(const std::string& msgctxt,
+ const std::string& msgid, const std::string& msgid_plural,
+ const std::vector& msgstrs)
+{
+ std::vector& vec = ctxt_entries[msgctxt][msgid];
+ if (vec.empty())
+ {
+ vec = msgstrs;
+ }
+ else
+ {
+ log_warning << "collision in add_translation(\"" << msgctxt << "\", \"" << msgid << "\", \"" << msgid_plural << "\")" << std::endl;
+ vec = msgstrs;
+ }
+}
+
+void
+Dictionary::add_translation(const std::string& msgctxt, const std::string& msgid, const std::string& msgstr)
+{
+ std::vector& vec = ctxt_entries[msgctxt][msgid];
+ if (vec.empty())
+ {
+ vec.push_back(msgstr);
+ }
+ else
+ {
+ log_warning << "collision in add_translation(\"" << msgctxt << "\", \"" << msgid << "\")" << std::endl;
+ vec[0] = msgstr;
+ }
+}
+
+} // namespace tinygettext
+
+/* EOF */
Index: libraries/source/tinygettext/tinygettext/dictionary.hpp
===================================================================
--- libraries/source/tinygettext/tinygettext/dictionary.hpp (revision 0)
+++ libraries/source/tinygettext/tinygettext/dictionary.hpp (working copy)
@@ -0,0 +1,123 @@
+// tinygettext - A gettext replacement that works directly on .po files
+// Copyright (C) 2006 Ingo Ruhnke
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+#ifndef HEADER_TINYGETTEXT_DICTIONARY_HPP
+#define HEADER_TINYGETTEXT_DICTIONARY_HPP
+
+#include