i18n für Fortgeschrittene

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

i18n für Fortgeschrittene

Beitrag von timo » Mo 31. Okt 2005, 14:06

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;
}
Zuletzt geändert von timo am Mi 9. Nov 2005, 12:17, insgesamt 1-mal geändert.

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 9. Nov 2005, 11:49

ad.

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);
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)
*** make your own tools (wishlist :: thx)

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Mi 9. Nov 2005, 12:18

emergence hat geschrieben:ansonsten sehr guter beitrag... ;-)
Immer diese pingeligen Österreicher :wink:

Danke ;) Ja das mit dem i18n für Plugins muß ich nochmal erweitern, komme im Moment aber nicht dazu

Oldperl
Beiträge: 4255
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Beitrag von Oldperl » Mi 9. Nov 2005, 14:49

timo hat geschrieben:Ja das mit dem i18n für Plugins muß ich nochmal erweitern, komme im Moment aber nicht dazu
Die Regeln für i18n gelten für Plugins entsprechend unter folgenden Vorraussetzungen.

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

Antworten