Sprend på flera språk

Skickafilen är äntligen påväg att byta namn till Sprend. I samband med detta översätter vi sajten till ett antal språk, till att börja med norska, engelska, franska, tyska och kroatiska.

Eftersom det var mitt första försök att översätta en webbapplikation var jag tvungen att läsa på lite grann om hur man går tillväga i javavärlden. Jag läste om ResourceBundles och propertiesfiler och hittade åtminstone tre problem med det traditionella sättet att hantera språk.

  1. Det klassiska problemet att propertiesfiler bara stöder 8859-1. I mitt fall skulle inte flera kroatiska bokstäver fungera.
  2. Propertiesfilen laddas via en klassladdare vilket tydligen leder till strul i en webbmiljö.
  3. Separata filer för varje språk gör det svårare för översättaren.

Den bästa lösningen är antagligen att stoppa in alla strängar i databasen. Då löser man problem 1 och 2 ovan. Ett webbgränssnitt för att redigera alla strängar är en elegant lösning på problem 3.

Men nu har jag inte all tid världen till snygga lösningar, så jag gjorde på ett lite enklare sätt. Genom att lägga alla språk i samma xml-fil, ladda in den via Properties.loadFromXML() och ange sökvägen direkt, löser man alla tre problem. I lite mer detalj gjorde jag så här:

  1. Jag tog propertiesfilen vi redan skapat, som var i traditionellt format, och gjorde fem kopior.
  2. Därefter adderade jag språkkoden till samtliga strängar i respektive fil, tex för svenska: upload.message => upload.message.sv.
  3. Innehållet i alla filer satte jag ihop till en stor propertiesfil.
  4. Filen konverteras till xml via liten javasnutt som låter Propertiesklassen först läsa in denna fil, och därefter spara den i xml.
  5. Resultatet klistrade jag sedan in i Excel. Excel? Ja, för att enkelt kunna sortera en kolumn, vilket placerar alla översättningar av samma sträng tillsammans.

Formatet blir så här:

<entry key=”upload.message.en”>Message:</entry>


<entry key=”upload.message.de”>translate-de</entry>


<entry key=”upload.message.fr”>translate-fr</entry>


<entry key=”upload.message.hr”>translate-hr</entry>


<entry key=”upload.message.nb”>Melding:</entry>


<entry key=”upload.message.sv”>Meddelande:</entry>



(för denna nyckel saknas som synes fortfarande översättningar till några språk)

Inladdningen av strängarna gör jag med följande kod:

translatedStrings = new Properties();
String realPathToTextPropertiesXml = request.getSession().getServletContext().
getRealPath(“/i18n/text.properties.xml”);
translatedStrings.loadFromXML(new FileInputStream(realPathToTextPropertiesXml));

Jag tycker det funkar bra, än så länge. En nackdel kan vara att filen med översättningar är läsbar utifrån, vilket kanske inte passar alla applikationer. Ett annat mindre problem hänger ihop med översättare som jobbar parallellt och att alla språk finns i samma fil. Det översatta materialet måste mergas ihop men det går att hantera med Subversion om man har tungan rätt i mun.

About Arne Evertsson

I am Sprend.
This entry was posted in kodning. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>