<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Objekt zum ändern der Sprache.]]></title><description><![CDATA[<p>Ich habe eine Klasse geschrieben, die die Sprache der Strings in meinem Programm auch zur Laufzeit ändern kann. Allerdings ist sie noch starkverbesserungsdürftig.</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

struct GesamtText
{
	std::string Text1; // Punkt A
	std::string Text2;
	std::string Text3;
	GesamtText(const std::string was1,const std::string was2, const std::string was3) :
	Text1(was1), // Punkt B
	Text2(was2),
	Text3(was3)
	{
	}
};
class vStrings
{
	private:
		const GesamtText Deutsch;
		const GesamtText English;
	public:
		vStrings() : 
		Deutsch(&quot;Hallo!&quot;,&quot;Ich habe Hunger.&quot;,&quot;Tschüss!&quot;),
		English(&quot;Hello!&quot;,&quot;I am hungry.&quot;,&quot;Bye!&quot;)
		{
		}
		const GesamtText * Text;
		void SetLanguage(char was)
		{
			switch(was) // Punkt C
			{
				case 0:
					Text = &amp;Deutsch;
				break;
				case 1:
					Text = &amp;English;
				break;
			}
		}
};

int main(int argc, char *argv[])
{
	vStrings vStrings; // Punkt D
	vStrings.SetLanguage(0);
	std::cout &lt;&lt; vStrings.Text-&gt;Text1 &lt;&lt; std::endl &lt;&lt; vStrings.Text-&gt;Text2 &lt;&lt; std::endl &lt;&lt; vStrings.Text-&gt;Text3 &lt;&lt; std::endl;
	system(&quot;PAUSE&quot;);
	vStrings.SetLanguage(1);
	std::cout &lt;&lt; vStrings.Text-&gt;Text1 &lt;&lt; std::endl &lt;&lt; vStrings.Text-&gt;Text2 &lt;&lt; std::endl &lt;&lt; vStrings.Text-&gt;Text3 &lt;&lt; std::endl;
	return EXIT_SUCCESS;
}
</code></pre>
<p>Folgende Sachen möchte ich noch ändern:</p>
<p>1. Bei Punkt A und Punkt B hab ich eine Verdoppelung, was sich vorallem bei vielen strings bemerkbar macht.</p>
<p>2. Bei Punkt C hab ich ein switch, gefällt mir aber nicht so, weil sich das vorallem bei vielen Sprachen bemerkbar macht. (ist nicht ganz so schlimm)</p>
<p>3. Punkt D ist auch nicht so wichtig: Weiß jemand einen besseren Namen der genauer auf die Klasse zutrifft?</p>
<p>4. Eine Frage: Sind die Text Strings jetzt eigentlich konstant? Weil so ganz hab ich das noch nicht verstanden: Verbrauchen die auch RAM? Weil sagen wir 20 strings und 5 Sprachen, das macht dann ne Menge aus.</p>
<p>Ich hoffe ihr könnt mir weiterhelfen, danke im Voraus.</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/130843/objekt-zum-ändern-der-sprache</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 17:12:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/130843.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Dec 2005 00:32:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt zum ändern der Sprache. on Wed, 28 Dec 2005 00:32:08 GMT]]></title><description><![CDATA[<p>Ich habe eine Klasse geschrieben, die die Sprache der Strings in meinem Programm auch zur Laufzeit ändern kann. Allerdings ist sie noch starkverbesserungsdürftig.</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

struct GesamtText
{
	std::string Text1; // Punkt A
	std::string Text2;
	std::string Text3;
	GesamtText(const std::string was1,const std::string was2, const std::string was3) :
	Text1(was1), // Punkt B
	Text2(was2),
	Text3(was3)
	{
	}
};
class vStrings
{
	private:
		const GesamtText Deutsch;
		const GesamtText English;
	public:
		vStrings() : 
		Deutsch(&quot;Hallo!&quot;,&quot;Ich habe Hunger.&quot;,&quot;Tschüss!&quot;),
		English(&quot;Hello!&quot;,&quot;I am hungry.&quot;,&quot;Bye!&quot;)
		{
		}
		const GesamtText * Text;
		void SetLanguage(char was)
		{
			switch(was) // Punkt C
			{
				case 0:
					Text = &amp;Deutsch;
				break;
				case 1:
					Text = &amp;English;
				break;
			}
		}
};

int main(int argc, char *argv[])
{
	vStrings vStrings; // Punkt D
	vStrings.SetLanguage(0);
	std::cout &lt;&lt; vStrings.Text-&gt;Text1 &lt;&lt; std::endl &lt;&lt; vStrings.Text-&gt;Text2 &lt;&lt; std::endl &lt;&lt; vStrings.Text-&gt;Text3 &lt;&lt; std::endl;
	system(&quot;PAUSE&quot;);
	vStrings.SetLanguage(1);
	std::cout &lt;&lt; vStrings.Text-&gt;Text1 &lt;&lt; std::endl &lt;&lt; vStrings.Text-&gt;Text2 &lt;&lt; std::endl &lt;&lt; vStrings.Text-&gt;Text3 &lt;&lt; std::endl;
	return EXIT_SUCCESS;
}
</code></pre>
<p>Folgende Sachen möchte ich noch ändern:</p>
<p>1. Bei Punkt A und Punkt B hab ich eine Verdoppelung, was sich vorallem bei vielen strings bemerkbar macht.</p>
<p>2. Bei Punkt C hab ich ein switch, gefällt mir aber nicht so, weil sich das vorallem bei vielen Sprachen bemerkbar macht. (ist nicht ganz so schlimm)</p>
<p>3. Punkt D ist auch nicht so wichtig: Weiß jemand einen besseren Namen der genauer auf die Klasse zutrifft?</p>
<p>4. Eine Frage: Sind die Text Strings jetzt eigentlich konstant? Weil so ganz hab ich das noch nicht verstanden: Verbrauchen die auch RAM? Weil sagen wir 20 strings und 5 Sprachen, das macht dann ne Menge aus.</p>
<p>Ich hoffe ihr könnt mir weiterhelfen, danke im Voraus.</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/951208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951208</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Wed, 28 Dec 2005 00:32:08 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt zum ändern der Sprache. on Wed, 28 Dec 2005 01:03:01 GMT]]></title><description><![CDATA[<p>Das ist ganz schlecht.<br />
Mach dir für jede Sprache einen Header, da steht dann zB. drin:</p>
<pre><code>namespace msg {
  const char* HELLO = &quot;hi!&quot;;
  const char* CIAO = &quot;by!&quot;;
}
</code></pre>
<p>Und je nach Sprache, bindest du den entspr. Header ein.</p>
<p>Wenns die Sprache erst zur Laufzeit entschieden werden soll, musst du den Header selber parsen, da würde sich dann natürlich eine simplere Syntax als C++ anbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/951215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951215</guid><dc:creator><![CDATA[DrGreenthumb]]></dc:creator><pubDate>Wed, 28 Dec 2005 01:03:01 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt zum ändern der Sprache. on Wed, 28 Dec 2005 01:24:09 GMT]]></title><description><![CDATA[<p>joomoo == Frickler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/951221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951221</guid><dc:creator><![CDATA[definitiv]]></dc:creator><pubDate>Wed, 28 Dec 2005 01:24:09 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt zum ändern der Sprache. on Wed, 28 Dec 2005 11:31:48 GMT]]></title><description><![CDATA[<p>DrGreenthumb schrieb:</p>
<blockquote>
<p>Wenns die Sprache erst zur Laufzeit entschieden werden soll, musst du den Header selber parsen, da würde sich dann natürlich eine simplere Syntax als C++ anbieten.</p>
</blockquote>
<p>Genau das will ich. Aber weiß heißt das: &quot;parsen&quot;? Und soll ich dann nicht mehr C++ schreiben?</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/951370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951370</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Wed, 28 Dec 2005 11:31:48 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt zum ändern der Sprache. on Wed, 28 Dec 2005 11:31:25 GMT]]></title><description><![CDATA[<p>definitiv schrieb:</p>
<blockquote>
<p>joomoo == Frickler</p>
</blockquote>
<p>Wasn ein Frickler?</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/951372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951372</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Wed, 28 Dec 2005 11:31:25 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt zum ändern der Sprache. on Wed, 28 Dec 2005 15:31:10 GMT]]></title><description><![CDATA[<p>genau. was ist ein frickler...<br />
wenn ihr jetzt sagt ich bin einer ist ein frcikler also ein trikotsammler - gehört zu den ultras bremen - ist schöau - und sieht gut aus. hat ne freundinn und wichst sich 6 mal täglich einen. und wisst ihr auch warum? weil ich es kann:P</p>
<p>ne würde das aber auch mal gerne wissen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/951530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951530</guid><dc:creator><![CDATA[dumdidumdadidilidumm]]></dc:creator><pubDate>Wed, 28 Dec 2005 15:31:10 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt zum ändern der Sprache. on Wed, 28 Dec 2005 17:30:32 GMT]]></title><description><![CDATA[<p>du könntest es auch so machen:</p>
<pre><code class="language-cpp">enum Message { HELLO, BY, ..., NMESSAGES };

struct Language {
  const char* _str[NMESSAGES];
  const char* str(Message id) { return _str[id]; }
};

// hierfür ein Makro
struct German : public Language {
  German() {
    _str[HELLO] = &quot;hi&quot;;
    ...
  }
};
</code></pre>
<p>und je nach Sprache legst du das entsprechende Objekt an:</p>
<pre><code class="language-cpp">Language* lang = new German();
cout &lt;&lt; lang-&gt;str(HELLO);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/951593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951593</guid><dc:creator><![CDATA[DrGreenthumb]]></dc:creator><pubDate>Wed, 28 Dec 2005 17:30:32 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt zum ändern der Sprache. on Wed, 28 Dec 2005 17:34:32 GMT]]></title><description><![CDATA[<p>DrGreenthumb schrieb:</p>
<blockquote>
<p>Wenns die Sprache erst zur Laufzeit entschieden werden soll, musst du den Header selber parsen</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Ich glaube, ich würde eher sowas wie 'ne Stringtable benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/951599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951599</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 28 Dec 2005 17:34:32 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt zum ändern der Sprache. on Wed, 28 Dec 2005 17:38:59 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>DrGreenthumb schrieb:</p>
<blockquote>
<p>Wenn die Sprache erst zur Laufzeit entschieden werden soll, musst du den Header selber parsen</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Das er keinene C++-&quot;Header&quot; parsen soll, habe ich dazu geschrieben.<br />
So eine Textdatei wäre aber natürlich nur nötig, wenn man ohne neu-kompilieren Sprachen ändern will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/951604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951604</guid><dc:creator><![CDATA[DrGreenthumb]]></dc:creator><pubDate>Wed, 28 Dec 2005 17:38:59 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt zum ändern der Sprache. on Wed, 28 Dec 2005 22:24:31 GMT]]></title><description><![CDATA[<p>Ich hab jetzt gearbeitet und die ganze Klasse sieht jetzt so aus:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;fstream&gt;
#include&lt;string&gt;
#include&lt;deque&gt;

class LanguageStrings
{
    private:
        std::deque&lt;std::string&gt; Text;
        std::string Undefined;
    public:
        LanguageStrings(const std::deque&lt;std::string&gt;&amp; c) :
        Text(c),
        Undefined(&quot;undef&quot;)
        {
        }
        std::string &amp;GetText(unsigned int Nr)
        {
            if(Nr &gt;= Text.size())
            {
                return Undefined;
            }
            return Text[Nr];
        }
};

class Language
{
    private:
        std::deque&lt;LanguageStrings *&gt; pLStrings;
        unsigned int ActiveLanguage;
        void LoadLanguageFiles()
        {
            const int EndeEinlesen = 100;
            for(int DateiNr = 0;DateiNr &lt; EndeEinlesen;DateiNr++)
            {
                char DateiName[] = &quot;xxx.txt&quot;;
                sprintf(DateiName,&quot;%i.txt&quot;,DateiNr);
                std::ifstream fin(DateiName);
                if(!fin)
                {
                    DateiNr = EndeEinlesen;
                }
                else
                {
                    std::deque&lt;std::string&gt; Datei; /* Die einzelnen in der Datei durch \n-\n getrennten Strings in einem Deque von einander getrennt */
                    std::string DateiInhalt; /* Temp String */           
                    char ch_last = 0; /* Der letzte eingelesene Charakter */
                    char ch; /* Aktuell eingelesener Charakter */
                    DateiInhalt.append(&quot;\n&quot;); /* Ein Charakter am Anfang und einer am Ende werden immer abgeschnitten, auf grund der Trennung durch &quot;\n-\n&quot; */
                    while(fin.get(ch)) /* Jeden Charakter einzeln einlesen */
                    {
                        if((ch_last = '\n' &amp;&amp; ch == '-' &amp;&amp; fin.peek() == '\n') || fin.peek() == EOF) /* Wurden die drei Trennzeichen gefunden? Oder Ende der Datei?*/
                        {
                            if(fin.peek() == EOF) /* Verhindert, dass das letzte Zeichen abgeschnitten wird. */
                            {
                                DateiInhalt.append(&amp;ch);
                            }
                            if(DateiInhalt.size() &gt;= 3) /* Vermeidet Laufzeitfehler */
                            {
                                Datei.push_back(DateiInhalt.substr(1,DateiInhalt.size()-2)); /* String ohne den ersten und letzten Charakter übergeben an das deque */
                            }
                            DateiInhalt.clear(); /* String leeren */                    
                        }
                        else
                        {
                            DateiInhalt.append(&amp;ch); /* Zeichen hinten drann hängen */
                        }
                    }
                    pLStrings.push_back(new LanguageStrings(Datei));
                }    
            }
        }
    public:
        Language() : ActiveLanguage(0)
        {
            LoadLanguageFiles();
        }
        void ChangeLanguage()
        {
            ActiveLanguage++;
            if(ActiveLanguage &gt;= pLStrings.size())
            {
                ActiveLanguage = 0;
            }
        }
        std::string &amp; Text(unsigned int Nr)
        {
            return pLStrings[ActiveLanguage]-&gt;GetText(Nr);
        }
};

int main(int argc, char *argv[])
{
    Language Language;
    std::cout &lt;&lt; Language.Text(0) &lt;&lt; std::endl;
    Language.ChangeLanguage();
    std::cout &lt;&lt; Language.Text(2) &lt;&lt; std::endl;
    Language.ChangeLanguage();
    std::cout &lt;&lt; Language.Text(2) &lt;&lt; std::endl;
    Language.ChangeLanguage();
    std::cout &lt;&lt; Language.Text(1) &lt;&lt; std::endl;
    Language.ChangeLanguage();
    std::cout &lt;&lt; Language.Text(0) &lt;&lt; std::endl;
    std::cin.get();
    return EXIT_SUCCESS;
}
</code></pre>
<p>Die 3 txt Dateien sehen so aus:</p>
<p>0.txt</p>
<pre><code class="language-cpp">Deutsch
-
Hallo!
</code></pre>
<p>1.txt</p>
<pre><code class="language-cpp">English
-
Hello!
</code></pre>
<p>2.txt</p>
<pre><code class="language-cpp">Francais
-
Bonjour!
-
J'ai faim.
</code></pre>
<p>Die Ausgabe, wenn man das Programm ausführ folgender maßen:</p>
<pre><code class="language-cpp">Deutsch
undef
J'ai faim.
Hallo!
English
</code></pre>
<p>Scheint ja alles ganz gut zu klappen. Allerdings habe ich jetzt noch das Problem, dass das ganze wahrscheinlich zu viel RAM verbraucht. (Vor allem wen man lange Texte in unterschiedlichen Sprachen hat) Was kann man dagegen tun?</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/951822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/951822</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Wed, 28 Dec 2005 22:24:31 GMT</pubDate></item></channel></rss>