Upload
willafried-widder
View
109
Download
0
Embed Size (px)
Citation preview
2
Part I
Mehrsprachigkeit
in PHP Anwendungen
3
Wofür überhaupt explizite Sprachmodule
Designentscheidung Mehrsprachigkeit Schnittstelle für Übersetzer
4
Wie kann man Sprachmodule realisieren?
Nachteile Immer alle Sprachen eingebunden Um Zugriff darauf zu haben, muss das Sprach-Array als
Globale in jede Funktion eingebunden werden
Global array IVerwendung
$lang[’de’][’firstname’] = ’Vorname’;$lang[’de’][’lastname’] = ’Nachname’;$lang[’de’][’age’] = ’Alter’;...$lang[’en’][’firstname’] = ’First Name’;$lang[’en’][’lastname’] = ’Last Name’;$lang[’en’][’age’] = ’Age (in Years)’;
5
Wie kann man Sprachmodule realisieren?
Switched Array II
Verwendung
switch ($lang) {case "de":
include("langDE.inc");break;
case "en": include("langEN.inc");break;
default: include("langDE.inc");break;
}
6
Wie kann man Sprachmodule realisieren?
Defines IIIVerwendung I
function KontaktDatenErzeugen($firstName, $lastName, $age) {
global $lang;
$rows[] = array( $lang[‚firstname’], $firstName);$rows[] = array( $lang[‚lastname’], $lastName);$rows[] = array( $lang[‚age’], $age);
echo table_build($rows);}
Vorname HansNachname MustermannAlter 25
7
Wie kann man Sprachmodule realisieren?
Defines IIIVerwendung II
Define(‘firstname’, ‘Vorname’);define(‘lastname’, ‘Nachname’);define(‘age’, ‘Alter’);...
Define(‘__firstname’, ‘Vorname’);define(‘__lastname’, ‘Nachname’);define(‘__age’, ‘Alter’);...
8
Wie kann man Sprachmodule realisieren?
Datenbank IV
Zur Pflege: JA Zur Verwendung: NEIN
9
Pflege der Übersetzungen
ManuellNachteile Weitere Sprachen hinzufügen bedeutet, neue Datei
(z.B. langIT.inc) erzeugen und alle bisher vorhandenen Keys nachtragen.
Weiteren Key hinzufügen bedeutet, in allen Dateien den Key einzupflegen (beim Löschen zu entfernen).
Vorteil Sehr einfach an externe Übersetzer / Community
weiterzugeben.
10
Pflege der ÜbersetzungenDatenbank
Übersetzungstabelle
Create table languages (id int(11) NOT NULL default '0',key varchar(64) NOT NULL default ’’,langDE textlangEN text,langIT text,PRIMARY KEY (id)
)
Daten per Skript in gewünschtes Format zu exportieren Konsistenzwahrung beim Hinzufügen von Sprachen
11
OptimierungSourcecode
Verwendung I
Verwendung II
$s = $lang[‘firstname’].’ ‘.$lang[’lastname’];
$s = _(‘firstname’).’ ’._(’lastname’)
Vorteile Zeichnet sich durch kurze prägnante Verwendung aus Umgeht das Problem der Globals und der Namespaces
Nachteile Gettext stützt sich auf die „lokale“ Einstellungen des Servers Weitere Komponente, unübersichtliches Menüstruktur für Daten
12
Exkurs: GettextSprachdefinitionen die englische messages.po
msgid “firstname”msgstr “First Name”
msgid “lastname”msgstr “Last Name”
msgid “age”msgstr “Age”
die deutsche messages.pomsgid “firstname”msgstr “Vorname”
msgid “lastname”msgstr “Nachname”
msgid “age”msgstr “Alter”
13
Exkurs: Gettext
Vorteile: Kann mit beliebigem Editor bearbeitet werden Es gibt frei verfügbare GUI-Editoren
(poEdit http://www.poedit.org/, ubuntu webbased) Command-Line Tools Weit verbreitet
14
Exkurs: Gettext
15
Vorgehensweise Sprachkeys automatisch aus Sourcecode extrahieren
xgettext --language=php -o messages.po --keyword=_ myApp.php
Ergebnis: Sprachkeys jederzeit per Skript aus unserem Projekt ziehen Vorhandenen Übersetzungen werden in neue messages.po Dateien integriert Überflüssige Übersetzungen (#~...) können per Skript entfernt werden (awk '{if (/^#~/) exit; else print}' messages.po > messages_bereinigt.po) (Die PO-Dateien sollten in UTF8 Kodierung gespeichert werden, der PHP Code
liegt aber meistens in iso-8859-1 vor, das lässt sich aber per Parameter xgettext --from-code=iso-8859-1 lösen)
Nachteil: Vor der eigentlichen Verwendung durch gettext muss die eigentliche textbasierte
PO-Datei in eine binäre MO-Datei überführt werden.
Extrakt mit vorhandenen Übersetzungen mischenmsgmerge messages.po messages_alt.po > messages_utf8.po
16
Entwicklungszyklus verkürzen
Pear Bibliothek Translation2 erlaubt die direkte Verwendung der MO-Dateien
Während der Entwicklung wird das Generieren der PO Dateien nicht benötigt
Einfacher für Entwickler
17
Entwicklungszyklus verkürzenFeinheiten (1) Verwendung von Translation2
$params = array(
'prefetch' => false,
'langs_avail_file' => './lang/langs.ini',
'domains_path_file' => './lang/domains.ini',
'default_domain' => 'messages',
'file_type' => 'po', // aktivieren);
$tr = Translation2::factory('gettext', $params);
$tr->setLang($lang);
echo $tr->get(‘firstname’);
18
Entwicklungszyklus verkürzenFeinheiten (2) Wrapper
# doppelter Underscore
function __($message) {
global $tr;
$translate = $tr->get($message);
# beliebige Validierung einbaubar
$res = '<font color=red>'.$translate.'</font>';
return $res;
}
19
Fazit
Was haben wir erreicht? Texte aus Sourcecode ausgegliedert Grundlagen für Mehrsprachigkeit geschaffen Einheitliches verbreitetes System (Gettext) als
Basis gewählt, mit den Vorteilen der Tools und Anwendungen
Den Turn-Around für den Entwickler minimal gehalten (Übersetzung definieren, speichern, Anwendung aktualisieren, fertig)
Aus Performancegründen die Live-Version mit den komprimierten MO-Dateien
20
Part II
Mehrsprachigkeit
in Datenbanken
21
Mehrsprachigkeit in Datenbanken
Mehrsprachigkeit in Daten, nicht nur in Anwendung Anzahl der Sprachen in Anwendung und Daten
unterschiedlich Vermeidung von Datenfehlern / Inkonsistenzen in Daten
22
Wo sind die Probleme?
Beispiel
Klassen sprachabhängiger Attribute1. Unabhängig (z.B. Zahl, Farbe, Namen, ...)2. Abhängig (z.B. Anrede)3. Abhängig, aber mit bekannter Transformationsfunktion:
Temperatur (Grad, Fahrenheit), Gewicht (kg, Pfund), Längen (km, Miles), Währungen, ...
Anwendung dt Datenbank-------------------------------------------Anrede HerrVorname PaulNachname Mustermann
Anwendung en Datenbank-------------------------------------------Title Herr vs. Mr. !!!!First Name PaulLast Name Mustermann
23
Wo speichert man die Übersetzung?
In der Datenbank
In dem Datensatz, d. h. Tabellendefinition erweitern
24
Wie speichert man die Übersetzung?
Tabellenstruktur alt
Tabellenstruktur neu
CREATE TABLE `kategorien` (
id int(10) unsigned NOT NULL auto_increment,
caption varchar(30) NOT NULL default '',
PRIMARY KEY (id)
)
CREATE TABLE `kategorien` (
id int(10) unsigned NOT NULL auto_increment,
caption_de_DE varchar(30) NOT NULL default '',
caption_en_US varchar(30) NOT NULL default '',
PRIMARY KEY (id))
25
Wie speichert man die Übersetzung?
Inhalt der Tabelle
Einfach weitere Sprachen möglich
1, Privat, Privat
2, Geschäftlich, Business
3, Notiz, Note
4, Anruf, Phone Call
26
Wie verwendet man die Übersetzung?
Zugriff mit MySQL bisher
Zugriff mit MySQL jetzt
$sql = “select caption from kategorien order by caption”;
$lang = ‘de_DE’;
$sql = “select caption{lang} from kategorien order by caption”;
$sql = str_replace(‘{lang}’, ‘_’.$lang, $sql);
27
Zwischenergebnis
Mehrsprachigkeit in Daten Kollisionsfreie Erweiterung vorhandener Datenbanken Einfache Umstellung der SQL-Ausdrücke Sanfte Migration
Was noch?
28
Format der Daten
Vor MySQL 4.1 keine Auswahlmöglichkeit Ab 4.1 für jedes Attribut eigenes Format, in
Abhängigkeit der Daten möglich Normalerweise latin1_general_ci,
latin1_german1_ci (NICHT _cs !)
29
Darstellung der Daten Ab MySQL 4.1 pro Verbindung
Ergebnis
Daten Muffler
Müller
MX Systems
MySQL
SELECT name FROM kunden ORDER BY name COLLATE collation_name
latin1_swedish_ci latin1_german1_cilatin1_german2_ci
Muffler Muffler Müller
MX Systems Müller Muffler
Müller MX Systems MX Systems
MySQL MySQL MySQL
30
Ausblick
Part III, mit praktischen Beispielen Diskussion
31
Ende – Fin – Finish – Finito ...
Folien auf der UG Website Fragen, Ideen, Austausch
[email protected] Folien unter
http://kilp.net/phpugffm/Mehrsprachigkeit_in_PHP.pdf
Danke für euer Interesse!