The original thinking behind the localization server project at large is to simplify Drupal project translation tasks for people. So creating an intuitive interface is important. Among some backend changes (like storing string extraction errors per release, so we can funnel them back to developers to fix), I took most of the recent days with simplifying the UI of the server, and coming up with more user guidance where possible.
The result is a brand new home screen, which provides an overview of what this server is all about, what are the steps required to contribute and gives important pointers to the lesser known global translator communities. I also took considerable amount of time collecting a list of languages, which will be used to launch the site. I took the contributions CVS HEAD of the translations folder, and did count 58 languages, to which more-or-less Drupal core is translated. There could be more languages in contributed module translations, but it is not likely. I also needed to collect the plural formulas for these languages, which was not easy in all the cases (more below). The result is a realistic overview of languages, of which my second screenshot only shows a small amount.
Let me remind you that this second screenshot shows fake numbers to provide a live looking overview (but the numbers on the first shot are all real on my dev site), while I still take my time to develop a usable translation interface (it is shaping nicely, but no nice shot to present yet). I stopped glaring at this language overview screen several times. It needs to be simplified. The question is what interests people more, and what is the "default action". I mean, we have translations and online groups, and these are two different interfaces. The translation groups host guidelines, tips, maybe a group forum and so on. This is all provided by organic groups. The translations themselfs on the other hand are collections of string pairs, and they need a very different interface. So when looking at the list of languages, we choose between going to the group or the project listing for a language. It does not seem to be a good idea to not use the language name as a link, but then we need to choose the default action, which could be the translation interface obviously. It is also a good question, whether we need all the numbers shown, like both a number and a percentage for the "ready" translations. All-in-all, I am looking at ways to simplify this interface.
Part of the simplification is that we will know plural formulas for all languages on the site. It took considerable time just to collect these formulas from Drupal.org contributions and comparing them to online sources to double check. There were some interesting things I find while collecting these:
- There are three Norvegian translations, while there are only two language variants. I don't see why we have "nb", "nn" and "no" languages.
- There is a "ru" Russian translation and a "ru-ru" one. This seems like a classic CVS power struggle problem, the "ru" one was released for 4.7 and the "ru-ru" is only supposed to be released for later versions. These need to be united in CVS and on the project interface too.
- There is a "uz-uz" translation, in which the "-uz" suffix does not seem to be justified.
- There are differences in the Wordforge plural format listing I used and the Drupal.org CVS data, which would be nice to resolve/discuss. See bellow in the code comments.
I intend to write an overview entry for translation maintainers/contributors, and try to direct them here to get input on these problems, and resolve them for good. In the meanwhile if you know anything about these issues, let me know in the comments.
<?php
/**
* A list of "Drupal languages" compiled from the list of languages
* in drupal.org CVS on July 18th, 2007.
*
* Plural information based on:
* - http:// www. wordforge.org/static/l10n-pluralforms.html
* - our own CVS repository information from core translations
*/
function l10n_community_plurals() {
$default = 'nplurals=2; plural=(n!=1);';
$one = 'nplurals=1; plural=0;';
return array(
'af' => array('Afrikaans', $default),
// Wordforge says nplurals=4!?
'ar' => array('Arabic', 'nplurals=6; plural=n==1 ? 0 : n==0 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;'),
'bg' => array('Bulgarian', $default),
'bn' => array('Bengali', $default),
'bs' => array('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);'),
// Wordforge has different rules!?
'ca' => array('Catalan', 'nplurals=2; plural=(n > 1);'),
// Wordforge has different rules!?
'cs' => array('Czech', 'nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);'),
'da' => array('Danish', $default),
'de' => array('German', $default),
// Wordforge has nplurals=1, but this might fit us better.
'dz' => array('Dzongkha', $default),
'el' => array('Greek', $default),
'eo' => array('Esperanto', $default),
'es' => array('Spanish', $default),
'et' => array('Estonian', $default),
'eu' => array('Basque', $default),
// Wordforge has nplurals=1, but this might fit us better.
'fa' => array('Persian', $default),
'fi' => array('Finnish', $default),
'fo' => array('Faroese', $default),
'fr' => array('French', 'nplurals=2; plural=(n > 1);'),
'gl' => array('Galician', $default),
'gu' => array('Gujarati', $default),
'he' => array('Hebrew', $default),
'hi' => array('Hindi', $default),
'hr' => array('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;'),
// Wordforge has nplurals=1, but this might fit us better.
'hu' => array('Hungarian', $default),
// Wordforge has nplurals=1, but this might fit us better.
'id' => array('Indonesian', $default),
'is' => array('Icelandic', $default),
'it' => array('Italian', $default),
// Wordforge has nplurals=1, but this might fit us better.
'ja' => array('Japaneese', $default),
'km' => array('Khmer', $default),
'kn' => array('Kannada', $default),
'ko' => array('Korean', $default),
'lt' => array('Lithuanian', 'nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2;'),
'lv' => array('Latvian', 'nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;'),
'mk' => array('Macedonian', $default),
'mr' => array('Marathi', $default),
'ms' => array('Malay', $default),
'my' => array('Burmese', $default),
'nb' => array('Norvegian Bokmål', $default),
'nn' => array('Norwegian Nynorsk', $default),
// This is already superceeded in CVS by the above two?!?
//'no' => array('Norwegian', $default),
'np' => array('Nepali', $default),
'pl' => array('Polish', 'nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);'),
// Wordforge has different rules!?
'pt-br' => array('Brazilian Portuguese', $default),
'pt-pt' => array('Portuguese', $default),
// Wordforge has completely different rules with nplurals=3!?
'ro' => array('Romanian', $default),
'ru' => array('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);'),
// This should not be there in CVS, needs cleanup!
// 'ru-ru' => array(),
'sk' => array('Slovak', 'nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;'),
'sl' => array('Slovenian', 'nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);'),
'sq' => array('Albanian', $default),
// Wordforge has nplurals=4 here, and could be right, based on the .po file data?!?
'sr' => array('Serbian', $default),
'sv' => array('Swedish', $default),
'th' => array('Thai', $default),
'tr' => array('Turkish', $one),
'uk' => array('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;'),
// Why does this need the -uz suffix???
'uz-uz' => array('Uzbek', $default),
'vi' => array('Vietnamese', $one),
'zh-hans' => array('Chinese (simplified)', $one),
'zh-hant' => array('Chinese (traditional)', $one),
);
}
?>
Comments
posts submitted
I have submitted a lengthy explanation of the changes being done to the translations group: http://groups.drupal.org/node/5219
Made it promoted and sticky (for a while), and posted a note to the translations mailing list and my blog to let as many people possible to read it.
plural form
sorry, posted this to the other topic first
both plural forms for Czech are correct, but the longer one used in Drupal is more accurate
Plural forms for Czech in
Plural forms for Czech in Drupal are incorrect. The correct format is:
nplurals=3; plural=(n==1) ? 0 : (n>=2 && n< =4) ? 1 : 2I am planning to fix this in Czech .po files in CVS
Scots
I've been working a wee bit on my test/dev site for the new freso.dk on a Scots translation, but due to the lack of proper PO tools (that I've been able to find) for Mac OS X, I've put it off for now (as it was too troublesome to extract the proper translations and put them back upstream). With the/an online system coming along, I will pick it up again.
Scots is
'sco' => array('Scots', $default),.--
Frederik 'Freso' S. Olesen
--
Frederik 'Freso' S. Olesen
Clue on the Norwegian stuff
I just got a Norwegian translation for the audio module that might give a little insight on the situation. It looks like Norwegian Bokmål (nb) is a variation on Norwegian (no). Though based on the comment it seems like they're pretty much identical...
On no, nn, and nb
Norwegian (no) can be either Norwegian Bokmål (nb) or Norwegian Nynorsk (nn).
Norwegian Bokmål is a linguistic evolution off Danish (da), whereas Nynorsk was created in the 19th century to provide a proper Norwegian language instead of the Danish, which Bokmål has evolved from. Both are official languages of Norway and "managed" by the Norwegian language council, thus they are both (nn and nb) Norwegian (no). Which, in the end, means that a Norwegian site might want to have nb and nn available, where an international site might just want no (in either the nb or nn variant) and not bother with nb vs. nn. Thus I, as a Dane completely not involved with the Norwegian translation, would say that all three Norwegian language codes ought to stay.
More history on Wikipedia. :)
--
Frederik 'Freso' S. Olesen
--
Frederik 'Freso' S. Olesen
duplicate work?
If the 'no' translation either equals 'nn' or 'nb', depending on the actual site in question, why do we want to host a completely separate 'no' translation with its own group, strings and history? This is a good question for both the CVS hosting and the new web based interface. I honestly don't understand why is it worth it.
Mirror work?
I see your point and I admit I somewhat agree with you. However, if one is going for an international(ised) site and doesn't know better, they might be confused about nn/nb both being "Norwegian Something" while no would just be "Norwegian" - and this possibly the common choice. Perhaps it would be possible to mirror nb to no? (I think that's what the Norwegian team is doing manually already, but I might be mistaken.)
We really ought to ask the Norwegian translation team about this though, before making anything resembling a decision. I have already noted that I am not in any way related to that project. I stick to my Danish (and Scots =)).
--
Frederik 'Freso' S. Olesen
--
Frederik 'Freso' S. Olesen
The Norwegian translation
The Norwegian translation team is working on nb and nn. no is deprecated, and can safely be ignored.
Disclaimer: I'm not involved in the Norwegian translation (yet, anyway, though that may change when the localization server is up and running -- I'm really looking forward to it!) but the description under no is pretty clear.
--
Hilde Austlid, Drupalchick
Indeed
Seems like I mixed up something. Looks like the "no" files are actually removed from CVS.
Norwegian cleanup needed
Hi
I'm not a part of the Norwegian translation team, but I contact them and help them do a cleanup in CVS.
nn = Norwegian Bokmål
nb = Norwegian Nynorsk
no = Norwegian Bokmål. I think is old/wrong or both :) Don't remove it from CVS before I have checked.
nno = Norwegian Nynorsk. I think is old/wrong or both :) Don't remove it from CVS before I have checked.
We are supposed to use ISO 639-1 language Codes in CVS?
And, as an Norwegian, both Bokmål and Nynorsk is official written languages in Norway, actually we have one more:
sme = Northern sami http://en.wikipedia.org/wiki/Northern_Sami. It is a small language, but supported by projects like KDE and Gnome but not a official language in all the Norwegian counties (yes it is complicated).
Sorry I don't read it, write it or understand it :-D It is actually closer to Hungary then Norwegian :) as It is a part or share the grammar of many of http://en.wikipedia.org/wiki/Uralic_languages. If I have the time I could try an track down some of the Gnome/KDE translators and see if anyone want to do a translation for Drupal.
--
Stein Magne
--
Stein Magne
http://smbjorklund.com
old topics come alive :-)
Sorry for the late response regarding this matter....was a bit busy with the new nb version 2.3 release.
As the head-maintainer of the Norwegian Localization Project at http://drupal.org/project/nb I would like to clear out that this thread regarding no, nn, nb, and nno is actually very old news. The clean up was done around February/March of 2007.
«nb» project existed in 2005 but inactive is an understatement...the only commit then was done by killes which was actually not the maintainer but just received an unfinished norwegian translation of 4.6 and helped in committing the files to CVS. On the other hand, the «nno» project existed and maintained successfully by henrik.
There were no sound at all regarding nb since 2005 so I came up with the «no» project with a 100% translation of Drupal 5.x. Because of this, Drupal Norge (http://www.drupalnorge.no) was born sponsoring the «no» project. After long discussions with the norwegian drupal community, and trying to get in touch with the 2005 maintainer of the nb project without luck, the administrators (JohnNoc and Odd-inge) of Drupal Norge took over the administration of the nb project (ref: http://drupal.org/node/124051 and decided to deprecate the very active «no» project. We also decided collaboratively that henrik should change his project from «nno» to «nn». Moreover, I (JohnNoc) and Odd-inge of Drupal Norge were given administrative privileges to the «nn» project.
In other words, since march 2007:
There are now only 2 projects for norwegian:
In those project pages, it is clearly written that it was migrated from the old «no» and «nno» projects which should be non-existent by now. Hope this clears out the confusion :-)
John Noceda
Norwegian Localization Project (head maintainer)
Nynorsk Translation (co-maintainer)
Drupal Norge - http://www.drupalnorge.no (admin)
----------------------------------------------------

Thanx for the history update
Thanx for the history update :) but the old folders is still there and should be deleted else they will just be copyed to the next dev branch.
http://cvs.drupal.org/viewvc.py/drupal/contributions/translations/
--
Steinmb
--
Stein Magne
http://smbjorklund.com
deleting
I think that in the maintainers' guidelines, we are not recommended to delete folders in the CVS for history, revisions, and reference purposes....that is why we did not delete those folders. Regarding branches carrying over you mentioned, it is the job of project maintainers to create new branches for their projects so if a maintainer does not create a 6.x branch from that folder then there will be no branch for 6.x from the said folder.
Moreover...it is up to drupal.org infrastructure maintainers if they will delete the nno and no folders. :-)
----------------------------------------------------

Romanian language
Your Wordforge reference site above indicates the following plural form for Romanian:
nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);I will update the Romanian template files, for consistency.
Dutch
Dutch also has the default values:
nplurals=2; plural=(n != 1)but there is no project or no files yet?
I compiled the above list from looking at the CVS directories. Do you have a project and files already committed for Dutch?
Project and files available
Projects and files are available for dutch:
http://cvs.drupal.org/viewvc.py/drupal/contributions/translations/nl/?pa...
and also for 4.7, 4.6, ... but I think you get the picture ;)
Simplified interface
What interests people more?
A user looking for translations: select language, (select module(s),) download the translation(s).
A translator: primary: translation interface; secundary: discussion/wordlist/etc.
Some comments on the second screenshot interface. An overview of languages is nice and can serve as a language selection page, but shouldn't there be a central page per language, A page with links to translations, discussion, wordlist, etc. If so, the language link can link to this.
IMO we can do without the absolute figures on the second screenshot for translated, fuzzy, non translated. Fuzzy is the word used in the world of translators. But both 'fuzzy' and 'suggested' usually means WRONG translation. As details this may be interesting but not for an overview. In an overview a percentage is enough.
But then what does the percentage mean? The percentage of fully translated modules (incl. core) or the percentage of translated strings. As a user I would be more interested in translated modules to see how well Drupal is lokalized to my language.
language overview, numbers
Language overview pages is a good idea. I hope to squeeze out as much as possible from Organic Groups to provide such pages. These really should be editable (possible to organize) by the translation teams, which might need features such as Panels.
As far as 'fuzzy' and 'suggested' go, I have two things to add here. A 'suggested' strings is added by someone who is not entitled to decide on final translations (so it needs editorial approval), while a 'fuzzy' string is something which either the author himself marked as 'to be reviewed' (proactively) or the system matched some other string for translation (this later feature will not be part of the initial feature set). It might not make any sense to make any difference between the two. But it might make sense to name this state something more accessible then 'fuzzy'. You know categorization professionals know 'taxonomy' very well, but who else gets what it means? Using such jargon intimidates people, especially if we have an alternative which matches well.
As far as numbers are concerned, it would be very hard to tell the number of translated projects. For starters a project has several releases. Ie. Drupal core has releases from 4.6.x through 4.7.x and 5.x to 6.x. How do you tell if this project is translated? How many releases should be translated? When going a bit more deeper, how do you tell if a 96% or a 75% translation is a "complete" one or not? If we only count 100% ready translations, we end up with very disappointing results even for Drupal core, let alone the contributed projects. If we put the limit a bit lower, then users will be unhappy, because we told them the translation is ready, but it is not.
Workflow
The quality of translations can be very different from one translator to another. Does the Localization server support the language team in this for example with (optional) workflow? In other words can translated string be checked and approved before being uploaded to the server?
permissions
The prototype I am working on at this very moment is not yet capable of saving suggestions (as opposed to approved translations), but this is a very low level feature planned. I also plan to provide the choice for language teams. They either allow all members to contribute approved translations right away, or designate some people to read through and approve stuff.
Sidenote: In once crazy moment I also had the idea of implementing string translations as nodes, hahahaha (evil grin). It would provide the user relation, timestamp, permissions, history tracking and all out of the box. But it unfortunately provides a lot more which we don't need here, so it means lots of overhead. So some of these features are developed tailored for the localization server needs.
Estonian translation
Estonian translation is correct - it has the default values (nplurals=2; plural=(n != 1);).
ru and ru-ru
Two projects for Russian translation will be merged to one. I'll talk with ru-ru project maintainer.
Russian Drupal community www.drupal.ru
Italian Plural forms
Hi, i'm one of the administrators of drupalitalia.org (italian drupal community) and our plural form is:
Plural-Forms: nplurals=2; plural=(n != 1)--
Psicomante - italian translator and developer
il Blog di Psicomante
Drupal Italia