<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soraxdesign &#187; Mehrsprachigkeit</title>
	<atom:link href="http://www.soraxdesign.de/tag/mehrsprachigkeit/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.soraxdesign.de</link>
	<description>Softwareentwicklung, Rich Internet Applications und Blog</description>
	<lastBuildDate>Sat, 04 Dec 2010 13:56:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Tutorial: Mehrsprachige Anwendungen in Flex 3</title>
		<link>http://www.soraxdesign.de/2009/10/22/tutorial-mehrsprachige-anwendungen-in-flex-3-runtime-localization/</link>
		<comments>http://www.soraxdesign.de/2009/10/22/tutorial-mehrsprachige-anwendungen-in-flex-3-runtime-localization/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 20:21:41 +0000</pubDate>
		<dc:creator>rené</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Mehrsprachigkeit]]></category>
		<category><![CDATA[MXML]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.soraxdesign.de/?p=269</guid>
		<description><![CDATA[Wer schon einmal vor der Aufgabe stand, eine Flex Projekt mehrsprachig zu gestalten, dem bieten sich beim ersten Überlegen mehrere Lösungen an:

ein Array für jede Sprache
XML Datei
eine Datenbank, mit einer Serversprache und Stream über AMF
&#8230;bestimmt noch viele weitere Lösungen

Jedoch hat sich Adobe Gedanken gemacht und eine recht elegante Lösung für Flex 3 vorgesehen: Runtime Localization [...]]]></description>
			<content:encoded><![CDATA[<p>Wer schon einmal vor der Aufgabe stand, eine Flex Projekt mehrsprachig zu gestalten, dem bieten sich beim ersten Überlegen mehrere Lösungen an:</p>
<ul>
<li>ein Array für jede Sprache</li>
<li>XML Datei</li>
<li>eine Datenbank, mit einer Serversprache und Stream über AMF</li>
<li>&#8230;bestimmt noch viele weitere Lösungen</li>
</ul>
<p>Jedoch hat sich Adobe Gedanken gemacht und eine recht elegante Lösung für Flex 3 vorgesehen: Runtime Localization mit Ressourcen. Dabei gibt es viele Vorteile:<br />
<span id="more-269"></span></p>
<ul>
<li>mehrere Ressourcen (=Sprachen) können in ein Projekt kompiliert werden</li>
<li>Ressourcen werden extern in .properties Dateien gespeichert (Trennung vom Code)</li>
<li>direktes Umschalten zwischen verschiedenen Sprachen (alle Referenzen werden sofort aktualisiert)</li>
<li>auch Sounds, Bilder können &#8220;mehrsprachig&#8221; verknüpft werden</li>
<li>zur Laufzeit können neue Ressourcen aus XML Dateien, Datenbankanfragen erzeugt werden</li>
</ul>
<p>Nun aber zum Tutorial. Erzeugt euch ein Flex 3 Projekt und editiert eure *.mxml Datei wie folgt:</p>
<div class="codecolorer-container mxml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="mxml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000;">&lt;?xml version=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #7400FF;">&gt;</span></span><br />
<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Application</span> xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span><span style="color: #7400FF;">&gt;</span></span><br />
    <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Label</span> text=<span style="color: #ff0000;">&quot;@Resource(bundle='myResources', key='SLOGAN')&quot;</span> fontSize=<span style="color: #ff0000;">&quot;20&quot;</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;40&quot;</span><span style="color: #7400FF;">/&gt;</span></span><br />
    <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:ComboBox</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;10&quot;</span><span style="color: #7400FF;">&gt;</span><span style="color: #7400FF;">&lt;/mx:ComboBox</span><span style="color: #7400FF;">&gt;</span></span><br />
    <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Image</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;78&quot;</span> width=<span style="color: #ff0000;">&quot;211&quot;</span> height=<span style="color: #ff0000;">&quot;193&quot;</span><span style="color: #7400FF;">/&gt;</span></span><br />
<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Application</span><span style="color: #7400FF;">&gt;</span></span></div></div>
<p>Dabei kann man deutlich erkennen, dass hier eine Ressource mit dem Namen &#8220;myResources&#8221; und dort der Key &#8220;SLOGAN&#8221; aufgerufen wird. Schaltet ihr in die Designansicht, seht ihr, dass das der Inhalt des Attributs <em>text</em> jetzt etwas unschön quer über die Applikation ragt.<br />
Anschließend erzeugt ihr euch in eurem <em>src</em> Ordner einen Ordner <em>locale</em>, darin zwei Ordner <em>de_DE</em> und <em>en_US</em>. In diesen weiterhin jeweils eine Datei namens <strong>myResources.properties</strong> (hier ist die oben erwähnte .properties Datei, außerdem der Link vom <em>text</em> Attribut mit &#8220;myResources&#8221;). Danach sollte eure Ordnerstuktur so ähnlich aussehen:</p>
<p><img src="http://www.soraxdesign.de/wp-content/uploads/2009/10/Bildschirmfoto-2009-10-22-um-21.36.53.png" alt="Ordnerstruktur locale" title="Ordnerstruktur locale" width="267" height="200" align="center"/></p>
<p>Anschließend müsst ihr unbedingt die Kodierung der Dateien auf UTF-8 setzen. Dazu Rechtsklick auf die myResources.properties -> Eigenschaften. Hier stellt ihr das Text File Encoding auf UTF-8:</p>
<p><a href="http://www.soraxdesign.de/wp-content/uploads/2009/10/Bildschirmfoto-2009-10-22-um-21.44.27.png"><img src="http://www.soraxdesign.de/wp-content/uploads/2009/10/Bildschirmfoto-2009-10-22-um-21.44.27-300x223.png" alt="Umstellung der Kodierung auf UTF-8" title="Umstellung der Kodierung auf UTF-8" width="300" height="223"/></a></p>
<p>Damit der Compiler auch die Ressourcen findet, muss der Pfad zu diesem in dem Compileroptionen angegeben werden. Dazu öffnet ihr die Eigenschaften des Projektes, geht auf Flex Compiler und ergänzt/ersetzt dort um folgendes:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-locale=en_US -source-path=../locale/{locale}</div></div>
<p>Damit wird dem Flex Compiler mitgeteilt, dass die Standardsprache englisch ist sowie weitere Sprachen im Ordner &#8220;locale&#8221; zu finden sind. Die &#8220;..&#8221; sind entscheidend, da der Flex Compiler einen relativen src-Pfad nimmt und nicht den absoluten wie man ihn im Projektbaum sieht. Scheint noch ein Relikt aus der Betaphase zu sein.</p>
<p>Jetzt sind alle Vorbereitungen getroffen, wenn ihr das Projekt ausführt sollte der Platzhalter <em>SLOGAN</em> durch euren Text aus der Datei en_US/myResources.properties ersetzt werden. Jedoch sprach ich noch vom direkten Umschalten zwischen mehreren Sprachen. Dazu verknüpfen wir die vorhandenen Ressources mit einer Combobox.<br />
Kurz etwas zum Hintergrund des Flex Compilers: Für jede Sprachresource muss für es einen Resource im Frameworkordner des Flex Frameworks (SDK) geben. D.h. für en_US gibt es bereits nach der Installation ein fertiges Sprachpaket unter <em>frameworks/locale/en_US/framework_rb.swc</em>. Wenn wir aber in den Compileroptionen <em>-locale=de_DE</em> angeben, erwartet der Compiler, eben dieses Sprachpaket unter <em>frameworks/locale/<strong>de_DE</strong>/framework_rb.swc</em> zu finden. Das ist aber von Hause aus nicht so. Deswegen müssen wir manuell die Resourcen für unsere Sprachen erzeugen. Diese geschieht recht simpel, indem man die vorhandene (englische) Resource dupliziert.</p>
<p>Für Windows geht dieses mit</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bincopylocale.exe en_US de_DE</div></div>
<p>sowie unter Mac mit dem Befehl</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bin/copylocale.sh en_US de_DE</div></div>
<p>Nun aber zur Umschaltung zwischen verschiedenen Sprachen. Folgendermaßen sieht der Code jetzt aus:</p>
<div class="codecolorer-container mxml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="mxml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000;">&lt;?xml version=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #7400FF;">&gt;</span></span><br />
<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Application</span> xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span><span style="color: #7400FF;">&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Metadata</span><span style="color: #7400FF;">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; [ResourceBundle(&quot;myResources&quot;)]<br />
&nbsp; &nbsp; <span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Metadata</span><span style="color: #7400FF;">&gt;</span></span><br />
<br />
&nbsp; &nbsp; <span style="color: #339933;">&lt;mx:Script&gt;</span><br />
<span style="color: #339933;"> &nbsp; &nbsp;&lt;![CDATA[</span><br />
<br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;[Bindable]</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;private var locales:Array = [ &quot;en_US&quot; , &quot;de_DE&quot; ];</span><br />
<br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;private function localeComboBox_initializeHandler(event:Event):void</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;{</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;localeComboBox.selectedIndex = locales.indexOf(resourceManager.localeChain[0]);</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;}</span><br />
<span style="color: #339933;"> &nbsp; </span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;private function localeComboBox_changeHandler(event:Event):void</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;{</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Set the localeChain to either the one-element Array</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// [ &quot;en_US&quot; ] or the one-element Array [ &quot;de_DE&quot; ].</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resourceManager.localeChain = [localeComboBox.selectedItem];</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><br />
<span style="color: #339933;"> &nbsp; &nbsp; &nbsp; &nbsp;}</span><br />
<br />
<span style="color: #339933;"> &nbsp; &nbsp;]]&gt;</span><br />
<span style="color: #339933;"> &nbsp; &nbsp;&lt;/mx:Script&gt;</span><br />
&nbsp; &nbsp; <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Label</span> text=<span style="color: #ff0000;">&quot;{resourceManager.getString('myResources', 'SLOGAN')}&quot;</span> fontSize=<span style="color: #ff0000;">&quot;20&quot;</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;40&quot;</span><span style="color: #7400FF;">/&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:ComboBox</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;10&quot;</span> id=<span style="color: #ff0000;">&quot;localeComboBox&quot;</span> dataProvider=<span style="color: #ff0000;">&quot;{locales}&quot;</span></span><br />
<span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; initialize=<span style="color: #ff0000;">&quot;localeComboBox_initializeHandler(event)&quot;</span></span><br />
<span style="color: #000000;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; change=<span style="color: #ff0000;">&quot;localeComboBox_changeHandler(event)&quot;</span><span style="color: #7400FF;">/&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Image</span> x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;78&quot;</span> width=<span style="color: #ff0000;">&quot;211&quot;</span> height=<span style="color: #ff0000;">&quot;193&quot;</span> source=<span style="color: #ff0000;">&quot;{resourceManager.getString('myResources', 'IMGSRC')}&quot;</span><span style="color: #7400FF;">/&gt;</span></span><br />
<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Application</span><span style="color: #7400FF;">&gt;</span></span></div></div>
<p>Die wichtigste Veränderung stellt die Ersetzung aller &#8220;@Resource(bundle&#8230;.&#8221; durch &#8220;{resourceManager.getString(&#8230;&#8221; dar. Damit greift ihr direkt auf den resourceManager zu, welchem ihr über die Combobox verschiedene Sprachresourcen zuweisen könnt. Dabei ist <em>localeChain</em> der entscheidene Begriff.<br />
Im Download und der Demo findet ihr auch ein Beispiel für &#8220;mehrsprachige&#8221; Bilder. </p>
<p><a href="http://www.soraxdesign.de/examples/20091023_flex3_localization/BLOG_Localization.html">Demo</a><br />
<a href='http://www.soraxdesign.de/wp-content/uploads/2009/10/Flex3_Localization.zip'>Download Beispiel</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.soraxdesign.de/2009/10/22/tutorial-mehrsprachige-anwendungen-in-flex-3-runtime-localization/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

