summaryrefslogtreecommitdiff
path: root/pidgin/win32/nsis/create_nsis_translations.pl
diff options
context:
space:
mode:
Diffstat (limited to 'pidgin/win32/nsis/create_nsis_translations.pl')
-rw-r--r--pidgin/win32/nsis/create_nsis_translations.pl390
1 files changed, 390 insertions, 0 deletions
diff --git a/pidgin/win32/nsis/create_nsis_translations.pl b/pidgin/win32/nsis/create_nsis_translations.pl
new file mode 100644
index 0000000000..6e9a8b1f42
--- /dev/null
+++ b/pidgin/win32/nsis/create_nsis_translations.pl
@@ -0,0 +1,390 @@
+#!/usr/bin/perl
+#
+# create_nsis_translations.pl
+#
+# Copyright (C) 2000-2009 Bruno Coudoin
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+
+use strict;
+
+sub usage {
+ print 'create_nsis_translations.pl translations installer tmp_dir
+ translations
+ This is an input file that contains all the
+ translated strings. If must be formated as a GNU/Linux
+ desktop file and contains multiple strings entry.
+ For example you must have:
+ toBe=To be or not to be
+ toBe[fr]=Etre ou ne pas etre
+
+ installer
+ This is your nsis installer source file. You must include
+ in it the marker @INSERT_TRANSLATIONS@ before you use any
+ translation string.
+ After that you can use the variable $(toBe) in your file.
+
+ tmp_dir
+ This is a directory in which temporary files needed for
+ the translation system.
+ It will be created if non existant.
+ You can remove it once you have created your installer.
+';
+}
+
+my $translations;
+if (! $ARGV[0] || ! -f $ARGV[0])
+{
+ usage();
+}
+else
+{
+ $translations = $ARGV[0];
+}
+
+shift;
+my $installer;
+if (! $ARGV[0] || ! -f $ARGV[0])
+{
+ usage();
+}
+else
+{
+ $installer = $ARGV[0];
+}
+
+shift;
+my $tmp_dir;
+if (! $ARGV[0] )
+{
+ usage();
+}
+else
+{
+ $tmp_dir = $ARGV[0];
+
+ if ( ! -d $tmp_dir )
+ {
+ mkdir $tmp_dir or die "ERROR: '$tmp_dir' $!\n";
+ }
+}
+
+print "Processing translation file '$translations'\n";
+print " NSIS source file '$installer'\n";
+print " Working dir '$tmp_dir'\n";
+
+# Commented out locales that are not available in nsis
+# Map value is ["NSISFilename", "Encoding", "LCID"]
+my %localeNames = (
+ "af" => ["Afrikaans", "WINDOWS-1252", "1078"],
+# "am" => ["Amharic", "UTF-8"],
+ "ar" => ["Arabic", "WINDOWS-1256", "1025"],
+ "be" => ["Belarusian", "WINDOWS-1251", "1059"],
+ "bg" => ["Bulgarian", "WINDOWS-1251", "1026"],
+ "bs" => ["Bosnian", "WINDOWS-1250", "5146"],
+ "br" => ["Breton", "WINDOWS-1252", "1150"],
+ "ca" => ["Catalan", "WINDOWS-1252", "1027"],
+ "cs" => ["Czech", "WINDOWS-1250", "1029"],
+ "cy" => ["Welsh", "WINDOWS-1252", "1160"],
+ "da" => ["Danish", "WINDOWS-1252", "1030"],
+ "de" => ["German", "WINDOWS-1252", "1031"],
+# "dz" => ["Dzongkha", "UTF-8"],
+ "el" => ["Greek", "WINDOWS-1253", "1032"],
+ "en" => ["English", "WINDOWS-1252", "1033"],
+ "eo" => ["Esperanto", "WINDOWS-1252", "9998"],
+ "es" => ["Spanish", "WINDOWS-1252", "1034"],
+ "et" => ["Estonian", "WINDOWS-1257", "1061"],
+ "eu" => ["Basque", "WINDOWS-1252", "1069"],
+ "fa" => ["Farsi", "WINDOWS-1256", "1065"],
+ "fi" => ["Finnish", "WINDOWS-1252", "1035"],
+ "fr" => ["French", "WINDOWS-1252", "1036"],
+ "ga" => ["Irish", "WINDOWS-1252", "2108"],
+ "gl" => ["Galician", "WINDOWS-1252", "1110"],
+# "gu" => ["Gujarati", "UTF-8"],
+ "he" => ["Hebrew", "WINDOWS-1255", "1037"],
+# "hi" => ["Hindi", "UTF-8"],
+ "hr" => ["Croatian", "WINDOWS-1250", "1050"],
+ "hu" => ["Hungarian", "WINDOWS-1250", "1038"],
+ "id" => ["Indonesian", "WINDOWS-1252", "1057"],
+ "is" => ["Icelandic", "WINDOWS-1252", "15"], #This should be 1039!
+ "it" => ["Italian", "WINDOWS-1252", "1040"],
+ "ja" => ["Japanese", "CP932", "1041"],
+# "ka" => ["Georgian", "UTF-8"],
+ "ko" => ["Korean", "CP949", "1042"],
+ "ku" => ["Kurdish", "WINDOWS-1254", "9999"],
+ "lb" => ["Luxembourgish", "WINDOWS-1252", "4103"],
+ "lt" => ["Lithuanian", "WINDOWS-1257", "1063"],
+ "lv" => ["Latvian", "WINDOWS-1257", "1062"],
+ "mk" => ["Macedonian", "WINDOWS-1251", "1071"],
+# "ml" => ["Malayalam", "UTF-8"],
+# "mr" => ["Marathi", "UTF-8"],
+ "mn" => ["Mongolian", "WINDOWS-1251", "1104"],
+ "ms" => ["Malay", "WINDOWS-1252", "1086"],
+ "nb" => ["Norwegian", "WINDOWS-1252", "1044"],
+# "ne" => ["Nepal", "UTF-8"],
+ "nl" => ["Dutch", "WINDOWS-1252", "1043"],
+ "nn" => ["NorwegianNynorsk", "WINDOWS-1252", "2068"],
+# "oc" => ["Occitan", "WINDOWS-1252"],
+# "pa" => ["Punjabi", "UTF-8"],
+ "pl" => ["Polish", "WINDOWS-1250", "1045"],
+ "pt" => ["Portuguese", "WINDOWS-1252", "2070"],
+ "pt_BR" => ["PortugueseBR", "WINDOWS-1252", "1046"],
+ "ro" => ["Romanian", "WINDOWS-1250", "1048"],
+ "ru" => ["Russian", "WINDOWS-1251", "1049"],
+# "rw" => ["Kinyarwanda", "UTF-8"],
+ "sk" => ["Slovak", "WINDOWS-1250", "1051"],
+ "sl" => ["Slovenian", "WINDOWS-1250", "1060"],
+# "so" => ["Somali", "UTF-8"],
+ "sq" => ["Albanian", "WINDOWS-1252", "1052"],
+ "sr" => ["Serbian", "WINDOWS-1251", "3098"],
+ "sr\@latin" => ["SerbianLatin", "WINDOWS-1250", "2074"],
+ "sv" => ["Swedish", "WINDOWS-1252", "1053"],
+# "ta" => ["Tamil", "UTF-8"],
+ "th" => ["Thai", "WINDOWS-874", "1054"],
+ "tr" => ["Turkish", "WINDOWS-1254", "1055"],
+ "uk" => ["Ukrainian", "WINDOWS-1251", "1058"],
+ "uz" => ["Uzbek", "WINDOWS-1252", "1091"],
+# "ur" => ["Urdu", "UTF-8"],
+# "vi" => ["Vietnamese", "WINDOWS-1258"],
+# "wa" => ["Walloon", "WINDOWS-1252"],
+ "zh_CN" => ["SimpChinese", "WINDOWS-936", "2052"],
+ "zh_TW" => ["TradChinese", "CP950", "1028"],
+);
+
+my @localeKeys = keys(%localeNames);
+
+# Create the holder for the results
+# %result{"locale"}{"stringname"} = result line
+print "Parsing nsis_translations.desktop\n";
+my %result;
+
+# Create a hash of the keys to translate
+open (MYFILE, $translations);
+while (<MYFILE>) {
+ chomp $_;
+ if ($_ =~ /Encoding=UTF-8/)
+ {
+ next;
+ }
+ elsif ($_ =~ /^(\w+)=(.*)/)
+ {
+ my $line = "!define $1 \"$2\"\n";
+ $result{"en"}{"$1"} = $line;
+ }
+ elsif ($_ =~ /^(\w+)\[(\w+)\]=(.*)/)
+ {
+ my $line = "!define $1 \"$3\"\n";
+ $result{"$2"}{"$1"} = $line;
+ }
+}
+close (MYFILE);
+
+# Lets insert the default languages
+# in the installer file which means replacing:
+# @INSERTMACRO_MUI_LANGUAGE@
+# By the list of locales:
+# !insertmacro MUI_LANGUAGE "French"
+
+my $muiLanguages;
+$muiLanguages = '
+ ;; English goes first because its the default. The rest are
+ ;; in alphabetical order (at least the strings actually displayed
+ ;; will be).
+ !insertmacro MUI_LANGUAGE "English"
+';
+
+# The specific GCompris translation for the installer
+# replacing:
+# @GCOMPRIS_MACRO_INCLUDE_LANGFILE@
+# By the list of locales:
+# !insertmacro GCOMPRIS_MACRO_INCLUDE_LANGFILE "ALBANIAN" "${GCOMPRIS_NSIS_INCLUDE_PATH}\translations\albanian.nsh"
+
+my $gcomprisLanguages;
+
+$gcomprisLanguages .= '
+;--------------------------------
+;Translations
+ !define GCOMPRIS_DEFAULT_LANGFILE "${GCOMPRIS_NSIS_INCLUDE_PATH}\\translations\\en.nsh"
+;;
+;; Windows GCompris NSIS installer language macros
+;;
+
+!macro GCOMPRIS_MACRO_DEFAULT_STRING LABEL VALUE
+ !ifndef "${LABEL}"
+ !define "${LABEL}" "${VALUE}"
+ !ifdef INSERT_DEFAULT
+ !warning "${LANG} lang file missing ${LABEL}, using default..."
+ !endif
+ !endif
+!macroend
+
+!macro GCOMPRIS_MACRO_LANGSTRING_INSERT LABEL LANG
+ LangString "${LABEL}" "${LANG_${LANG}}" "${${LABEL}}"
+ !undef "${LABEL}"
+!macroend
+
+!macro GCOMPRIS_MACRO_LANGUAGEFILE_BEGIN LANG
+ !define CUR_LANG "${LANG}"
+!macroend
+';
+
+
+# GCOMPRIS_MACRO_LANGUAGEFILE_END
+$gcomprisLanguages .= '
+!macro GCOMPRIS_MACRO_LANGUAGEFILE_END
+ !define INSERT_DEFAULT
+ !include "${GCOMPRIS_DEFAULT_LANGFILE}"
+ !undef INSERT_DEFAULT
+
+ ; String labels should match those from the default language file.
+';
+
+my $text_en = $result{"en"};
+foreach my $keyEn (keys(%$text_en)) {
+ $gcomprisLanguages .= " !insertmacro GCOMPRIS_MACRO_LANGSTRING_INSERT $keyEn \${CUR_LANG}";
+ $gcomprisLanguages .= "\n";
+}
+
+$gcomprisLanguages .= '
+ !undef CUR_LANG
+!macroend
+';
+
+$gcomprisLanguages .= '
+!macro GCOMPRIS_MACRO_INCLUDE_LANGFILE LANG FILE
+ !insertmacro GCOMPRIS_MACRO_LANGUAGEFILE_BEGIN "${LANG}"
+ !include "${FILE}"
+ !insertmacro GCOMPRIS_MACRO_LANGUAGEFILE_END
+!macroend
+';
+
+#
+# Create each nsh translation file
+#
+
+print "Creating the nsh default file\n";
+open (DESC, ">$tmp_dir/en.nsh");
+print DESC ";; Auto generated file by create_nsis_translations.pl\n";
+foreach my $keyEn (keys(%$text_en)) {
+ my $line = $result{'en'}{$keyEn};
+ $line =~ s/!define /!insertmacro GCOMPRIS_MACRO_DEFAULT_STRING /;
+ print DESC $line;
+}
+close DESC;
+
+$gcomprisLanguages .= " !insertmacro GCOMPRIS_MACRO_INCLUDE_LANGFILE".
+ " \"ENGLISH\"".
+ " \"\${GCOMPRIS_NSIS_INCLUDE_PATH}\\translations\\en.nsh\"\n";
+
+my $selectTranslationFunction = '
+!macro SELECT_TRANSLATION_SECTION LANG_NAME LANG_CODE
+ StrCmp "$LANGUAGE" "${LANG_${LANG_NAME}}" 0 end_${LANG_CODE}
+ !insertmacro SelectSection ${SecLang_${LANG_CODE}}
+ Goto done
+ end_${LANG_CODE}:
+!macroend
+; Convert the current $LANGUAGE to a language code that we can use for translation mo selection
+; If there\'s a better way to do this, I\'d love to know it
+!macro SELECT_TRANSLATION_FUNCTION
+';
+
+#
+# Two pass are needed:
+# - create the utf8 file
+# - transform it to the proper windows locale
+#
+print "Creating the nsh locale files\n";
+foreach my $lang (@localeKeys) {
+ if ( $lang eq "en" ) { next; }
+ open (DESC, ">$tmp_dir/$lang.nsh.utf8");
+ print DESC ";; Auto generated file by create_nsis_translations.pl\n";
+ print DESC ";; Code Page: $localeNames{$lang}[1]\n";
+
+ my $text_locale = $result{"$lang"};
+ my $total_key_count = 0;
+ my $found_key_count = 0;
+ foreach my $keyEn (keys(%$text_en)) {
+ my $found = 0;
+ $total_key_count++;
+ foreach my $keyLocale (keys(%$text_locale)) {
+ # Fine, we found a translation
+ if ( $keyLocale eq $keyEn )
+ {
+ print DESC "$result{$lang}{$keyLocale}";
+ $found = 1;
+ $found_key_count++;
+ last;
+ }
+ }
+ # English keys are the reference.
+ # If not found they are inserted
+ #if ( ! $found )
+ #{
+ # print DESC "$result{'en'}{$keyEn}";
+ #}
+ }
+ close DESC;
+
+ # If we have at least 50% of the keys found, include the language
+ if (($found_key_count * 1.0 / $total_key_count) >= 0.5) {
+ $muiLanguages .= " !insertmacro MUI_LANGUAGE \"$localeNames{$lang}[0]\"\n";
+ $gcomprisLanguages .= " !insertmacro GCOMPRIS_MACRO_INCLUDE_LANGFILE".
+ " \"". uc($localeNames{$lang}[0]) . "\"".
+ " \"\${GCOMPRIS_NSIS_INCLUDE_PATH}\\translations\\$lang.nsh\"\n";
+ $selectTranslationFunction .= " !insertmacro SELECT_TRANSLATION_SECTION".
+ " \"" . uc($localeNames{$lang}[0]) . "\" \"$lang\"\n";
+ } else {
+ print "Ignoring language $lang because it is less than 50% translated ($found_key_count of $total_key_count).\n";
+ next;
+ }
+
+
+ # iconv conversion
+ system("iconv -f UTF-8 -t $localeNames{$lang}[1] $tmp_dir/$lang.nsh.utf8 > $tmp_dir/$lang.nsh");
+ if ($? ne 0)
+ {
+ die("ERROR: Failed to run: iconv -f UTF-8 -t $localeNames{$lang}[1] $lang.nsh.utf8 > $lang.nsh\n");
+ }
+ #`rm $tmp_dir/$lang.nsh.utf8`;
+
+}
+
+$selectTranslationFunction .= '
+done:
+!macroend
+';
+
+# We have all the data, let's replace it
+my $gcomprisInstaller;
+open (MYFILE, $installer);
+while (<MYFILE>) {
+ if ($_ =~ /\@INSERT_TRANSLATIONS\@/)
+ {
+ print "Processing \@INSERT_TRANSLATIONS\@\n";
+ $gcomprisInstaller .= $muiLanguages;
+ $gcomprisInstaller .= $gcomprisLanguages;
+ $gcomprisInstaller .= $selectTranslationFunction;
+ }
+ else
+ {
+ $gcomprisInstaller .= "$_";
+ }
+}
+close (MYFILE);
+
+# Rewrite the file with the replaced data
+open (MYFILE, ">$installer");
+print MYFILE "$gcomprisInstaller";
+close (MYFILE);