diff --git a/.gitignore b/.gitignore index 8e0794a7999..48fc68ec240 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ /apps/inc.php /assets /.htaccess +/translationfiles +/translationtool.phar # ignore all apps except core ones /apps*/* diff --git a/.tx/config b/.tx/config new file mode 100644 index 00000000000..b24acaeb386 --- /dev/null +++ b/.tx/config @@ -0,0 +1,129 @@ +[main] +host = https://www.transifex.com +lang_map = bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja + +[nextcloud.core] +file_filter = translationfiles//core.po +source_file = translationfiles/templates/core.pot +source_lang = en +type = PO + +[nextcloud.files] +file_filter = translationfiles//files.po +source_file = translationfiles/templates/files.pot +source_lang = en +type = PO + +[nextcloud.settings-1] +file_filter = translationfiles//settings.po +source_file = translationfiles/templates/settings.pot +source_lang = en +type = PO + +[nextcloud.lib] +file_filter = translationfiles//lib.po +source_file = translationfiles/templates/lib.pot +source_lang = en +type = PO + +[nextcloud.dav] +file_filter = translationfiles//dav.po +source_file = translationfiles/templates/dav.pot +source_lang = en +type = PO + +[nextcloud.files_encryption] +file_filter = translationfiles//encryption.po +source_file = translationfiles/templates/encryption.pot +source_lang = en +type = PO + +[nextcloud.files_external] +file_filter = translationfiles//files_external.po +source_file = translationfiles/templates/files_external.pot +source_lang = en +type = PO + +[nextcloud.files_sharing] +file_filter = translationfiles//files_sharing.po +source_file = translationfiles/templates/files_sharing.pot +source_lang = en +type = PO + +[nextcloud.files_trashbin] +file_filter = translationfiles//files_trashbin.po +source_file = translationfiles/templates/files_trashbin.pot +source_lang = en +type = PO + +[nextcloud.files_versions] +file_filter = translationfiles//files_versions.po +source_file = translationfiles/templates/files_versions.pot +source_lang = en +type = PO + +[nextcloud.user_ldap] +file_filter = translationfiles//user_ldap.po +source_file = translationfiles/templates/user_ldap.pot +source_lang = en +type = PO + +[nextcloud.comments] +file_filter = translationfiles//comments.po +source_file = translationfiles/templates/comments.pot +source_lang = en +type = PO + +[nextcloud.federatedfilesharing] +file_filter = translationfiles//federatedfilesharing.po +source_file = translationfiles/templates/federatedfilesharing.pot +source_lang = en +type = PO + +[nextcloud.federation] +file_filter = translationfiles//federation.po +source_file = translationfiles/templates/federation.pot +source_lang = en +type = PO + +[nextcloud.oauth2] +file_filter = translationfiles//oauth2.po +source_file = translationfiles/templates/oauth2.pot +source_lang = en +type = PO + +[nextcloud.sharebymail] +file_filter = translationfiles//sharebymail.po +source_file = translationfiles/templates/sharebymail.pot +source_lang = en +type = PO + +[nextcloud.systemtags] +file_filter = translationfiles//systemtags.po +source_file = translationfiles/templates/systemtags.pot +source_lang = en +type = PO + +[nextcloud.updatenotification] +file_filter = translationfiles//updatenotification.po +source_file = translationfiles/templates/updatenotification.pot +source_lang = en +type = PO + +[nextcloud.theming] +file_filter = translationfiles//theming.po +source_file = translationfiles/templates/theming.pot +source_lang = en +type = PO + +[nextcloud.twofactor_backupcodes] +file_filter = translationfiles//twofactor_backupcodes.po +source_file = translationfiles/templates/twofactor_backupcodes.pot +source_lang = en +type = PO + +[nextcloud.workflowengine] +file_filter = translationfiles//workflowengine.po +source_file = translationfiles/templates/workflowengine.pot +source_lang = en +type = PO diff --git a/build/files-checker.php b/build/files-checker.php index 20d8b4b5f33..bdded803d99 100644 --- a/build/files-checker.php +++ b/build/files-checker.php @@ -36,6 +36,7 @@ $expectedFiles = [ '.mailmap', '.scrutinizer.yml', '.tag', + '.tx', '.user.ini', '3rdparty', 'apps', @@ -62,7 +63,6 @@ $expectedFiles = [ 'index.html', 'index.php', 'issue_template.md', - 'l10n', 'lib', 'occ', 'ocs', diff --git a/build/l10nParseAppInfo.php b/build/l10nParseAppInfo.php deleted file mode 100644 index 74c040b333c..00000000000 --- a/build/l10nParseAppInfo.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -/** - * This little script parses the info.xml and extracts the app name as well - * as the navigation entry name from the XML and writes it into a file named - * specialAppInfoFakeDummyForL10nScript.php that is created and deleted during - * l10n string extraction - */ - -$fileName = getcwd() . '/appinfo/info.xml'; -$strings = []; - -if (!file_exists($fileName)) { - exit(); -} - -$xml = simplexml_load_file($fileName); - -if ($xml->name) { - $strings[] = $xml->name->__toString(); -} - -if ($xml->navigations) { - foreach ($xml->navigations as $navigation) { - $name = $navigation->navigation->name->__toString(); - if (!in_array($name, $strings)) { - $strings[] = $name; - } - } -} - -print_r($strings); - -$content = 't("' . $string . '");' . PHP_EOL; -} - -file_put_contents('specialAppInfoFakeDummyForL10nScript.php', $content); - diff --git a/l10n/.gitignore b/l10n/.gitignore deleted file mode 100644 index 72ab4b0e236..00000000000 --- a/l10n/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.po -*.pot diff --git a/l10n/.tx/config b/l10n/.tx/config deleted file mode 100644 index 5e32709c702..00000000000 --- a/l10n/.tx/config +++ /dev/null @@ -1,129 +0,0 @@ -[main] -host = https://www.transifex.com -lang_map = bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja - -[nextcloud.core] -file_filter = /core.po -source_file = templates/core.pot -source_lang = en -type = PO - -[nextcloud.files] -file_filter = /files.po -source_file = templates/files.pot -source_lang = en -type = PO - -[nextcloud.settings-1] -file_filter = /settings.po -source_file = templates/settings.pot -source_lang = en -type = PO - -[nextcloud.lib] -file_filter = /lib.po -source_file = templates/lib.pot -source_lang = en -type = PO - -[nextcloud.dav] -file_filter = /dav.po -source_file = templates/dav.pot -source_lang = en -type = PO - -[nextcloud.files_encryption] -file_filter = /encryption.po -source_file = templates/encryption.pot -source_lang = en -type = PO - -[nextcloud.files_external] -file_filter = /files_external.po -source_file = templates/files_external.pot -source_lang = en -type = PO - -[nextcloud.files_sharing] -file_filter = /files_sharing.po -source_file = templates/files_sharing.pot -source_lang = en -type = PO - -[nextcloud.files_trashbin] -file_filter = /files_trashbin.po -source_file = templates/files_trashbin.pot -source_lang = en -type = PO - -[nextcloud.files_versions] -file_filter = /files_versions.po -source_file = templates/files_versions.pot -source_lang = en -type = PO - -[nextcloud.user_ldap] -file_filter = /user_ldap.po -source_file = templates/user_ldap.pot -source_lang = en -type = PO - -[nextcloud.comments] -file_filter = /comments.po -source_file = templates/comments.pot -source_lang = en -type = PO - -[nextcloud.federatedfilesharing] -file_filter = /federatedfilesharing.po -source_file = templates/federatedfilesharing.pot -source_lang = en -type = PO - -[nextcloud.federation] -file_filter = /federation.po -source_file = templates/federation.pot -source_lang = en -type = PO - -[nextcloud.oauth2] -file_filter = /oauth2.po -source_file = templates/oauth2.pot -source_lang = en -type = PO - -[nextcloud.sharebymail] -file_filter = /sharebymail.po -source_file = templates/sharebymail.pot -source_lang = en -type = PO - -[nextcloud.systemtags] -file_filter = /systemtags.po -source_file = templates/systemtags.pot -source_lang = en -type = PO - -[nextcloud.updatenotification] -file_filter = /updatenotification.po -source_file = templates/updatenotification.pot -source_lang = en -type = PO - -[nextcloud.theming] -file_filter = /theming.po -source_file = templates/theming.pot -source_lang = en -type = PO - -[nextcloud.twofactor_backupcodes] -file_filter = /twofactor_backupcodes.po -source_file = templates/twofactor_backupcodes.pot -source_lang = en -type = PO - -[nextcloud.workflowengine] -file_filter = /workflowengine.po -source_file = templates/workflowengine.pot -source_lang = en -type = PO diff --git a/l10n/l10n.pl b/l10n/l10n.pl deleted file mode 100644 index c8312982fdc..00000000000 --- a/l10n/l10n.pl +++ /dev/null @@ -1,227 +0,0 @@ -#!/usr/bin/perl -use strict; -use Locale::PO; -use Cwd; -use Data::Dumper; -use File::Path; - -sub crawlPrograms{ - my( $dir, $ignore ) = @_; - my @found = (); - - opendir( DIR, $dir ); - my @files = readdir( DIR ); - closedir( DIR ); - @files = sort( @files ); - - foreach my $i ( @files ){ - next if substr( $i, 0, 1 ) eq '.'; - if( $i eq 'l10n' && !$ignore ){ - push( @found, $dir ); - } - elsif( -d $dir.'/'.$i ){ - push( @found, crawlPrograms( $dir.'/'.$i )); - } - } - - return @found; -} - -sub crawlFiles{ - my( $dir ) = @_; - my @found = (); - - opendir( DIR, $dir ); - my @files = readdir( DIR ); - closedir( DIR ); - @files = sort( @files ); - - foreach my $i ( @files ){ - next if substr( $i, 0, 1 ) eq '.'; - next if $i eq 'l10n'; - - if( -d $dir.'/'.$i ){ - push( @found, crawlFiles( $dir.'/'.$i )); - } - else{ - push(@found,$dir.'/'.$i) if $i =~ /.*(?){ - my $line = $_; - chomp($line); - $ignore{"./$line"}++; - } - close(IN); - return %ignore; -} - -sub getPluralInfo { - my( $info ) = @_; - - # get string - $info =~ s/.*Plural-Forms: (.+)\\n.*/$1/; - $info =~ s/^(.*)\\n.*/$1/g; - - return $info; -} - -sub init() { - # let's get the version from stdout of xgettext - my $out = `xgettext --version`; - # we assume the first line looks like this 'xgettext (GNU gettext-tools) 0.19.3' - $out = substr $out, 29, index($out, "\n")-29; - $out =~ s/^\s+|\s+$//g; - $out = "v" . $out; - my $actual = version->parse($out); - # 0.18.3 introduced JavaScript as a language option - my $expected = version->parse('v0.18.3'); - if ($actual < $expected) { - die( "Minimum expected version of xgettext is " . $expected . ". Detected: " . $actual ); - } -} - -init(); - -my $task = shift( @ARGV ); -my $place = '..'; - -die( "Usage: l10n.pl task\ntask: read, write\n" ) unless $task && $place; - -# Our current position -my $whereami = cwd(); -die( "Program must be executed in a l10n-folder called 'l10n'" ) unless $whereami =~ m/\/l10n$/; - -# Where are i18n-files? -my @dirs = crawlPrograms( $place, 1 ); - -# Languages -my @languages = (); -opendir( DIR, '.' ); -my @files = readdir( DIR ); -closedir( DIR ); -foreach my $i ( @files ){ - push( @languages, $i ) if -d $i && substr( $i, 0, 1 ) ne '.'; -} - -if( $task eq 'read' ){ - rmtree( 'templates' ); - mkdir( 'templates' ) unless -d 'templates'; - print "Mode: reading\n"; - foreach my $dir ( @dirs ){ - my @temp = split( /\//, $dir ); - my $app = pop( @temp ); - chdir( $dir ); - # parses the app info and creates an dummy file specialAppInfoFakeDummyForL10nScript.php - `php $whereami/../build/l10nParseAppInfo.php`; - my @totranslate = crawlFiles('.'); - my %ignore = readIgnorelist(); - my $output = "${whereami}/templates/$app.pot"; - print " Processing $app\n"; - - foreach my $file ( @totranslate ){ - next if $ignore{$file}; - my $keywords = ''; - if( $file =~ /\.js$/ ){ - $keywords = '--keyword=t:2 --keyword=n:2,3'; - } - else{ - $keywords = '--keyword=t --keyword=n:1,2'; - } - my $language = ( $file =~ /\.js$/ ? 'Javascript' : 'PHP'); - my $joinexisting = ( -e $output ? '--join-existing' : ''); - print " Reading $file\n"; - `xgettext --output="$output" $joinexisting $keywords --language=$language "$file" --add-comments=TRANSLATORS --from-code=UTF-8 --package-version="8.0.0" --package-name="ownCloud Core" --msgid-bugs-address="translations\@owncloud.org"`; - } - rmtree( "specialAppInfoFakeDummyForL10nScript.php" ); - chdir( $whereami ); - } -} -elsif( $task eq 'write' ){ - print "Mode: write\n"; - foreach my $dir ( @dirs ){ - my @temp = split( /\//, $dir ); - my $app = pop( @temp ); - chdir( $dir.'/l10n' ); - print " Processing $app\n"; - foreach my $language ( @languages ){ - next if $language eq 'templates'; - - my $input = "${whereami}/$language/$app.po"; - next unless -e $input; - - print " Language $language\n"; - my $array = Locale::PO->load_file_asarray( $input ); - # Create array - my @strings = (); - my @js_strings = (); - my $plurals; - - TRANSLATIONS: foreach my $string ( @{$array} ){ - if( $string->msgid() eq '""' ){ - # Translator information - $plurals = getPluralInfo( $string->msgstr()); - } - elsif( defined( $string->msgstr_n() )){ - # plural translations - my @variants = (); - my $msgid = $string->msgid(); - $msgid =~ s/^"(.*)"$/$1/; - my $msgid_plural = $string->msgid_plural(); - $msgid_plural =~ s/^"(.*)"$/$1/; - my $identifier = "_" . $msgid."_::_".$msgid_plural . "_"; - - foreach my $variant ( sort { $a <=> $b} keys( %{$string->msgstr_n()} )){ - next TRANSLATIONS if $string->msgstr_n()->{$variant} eq '""'; - push( @variants, $string->msgstr_n()->{$variant} ); - } - - push( @strings, "\"$identifier\" => array(".join(",", @variants).")"); - push( @js_strings, "\"$identifier\" : [".join(",", @variants)."]"); - } - else{ - # singular translations - next TRANSLATIONS if $string->msgstr() eq '""'; - push( @strings, $string->msgid()." => ".$string->msgstr()); - push( @js_strings, $string->msgid()." : ".$string->msgstr()); - } - } - next if $#strings == -1; # Skip empty files - - for (@strings) { - s/\$/\\\$/g; - } - - # delete old php file - unlink "$language.php"; - - # Write js file - open( OUT, ">$language.js" ); - print OUT "OC.L10N.register(\n \"$app\",\n {\n "; - print OUT join( ",\n ", @js_strings ); - print OUT "\n},\n\"$plurals\");\n"; - close( OUT ); - - # Write json file - open( OUT, ">$language.json" ); - print OUT "{ \"translations\": "; - print OUT "{\n "; - print OUT join( ",\n ", @js_strings ); - print OUT "\n},\"pluralForm\" :\"$plurals\"\n}"; - close( OUT ); - - } - chdir( $whereami ); - } -} -else{ - print "unknown task!\n"; -} diff --git a/l10n/rm-old.sh b/l10n/rm-old.sh deleted file mode 100644 index e5e1348014b..00000000000 --- a/l10n/rm-old.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -lang=(ach ady af_ZA ak am_ET ar ast az bal be bg_BG bn_BD bn_IN bs ca cs_CZ cy_GB da de de_AT de_DE el en_GB en@pirate eo es es_AR es_CL es_MX et_EE eu fa fi_FI fil fr fy_NL gl gu he hi hr hu_HU hy ia id io is it ja jv ka_GE km kn ko ku_IQ la lb lo lt_LT lv mg mk ml ml_IN mn mr ms_MY mt_MT my_MM nb_NO nds ne nl nn_NO nqo oc or_IN pa pl pt_BR pt_PT ro ru si_LK sk_SK sl sq sr sr@latin su sv sw_KE ta_IN ta_LK te tg_TJ th_TH tl_PH tr tzl tzm ug uk ur_PK uz vi yo zh_CN zh_HK zh_TW) - -ignore="" - -for fignore in "${lang[@]}"; do - ignore=${ignore}"-not -name ${fignore}.js -not -name ${fignore}.json " -done - - -find ../lib/l10n -type f $ignore -delete -find ../settings/l10n -type f $ignore -delete -find ../core/l10n -type f $ignore -delete -find ../apps/files/l10n -type f $ignore -delete -find ../apps/encryption/l10n -type f $ignore -delete -find ../apps/files_external/l10n -type f $ignore -delete -find ../apps/files_sharing/l10n -type f $ignore -delete -find ../apps/files_trashbin/l10n -type f $ignore -delete -find ../apps/files_versions/l10n -type f $ignore -delete -find ../apps/user_ldap/l10n -type f $ignore -delete -find ../apps/user_webdavauth/l10n -type f $ignore -delete - -