views:

632

answers:

12

I am working on a Software Project that needs to be translated into 30 languages. This means that changing any string incurs into a relatively high cost. Additionally, translation does not happen overnight, because the translation package needs to be worked by different translators, so this might take a while.

Adding new features is cumbersome somehow. We can think up all the Strings that will be needed before we actually code the UI, but sometimes still we need to add new strings because of bug fixes or because of an oversight.

So the question is, how do you manage all this process? Any tips in how to ease the impact of translation in the software project? How to rule the strings, instead of having the strings rule you?

EDIT: We are using Java and all Strings are internationalized using Resource Bundles, so the problem is not the internationalization per-se, but the management of the strings.

A: 

In Java, internationalization is accomplished by moving the strings to resource bundles ... the translation process is still long and arduous, but at least it's separated from the process of producing the software, releasing service packs etc. One thing that helps is to have a CI system that repackages everything any time changes are made. We can have a new version tested and out in a matter of minutes whether it's a code change, new language pack or both.

Steve Moyer
Dumb question, what is a CI package?
Mario Ortegón
+2  A: 

The localised projects I've worked on had 'string freeze' dates. After this time, the only way strings were allowed to be changed was with permission from a very senior member of the project management team.

It isn't exactly a perfect solution, but it did enable us to put defects regarding strings on hold until the next release with a valid reason. Once the string freeze has occured you also have a valid reason to deny adding brand new features to the project on 'spur of the moment' decisions. And having the permission come from high up meant that middle managers would have no power to change specs on your :)

workmad3
You can't have it both ways, I guess. That is exactly what we are running into. We won't add features because there is no strings for them
Mario Ortegón
+2  A: 

If available, use a database for this. Each string gets an id, and there is either a table for each language, or one table for all with the language in a column (depending on how the site is accessed the performance dictates which is better). This allows updates from translators without trying to manage code files and version control details. Further, it's almost trivial to run reports on what isn't translated, and keep track of what was an autotranslation (engine) vs a real human translation.

If no database, then I stick each language in a separate file so version control issues are reduced. But the structure is basically the same - each string has an id.

Adam Davis
A 'translations' table, with a LanguageID key is easier to use than a table for each language.
Robin Bennett
+1  A: 

The solution we came up to so far is having a small application in Excel that reads all the property files, and then shows a matrix with all the translations (languages as headers, keys as rows). It is quite evident what is missing then. This is send to the translators. When it comes back, then the sheet can be processed to generate the same property bundles back again. So far it has eased the pain somewhat, but I wonder what else is around.

Mario Ortegón
+1  A: 

I put in a makefile target that finds all the .properties files and puts them in a zip file to send off to the translators. I offered to send them just diffs, but for some reason they want the whole bundle of files each time. I think they have their own system for tracking just differences, because they charge us based on how many strings have changed from one time to the next. When I get their delivery back, I manually diff all their files with the previous delivery to see if anything unexpected has changed - one time all the PT_BR (Brazillian Portugese) strings changed, and it turns out they'd used a PT_PT (Portugese Portugese) translator for that batch in spite of the order for PT_BR.

Paul Tomblin
+2  A: 

Not only did we use a database instead of the vaunted resource files (I have never understood why people use something like that which is a pain to manage, when we have such good tools for dealing with databases), but we also avoided the need to tag things in the application (forgetting to tag controls with numbers in VB6 Forms was always a problem) by using reflection to identify the controls for translation. Then we use an XML file which translates the controls to the phrase IDs from the dictionary database.

Although the mapping file had to be managed, it could still be managed independent of the build process, and the translation of the application was actually possible by end-users who had rights in the database.

Cade Roux
It would be neat to make some kind of static analysis tool that would identify the strings that are used in Swing Components for Java. That would help
Mario Ortegón
A: 

For starters, I'd use default strings in case a translation is missing. For example, the English or Spanish value. Secondly, you might want to consider a web app or something similar for your translators to use. This requires some resources upfront, but at least you won't need to send files around and it will be obvious for the translators which strings are new, etc.

Jonas Lincoln
A: 

Id copy the main message.properties into 30 property files with local names surfix. When translation will be ready i would just update that file. New Messages could be added by hand to all 31 files(english version) or you could write some "code generator". Messages cant change, if you need to change something you just add new one. Doing it this way you would have default msg in every language and you will only need to translate new messages. I hope that helps. If you want to automate you could also write some xml file that keeps info of last translated message for each language and generate files with everything after translated message. New messages would go on top(or bottom) and no rearranging would be allowed.

01
+2  A: 
Elijah
I think you actually save memory, as you have a pointer to the Strings in your class, as oposed to a "KEY", which is a literal, in the class file that is loaded in perm memory. I think Eclipse uses this trick to save something like 8 MB of RAM
Mario Ortegón
A: 

This google book - resource file management gives some good tips

You can use Resource File Management software to keep track of strings that have changed and control the workflow to get them translated - otherwise you end up in a mess of freezes and overbearing version control

Some tools that do this sort of thing - no connection an I haven't actually used them, just researching

http://www.sisulizer.com/

http://www.translationzone.com/en/products/

Ryan
+1  A: 

Pootle is an webapp that allows to manage translation process over the web.

maciejka
+3  A: 

I'm not sure the platform you're internationalizing in. I've written an answer before on the best way to il8n an application. See http://stackoverflow.com/questions/59130/what-do-i-need-to-know-to-globalize-an-asp-net-application/59184#59184

That said - managing the translations themselves is hard. The problem is that you'll be using the same piece of text across multiple pages. Your framework may not, however, support only having that piece of text in one file (resource files in asp.net, for instance, encourage you to have one resource file per language).

The way that we found to work with things was to have a central database repository of translations. We created a small .net application to import translations from resource files into that database and to export translations from that database to resource files. There is, thus, an additional step in the build process to build the resource files.

The other issue you're going to have is passing translations to your translation vendor and back. There are a couple ways for this - see if your translation vendor is willing to accept XML files and return properly formatted XML files. This is, really, one of the best ways, since it allows you to automate your import and export of translation files. Another alternative, if your vendor allows it, is to create a website to allow them to edit the translations.

In the end, your answer for translations will be the same for any other process that requires repetition and manual work. Automate, automate, automate. Automate every single thing that you can. Copy and paste is not your friend in this scenario.

John Christensen