Commit 2762e7bb authored by Michal Čihař's avatar Michal Čihař

Add command to compare language definitions to a file

Signed-off-by: default avatarMichal Čihař <michal@cihar.com>
parent b858867c
# -*- coding: utf-8 -*-
#
# Copyright © 2012 - 2014 Michal Čihař <michal@cihar.com>
#
# This file is part of Weblate <http://weblate.org/>
#
# 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/>.
#
from django.core.management.base import BaseCommand, CommandError
from optparse import make_option
from weblate.lang.models import Language
class Command(BaseCommand):
help = 'Checks language definitions against rst/csv file'
def handle(self, *args, **options):
'''
Creates default set of languages, optionally updating them
to match current shipped definitions.
'''
if len(args) != 1:
raise CommandError('Use: checklang file')
errors = Language.objects.check(args[0])
for error in errors:
self.stderr.write(error)
......@@ -251,6 +251,38 @@ class LanguageManager(models.Manager):
'''
return self.filter(translation__total__gt=0).distinct()
def check(self, filename):
"""
Checks database language definitions with supplied ones.
"""
errors = []
with open(filename) as handle:
for line in handle:
line = line.strip().decode('utf-8')
parts = [part.strip() for part in line.split(',')]
if len(parts) != 3:
continue
lang, name, plurals = parts
nplurals, pluralform = plurals.strip(';').split(';')
nplurals = int(nplurals.split('=', 1)[1])
pluralform = pluralform.split('=', 1)[1]
try:
language = Language.objects.get(code=lang)
except Language.DoesNotExist:
errors.append(
u'missing language {0}'.format(line)
)
continue
if nplurals != language.nplurals:
errors.append(
u'different number of plurals {0}'.format(line)
)
errors.append(
u'have {0}'.format(language.get_plural_form())
)
return errors
@receiver(post_syncdb)
@receiver(post_migrate)
......
ach, Acholi, nplurals=2; plural=(n > 1);
af, Afrikaans, nplurals=2; plural=(n != 1);
ak, Akan, nplurals=2; plural=(n > 1);
am, Amharic, nplurals=2; plural=(n > 1);
an, Aragonese, nplurals=2; plural=(n != 1);
anp, Angika, nplurals=2; plural=(n != 1);
ar, Arabic [#f1]_, nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5);
arn, Mapudungun, nplurals=2; plural=(n > 1);
as, Assamese, nplurals=2; plural=(n != 1);
ast, Asturian, nplurals=2; plural=(n != 1);
ay, Aymará, nplurals=1; plural=0;
az, Azerbaijani, nplurals=2; plural=(n != 1);
**B**
be, Belarusian, nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
bg, Bulgarian, nplurals=2; plural=(n != 1);
bn, Bengali, nplurals=2; plural=(n != 1);
bo, Tibetan, nplurals=1; plural=0;
br, Breton, nplurals=2; plural=(n > 1);
brx, Bodo, nplurals=2; plural=(n != 1);
bs, Bosnian, nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
**C**
ca, Catalan, nplurals=2; plural=(n != 1);
cgg, Chiga, nplurals=1; plural=0;
cs, Czech, nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;
csb, Kashubian, nplurals=3; plural=(n==1) ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
cy, Welsh, nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;
**D**
da, Danish, nplurals=2; plural=(n != 1);
de, German, nplurals=2; plural=(n != 1);
doi, Dogri, nplurals=2; plural=(n != 1);
dz, Dzongkha, nplurals=1; plural=0;
**E**
el, Greek, nplurals=2; plural=(n != 1);
en, English, nplurals=2; plural=(n != 1);
eo, Esperanto, nplurals=2; plural=(n != 1);
es, Spanish, nplurals=2; plural=(n != 1);
es_AR, Argentinean Spanish, nplurals=2; plural=(n != 1);
et, Estonian, nplurals=2; plural=(n != 1);
eu, Basque, nplurals=2; plural=(n != 1);
**F**
fa, Persian, nplurals=1; plural=0;
ff, Fulah, nplurals=2; plural=(n != 1);
fi, Finnish, nplurals=2; plural=(n != 1);
fil, Filipino, nplurals=2; plural=(n > 1);
fo, Faroese, nplurals=2; plural=(n != 1);
fr, French, nplurals=2; plural=(n > 1);
fur, Friulian, nplurals=2; plural=(n != 1);
fy, Frisian, nplurals=2; plural=(n != 1);
**G**
ga, Irish, nplurals=5; plural=(n==1) ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4;
gd, Scottish Gaelic, nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;
gl, Galician, nplurals=2; plural=(n != 1);
gu, Gujarati, nplurals=2; plural=(n != 1);
gun, Gun, nplurals=2; plural=(n > 1);
**H**
ha, Hausa, nplurals=2; plural=(n != 1);
he, Hebrew, nplurals=2; plural=(n != 1);
hi, Hindi, nplurals=2; plural=(n != 1);
hne, Chhattisgarhi, nplurals=2; plural=(n != 1);
hy, Armenian, nplurals=2; plural=(n != 1);
hr, Croatian, nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
hu, Hungarian, nplurals=2; plural=(n != 1);
**I**
ia, Interlingua, nplurals=2; plural=(n != 1);
id, Indonesian, nplurals=1; plural=0;
is, Icelandic, nplurals=2; plural=(n%10!=1 || n%100==11);
it, Italian, nplurals=2; plural=(n != 1);
**J**
ja, Japanese, nplurals=1; plural=0;
jbo, Lojban, nplurals=1; plural=0;
jv, Javanese, nplurals=2; plural=(n != 0);
**K**
ka, Georgian, nplurals=1; plural=0;
kk, Kazakh, nplurals=1; plural=0;
kl, Greenlandic, nplurals=2; plural=(n != 1);
km, Khmer, nplurals=1; plural=0;
kn, Kannada, nplurals=2; plural=(n != 1);
ko, Korean, nplurals=1; plural=0;
ku, Kurdish, nplurals=2; plural=(n != 1);
kw, Cornish, nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3;
ky, Kyrgyz, nplurals=1; plural=0;
**L**
lb, Letzeburgesch, nplurals=2; plural=(n != 1);
ln, Lingala, nplurals=2; plural=(n > 1);
lo, Lao, nplurals=1; plural=0;
lt, Lithuanian, nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);
lv, Latvian, nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);
**M**
mai, Maithili, nplurals=2; plural=(n != 1);
mfe, Mauritian Creole, nplurals=2; plural=(n > 1);
mg, Malagasy, nplurals=2; plural=(n > 1);
mi, Maori, nplurals=2; plural=(n > 1);
mk, Macedonian, nplurals=2; plural= n==1 || n%10==1 ? 0 : 1;
ml, Malayalam, nplurals=2; plural=(n != 1);
mn, Mongolian, nplurals=2; plural=(n != 1);
mni, Manipuri, nplurals=2; plural=(n != 1);
mnk, Mandinka, nplurals=3; plural=(n==0 ? 0 : n==1 ? 1 : 2);
mr, Marathi, nplurals=2; plural=(n != 1);
ms, Malay, nplurals=1; plural=0;
mt, Maltese, nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);
my, Burmese, nplurals=1; plural=0;
**N**
nah, Nahuatl, nplurals=2; plural=(n != 1);
nap, Neapolitan, nplurals=2; plural=(n != 1);
nb, Norwegian Bokmal, nplurals=2; plural=(n != 1);
ne, Nepali, nplurals=2; plural=(n != 1);
nl, Dutch, nplurals=2; plural=(n != 1);
se, Northern Sami, nplurals=2; plural=(n != 1);
nn, Norwegian Nynorsk, nplurals=2; plural=(n != 1);
no, Norwegian (old code), nplurals=2; plural=(n != 1);
nso, Northern Sotho, nplurals=2; plural=(n != 1);
**O**
oc, Occitan, nplurals=2; plural=(n > 1);
or, Oriya, nplurals=2; plural=(n != 1);
**P**
ps, Pashto, nplurals=2; plural=(n != 1);
pa, Punjabi, nplurals=2; plural=(n != 1);
pap, Papiamento, nplurals=2; plural=(n != 1);
pl, Polish, nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
pms, Piemontese, nplurals=2; plural=(n != 1);
pt, Portuguese, nplurals=2; plural=(n != 1);
pt_BR, Brazilian Portuguese, nplurals=2; plural=(n > 1);
**R**
rm, Romansh, nplurals=2; plural=(n != 1);
ro, Romanian, nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);
ru, Russian, nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
rw, Kinyarwanda, nplurals=2; plural=(n != 1);
**S**
sah, Yakut, nplurals=1; plural=0;
sat, Santali, nplurals=2; plural=(n != 1);
sco, Scots, nplurals=2; plural=(n != 1);
sd, Sindhi, nplurals=2; plural=(n != 1);
si, Sinhala, nplurals=2; plural=(n != 1);
sk, Slovak, nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;
sl, Slovenian, nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);
so, Somali, nplurals=2; plural=(n != 1);
son, Songhay, nplurals=2; plural=(n != 1);
sq, Albanian, nplurals=2; plural=(n != 1);
sr, Serbian, nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
su, Sundanese, nplurals=1; plural=0;
sw, Swahili, nplurals=2; plural=(n != 1);
sv, Swedish, nplurals=2; plural=(n != 1);
**T**
ta, Tamil, nplurals=2; plural=(n != 1);
te, Telugu, nplurals=2; plural=(n != 1);
tg, Tajik, nplurals=2; plural=(n > 1);
ti, Tigrinya, nplurals=2; plural=(n > 1);
th, Thai, nplurals=1; plural=0;
tk, Turkmen, nplurals=2; plural=(n != 1);
tr, Turkish, nplurals=2; plural=(n > 1);
tt, Tatar, nplurals=1; plural=0;
**U**
ug, Uyghur, nplurals=1; plural=0;
uk, Ukrainian, nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
ur, Urdu, nplurals=2; plural=(n != 1);
uz, Uzbek, nplurals=2; plural=(n > 1);
**V**
vi, Vietnamese, nplurals=1; plural=0;
**W**
wa, Walloon, nplurals=2; plural=(n > 1);
wo, Wolof, nplurals=1; plural=0;
**Y**
yo, Yoruba, nplurals=2; plural=(n != 1);
**Z**
zh, Chinese [#f2]_, nplurals=1; plural=0;
zh, Chinese [#f3]_, nplurals=2; plural=(n > 1);
......@@ -25,6 +25,7 @@ Tests for language manipulations.
from django.test import TestCase
from weblate.lang.models import Language
from django.core.management import call_command
import os.path
class LanguagesTest(TestCase):
......@@ -196,3 +197,10 @@ class CommandTest(TestCase):
def test_setuplang_noupdate(self):
call_command('setuplang', update=False)
self.assertTrue(Language.objects.exists())
def test_setuplang(self):
testfile = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
'plurals.txt'
)
call_command('checklang', testfile)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment