Was wird internationalisiert (=Übersetzbar gemacht)?
====================================================
Es wird alles übersetzbar gemacht, was ein armer Übersetzer am Ende übersetzen muß. Dabei gelten die guten alten Regeln aus der Schulzeit, wie z.b. die Eigennamen - sie ersparen uns viel Arbeit, weil man sie nicht übersetzt! Dabei gibt es noch ein paar weitere, allgemeine i18n- (bzw gettext-) Regeln:
- Müssen Variablen in die Übersetzung eingebaut werden, löst man das mit Platzhaltern (z.b. %s und sprintf)
- Eigennamen und technische Begriffe werden nicht übersetzt
- Sätze dürfen in der Übersetzung nicht in Teilsätze unterteilt werden, da der Satzbau sich in vielen Ländern erheblich von dem deutschen Satzbau unterscheidet.
Wie wird internationalisiert?
============================
In Contenido selbst immer mit i18n, in Modulen mit mi18n. Die Ursprungssprache für Contenido ist immer Englisch. Bei Modulen: Es kommt auf das Projekt an, ob Modulübersetzungen notwending sind. Soll ein Projekt ab Beginn oder später internationalisiert werden, zahlt es sich aus, gleich sämtliche Texte mit der Modulübersetzung anzulegen. Hier ist die Ursprungssprache meist gleich der ersten Sprache. Es sollte vorher entschieden werden, was die Ursprungssprache ist, und nicht gemischt werden (Böses Beispiel: Modul A = Deutscher mi18n-Ursprung, Modul B = Englischer mi18n-Ursprung).
Einfache gute Beispiele:
========================
echo i18n("We want to translate this"); // Nichts aufregendes
echo i18n("This ain't a big thing"); // Einzelne Anführungszeichen werden erkannt
Einfache schlechte Beispiele:
=============================
echo i18n("<h1>BIG ERROR</h1>"); // Schlecht, HTML-Tags sind nicht übersetzbar und haben deshalb dort nichts verloren
echo i18n(""Hello""); // Schlecht, auch HTML-Entities sind nicht übersetzbar. Besser: i18n("\"Hello\"");, auch wenn es ugly aussieht.
echo i18n("CSS"); // Schlecht, CSS ist ein Eigenname und wird deshalb nicht übersetzt.
Einfache nicht-funktionierende Beispiele:
=========================================
echo i18n('I am still tired'); // Schlecht, single-quotes werden vom gettext-Parser nicht erkannt.
echo i18n("Error code: $errornum"); // Schlecht, kann so nicht übersetzt werden. Besser: sprintf(i18n("Error code: %s"), $errornum);
Komplexere gute Beispiele:
==========================
switch ($errnum)
{
case 1: $msg = sprintf(i18n("Could not connect to database %s."), $ipAddress); break;
case 2: $msg = sprintf(i18n("Could not find table %s or insufficient permissions."), $tableName); break;
default: $msg = i18n("Undefined error"); break;
}
echo sprintf(i18n("An error occured. Error Number: %s, Error Message: %s), $errnum, $msg);
Komplexes schlechtes Beispiel:
==============================
switch ($errnum)
{
case 1: echo i18n("An error occured. Error Number: 1, Error Message: Could not connect to database"). $ipAddress."."); break;
case 2: echo i18n("An error occured. Error Number: 2, Error Message: Could not find table"). $tableName.i18n(" or insufficient permissions."); break;
default: echo i18n("Undefined error"); break;
}
i18n für Fortgeschrittene
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
i18n für Fortgeschrittene
Zuletzt geändert von timo am Mi 9. Nov 2005, 12:17, insgesamt 1-mal geändert.
ad.
ist aber auch ein schlechtes beispiel, weils nicht gehen wird...
$msg = sollte $errmsg = sein...
ansonsten sehr guter beitrag...
vielleicht sollte man noch erwähnen das i18n einen zusätzlichen parameter hat der für plugins genutzt werden kann... (falls es einige nicht wissen sollten)
Code: Alles auswählen
switch ($errnum)
{
case 1: $msg = sprintf(i18n("Could not connect to database %s."), $ipAddress); break;
case 2: $msg = sprintf(i18n("Could not find table %s or insufficient permissions."), $tableName); break;
default: $msg = i18n("Undefined error"); break;
}
echo sprintf(i18n("An error occured. Error Number: %s, Error Message: %s), $errnum, $errmsg);
$msg = sollte $errmsg = sein...
ansonsten sehr guter beitrag...
vielleicht sollte man noch erwähnen das i18n einen zusätzlichen parameter hat der für plugins genutzt werden kann... (falls es einige nicht wissen sollten)
*** make your own tools (wishlist :: thx)
-
- Beiträge: 4255
- Registriert: Do 30. Jun 2005, 22:56
- Wohnort: Eltmann, Unterfranken, Bayern
- Kontaktdaten:
Die Regeln für i18n gelten für Plugins entsprechend unter folgenden Vorraussetzungen.timo hat geschrieben:Ja das mit dem i18n für Plugins muß ich nochmal erweitern, komme im Moment aber nicht dazu
In der config.plugin.php im Verzeichnis /plugins/MeinPlugin/includes definiert man eine Variable $plugin_name="MeinPlugin".
Diese wird dann der i18n-Funktion mit übergeben.
i18n("This part to translate", $plugin_name)
Die Sprachdateien dazu liegen dann im Verzeichnispfad /plugins/MeinPlugin/locale/de_DE/LC_MESSAGES (für andere Sprachen entsprechend)
Übersetzungen werden gemacht mit poEdit (http://www.poedit.org/download.php), welches sowohl für WinDoof als auch für Linux zum Download angeboten wird.
Gruß aus Franken
Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog