Toon posts:

[xml/xsl] internationalization

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een methode aan het bedenken om m'n applicatie mbv xml/xsl verschillende talen te laten ondersteunen.

Nu heb ik hier al een werkende methode gevonden, maar dat is nog niet helemaal wat ik wil; Ik wil namelijk ook de mogelijkheid hebben om waardes van attributen evt te kunnen vertalen.

Nu heb ik de volgende methode bedacht en vraag me af of dat een correcte methode is en/of iemand anders hier een betere implementatie voor heeft bedacht.

Voorbeeldje, ik heb de volgende xml-code:
code:
1
2
3
4
5
6
<form>
  <translate:header>formHeader</translate:header>
  <field type="input" name="username" translate:label="usernamefieldlabel"/>
  <field type="secret" name="password" translate:label="passwordfieldlabel"/>
  <button type="submit" name="submit" translate:label="submitbuttonlabel"/>
</form>

daar gooi ik m'n translate.xsl stylesheet overheen (die als parameter een language meekrijgt, bijv 'en-us') die het

gebruikmakend van een dictionary.xml:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<labels>
  <label name="formHeader">
    <translation xml:lang="en-us">Login</translation>
    <translation xml:lang="de">Anmelden</translation>
    <translation xml:lang="nl">Inloggen</translation>
  </label>
  <label name="usernamefieldlabel">
    <translation xml:lang="en-us">Username</translation>
    <translation xml:lang="de">Benutzername</translation>
    <translation xml:lang="nl">Gebruikersnaam</translation>
  </label>
  <label name="passwordfieldlabel">
    <translation xml:lang="en-us">Password</translation>
    <translation xml:lang="de">Passwort</translation>
    <translation xml:lang="nl">Wachtwoord</translation>
  </label>
  <label name="submitbuttonlabel">
    <translation xml:lang="en-us">Login</translation>
    <translation xml:lang="de">Anmelden</translation>
    <translation xml:lang="nl">Inloggen</translation>
  </label>
</labels>

omzet naar de volgende code:
code:
1
2
3
4
5
6
<form>
  <header>Login</translate:header>
  <field type="input" name="username" label="Username"/>
  <field type="secret" name="password" label="Password"/>
  <button type="submit" name="submit" label="Submit"/>
</form>

waarna ik deze xml code mbv een xsl-stylesheet kan omzetten naar de desgewenste output.

Wat het dus in dit geval doet: Zoek elke tag met de 'translate' namespace, vervang de waarde ervan met de overeenkomende waarde in het dictionary.xml bestand in de meegegeven taal en haal de namespace ervan weg. doe hetzelfde met attributen met de 'translate' namespace.

Comments plz

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Wel leuke methode. Maar wat ik vaker doe is gewoon een hele template(s) omzetten per taal. Bij hele paragrafen (dus niet alleen enkele zinnetjes) geeft dat een beter resultaat dan elk zinnetje apart omzetten.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Dat artikeltje is wel bekend ;) .

Hum, het is wel goed bedacht maar ik vraag me af of dit de beste aanpak is. Het probleem van deze aanpak is volgens mij dat de content die je wilt vertalen nu echt in een andere namespace zit, dat is niet mooi en wellicht zelfs lastig.

Er is ook niet echt een noodzaak voor i18n gelijk in attributen. Attributen lenen zich daar niet goed voor.

Ik zou daarom een klein detail veranderen.... waarom maak je de translate optie geen attribuut?

Je krijgt dan dit:
code:
1
2
3
4
<form>
  <header i18n:id="formHeader"/>
   ...
</form>

Je kunt nu keurig netjes een stylesheet maken die gewoon alles met een attribuut in de namespace van i18n eruit haalt en vervangt door de echte tekst in de dictionary. Je hebt echter nog wel steeds content in de originele namespace. Je kunt nu eventueel ook gelijk de tekst erin zetten. Voordeel duidelijk?

Eigenlijk kan het zelfs nog mooier doen als je alle tekst in een aparte tag zet. Bijvoorbeeld:
code:
1
2
3
4
5
<form>
   <header>
     <text>Hier staat een header waar ik ff geen naam voor weet</text>
   </header>
   ...

Het geinternationaliseerd alternatief is nu:
code:
1
2
3
4
5
<form>
   <header>
      <text i18n:id="formHeader"/>
   </header>
   ...

Zo heb je het denk ik veruit het schoonst :9~ en je stylesheet kan volledig generiek zijn voor elke toepassing :9~ .

Je zegt nu natuurlijk: ja leuk, maar hier heb ik geen ruk aan. Ik moet toch ook attributen vertalen |:( .

Maar daar is ook wel een oplossing voor. Het idee is simpel: verzin een formaat wat je kunt laten omzetten naar attributen door een stylesheet. Dit is niet alleen van toepassing op i18n, maar kan voor veel meer zaken worden gebruikt. Je zou bijvoorbeeld dit kunnen doen:
code:
1
2
3
4
5
<field>
   <pp:attribute name="label">
      <text i18n:id="formHeader"/>
   </pp:attribute>
</field>

De naam van het attribuut staat in het attribuut name en de value van het attribuut is de content. Omdat dit ook een eigen namespace heeft kan je dit ook generiek omzetten en zelfs nog gebruiken voor andere toepassingen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
ok, is op zich wel wat voor te zeggen. Deze constructie had ik eigenlijk ook al bedacht (echt waar! ;)), maar ik gaf de voorkeur aan de mijne omdat je dan ook attributen kon vertalen. Ik had eigenlijk al verwacht dat dit niet een mooie oplossing zou worden gevonden vanwege dat laatste...

maar wat ik niet helemaal begrijp in jouw verhaal is die i18n namespace. Is dit een predefined-namespace oid? Anders heeft ie wel een erg on-voordehandliggende naam...

[slightly off-topic]
Ik benut deze thread om maar meteen ff een probleem aan te kaarten wat in dezelfde context ligt:

Ik wil een template-match-xpath-query hebben die alle nodes selecteert, behalve die nodes die binnen de namespace 'namespacenaam' vallen.

<xsl:template match="not(namespace:*)"/> werkt bij mij niet....
[/slightly off-topic]

Verwijderd

Topicstarter
ok, heb ff op google gezoch op i18n (eigenlijk meteen moeten doen :o) en een linkje gevonden... Weer wat geleerd vandaag :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Mas*Mind: Ik wil een template-match-xpath-query hebben die alle nodes selecteert, behalve die nodes die binnen de namespace 'namespacenaam' vallen.
Hum, ik weet eigenlijk hier uit mijn hoofd geen goede oplossing voor, behalve aan geven wat je wel wilt matchen in combinatie met volgorde. Zal later nog wel even kijken of hier wat voor is...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1