Browsing all articles tagged with Zend_Translate
Nov
22

Übersetzung ohne ViewHelper

Jeder, der mit Übersetzungen, im Zend Framework arbeitet kennt es. Das lange ungetüm, das es braucht um einen einzelnen String im View zu übersetzen. Dafür gibt es aber eine Lösung, eine Kurzfassung, die ich hier vorstellen will. Das Zend Framework bietet einem Filter für den View. Filter, die nach dem Rendern eines Views ausgeführt werden und zum Ziel haben die Ausgabe im Nachhinein zu verändern. Einen solchen Filter stelle ich hier nun zur Verfügung.

weiterlesen

Nov
18

Translate Resource

Oftmals wird hier im Blog das Thema Zend_Translate angesprochen. Die bisherigen Themen dazu sind aber leider entsprechend veraltet und so soll hier auch in diesem Bereich etwas Moderne den Einzug halten. Ich habe für mein kleines Projekt eine eigene Translate Resource mit Modulfähigkeit geschrieben. Im Folgenden will ich ein kurzes Beispiel zur Verwendung der Resource bringen. Es ist dabei unbedingt zu beachten, dass ich in dieser einfachen Version der Resource auf Exceptions verzichtet habe. Diese werden im Laufe der Zeit noch dazu kommen, ebenso wie die nötige Cache Funktionalität. Mein Beispiel basiert auf TMX Dateien, welche ich persönlich empfehle, da sie XML Dateien sind und somit leicht über ein entsprechendes Frontend zu bearbeiten sind. Dieses kann sich zum Beispiel im Adminbereich einer Website finden.

Nun beginnen wir.

Ich will im View einen String ausgeben. Natürlich verwende ich dafür den entsprechenden ViewHelper. Wenn man dies jedoch einbaut, dann wird man feststellen, dass es keine Übersetzung gibt, sondern der String an sich ausgegeben wird.

< ?php echo $this->translate('testMessage'); ?>

Um nun der Applikation die Mehrsprachigkeit hinzuzufügen braucht es einige erst einmal der Resource, die sich am Ende dieses Artikels findet. Ich gehe davon aus, dass hier ein Basiswissen Resourcen besteht und man weiß, wie man sie einbindet. Um die Resource zu aktivieren und zu konfigurieren braucht es in der Konfigurationsdatei der Applikation, bei mir die application.php, einiger Variablen.

weiterlesen

Nov
16

Zend_Translate Webcast

Es gibt bekannterweise viele Menschen im Bereich der Zend Framework Entwicklung, die noch nicht so richtig klarkommen mit den Fähigkeiten der Translate Komponente. Nun habe ich einen Webcast gefunden, der nicht schlecht ist und alles wirklich gut darstellt. Ein Grundvermögen für die englische Sprache ist Voraussetzung für diesen Webcast, aber auch verständlich (halbwegs) für jene, die sich nur das Video ansehen können ohne etwas zu verstehen.

Das Video wird euch die Komponenten Zend_Translate und Zend_Locale näher bringen. Über Plugins und View Helper kann man diese verwenden. IN dem Video wird gezeigt, wie man sprach-freundliche  Routen erstellt, wie man einen Sprach-Wechsler erstellt und wie man .csv Sprach-Dateien ausliest und einbindet.

Zum Webcast

Mai
26

Mehrsprachigkeit mit Zend_Application

Eine Multilinguale Seite mit Zend_Application aufzubauen ist gar nicht so schwer, wie man denkt. Ich gehe hier davon aus, dass man schon Erfahrung mit Zend_Application hat und werde es nicht in jeder Kleinigkeit erklären. Das ganze basiert auf dem Zend Framework 1.8.1

Wenn man am Ende alles richtig eingebaut hat anhang der Beispieldaten, dann sind die Sprachen Deutsch und Englisch verfügbar über die folgenden Adressen:

http://en.domain.tld -> Englisch
http://de.domain.tld -> Deutsch
http://fr.domain.tld -> Deutsch, da dies als Standard gesetzt wird in der Bootstrap

Zuerst einma benötigt man Translate Dateien. Ich habe dafür eine Verzeichnisstruktur angelegt, in der sich ein Ordner für jede Sprache findet. In meinem Fall sind dies “de” und “en”. In diesen liegen dann die verschiedenen PHP Dateien mit Arrays. Hier kurz Beispielhaft für Deutsch und Englisch jeweils die string.php

return array(

'WELCOME' =&gt; 'Willkommen zum Test'

);
return array(

'WELCOME' =&gt; 'Welcome to the Test'

);

Über die application.ini setzt man die nötigen Routen, Locale und Translate Einstellungen. Bitte die angegebene Domain im Router auch in die richtige ändern.

resources.router.routes.language.type = &quot;Zend_Controller_Router_Route_Hostname&quot;
resources.router.routes.language.route = &quot;:lang.domain.tld&quot;
resources.router.routes.language.defaults.controller = &quot;index&quot;
resources.router.routes.language.defaults.action = &quot;index&quot;
resources.router.routes.language.defaults.lang = &quot;de&quot;
resources.router.routes.language.chains.index.type = &quot;Zend_Controller_Router_Route&quot;
resources.router.routes.language.chains.index.route = &quot;:controller/:action/*&quot;
resources.router.routes.language.chains.index.defaults.module = &quot;default&quot;
resources.router.routes.language.chains.index.defaults.controller = &quot;index&quot;
resources.router.routes.language.chains.index.defaults.controller = &quot;index&quot;
resources.router.routes.language.chains.base.type = &quot;Zend_Controller_Router_Route&quot;
resources.router.routes.language.chains.base.route = &quot;/*&quot;
resources.router.routes.language.chains.base.defaults.module = &quot;default&quot;
resources.router.routes.language.chains.base.defaults.controller = &quot;index&quot;
resources.router.routes.language.chains.base.defaults.controller = &quot;index&quot;

resources.translate.adapter = &quot;array&quot;
resources.translate.data = APPLICATION_PATH &quot;/languages&quot;
resources.translate.locale = &quot;en&quot;
resources.translate.options.disableNotices = true
resources.translate.options.scan = &quot;directory&quot;

Und zuletzt die Bootstrap Klasse

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

protected function _initRequest()
{
// Nötige Abhängigkeiten auflösen
$this-&gt;bootstrap('FrontController');
$this-&gt;bootstrap('router');

// Den Frontcontroller holen
$front = $this-&gt;getResource('FrontController');

// Ein Request Objekt in den Frontcontroller setzen
$request = new Zend_Controller_Request_Http();
$request-&gt;setBaseUrl('/');
$front-&gt;setRequest($request);

// Den Request in die Registry des Bootstrap Objekt setzen
return $request;
}

protected function _initLang()
{
// Die nötigen Abhhängigkeiten aufbauen
$this-&gt;bootstrap('FrontController');
$this-&gt;bootstrap('router');
$this-&gt;bootstrap('translate');

// Den Frontcontroller mit dem Request Objekt holen und den Router ausführen
$front = Zend_Controller_Front::getInstance();
$request = $front-&gt;getRequest();
$router = $front-&gt;getRouter();
$router-&gt;route($request);

// Das Translate Objekt holen
$lang = $this-&gt;getResource('translate');

// Prüfen, ob die ausgewählte Sprache zur verfügung steht, wenn nicht, dann Standard setzen.
if (!$lang-&gt;isAvailable($front-&gt;getRequest()-&gt;getParam('lang','de'))) {
$front-&gt;getRequest()-&gt;setParam('lang','de');
}

// Die ausgewählte Sprache in das Translate setzen
$lang-&gt;setLocale($front-&gt;getRequest()-&gt;getParam('lang'));

return;
}

}

Zum Test kann man sich einen String ausgeben lassen in der View

&lt;?=$this-&gt;translate('WELCOME')?&gt;

Das ganze ist natürlich noch um einige Features erweiterbar, aber mit diesen Schritten hat man eine gute Basis um weiter zu kommen. Interessant sind für den Einbau wohl noch Zend_Cache, entsprechende andere Router oder das speichern der Standardsprache in der Konfiguration für schnelle Änderungen.

Mai
9

Zend Translate – Automatische Übersetzung

Da immer wieder die Frage aufkommt wie man ein Translate Objekt vom Zend Framework so hinbekommt, dass es automatisch Formulare usw. übersetzt. Folgend habe ich dafür ein kleines Plugin. Formularfelder werden dann automatisch übersetzt. Meine TMX, die ich dort genannt habe, lege ich gleich bei.

class Zorta_Plugin_Language extends Zend_Controller_Plugin_Abstract {

	private $_translate = null;

	public function __construct()
	{
		# Lpcale setzen, erkennt automatiswch die Sprache des Benutzers
		$locale = new Zend_Locale();

		# Ein neues Translate Objekt initialisieren.
		$translate = new Zend_Translate('tmx', APPLICATION_PATH . '/application/languages/trans.tmx', 'en');

		# Dien Locale aus dem Locale Obnjekt setzen
		$translate-&gt;getAdapter()-&gt;setLocale($locale-&gt;getLanguage());

		# Das Translate Objekt ibn die Registry setzen um es für andere Komponenten aufrufbar zu machen
   		Zend_Registry::set('Zend_Translate',$translate);

    	$this-&gt;_translate = $translate;
	}

}

[code land="xml"]<?xml version="1.0" ?>
<!DOCTYPE tmx SYSTEM "tmx14.dtd">
<tmx version="1.4">
<header creationtoolversion="1.0.0" datatype="winres" segtype="sentence"
adminlang="en-us" srclang="de-at" o-tmf="abc"
creationtool="XYZTool" >
</header>
<body>
<tu tuid='test'>
<tuv xml:lang="de"><seg>Das ist ein Test</seg></tuv>
<tuv xml:lang="en"><seg>This is a Test</seg></tuv>
</tu>
<tu tuid='Username'>
<tuv xml:lang="de"><seg>Benutzername</seg></tuv>
<tuv xml:lang="en"><seg>Username</seg></tuv>
</tu>
<tu tuid='Password'>
<tuv xml:lang="de"><seg>Passwort</seg></tuv>
<tuv xml:lang="en"><seg>Password</seg></tuv>
</tu>
<tu tuid='Login'>
<tuv xml:lang="de"><seg>Einloggen</seg></tuv>
<tuv xml:lang="en"><seg>Login</seg></tuv>
</tu>
</body>
</tmx>[/code]