i18n

Hallo,

ich bin grad dabei meine Seite zu internationalisieren. Das übersetzen der Texte funktioniert soweit jedoch schaffe ich es nicht die URL’S zu übersetzen.

Zu folgendem Beispiel (http://www.yiiframework.com/doc/cookbook/55/) habe ich paar Fragen

  1. Wo erstelle ich Application Components?

  2. Wie integriere ich diese Application Componentes in mein Projekt?

  3. Die Beispiel Klasse heißt i18n. Verstößt dies nicht gegen die Core Klasse i18n??


class I18n extends CApplicationComponent



4.) File Translation

Für verschiedene Sprache möchte ich auch verschiedene Seiten anzeigen lassen.

In meiner config habe ich

‘language’ => ‘de’ eingetragen

Beispiel der Ordnerstruktur meiner "site"-View




site/

  hr/

    index.php

  index.php



hr ist die zweite Sprache und die Default Sprache ist de. Laut der Doku müsste das so funktionieren, aber die Dateien aus dem hr Ordner werden nicht aufgerufen

Standardmäßig in "/protected/components"

Über die config. Praktisch genau so wie du auch die db konfigurierst. Zusätzlich halt noch in das preload-array (genau wie "log") damit die I18n-Klasse noch vor dem Controller etc. geladen wird. Steht ja alles im Artikel.

Yii core classes haben immer ein "C" als Prefix um genau dieses Problem zu umgehen.

Geht mit der I18n-class aus dem Artikel nicht. Was meinst du überhaupt mit anderen Seiten? Tatsächlich komplett andere views? Ich nehme mal an du willst die gleichen views halt nur in einer anderen Sprache?

Sorry, habe mich bisschen unglücklich hier ausgedrückt.

Kleinere Abschnitte setzte ich in Yii::t(‘xyz’,‘kleiner Text’);

Größere Abschnitte (mehrere Zeilen), finde ich sehr unpraktisch per t() zu übersetzen. Nun würde ich die größeren Abschnitte in Dateien auslagern. (natürlich Sprachabhängig)

Defaultsprache "de" und andere Sprachen wären "en" und "hr"

Hi,

ich habe ich meiner App-Config die ‘sourceLanguage’ auf ‘’ (leer) gesetzt.

Dann gilt jede Sprache als Übersetzung und dann kannst Du auch für die default-‘language’ mit Übersetzungen arbeiten. Natürlich Yii::app()->language auf ‘de’ lassen.

Für längere Texte nehme ich einen Platzhalter ‘NOTICE_ABC’. Denn gerade bei denen ändert sich ja auch oft der Source-Text. Die kann ich dann aber einfach mit langen Sätzen ersetzen.

Grüße

schmunk

@schmunk:

Interessante Methode, muss ich mir merken. Danke! :)

Gern geschehen! Ist übrigens alles schon im pii verwurstet B)

deine Lösung ist "yi"

easy und efficient ^^

@YII und dein Turorial

Du musst in der config das i18 groß schreiben ansonsten erhält man folgende Fehlermeldung




CException

Beschreibung


Objekt-Konfiguration muss ein Array sein, das ein "class"-Element beinhaltet.

Quelldatei


/var/www/yii/framework/YiiBase.php(177)




// application components

'components' => array(

	'log' => array(

		'class'	=>	'CLogRouter', 

			'routes' =>	array(

				array(

					'class'	=> 'CFileLogRoute',

					'levels'=>'error, warning',

				),

				'class' => 'CWebLogRoute',

			),

		),

	'errorHandler'	=> array(

		'errorAction'	=> 'translation/error',

	),

		'user'=>array(

		// enable cookie-based authentication

		'allowAutoLogin' => true,

	),

	'I18n' => array(

		'urlRulesPath' => dirname(__FILE__) . '/i18n/urlRules',

		'supportedLanguages' => array(

			array('code' => 'en', 'name' => 'english', 'fallback' => true),

			array('code' => 'de', 'name' => 'german'),

		),

	),



Ich kriege deinen Code nicht zum laufen

Ich habe soweit alles eingebunden wie du es beschrieben hast und in die init()-Methode ganz am Anfang ein exit() eingebunden, dieses wird aber nicht ausgeführt

meinen alten urlManager habe ich auskommentiert. in i18n/urlRules/de.php habe ich auch am Anfang mal ein exit() eingeführt auch das wird nicht ausgeführt.

Trace


16:03:46.209917  	trace  	system.web.CModule  	Loading "log" application component

16:03:46.213249 	trace 	system.web.CModule 	Loading "session" application component

16:03:46.214929 	trace 	system.web.CModule 	Loading "request" application component

16:03:46.218444 	trace 	system.web.CModule 	Loading "urlManager" application component

16:03:46.228138 	trace 	system.web.CModule 	Loading "clientScript" application component

16:03:46.231113 	trace 	system.web.CModule 	Loading "messages" application component

16:03:46.239917 	trace 	system.web.CModule 	Loading "db" application component

16:03:46.240504 	trace 	system.db.CDbConnection 	Opening DB connection

Schreib das I bei deiner i18n-Komponente in der config klein.

Edit:

Uups, dann isses genau anders rum. :) Hatte nur deine Originalnachricht in der Email, aber hastes wohl nochmal ausgebessert…

Edit 2:

Am besten ist es, dem ‘i18n’ array noch ein ‘class’ => ‘I18n’ zu verpassen, dann dürfts keine Exception mehr geben, egal wie du die Komponente benennst.

hehe ;)

Dennoch wird die I18n Komponente nicht ausgeführt, siehe meinen Trace

Dann hast du "i18n" nicht im preload array.

So sollte es sein - habs angepasst.

hehe doch aber mit dem kleinen i :D, exit wird schon mal ausgeführt. teste nun weiter :D


'urlRulesPath' => dirname(__FILE__) . '/I18n/urlRules',

führt hierzu!

include(/var/www/blog/protected/config/I18n/urlRules/de.php) [<a href=‘function.include’>function.include</a>]: failed to open stream: No such file or directory

Dann mach


'urlRulesPath' => dirname(dirname(__FILE__)) . '/I18n/urlRules',

bzw. ich weiss ja nicht wo du deine de.php liegen hast. Kann also auch gross/kleinschreibung sein.

das hat funktioniert.

ich übernehme die Ordnerstruktur aus dem Tutorial sprich /protected/I18n/urlRules/de.php

Meine Regel drehen sich aber nur im Kreis, sprich ich bekomme einen Umleitungsfehler


Fehler: Umleitungsfehler

Die aufgerufene Website leitet die Anfrage so um, dass sie nie beendet werden kann


return array(

//	'urlFormat'			=>	'path',

//	'caseSensitive'		=>	true,

//	'showScriptName'	=>	false,

//	'urlFormat'			=> 'path',

	'rules' => array(

  		'zontakt' => 'site/contact',

	)

);



In meiner config habe ich den urlManager komplett rausgenommen, daher muss ich doch folgende Zeilen in jede Sprache-Rules reintuen?


'urlFormat'		=>	'path',

'caseSensitive'		=>	true,

'showScriptName'	=>	false,

'urlFormat'		=>	'path',



Nein das klappt nicht weil das was in de.php steht an Yii::app()->urlmanager->rules übergeben wird. Die Standardeinstellungen

vom UrlManager sollten schon in der normalen config stehen.

Wenn du dann immernoch nen Umleitungsfehler bekommst, dann kannst ja nochmal bescheid sagen.

Weiterhin ein Umleitungsfehler.

Hier ein Auszug aus meinen Dateien

/protected/config/main.php

<?php


return array(

	'basePath'	=> dirname(__FILE__).DIRECTORY_SEPARATOR.'..',

	'name'		=>'',


	// preloading 'log' component

	'preload'	=> array('log', 'session', 'I18n'),


	// autoloading model and component classes

	'import'	=> array(

		'application.models.*',

		'application.components.*',

		'application.components.controllers.*'

	),


	'language' => 'de',


	// application components

	'components' => array(


		'I18n' => array(

			'class'	=>	'I18n',

			'urlRulesPath' => dirname(dirname(__FILE__)) . '/I18n/urlRules',

			'supportedLanguages' => array(

				array('code' => 'en', 'name' => 'english', 'fallback' => true),

				array('code' => 'de', 'name' => 'german'),

    		),

  		),


		'log' => array(

			'class'	=>	'CLogRouter', 

				'routes' =>	array(

					array(

						'class'	=> 'CFileLogRoute',

						'levels'=>'error, warning',

					),

					'class' => 'CWebLogRoute',

				),

			),

		'errorHandler'	=> array(

			'errorAction'	=> 'translation/error',

		),


		'user'=>array(

			// enable cookie-based authentication

			'allowAutoLogin' => true,

		),

		'urlManager'=>array(

			'urlFormat'		=> 'path',

			'caseSensitive'		=> true,

			'showScriptName'	=> false,

			'urlFormat'		=> 'path',

//			'rules' => array(

//			),

			'urlSuffix' => '.html',

		),

	),

protected/I18n/urlRules/de.php


<?php

 

/* ../protected/i18n/urlRules/de.php */

return array(

//	'urlFormat'		=> 'path',

//	'caseSensitive'		=> true,

//	'showScriptName'	=> false,

//	'urlFormat'		=> 'path',

	'rules' => array(

  		'zontakt' => 'site/contact',

	)

);



?>

protected/components/I18n.php




class I18n extends CApplicationComponent{

original aus dem Tutorial

}



So muss es sein:




return array(

  'foo' => 'bar/baz'

);



Wie gesagt das was da im Array steht wird direkt an Yii::app()->urlmanager->rules übergeben.

Noch eine Info: Wie ich gerade sehe unterstützt Yii nun auch subdomains und topleveldomains im UrlManager. Siehe hier unter "Parameterizing Hostnames".

weiterhin ein Umleitungsfehler


return array(

  		'zontakt' => 'site/contact',

);



zu yii.

Ich benutze folgendes Cookbook zur Sprachänderung

http://www.yiiframework.com/doc/cookbook/26/

Meine zwei URL’s sollen heißen

www.example.com //deutsch

en.example.com //englisch

weiterhin

www.example.com/suchen/xyz.html

en.example.com/search/xyz.html

www.example.com/suchen/bilder/xyz.html

en.example.com/search/picuture/xyz.html

Wie würdest du das nun mit dem neuen Feature von yii erstellen?




array(

    'http://<language:\w+>.example.com/<lang:\w+>/profile' => 'user/profile',

)