Switch to nested object pluralisation format for i18n files (#11412)
This commit is contained in:
parent
523e691136
commit
aee6247ad8
56 changed files with 11874 additions and 6240 deletions
|
@ -1,192 +0,0 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Cwd 'abs_path';
|
||||
|
||||
# script which checks how out of sync the i18ns are drifting
|
||||
|
||||
# example i18n format:
|
||||
# "%(oneUser)sleft": "%(oneUser)sleft",
|
||||
|
||||
$|=1;
|
||||
|
||||
$0 =~ /^(.*\/)/;
|
||||
my $i18ndir = abs_path($1."/../src/i18n/strings");
|
||||
my $srcdir = abs_path($1."/../src");
|
||||
|
||||
my $en = read_i18n($i18ndir."/en_EN.json");
|
||||
|
||||
my $src_strings = read_src_strings($srcdir);
|
||||
my $src = {};
|
||||
|
||||
print "Checking strings in src\n";
|
||||
foreach my $tuple (@$src_strings) {
|
||||
my ($s, $file) = (@$tuple);
|
||||
$src->{$s} = $file;
|
||||
if (!$en->{$s}) {
|
||||
if ($en->{$s . '.'}) {
|
||||
printf ("%50s %24s\t%s\n", $file, "en_EN has fullstop!", $s);
|
||||
}
|
||||
else {
|
||||
$s =~ /^(.*)\.?$/;
|
||||
if ($en->{$1}) {
|
||||
printf ("%50s %24s\t%s\n", $file, "en_EN lacks fullstop!", $s);
|
||||
}
|
||||
else {
|
||||
printf ("%50s %24s\t%s\n", $file, "Translation missing!", $s);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print "\nChecking en_EN\n";
|
||||
my $count = 0;
|
||||
my $remaining_src = {};
|
||||
foreach (keys %$src) { $remaining_src->{$_}++ };
|
||||
|
||||
foreach my $k (sort keys %$en) {
|
||||
# crappy heuristic to ignore country codes for now...
|
||||
next if ($k =~ /^(..|..-..)$/);
|
||||
|
||||
if ($en->{$k} ne $k) {
|
||||
printf ("%50s %24s\t%s\n", "en_EN", "en_EN is not symmetrical", $k);
|
||||
}
|
||||
|
||||
if (!$src->{$k}) {
|
||||
if ($src->{$k. '.'}) {
|
||||
printf ("%50s %24s\t%s\n", $src->{$k. '.'}, "src has fullstop!", $k);
|
||||
}
|
||||
else {
|
||||
$k =~ /^(.*)\.?$/;
|
||||
if ($src->{$1}) {
|
||||
printf ("%50s %24s\t%s\n", $src->{$1}, "src lacks fullstop!", $k);
|
||||
}
|
||||
else {
|
||||
printf ("%50s %24s\t%s\n", '???', "Not present in src?", $k);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
$count++;
|
||||
delete $remaining_src->{$k};
|
||||
}
|
||||
}
|
||||
printf ("$count/" . (scalar keys %$src) . " strings found in src are present in en_EN\n");
|
||||
foreach (keys %$remaining_src) {
|
||||
print "missing: $_\n";
|
||||
}
|
||||
|
||||
opendir(DIR, $i18ndir) || die $!;
|
||||
my @files = readdir(DIR);
|
||||
closedir(DIR);
|
||||
foreach my $lang (grep { -f "$i18ndir/$_" && !/(basefile|en_EN)\.json/ } @files) {
|
||||
print "\nChecking $lang\n";
|
||||
|
||||
my $map = read_i18n($i18ndir."/".$lang);
|
||||
my $count = 0;
|
||||
|
||||
my $remaining_en = {};
|
||||
foreach (keys %$en) { $remaining_en->{$_}++ };
|
||||
|
||||
foreach my $k (sort keys %$map) {
|
||||
{
|
||||
no warnings 'uninitialized';
|
||||
my $vars = {};
|
||||
while ($k =~ /%\((.*?)\)s/g) {
|
||||
$vars->{$1}++;
|
||||
}
|
||||
while ($map->{$k} =~ /%\((.*?)\)s/g) {
|
||||
$vars->{$1}--;
|
||||
}
|
||||
foreach my $var (keys %$vars) {
|
||||
if ($vars->{$var} != 0) {
|
||||
printf ("%10s %24s\t%s\n", $lang, "Broken var ($var)s", $k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($en->{$k}) {
|
||||
if ($map->{$k} eq $k) {
|
||||
printf ("%10s %24s\t%s\n", $lang, "Untranslated string?", $k);
|
||||
}
|
||||
$count++;
|
||||
delete $remaining_en->{$k};
|
||||
}
|
||||
else {
|
||||
if ($en->{$k . "."}) {
|
||||
printf ("%10s %24s\t%s\n", $lang, "en_EN has fullstop!", $k);
|
||||
next;
|
||||
}
|
||||
|
||||
$k =~ /^(.*)\.?$/;
|
||||
if ($en->{$1}) {
|
||||
printf ("%10s %24s\t%s\n", $lang, "en_EN lacks fullstop!", $k);
|
||||
next;
|
||||
}
|
||||
|
||||
printf ("%10s %24s\t%s\n", $lang, "Not present in en_EN", $k);
|
||||
}
|
||||
}
|
||||
|
||||
if (scalar keys %$remaining_en < 100) {
|
||||
foreach (keys %$remaining_en) {
|
||||
printf ("%10s %24s\t%s\n", $lang, "Not yet translated", $_);
|
||||
}
|
||||
}
|
||||
|
||||
printf ("$count/" . (scalar keys %$en) . " strings translated\n");
|
||||
}
|
||||
|
||||
sub read_i18n {
|
||||
my $path = shift;
|
||||
my $map = {};
|
||||
$path =~ /.*\/(.*)$/;
|
||||
my $lang = $1;
|
||||
|
||||
open(FILE, "<", $path) || die $!;
|
||||
while(<FILE>) {
|
||||
if ($_ =~ m/^(\s+)"(.*?)"(: *)"(.*?)"(,?)$/) {
|
||||
my ($indent, $src, $colon, $dst, $comma) = ($1, $2, $3, $4, $5);
|
||||
$src =~ s/\\"/"/g;
|
||||
$dst =~ s/\\"/"/g;
|
||||
|
||||
if ($map->{$src}) {
|
||||
printf ("%10s %24s\t%s\n", $lang, "Duplicate translation!", $src);
|
||||
}
|
||||
$map->{$src} = $dst;
|
||||
}
|
||||
}
|
||||
close(FILE);
|
||||
|
||||
return $map;
|
||||
}
|
||||
|
||||
sub read_src_strings {
|
||||
my $path = shift;
|
||||
|
||||
use File::Find;
|
||||
use File::Slurp;
|
||||
|
||||
my $strings = [];
|
||||
|
||||
my @files;
|
||||
find( sub { push @files, $File::Find::name if (-f $_ && /\.jsx?$/) }, $path );
|
||||
foreach my $file (@files) {
|
||||
my $src = read_file($file);
|
||||
$src =~ s/'\s*\+\s*'//g;
|
||||
$src =~ s/"\s*\+\s*"//g;
|
||||
|
||||
$file =~ s/^.*\/src/src/;
|
||||
while ($src =~ /_t(?:Jsx)?\(\s*'(.*?[^\\])'/sg) {
|
||||
my $s = $1;
|
||||
$s =~ s/\\'/'/g;
|
||||
push @$strings, [$s, $file];
|
||||
}
|
||||
while ($src =~ /_t(?:Jsx)?\(\s*"(.*?[^\\])"/sg) {
|
||||
push @$strings, [$1, $file];
|
||||
}
|
||||
}
|
||||
|
||||
return $strings;
|
||||
}
|
|
@ -1,114 +0,0 @@
|
|||
#!/usr/bin/perl -ni
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
# script which synchronises i18n strings to include punctuation.
|
||||
# i've cherry-picked ones which seem to have diverged between the different translations
|
||||
# from TextForEvent, causing missing events all over the place
|
||||
|
||||
BEGIN {
|
||||
$::fixups = [split(/\n/, <<EOT
|
||||
%(targetName)s accepted the invitation for %(displayName)s.
|
||||
%(targetName)s accepted an invitation.
|
||||
%(senderName)s requested a VoIP conference.
|
||||
%(senderName)s invited %(targetName)s.
|
||||
%(senderName)s banned %(targetName)s.
|
||||
%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.
|
||||
%(senderName)s set their display name to %(displayName)s.
|
||||
%(senderName)s removed their display name (%(oldDisplayName)s).
|
||||
%(senderName)s removed their profile picture.
|
||||
%(senderName)s changed their profile picture.
|
||||
%(senderName)s set a profile picture.
|
||||
VoIP conference started.
|
||||
%(targetName)s joined the room.
|
||||
VoIP conference finished.
|
||||
%(targetName)s rejected the invitation.
|
||||
%(targetName)s left the room.
|
||||
%(senderName)s unbanned %(targetName)s.
|
||||
%(senderName)s kicked %(targetName)s.
|
||||
%(senderName)s withdrew %(targetName)s's inivitation.
|
||||
%(targetName)s left the room.
|
||||
%(senderDisplayName)s changed the topic to "%(topic)s".
|
||||
%(senderDisplayName)s changed the room name to %(roomName)s.
|
||||
%(senderDisplayName)s sent an image.
|
||||
%(senderName)s answered the call.
|
||||
%(senderName)s ended the call.
|
||||
%(senderName)s placed a %(callType)s call.
|
||||
%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.
|
||||
%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).
|
||||
%(senderName)s changed the power level of %(powerLevelDiffText)s.
|
||||
For security, this session has been signed out. Please sign in again.
|
||||
You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.
|
||||
A new password must be entered.
|
||||
Guests can't set avatars. Please register.
|
||||
Failed to set avatar.
|
||||
Unable to verify email address.
|
||||
Guests can't use labs features. Please register.
|
||||
A new password must be entered.
|
||||
Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.
|
||||
Guests cannot join this room even if explicitly invited.
|
||||
Guest users can't invite users. Please register to invite.
|
||||
This room is inaccessible to guests. You may be able to join if you register.
|
||||
delete the alias.
|
||||
remove %(name)s from the directory.
|
||||
Conference call failed.
|
||||
Conference calling is in development and may not be reliable.
|
||||
Guest users can't create new rooms. Please register to create room and start a chat.
|
||||
Server may be unavailable, overloaded, or you hit a bug.
|
||||
Server unavailable, overloaded, or something else went wrong.
|
||||
You are already in a call.
|
||||
You cannot place VoIP calls in this browser.
|
||||
You cannot place a call with yourself.
|
||||
Your email address does not appear to be associated with a Matrix ID on this Homeserver.
|
||||
Guest users can't upload files. Please register to upload.
|
||||
Some of your messages have not been sent.
|
||||
This room is private or inaccessible to guests. You may be able to join if you register.
|
||||
Tried to load a specific point in this room's timeline, but was unable to find it.
|
||||
Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.
|
||||
This action cannot be performed by a guest user. Please register to be able to do this.
|
||||
Tried to load a specific point in this room's timeline, but was unable to find it.
|
||||
Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.
|
||||
You are trying to access %(roomName)s.
|
||||
You will not be able to undo this change as you are promoting the user to have the same power level as yourself.
|
||||
EOT
|
||||
)];
|
||||
}
|
||||
|
||||
# example i18n format:
|
||||
# "%(oneUser)sleft": "%(oneUser)sleft",
|
||||
|
||||
# script called with the line of the file to be checked
|
||||
my $sub = 0;
|
||||
if ($_ =~ m/^(\s+)"(.*?)"(: *)"(.*?)"(,?)$/) {
|
||||
my ($indent, $src, $colon, $dst, $comma) = ($1, $2, $3, $4, $5);
|
||||
$src =~ s/\\"/"/g;
|
||||
$dst =~ s/\\"/"/g;
|
||||
|
||||
foreach my $fixup (@{$::fixups}) {
|
||||
my $dotless_fixup = substr($fixup, 0, -1);
|
||||
|
||||
if ($src eq $dotless_fixup) {
|
||||
print STDERR "fixing up src: $src\n";
|
||||
$src .= '.';
|
||||
$sub = 1;
|
||||
}
|
||||
|
||||
if ($ARGV !~ /(zh_Hans|zh_Hant|th)\.json$/ && $src eq $fixup && $dst !~ /\.$/) {
|
||||
print STDERR "fixing up dst: $dst\n";
|
||||
$dst .= '.';
|
||||
$sub = 1;
|
||||
}
|
||||
|
||||
if ($sub) {
|
||||
$src =~ s/"/\\"/g;
|
||||
$dst =~ s/"/\\"/g;
|
||||
print qq($indent"$src"$colon"$dst"$comma\n);
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$sub) {
|
||||
print $_;
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
#!/usr/bin/perl -pi
|
||||
|
||||
# pass in a list of filenames whose imports should be fixed up to be relative
|
||||
# to matrix-react-sdk rather than vector-web.
|
||||
# filenames must be relative to src/ - e.g. ./components/moo/Moo.js
|
||||
|
||||
# run with something like:
|
||||
# sierra:src matthew$ grep -ril 'require(.matrix-react-sdk' . | xargs ../scripts/fixup-imports.pl
|
||||
# sierra:src matthew$ grep -ril 'import.*matrix-react-sdk' . | xargs ../scripts/fixup-imports.pl
|
||||
|
||||
# e.g. turning:
|
||||
# var rate_limited_func = require('matrix-react-sdk/lib/ratelimitedfunc');
|
||||
#
|
||||
# into:
|
||||
# const rate_limited_func = require('../../ratelimitedfunc');
|
||||
#
|
||||
# ...if the current file is two levels deep inside lib.
|
||||
|
||||
$depth = () = $ARGV =~ m#/#g;
|
||||
$depth--;
|
||||
$prefix = $depth > 0 ? ('../' x $depth) : './';
|
||||
|
||||
s/= require\(['"]matrix-react-sdk\/lib\/(.*?)['"]\)/= require('$prefix$1')/;
|
||||
s/= require\(['"]matrix-react-sdk['"]\)/= require('${prefix}index')/;
|
||||
|
||||
s/^(import .* from )['"]matrix-react-sdk\/lib\/(.*?)['"]/$1'$prefix$2'/;
|
||||
s/^(import .* from )['"]matrix-react-sdk['"]/$1'${prefix}index'/;
|
Loading…
Add table
Add a link
Reference in a new issue