bestimmte Sprache aus mehrsprachigem String filtern – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 13:09:50 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750805#m1750805 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750805#m1750805 <p>Moin,</p> <p>HTML-Platzhalterdateien können mehrsprachig sein. Die Anzahl der Sprachen ist von Programm zu Programm variabel. Alle Programme haben de, en, nl - aber ich schließe nicht aus, dass neue Programme auch fr, es, ... können und die alten nach und nach erweitert werden.</p> <p>Bisher konnten die Sprachen pro Zeile nur einmal vorkommen, in der neuen Funktion dürfen sie beliebig oft sein, hier zweimal:</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>textA: ###de###en###nl### textB: ###deutsch###english###Nederlands###<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> </code></pre> <p>Ich übergebe der php-Funktion also die Textzeile, die Anzahl der Sprachen und den Sprach-Index 2 für en:</p> <pre><code class="block language-php"><span class="token variable">$zeile</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"<p>textA: ###de###en###nl### textB: ###deutsch###english###Nederlands###</p>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">waehleSprache</span><span class="token punctuation">(</span> <span class="token variable">$zeile</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Der Return-String soll so aussehen:</p> <p><code><p>textA: en textB: english</p></code></p> <p>Ich zerlege also die Zeile in ein Array und benötige mit Sicherheit den ersten und letzten Wert, aber dazwischen ist unklar:</p> <pre><code class="block language-php"><span class="token variable">$arr</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'###'</span><span class="token punctuation">,</span> <span class="token variable">$zeile</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token variable">$arr</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// vorlaufender Text</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token variable">$i</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator"><</span><span class="token function">count</span><span class="token punctuation">(</span><span class="token variable">$arr</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$string</span> <span class="token operator">.=</span> <span class="token operator">...</span><span class="token punctuation">;</span> <span class="token comment">// siehe Frage</span> <span class="token punctuation">}</span> <span class="token variable">$string</span> <span class="token operator">.=</span> <span class="token variable">$arr</span><span class="token punctuation">[</span><span class="token variable">$i</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// nachlaufender Text</span> </code></pre> <p>Irgendwie habe ich gerade ein Brett vorm Kopf, deshalb die <strong>Frage</strong>:</p> <p>Ich weiß, dass ich bei drei Sprachen und dem Sprach-Index 2 diese Sub-Arrays benötige:</p> <p><code>0, 2, [6, 10, 14, 18, ...,] count($arr) -1</code></p> <p>Bei fünf Sprachen und dem Sprach-Index 4 wären es:</p> <p><code>0, 4, [10, 16, ...,] count($arr) -1</code></p> <p>Mir will einfach nicht einfallen, wie ich diese Zahlenfolge mit einer Formel generieren kann.</p> <p>Wer kann helfen? Oder gibt es einen besseren Lösungsansatz?</p> <p>Gruß, Linuchs</p> <p>Edit: <code>0, 2, [6, 10, 14, 18, ...,] count($arr) -1</code> ist falsch, ergibt</p> <p><code>textA: endeutsch</code></p> bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 13:38:59 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750809#m1750809 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750809#m1750809 <p>Hallo,</p> <blockquote> <p>HTML-Platzhalterdateien können mehrsprachig sein. Die Anzahl der Sprachen ist von Programm zu Programm variabel. Alle Programme haben de, en, nl - aber ich schließe nicht aus, dass neue Programme auch fr, es, ... können und die alten nach und nach erweitert werden.</p> </blockquote> <p>bis hier kann ich dir folgen.</p> <blockquote> <p>Bisher konnten die Sprachen pro Zeile nur einmal vorkommen, in der neuen Funktion dürfen sie beliebig oft sein, hier zweimal:</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>textA: ###de###en###nl### textB: ###deutsch###english###Nederlands###<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> </code></pre> </blockquote> <p>Auch das verstehe ich noch, aber ich finde die Datenorganisation alles andere als gut.</p> <blockquote> <p>Ich übergebe der php-Funktion also die Textzeile, die Anzahl der Sprachen und den Sprach-Index 2 für en:</p> <pre><code class="block language-php"><span class="token variable">$zeile</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"<p>textA: ###de###en###nl### textB: ###deutsch###english###Nederlands###</p>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">waehleSprache</span><span class="token punctuation">(</span> <span class="token variable">$zeile</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Ähm, mit Index 2 komme ich auf nl (Niederländisch): 0->de, 1->en, 2->nl.</p> <blockquote> <p>Der Return-String soll so aussehen:</p> <p><code><p>textA: en textB: english</p></code></p> <p>Ich zerlege also die Zeile in ein Array und benötige mit Sicherheit den ersten und letzten Wert, aber dazwischen ist unklar:</p> <pre><code class="block language-php"><span class="token variable">$arr</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'###'</span><span class="token punctuation">,</span> <span class="token variable">$zeile</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token variable">$arr</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// vorlaufender Text</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token variable">$i</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator"><</span><span class="token function">count</span><span class="token punctuation">(</span><span class="token variable">$arr</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$string</span> <span class="token operator">.=</span> <span class="token operator">...</span><span class="token punctuation">;</span> <span class="token comment">// siehe Frage</span> <span class="token punctuation">}</span> <span class="token variable">$string</span> <span class="token operator">.=</span> <span class="token variable">$arr</span><span class="token punctuation">[</span><span class="token variable">$i</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// nachlaufender Text</span> </code></pre> <p>Irgendwie habe ich gerade ein Brett vorm Kopf, deshalb die <strong>Frage</strong>:</p> <p>Ich weiß, dass ich bei drei Sprachen und dem Sprach-Index 2 diese Sub-Arrays benötige:</p> <p><code>0, 2, [6, 10, 14, 18, ...,] count($arr) -1</code></p> </blockquote> <p>Also sei s die Anzahl der Sprachen und i der ab 1 zählende Index, dann brauchst du n<em>s+0 und n</em>s+i, wobei n ab 0 läuft und solange erhöht wird, bis die Array-Grenze überschritten ist.</p> <blockquote> <p>Wer kann helfen? Oder gibt es einen besseren Lösungsansatz?</p> </blockquote> <p>Ich würde beim bisherigen Ansatz bleiben und nur ein Element pro String verwenden. Und das dann als mehrstufiges Array organisieren:</p> <p><strong>str = definition[index][lang]</strong></p> <p>Hierbei ist <em>index</em> die fortlaufende Nummer des Textfragments, <em>lang</em> der 0-basierte Index der gewünschten Sprache.</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Ein Tag, an dem du nicht wenigstens einmal gelacht hast, ist ein verlorener Tag. </div> bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 14:28:55 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750810#m1750810 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750810#m1750810 <blockquote> <p>HTML-Platzhalterdateien können mehrsprachig sein. Die Anzahl der Sprachen ist von Programm zu Programm variabel. Alle Programme haben de, en, nl - aber ich schließe nicht aus, dass neue Programme auch fr, es, ... können und die alten nach und nach erweitert werden.</p> </blockquote> <blockquote> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>textA: ###de###en###nl### textB: ###deutsch###english###Nederlands###<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> </code></pre> </blockquote> <p>Ich habe deinen Lösungsweg ehrlichgesagt nicht verstanden. Aber PHP hat auch einen eigenen Mechanismus um Platzhaler in Templates zu ersetzen. Die Syntax ist etwas anders als bei dir und vielleicht etwas gewöhnungsbedürftig, aber dafür musst du das Template nicht mehr selber nach Platzhaltern durchsuchen und sie ersetzen. Damit ließe sich sehr einfach eine ähnliche Übersetzungsfunktion bauen:</p> <pre><code class="block language-php"><span class="token keyword">final</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Lang</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token constant">DE</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token constant">EN</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token constant">NL</span> <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$translate</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token keyword type-hint">int</span> <span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token keyword type-declaration">string</span> <span class="token operator">...</span><span class="token variable">$dictionary</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$dictionary</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">render</span><span class="token punctuation">(</span><span class="token keyword type-hint">int</span> <span class="token variable">$lang</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token operator"><<</span><span class="token operator"><</span><span class="token constant">HTML</span> <span class="token operator"><</span>p<span class="token operator">></span> textA<span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token variable">$translate</span><span class="token punctuation">(</span><span class="token variable">$lang</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'de'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'en'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'nl'</span><span class="token punctuation">)</span><span class="token punctuation">}</span> textB<span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token variable">$translate</span><span class="token punctuation">(</span><span class="token variable">$lang</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'deutsch'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'english'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Netherlands'</span><span class="token punctuation">)</span><span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>p<span class="token operator">></span> <span class="token constant">HTML</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">render</span><span class="token punctuation">(</span><span class="token class-name static-context">Lang</span><span class="token operator">::</span><span class="token constant">DE</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><code>$translate</code> muss in diesem Fall ein Closure sein, weil normale Funktionen innerhalb von String-Platzhaltern nicht aufgerufen werden können.</p> bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 15:31:45 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750817#m1750817 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750817#m1750817 <p>Hallo,</p> <blockquote> <p>Wer kann helfen? Oder gibt es einen besseren Lösungsansatz?</p> </blockquote> <p>Wenn ich das richtig durchschaut haben sollte, brauchst du die Anzahl der Sprachen nicht zu übergeben. Sie berechnet sich aus der Arraylänge.</p> <p>AnzSprachen = ( array.len - 3 ) ÷ 2</p> <p>Die zusammengehörenden Texte haben dann einen Abstand von AnzSprachen+1</p> <p>Gruß<br> Kalk</p> bestimmte Sprache aus mehrsprachigem String filtern Mon, 24 Jun 19 17:20:35 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1751091#m1751091 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1751091#m1751091 <p>Nun, der Sinn von Templates ist, es so zu machen, daß im Template nur die Platzhalter stehen und die Werte erst mit dem Rendern da reinkommen. Beispw. haben wir <code>{{platzhalter}}</code> und nach dem Rendern steht dann, je nach Sprache <code>English</code> oder <code>Deutsch</code> an der Stelle wo sich der Platzhalter befand.</p> <p>Auf diese Art und Weise sind Erweiterungen um weitere Sprachen nicht vom Template abhängig. MFG</p> bestimmte Sprache aus mehrsprachigem String filtern Tue, 25 Jun 19 05:35:53 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1751099#m1751099 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1751099#m1751099 <blockquote> <p>Oder gibt es einen besseren Lösungsansatz?</p> </blockquote> <p>Du betreibst sozusagen eine Zweckentfremdung. In template.h sähe das so aus:</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tmpl_if</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>de<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span> hir rede deusch <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tmpl</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tmpl_if</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span> speaking english <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tmpl</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tmpl_if</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>nl<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span> je word ouder <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tmpl</span><span class="token punctuation">></span></span> </code></pre> <p>Und es gibt tatsächlich Kollegen die das so machen. Was natürlich umständlich ist und bei Spracherweiterungen müssen die Templates bearbeitet werden. <a href="https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1751091#m1751091" rel="noopener noreferrer">Hier</a> schrieb ich gestern wie das zweckmäßiger geht.</p> <p>MFG</p> bestimmte Sprache aus mehrsprachigem String filtern Fri, 21 Jun 19 05:53:26 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750865#m1750865 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750865#m1750865 <p>Hi Martin,</p> <p>schön, Dich wieder hier zu lesen.</p> <p>Pit</p> bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 15:31:13 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750816#m1750816 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750816#m1750816 <blockquote> <p>Ich habe deinen Lösungsweg ehrlichgesagt nicht verstanden.</p> </blockquote> <p>Es geht um HTML-Dateien mit Platzhaltern, die von PHP-Programmen gelesen, ausgefüllt und an den Client ausgeliefert werden.</p> <p>Ursprünglich hatte ich für fünf Sprachen und jedes Programm je eine Platzhalter-Datei. Bei Änderungen mussten fünf Dateien manuell geändert werden, das führte zu Fehlern.</p> <p>Deshalb habe ich sprach-abhängige Texte als "Array" in die HTML-Datei geschrieben und die "Arrays" mit den Zeichen ### markiert. Bisher pro Zeile nur ein "Array".</p> <p>Nun geht es darum, mehrere "Arrays" pro Zeile zuzulassen, wobei die Anzahl der Sprachen von Programm zu Programm variieren kann, sie muss als Parameter also mitgegeben werden.</p> <p>Hier habe ich 5 Sprachen und möchte die französische Version (4):</p> <pre><code class="block language-php"><span class="token variable">$zeile</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"<p>textA: ###de-1###en-1###nl-1###fr-1###es-1### textB: ###deutsch###english###Nederlands###francais###espanol### textC: ###de-2###en-2###nl-2###fr-2###es-2</p>"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token function">displaySprache</span><span class="token punctuation">(</span> <span class="token variable">$zeile</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Ausgabe: <code>textA: fr-1 textB: francais textC: fr-2</code></p> <p>Habe das inzwischen so gelöst, hoffe aber, dass das vielleicht schneller geht. Pro Zeile der Platzhalter-Datei so eine Schleife zu duchlaufen hält auf:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">displaySprache</span><span class="token punctuation">(</span> <span class="token variable">$text</span><span class="token punctuation">,</span> <span class="token variable">$anzahl_sprachen</span><span class="token punctuation">,</span> <span class="token variable">$lg_ndx</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$anzahl_trenner</span> <span class="token operator">=</span> <span class="token function">substr_count</span> <span class="token punctuation">(</span> <span class="token variable">$text</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"###"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Prtüfung, ob paarig</span> <span class="token comment">// Trenner vorhanden und teilbar durch anzahl_sprachen +1?</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token variable">$anzahl_trenner</span> <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">&&</span> <span class="token variable">$anzahl_trenner</span> <span class="token operator">%</span> <span class="token punctuation">(</span><span class="token variable">$anzahl_sprachen</span> <span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$arr</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'###'</span><span class="token punctuation">,</span> <span class="token variable">$text</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// text - #de - #en - #nl - #text - #de - #en - #nl - #text</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token variable">$arr</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// vorlaufender text</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token variable">$i</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator"><</span><span class="token function">count</span><span class="token punctuation">(</span><span class="token variable">$arr</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token variable">$i</span> <span class="token operator">%</span> <span class="token punctuation">(</span><span class="token variable">$anzahl_sprachen</span> <span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token comment">// vorlaufender Text und Texte zwischen den Sprachen</span> <span class="token operator">||</span> <span class="token variable">$i</span> <span class="token operator">==</span> <span class="token variable">$lg_ndx</span> <span class="token comment">// 1. Vorkommen der Sprache</span> <span class="token operator">||</span> <span class="token variable">$i</span> <span class="token operator">%</span> <span class="token punctuation">(</span><span class="token variable">$anzahl_sprachen</span> <span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token variable">$lg_ndx</span> <span class="token comment">// weitere Sprach-Elemente</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$string</span> <span class="token operator">.=</span> <span class="token variable">$arr</span><span class="token punctuation">[</span><span class="token variable">$i</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$string</span> <span class="token operator">.=</span> <span class="token variable">$arr</span><span class="token punctuation">[</span><span class="token variable">$i</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// nachlaufender text</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$string</span> <span class="token operator">=</span> <span class="token variable">$text</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$string</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Linuchs</p> bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 15:40:11 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750818#m1750818 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750818#m1750818 <p>Wenn die "Array"-Markierung nicht aufgeht, also Programmier-Fehler in der Platzhalter-Datei, würde ich gerne die fehlerhafte Zeilen-Nummer ausgeben.</p> <p>PHP kennt mit seinen Fehlermeldungen ja die Zeilen-Nr, kann ich die als Programmierer auch wissen?</p> bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 15:44:13 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750819#m1750819 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750819#m1750819 <p>Hallo,</p> <blockquote> <p>Nun geht es darum, mehrere "Arrays" pro Zeile zuzulassen, wobei die Anzahl der Sprachen von Programm zu Programm variieren kann, sie muss als Parameter also mitgegeben werden.</p> </blockquote> <p>Du hast also sowohl unbekannte Anzahl Sprachen als auch unbekannte Anzahlan Texten. Wäre es da dann nicht sinnvoll, mit zwei verschiedenen Trennern (z.b. ### & $$$) zu arbeiten und dann mit 2 verschachtelten Arrays zu hantieren?</p> <p>Gruß<br> Kalk</p> bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 22:28:46 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750862#m1750862 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750862#m1750862 <blockquote> <blockquote> <p>Ich habe deinen Lösungsweg ehrlichgesagt nicht verstanden.</p> </blockquote> <p>Es geht um HTML-Dateien mit Platzhaltern, die von PHP-Programmen gelesen, ausgefüllt und an den Client ausgeliefert werden.</p> </blockquote> <p>Okay, mein Rat ist weiterhin PHPs interne String-Interpolation zu benutzen.</p> <p>Wenn du an deinem Ansatz festhälst, möchte ich trotzdem versuchen dir zu helfen. Tabellenkalk hat schon richtig erkannt, dass das wesentliche Problem an deinem Ansatz ist, dass du die selbe Zeichenkette <code>###</code> für den Array-Anfang und das Array-Ende benutzt. Der Ansatz hat zwei, drei weitere kleine Probleme: Du benutzt die selbe Zeichenkette auch noch als Trennsymbol zwischen den Array-Elementen. In den übersetzten Texten darf die Zeichenkette <code>###</code> nicht auftauchen und übersetzte Text dürfen nicht mehrzeilig sein.</p> <p>Ich würde vorschlagen, du überdenkst die Syntax nochmal. Zum Beispiel könntest du eckige Klammern für den Beginn und das Ende des Arrays benutzen und Kommata als Trennsymbole zwischen den Array-Elementen. Wenn eines dieser Sonderzeichen innerhalb eines übersetzten Textes vorkommt, kann man es durch einen Backslash maskieren.</p> <p>Also, wird aus deinem Beispiel:</p> <pre><code class="block language-php"><span class="token variable">$zeile</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"<p>textA: ###de-1###en-1###nl-1###fr-1###es-1### textB: ###deutsch###english###Nederlands###francais###espanol### textC: ###de-2###en-2###nl-2###fr-2###es-2###</p>"</span><span class="token punctuation">;</span> </code></pre> <p>Nun folgendes:</p> <pre><code class="block language-php">zeile <span class="token operator">=</span> <span class="token string double-quoted-string">"<p>textA: [de-1,en-1,nl-1,fr-1,es-1] textB: [deutsch,english,Nederlands,francais,espanol] textC: [de-2,en-2,nl-2,fr-2,es-2]</p>"</span><span class="token punctuation">;</span> </code></pre> <p>Obendrein wird das doch viel besser lesbar.</p> <p>Im Prinzip baust du eine eigene Mini-Programmiersprache. Ein Compiler für so eine Programmiersprache durchläuft konzeptionell drei Phasen: Tokenization, Parsen und Code-Generation. Tokenization beschäftigt sich mit der lexikalischen Struktur der Programmiersprache, Parsen beschäftigt sich mit der syntaktischen Struktur. Die Code-Generierung schließlich macht aus dem Zwischenformat, das ihm der Parser liefert, eine Repräsentation im Zielformat (hier also ein PHP-String.)</p> <p>Wir bauen also eine Funktion:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">compile</span><span class="token punctuation">(</span><span class="token keyword type-hint">int</span> <span class="token variable">$language</span><span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$input</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">evaluate</span><span class="token punctuation">(</span><span class="token variable">$language</span><span class="token punctuation">,</span> <span class="token function">parse</span><span class="token punctuation">(</span><span class="token function">tokenize</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Ein Aufruf wird später so aussehen:</p> <pre><code class="block language-php"><span class="token keyword">echo</span> <span class="token function">compile</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'<p>textA: [de-1,en-1,nl-1,fr-1,es-1] textB: [deutsch,english,Nederlands,francais,espanol] textC: [de-2,en-2,nl-2,fr-2,es-2]</p>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// <p>textA: en-1 textB: english textC: en-2</p></span> </code></pre> <p>Fangen wir mit der <code>tokenize</code>-Funktion an. Aufgabe der Tokenize-Funktion ist es den Eingabe-String in einzelne Stücke, sogenannte Token, zu zerlegen, und zwar so, dass jedes Sonderzeichen zu einem eigenen Stück wird und alle Zeichenketten, die kein Sonderzeichen enthalten, zusammenhängend bleiben. Wenn ein Sonderzeichen maskiert wurde, soll es auch keinen eigenen Token bekommen, sondern zum vorherigen dazugezählt werden.</p> <p>Wir haben also viert Arten von Token: Eine öffnende Klammer, eine schließende Klammer, ein Komma, und rohen Text ohne Sonderzeichen. In PHP könnte eine Token-Klasse so aussehen:</p> <pre><code class="block language-php"><span class="token keyword">final</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">Token</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token constant">OPEN</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token constant">CLOSE</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token constant">COMMA</span> <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token constant">PLAINTEXT</span> <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$type</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$content</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token keyword type-hint">int</span> <span class="token variable">$type</span><span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$content</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">type</span> <span class="token operator">=</span> <span class="token variable">$type</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">content</span> <span class="token operator">=</span> <span class="token variable">$content</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">content</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getType</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">int</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">type</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Kommen wir jetzt zur eigentlichen <code>tokenize</code>-Funktion. Die Funktion muss den Eingabe-String Zeichen für Zeichen einlesen und jeweils entscheiden, ob es sich um ein Sonderzeichen handelt oder nicht. Wenn ein Sonderzeichen vorliegt, dann geben wir ein entsprechendes Token dieser Art aus. Wenn kein Sonderzeichen vorliegt, schreiben wir das Zeichen in einen Zwischenspeicher, einen sogenannten Buffer. Sobald wir wieder ein Sonderzeichen lesen oder am String-Ende angelangt sind, machen wir aus dem Buffer ein PLAINTEXT-Token und setzen den Buffer anschließend zurück. Und wie gesagt, Sonderzeichen können maskiert werden, dafür müssen wir Sorge tragen. Die Funktion könnte dann so aussehen:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">tokenize</span><span class="token punctuation">(</span><span class="token keyword type-hint">string</span> <span class="token variable">$input</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token class-name return-type">Generator</span> <span class="token punctuation">{</span> <span class="token variable">$buffer</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token variable">$escape</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token function">mb_strlen</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$char</span> <span class="token operator">=</span> <span class="token function">mb_substr</span><span class="token punctuation">(</span><span class="token variable">$input</span><span class="token punctuation">,</span> <span class="token variable">$i</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$escape</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$buffer</span> <span class="token operator">.=</span> <span class="token variable">$char</span><span class="token punctuation">;</span> <span class="token variable">$escape</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span><span class="token variable">$char</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'['</span><span class="token punctuation">:</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">Token</span><span class="token punctuation">(</span><span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">PLAINTEXT</span><span class="token punctuation">,</span> <span class="token variable">$buffer</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$buffer</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">Token</span><span class="token punctuation">(</span><span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">OPEN</span><span class="token punctuation">,</span> <span class="token variable">$char</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">']'</span><span class="token punctuation">:</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">Token</span><span class="token punctuation">(</span><span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">PLAINTEXT</span><span class="token punctuation">,</span> <span class="token variable">$buffer</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$buffer</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">Token</span><span class="token punctuation">(</span><span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">CLOSE</span><span class="token punctuation">,</span> <span class="token variable">$char</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">','</span><span class="token punctuation">:</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">Token</span><span class="token punctuation">(</span><span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">PLAINTEXT</span><span class="token punctuation">,</span> <span class="token variable">$buffer</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$buffer</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">Token</span><span class="token punctuation">(</span><span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">COMMA</span><span class="token punctuation">,</span> <span class="token variable">$char</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token string single-quoted-string">'\\'</span><span class="token punctuation">:</span> <span class="token variable">$escape</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token variable">$buffer</span> <span class="token operator">.=</span> <span class="token variable">$char</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$buffer</span> <span class="token operator">!==</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">Token</span><span class="token punctuation">(</span><span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">PLAINTEXT</span><span class="token punctuation">,</span> <span class="token variable">$buffer</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Kommen wir als nächstes zur <code>parse</code>-Funktion. Diese Funktion bekommt die Tokens als Eingabe und macht daraus eine neue Liste von Elementen, die dieses mal nicht Token genannt werden, sondern Knoten. Ein Knoten ist entweder ein Rohtext ohne Übersetzungen oder eine Sammlung von Übersetzungs-Texten.</p> <pre><code class="block language-php"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Node</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token keyword">final</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">PlainText</span> <span class="token keyword">implements</span> <span class="token class-name">Node</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$content</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$content</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">content</span> <span class="token operator">=</span> <span class="token variable">$content</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">content</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">final</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">TranslatedText</span> <span class="token keyword">implements</span> <span class="token class-name">Node</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$dictionary</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$dictionary</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">dictionary</span> <span class="token operator">=</span> <span class="token variable">$dictionary</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">translate</span><span class="token punctuation">(</span><span class="token variable">$key</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">dictionary</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Der Parser arbeitet so ähnlich wie der Lexer. Nochmal zur Verdeutlichung: Der Lexer geht den Eingabestring Zeichen für Zeichen durch und macht daraus eine Liste von Tokens. Der Parser geht nun diese neue Liste Token für Token durch und macht daraus eine Liste von Knoten. Das machen wir deshalb, weil nicht jedes Komma und jede eckige Klammer auch tatsächlich eine Sonderrolle spielt. Kommata, zum Beispiel, haben nur innerhalb von eckigen Klammern eine besondere Bedeutung. Auf der anderen Seite hat die öffnende Klammer innerhalb eines übersetzten Textes keine spezielle Bedeutung mehr. Aufgabe des Parsers ist es diese Fälle zu unterscheiden. Wir brauchen also zumindest eine Variable, in der wir uns merken, ob wir uns zwischen eckigen Klammern befinden. Außerdem brauchen wir diesmal zwei Buffer, in denen wir uns unvollständige Rohtexte bzw. übersetzte Texte merken.</p> <pre><code class="block language-php"> <span class="token keyword">function</span> <span class="token function-definition function">parse</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Generator</span> <span class="token variable">$tokens</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token class-name return-type">Generator</span> <span class="token punctuation">{</span> <span class="token variable">$insideBrackets</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token variable">$textBuffer</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token variable">$languageBuffer</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$tokens</span> <span class="token keyword">as</span> <span class="token variable">$token</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span><span class="token variable">$token</span><span class="token operator">-></span><span class="token function">getType</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> <span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">OPEN</span><span class="token punctuation">:</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$insideBrackets</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$textBuffer</span> <span class="token operator">.=</span> <span class="token variable">$token</span><span class="token operator">-></span><span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">PlainText</span><span class="token punctuation">(</span><span class="token variable">$textBuffer</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$insideBrackets</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token variable">$textBuffer</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">CLOSE</span><span class="token punctuation">:</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$insideBrackets</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$languageBuffer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$textBuffer</span><span class="token punctuation">;</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">TranslatedText</span><span class="token punctuation">(</span><span class="token variable">$languageBuffer</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$insideBrackets</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token variable">$textBuffer</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token variable">$languageBuffer</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$textBuffer</span> <span class="token operator">.=</span> <span class="token variable">$token</span><span class="token operator">-></span><span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">COMMA</span><span class="token punctuation">:</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$insideBrackets</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$languageBuffer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$textBuffer</span><span class="token punctuation">;</span> <span class="token variable">$textBuffer</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$textBuffer</span> <span class="token operator">.=</span> <span class="token variable">$token</span><span class="token operator">-></span><span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> <span class="token class-name static-context">Token</span><span class="token operator">::</span><span class="token constant">PLAINTEXT</span><span class="token punctuation">:</span> <span class="token variable">$textBuffer</span> <span class="token operator">.=</span> <span class="token variable">$token</span><span class="token operator">-></span><span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Unkown type of token:'</span> <span class="token operator">.</span> <span class="token variable">$token</span><span class="token operator">-></span><span class="token function">getType</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$insideBrackets</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Missing closing square bracket.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span><span class="token variable">$textBuffer</span> <span class="token operator">!==</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">yield</span> <span class="token keyword">new</span> <span class="token class-name">PlainText</span><span class="token punctuation">(</span><span class="token variable">$textBuffer</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Das war der komplizierte Teil. Wir haben jetzt also eine Liste von Knoten, manche speichern verschiedene Übersetzungen, andere nur einen Rohtext. Jetzt kommt der einfache Teil: Je nach Sprache, möchten wir aus dieser Liste von Texten einen zusammenhängenden Text in der jeweiligen Zielsprache machen:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">evaluate</span><span class="token punctuation">(</span><span class="token keyword type-hint">int</span> <span class="token variable">$language</span><span class="token punctuation">,</span> <span class="token keyword type-hint">iterable</span> <span class="token variable">$nodes</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span> <span class="token punctuation">{</span> <span class="token variable">$buffer</span> <span class="token operator">.=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$nodes</span> <span class="token keyword">as</span> <span class="token variable">$node</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$node</span> <span class="token keyword">instanceof</span> <span class="token class-name">PlainText</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$buffer</span> <span class="token operator">.=</span> <span class="token variable">$node</span><span class="token operator">-></span><span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span><span class="token variable">$node</span> <span class="token keyword">instanceof</span> <span class="token class-name">TranslatedText</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$buffer</span> <span class="token operator">.=</span> <span class="token variable">$node</span><span class="token operator">-></span><span class="token function">translate</span><span class="token punctuation">(</span><span class="token variable">$language</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span><span class="token variable">$node</span> <span class="token keyword">instanceof</span> <span class="token class-name">Exception</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token variable">$node</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$buffer</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Damit wäre der Code komplett, ich hab ihn aber nur sehr wenig getestet. Ich hoffe die Vorgehensweise wurde einigermaßen deutlich. Das sieht zugegebenermaßen ziemlich komplex aus, ist es auch. Deswegen nochmal mein Rat, benutze lieber PHP-Interpolation oder eine fertige Templating-Engine anstelle von etwas eigenem.</p> bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 15:54:22 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750821#m1750821 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750821#m1750821 <blockquote> <p>Wenn ich das richtig durchschaut haben sollte, brauchst du die Anzahl der Sprachen nicht zu übergeben. Sie berechnet sich aus der Arraylänge.</p> </blockquote> <p>Ja, wenn ich genau 1 Array mit Fremdsprachen habe, ich möchte aber mehrere Arrays. Wie soll ich das unterscheiden?</p> <p>Array mit 7 Sprachen (9 Elemente):</p> <p><code><p>###deutsch###english###Nederlands###francais###espanol###russki###plattdütsch###</p></code></p> <p>2 Arrays mit je 3 Sprachen (auch 9 Elemente):</p> <p><code><p>Sprache: ###deutsch###english###Nederlands### &nbsp; Gruß: ###Guten Morgen###Good morning###Goedemorgen###</p></code></p> bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 15:51:16 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750820#m1750820 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750820#m1750820 <p>Tach!</p> <blockquote> <p>Wenn die "Array"-Markierung nicht aufgeht, also Programmier-Fehler in der Platzhalter-Datei, würde ich gerne die fehlerhafte Zeilen-Nummer ausgeben.</p> <p>PHP kennt mit seinen Fehlermeldungen ja die Zeilen-Nr, kann ich die als Programmierer auch wissen?</p> </blockquote> <p>Ja, <code>__LINE__</code> enthält die Zeilennummer. Auch andere magische Konstanten existeren, beispielsweise <code>__FILE__</code>. Das wird dir nur nicht viel nützen, weil das ja die aktuelle Code-Zeile ist und nicht die mit den fehlerhaften Daten. Ein "wo wurden die Daten definiert?" gibt es nicht. Du kannst aber die fehlerhaften Daten selbst ausgeben und danach eine Text-Suche starten.</p> <p>dedlfix.</p> bestimmte Sprache aus mehrsprachigem String filtern Thu, 20 Jun 19 16:16:53 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750822#m1750822 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1750822#m1750822 <p>Hallo,</p> <blockquote> <p>Wie soll ich das unterscheiden?</p> </blockquote> <p>Z.B. so:</p> <p>Array mit 7 Sprachen (9 Elemente):</p> <blockquote></blockquote> <p><code><p>###deutsch###english###Nederlands###francais###espanol###russki###plattdütsch$$$</p></code></p> <blockquote></blockquote> <p>2 Arrays mit je 3 Sprachen (auch 9 Elemente):</p> <p><code><p>Sprache: ###deutsch###english###Nederlands$$$ &nbsp; Gruß: ###Guten Morgen###Good morning###Goedemorge$$$</p></code></p> <p>Jeweils 1 zusätzliches Hilfsarray für das Abschluss-Element</p> <p>Gruß<br> Kalk</p> bestimmte Sprache aus mehrsprachigem String filtern Wed, 26 Jun 19 02:49:17 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1751230#m1751230 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1751230#m1751230 <blockquote> <p>Nun, der Sinn von Templates ist, es so zu machen, daß im Template nur die Platzhalter stehen und die Werte erst mit dem Rendern da reinkommen. Beispw. haben wir {{platzhalter}} und nach dem Rendern steht dann, je nach Sprache English oder Deutsch an der Stelle wo sich der Platzhalter befand.</p> </blockquote> <blockquote> <p>Auf diese Art und Weise sind Erweiterungen um weitere Sprachen nicht vom Template abhängig. MFG</p> </blockquote> <p>Mein Konzept ist ein anderes. Eine Platzhalter-Datei kann als Formular gesehen werden, in das Daten eingefügt werden. Aber anstatt mehrere Formulare für mehrere Sprachen zu haben, packe ich die Sprachen in ein gemeinsames Formular.</p> <p>Vor Jahren hatte ich fünf Dateien für fünf Sprachen. Multipliziert mit mehreren dutzend Programmen. Das ist bei Änderungen nicht mehr händelbar.</p> bestimmte Sprache aus mehrsprachigem String filtern Wed, 26 Jun 19 04:57:38 Z https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1751233#m1751233 https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1751233#m1751233 <blockquote> <p>Mein Konzept ist ein anderes. Eine Platzhalter-Datei kann als Formular gesehen werden, in das Daten eingefügt werden. Aber anstatt mehrere Formulare für mehrere Sprachen zu haben, packe ich die Sprachen in ein gemeinsames Formular.</p> </blockquote> <p>Genauso funktioniert das mit Templates. <a href="https://forum.selfhtml.org/self/2019/jun/20/bestimmte-sprache-aus-mehrsprachigem-string-filtern/1751099#m1751099" rel="noopener noreferrer">Hier</a> beschrieben.</p> <p>Template'engines sind übrigens stark auf dem Vormarsch und stehen mittlerweile in sehr vielen PLs zur Verfügung. Mustache'templates kannst Du sowohl für JS als auch für PHP nutzen. MFG</p>