Strict Standards: Declaration of action_plugin_dlcount::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /home/www/wiki/lib/plugins/dlcount/action.php on line 14

Strict Standards: Declaration of action_plugin_indexmenu::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /home/www/wiki/lib/plugins/indexmenu/action.php on line 169

Strict Standards: Declaration of action_plugin_ipban::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /home/www/wiki/lib/plugins/ipban/action.php on line 67

Strict Standards: Declaration of action_plugin_loglog::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /home/www/wiki/lib/plugins/loglog/action.php on line 82

Strict Standards: Declaration of action_plugin_navi::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /home/www/wiki/lib/plugins/navi/action.php on line 46

Strict Standards: Declaration of action_plugin_uparrow::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /home/www/wiki/lib/plugins/uparrow/action.php on line 69

Strict Standards: Declaration of action_plugin_userspagecreate::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /home/www/wiki/lib/plugins/userspagecreate/action.php on line 97

Strict Standards: Declaration of cache_instructions::retrieveCache() should be compatible with cache::retrieveCache($clean = true) in /home/www/wiki/inc/cache.php on line 289

Warning: Cannot modify header information - headers already sent by (output started at /home/www/wiki/lib/plugins/dlcount/action.php:14) in /home/www/wiki/inc/auth.php on line 312

Strict Standards: Only variables should be passed by reference in /home/www/wiki/doku.php on line 71

Warning: Cannot modify header information - headers already sent by (output started at /home/www/wiki/lib/plugins/dlcount/action.php:14) in /home/www/wiki/inc/actions.php on line 154
Internationalisierung (i18n) [phpwcms-HowTo:wiki]

Strict Standards: Declaration of syntax_plugin_code::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, &$renderer, $data) in /home/www/wiki/lib/plugins/code/syntax.php on line 41

Strict Standards: Declaration of syntax_plugin_tip::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, &$renderer, $data) in /home/www/wiki/lib/plugins/tip/syntax.php on line 38

Internationalisierung (i18n)

Google code r302: http://code.google.com/p/phpwcms/source/detail?r=302

Internationalisierung (i18n) für den phpwcms Parser:

Alle einfachen Worte/Zeilen @@Mein Text@@ werden automatisch Übersetzt, bzw. beim Erstdurchlauf eine neue Datei im Verzeichnis /template/template_lang/xx.php angelegt. In der Grundeinstellung benutzt das System die Datei Name/lade Sprachdatei - dies kann aber ersetzt werden mit den Parametern in $phpwcms['i18_lang'].

Render @@Text@@ basiert auf der Browsersprache und speichert in der aktuellen Spracheinstellung des Browers eine Sprachdatei, die später oder wenn benötigt übersetzt werden kann. Der Text zwischen @@Default@@ wird als Ausgabetext verwendet, solange keine Übersetzung existiert.


Technik: Dr.-Ing. Tobias Schittkowski (http://www.schittkowski.de/index.php?q=node/20) [EN]

“Ich möchte einen Weg aufzeigen, wie eine PHP Applikation mehrere Sprachversionen beinhalten kann ….”

Besonderheiten:

  • Worte/Sätze/Absätze, die übersetzt werden sollen haben @@-Tags
  • Die Übersetzungsdateien sind separiert und können so einfach angepasst werden
  • Die Übersetzungsfunktion kann auch intern mit php aufgerufen werden


Der Inhalt der Sprachdatei könnte sein:

/template/template_lang/de.php

<?php
$i18n_tokens['Benutzer bearbeiten']='Edit user';
$i18n_tokens['Benutzer']='User';
$i18n_tokens['Benutzergruppe']='User group';
$i18n_tokens['Benutzergruppen']='User groups';
$i18n_tokens['Benutzerverwaltung']='User management';

Bitte niemals diese Sprachdatei mit dem PHP tag ?> schließen. Die Datei würde unbrauchbar.

Ein kleiner Test

Bedingung: conf.inc.php

$phpwcms['i18n_parse'] = 1; 
// enable|disable browser based language parser - all @@Text@@ will be parsed and checked for translation/var based replacement

Schreibe in irgendeinen Text CP den folgenden Satz:

@@Benutzer@@ der @@Benutzer bearbeiten@@ kann gehört zu einer @@Benutzergruppe@@ bzw. in eine der @@Benutzergruppen@@ die durch die @@Benutzerverwaltung@@ gesteuert werden - das ist Schwachsinn.
→ speichern → Aufruf der Seite im Frontend

Ausgabe im FE:

Benutzer der Benutzer bearbeiten kann gehört zu einer Benutzergruppe bzw. in eine der Benutzergruppen die durch die Benutzerverwaltung gesteuert werden - das ist Schwachsinn.

→ Bitte schaue in den Ordner /template/template_lang/*
dort wirst du nun eine Datei finden die z.B. so aussieht:

/template/template_lang/de.php

<?php
// phpwcms template language file "de" (2009-02-06 16:52:05)
// ATTENTION! Never add the closing PHP tag "? >" at the end of this file!
 
$i18n_tokens['Benutzer'] = 'Benutzer'; // NEW 2009-02-06 16:52:05
$i18n_tokens['Benutzer bearbeiten'] = 'Benutzer bearbeiten'; // NEW 2009-02-06 17:01:15
$i18n_tokens['Benutzergruppe'] = 'Benutzergruppe'; // NEW 2009-02-06 17:01:15
$i18n_tokens['Benutzergruppen'] = 'Benutzergruppen'; // NEW 2009-02-06 17:01:15
$i18n_tokens['Benutzerverwaltung'] = 'Benutzerverwaltung'; // NEW 2009-02-06 17:01:15


Übersetze die Wörter/Sätze z.B. nach [en]

/template/template_lang/de.php

<?php
// phpwcms template language file "de" (2009-02-06 16:52:05)
// ATTENTION! Never add the closing PHP tag "? >" at the end of this file!
 
$i18n_tokens['Benutzer'] = 'User'; // NEW 2009-02-06 16:52:05
$i18n_tokens['Benutzer bearbeiten'] = 'Edit user'; // NEW 2009-02-06 17:01:15
$i18n_tokens['Benutzergruppe'] = 'User group'; // NEW 2009-02-06 17:01:15
$i18n_tokens['Benutzergruppen'] = 'User groups'; // NEW 2009-02-06 17:01:15
$i18n_tokens['Benutzerverwaltung'] = 'User management'; // NEW 2009-02-06 17:01:15

- Und lade die Seite im Browser noch einmal:

Neue Ausgabe dieser Seite:

User der Edit user kann gehört zu einer User group bzw. in eine der User groups die durch die User management gesteuert werden - das ist Schwachsinn.

Hurra! die Übersetzung ist fertig.

Diese Datei sollte im wahren Leben sicher nicht de.php heißen sondern eher en.php für die englische Sprache, da der User mit einem englischen lokalisierten Browser die Seite besucht. (Das wurde hier nur zum schnellen Test so gemacht, denn jeder wird nicht gleich seinen Browser umschalten können → FF: Quick Locale Switcher).

Auf diese Art und Weise kann auch ein gesamter Absatz behandelt werden.



Immer darauf achten, dass im Text vorkommende Hochkommata escaped werden, und zwar so: “It\'s a poor man\'s world”. Auch Sonderlaute und ~ zeichen müssen ersetzt werden, zB Ü –> &Uuml; (Korrektur: das ist nicht immer korrekt - muss näher erforscht werden! Im test läuft das mit utf-8 zur Zeit einwandfrei auch ohne Codierung). Andernfalls (Hochkommata) spuckt das System einen error auf den Bildschirm 8-o

Und noch was: Immer die editierten Sprachfiles utf-8- kodiert abspeichern, sonst kommt es zu einem unheimlichen Zeichensalat 8-o 8-o 8-o

Lokalisationen die der Browser zurückgibt:

Siehe auch:

PHP: mehrsprachige Seiten bauen

W3C: Language tags in HTML and XML

SmartyMultilanguageSupport

Lokalisationen

Afrikaans = af

Albanian = sq

Arabic (Algeria) = ar-dz
Arabic (Bahrain) = ar-bh
Arabic (Egypt) = ar-eg
Arabic (Iraq) = ar-iq
Arabic (Jordan) = ar-jo
Arabic (Kuwait) = ar-kw
Arabic (Lebanon) = ar-lb
Arabic (libya) = ar-ly
Arabic (Morocco) = ar-ma
Arabic (Oman) = ar-om
Arabic (Qatar) = ar-qa
Arabic (Saudi Arabia) = ar-sa
Arabic (Syria) = ar-sy
Arabic (Tunisia) = ar-tn
Arabic (U.A.E.) = ar-ae
Arabic (Yemen) = ar-ye
Arabic = ar

Armenian = hy

Assamese = as

Azeri (Cyrillic) = az
Azeri (Latin) = az

Basque = eu

Belarusian = be

Bengali = bn

Bulgarian = bg

Catalan = ca

Chinese (China) = zh-cn
Chinese (Hong Kong SAR) = zh-hk
Chinese (Macau SAR) = zh-mo
Chinese (Singapore) = zh-sg
Chinese (Taiwan) = zh-tw
Chinese = zh

Croatian = hr

Czech = cs

Danish = da

Divehi = div

Dutch (Belgium) = nl-be
Dutch (Netherlands) = nl

English (Australia) = en-au
English (Belize) = en-bz
English (Canada) = en-ca
English (Caribbean) = en
English (Ireland) = en-ie
English (Jamaica) = en-jm
English (New Zealand) = en-nz
English (Philippines) = en-ph
English (South Africa) = en-za
English (Trinidad) = en-tt
English (United Kingdom) = en-gb
English (United States) = en-us
English (Zimbabwe) = en-zw
English = en

Estonian = et

Faeroese = fo

Farsi = fa

Finnish = fi

French (Belgium) = fr-be
French (Canada) = fr-ca
French (France) = fr
French (Luxembourg) = fr-lu
French (Monaco) = fr-mc
French (Switzerland) = fr-ch

FYRO Macedonian = mk

Gaelic = gd

Georgian = ka

German (Austria) = de-at
German (Germany) = de
German (Liechtenstein) = de-li
German (lexumbourg) = de-lu
German (Switzerland) = de-ch

Greek = el

Gujarati = gu

Hebrew = he

Hindi = hi

Hungarian = hu

Icelandic = is

Indonesian = id

Italian (Italy) = it
Italian (Switzerland) = it-ch

Japanese = ja

Kannada = kn

Kazakh = kk

Konkani = kok

Korean = ko

Kyrgyz = kz

Latvian = lv

Lithuanian = lt

Malay (Brunei) = ms
Malay (Malaysia) = ms

Malayalam = ml

Maltese = mt

Marathi = mr

Mongolian (Cyrillic) = mn

Nepali (India) = ne

Norwegian (Bokmal) = nb-no
Norwegian (Bokmal) = no
Norwegian (Nynorsk) = nn-no

Oriya = or

Polish = pl

Portuguese (Brazil) = pt-BR
Portuguese (Portugal) = pt

Punjabi = pa

Rhaeto-Romanic = rm

Romanian (Moldova) = ro-md

Romanian = ro

Russian (Moldova) = ru-md
Russian = ru

Sanskrit = sa

Serbian (Cyrillic) = sr
Serbian (Latin) = sr

Slovak = sk

Slovenian = ls

Sorbian = sb

Spanish (Argentina) = es-ar
Spanish (Bolivia) = es-bo
Spanish (Chile) = es-cl
Spanish (Colombia) = es-co
Spanish (Costa Rica) = es-cr
Spanish (Dominican Republic) = es-do
Spanish (Ecuador) = es-ec
Spanish (El Salvador) = es-sv
Spanish (Guatemala) = es-gt
Spanish (Honduras) = es-hn
Spanish (International Sort) = es
Spanish (Mexico) = es-mx
Spanish (Nicaragua) = es-ni
Spanish (Panama) = es-pa
Spanish (Paraguay) = es-py
Spanish (Peru) = es-pe
Spanish (Puerto Rico) = es-pr
Spanish (Spain) = es-es
Spanish (Traditional Sort) = es
Spanish (United States) = es-us
Spanish (Uruguay) = es-uy
Spanish (Venezuela) = es-ve

Sutu = sx

Swahili = sw

Swedish (Finland) = sv-fi
Swedish = sv

Syriac = syr

Tamil = ta

Tatar = tt

Telugu = te

Thai = th

Tsonga = ts

Tswana = tn

Turkish = tr

Ukrainian = uk

Urdu = ur

Uzbek (Cyrillic) = uz
Uzbek (Latin) = uz

Vietnamese = vi

Xhosa = xh

Yiddish = yi

Zulu = zu

Mal ein wenig Praxis:

Mit dieser Ersetzungsmethode kann nicht nur Text innerhalb der Content Parts ersetzt werden - nein, auch Titel, Untertitel und mehr können damit “ausgerüstet” werden. Der praktische Nährwert liegt auf der Hand:

  • internationaler shop
  • googlemaps enhanced
  • Formulare
  • ach, was noch alles…

Stell Dir vor, Du hast eine 10-sprachige Seite und jede Sprache hat ein eigenes Kontaktformular. Was nun, wenn sich die Mailadresse ändert? Oder eine Bezeichnung? Richtig: 10x editieren.
Ein einziges Formular in einer versteckten Kategorie sollte reichen, ausgestattet mit diesen @@ nützlichen @@ tags. Wir referenzieren dieses eine Formular dann mit dem tollen {SHOW_CONTENT:CP,IDxx}, woimmer wir es brauchen.
Es sei denn, es gibt unterschiedliche Mailempfanger - dann natürlich nicht! ;-)
WOW!

Mal ein wenig Praxis II:

Weise Worte für den Weisen ;-)
Wenn dieses wirklich äusserst praktische Feature genutzt wird, dann ist hier ein praktischer Tip zur Arbeitsminimierung: Alle zu übersetzenden Texte sollten auf english hinterlegt werden. Anschließend einmal kurz mit dem Browser (mit der Seitensprache als Präferenz) durch die Seiten gehetzt, um alle @@Sprachtags@@ “einzufangen”.
Jetzt wird einfach eine Übersetzung der englischen Ausdrücke und Texte in dem neu entstandenen Sprachfile in die Seitensprache gemacht und dies wiederholt man dann bei den wichtigsten anderen später neu entstehenden…
Ergebnis der Prozedur: jeder neue “ausländische” Besucher bekommt wenigstens einen englischen Text zu Gesicht.
Andernfalls gibt es einen Riesenaufwand, all' die vielen neu entstehenden Sprachfiles ständig neu zu übersetzen / ergänzen (wart mal ein paar Tage und Du hast 50+++ neue Sprachdateien LOL )

Kleiner Zusatztipp: Den Quick Locale Switcher für den FF installieren, dann kann man die wichtigsten Sprachfiles selber und “absichtlich” generieren ;)

deutsch/ersetzer_rts/integrierte-tags/sprach-tags/i18n.txt · Last modified: 2009/10/28 09:09 by Knut Heermann (flip-flop)
www.planmatrix.de www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0

Strict Standards: Only variables should be passed by reference in /home/www/wiki/doku.php on line 79