31
1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von [email protected] Mai 2006

1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von [email protected]@gmx.net Mai 2006

Embed Size (px)

Citation preview

Page 1: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

1

Mehrsprachigkeit in PHP

In Anwendungen und Datenbanken

von [email protected]

Mai 2006

Page 2: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

2

Part I

Mehrsprachigkeit

in PHP Anwendungen

Page 3: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

3

Wofür überhaupt explizite Sprachmodule

Designentscheidung Mehrsprachigkeit Schnittstelle für Übersetzer

Page 4: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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)’;

Page 5: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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;

}

Page 6: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 7: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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’);...

Page 8: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

8

Wie kann man Sprachmodule realisieren?

Datenbank IV

Zur Pflege: JA Zur Verwendung: NEIN

Page 9: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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.

Page 10: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 11: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 12: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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”

Page 13: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 14: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

14

Exkurs: Gettext

Page 15: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 16: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 17: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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’);

Page 18: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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;

}

Page 19: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 20: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

20

Part II

Mehrsprachigkeit

in Datenbanken

Page 21: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 22: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 23: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

23

Wo speichert man die Übersetzung?

In der Datenbank

In dem Datensatz, d. h. Tabellendefinition erweitern

Page 24: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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))

Page 25: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 26: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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);

Page 27: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

27

Zwischenergebnis

Mehrsprachigkeit in Daten Kollisionsfreie Erweiterung vorhandener Datenbanken Einfache Umstellung der SQL-Ausdrücke Sanfte Migration

Was noch?

Page 28: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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 !)

Page 29: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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

Page 30: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

30

Ausblick

Part III, mit praktischen Beispielen Diskussion

Page 31: 1 Mehrsprachigkeit in PHP In Anwendungen und Datenbanken von Stefan.Kilp@gmx.netStefan.Kilp@gmx.net Mai 2006

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!