Forum: Mikrocontroller und Digitale Elektronik Implemetieren von verschiedenen Sprachversionen


von David 1 (Gast)


Lesenswert?

Hallo

Ich wollte mal nach euren Erfahrung bei der Implementierung von 
verschiedenen Sprachversion fragen.

Ich stehe vor der Aufgabe verschiedene Sprachversionen für ein HMI mit 
der Software ausliefern zu wollen.

Meine erste Lösung sieht zZ so aus:
lang.h:
1
#ifdef LANG_EN
2
  #include "LANG_EN.h"
3
 #elif LANG_DE
4
  #include "LANG_DE.h"
5
 #elif LANG_XX
6
  #include "LANG_XX.h"
7
#else
8
  #include "LANG_EN.h"
9
#endif

In der entsprechenden Headerdatei sind dann einzelne Begriffe definiert
zbsp:
1
#define   LANG_ERROR  "Fehler"
2
#define   LANG_STORAGE  "Speicher"

Für mich wirkt diese Lösung aber nicht optimal, denn schon bei der 
Konkatenation zweier Wörter wird das ganze unleserlich.

Hat jemand vielleicht eine andere Möglichkeit oder Idee hervorgebracht?

mfg und danke

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich würde einfach jeden Textstring im (s)printf Format ablegen dan must 
du nix zusammenbauen und sogar die ggf. andere Formatierung in anderen 
Sprachen kann berücksichtigt werden. Oder halt ein passendes 
Paket/Bibliothek verwenden, ist aber auch immer etwas Aufwand sich da 
einzuarbeiten.

von David 1 (Gast)


Lesenswert?

Hallo

Was wären denn Beispiele für solche Packete und Bibliotheken?

mfg und danke

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

http://www.google.de/#q=c+i18n such dir was aus...

von NurEinGast (Gast)


Lesenswert?

Erzähle uns doch noch ein bischen was über die Randbedingungen.

 Forum: Mikrocontroller und Elektronik  - deutet darauf hin, dass Du das 
mit nem Microcontroller machst ? Richtig ? Hast Du da ein 
Speicherproblem, oder könntest Du auch alle Sprachversionen gleichzeitig 
vorhalten ?

Wenn Du es mit der "#ifdef" Methode machst, dann bekommst Du ja für jede 
Sprache eine eigenes Bin-File. Also keine dynamische Umschaltung der 
Sprache möglich. Passt das zur Anforderung ?

Gruss

von David 1 (Gast)


Lesenswert?

Randbedingungen:
Die Sprachversionen sollen für HMI und RS232-Kommunikation implementiert 
werden.
Da ich schon an den Grenzen des Speicherplatzes gelange, will ich das 
System nicht mehrsprachig auslegen, sondern für jede Sprache ein 
Extraprogramm.

Ich weiß jetzt das i18n für Internationalization steht.

Hat jemand schon Erfahrungen im Mikrocontrollerbereich mit I18N 
Packeten/Bibliotheken gemacht und kann ein spezielle/s empfehlen?

von Karl H. (kbuchegg)


Lesenswert?

Ich denke die erste Frage, die du dir stellen solltest ist: Welche 
Zeichensätze sind unbedingt notwendig? Komme ich prinzipiell mit ASCII 
durch oder muss ich auf Unicode gehen.

Wenn ASCII ausreicht (ev. mit ein paar Sonderzeichen für den 
osteuropäischen Raum, Stichwort 'Hatschek') dann vereinfacht sich 
einiges.

Da du sowieso schon, wie du sagst, in Speichernöte kommst, würde ich an 
deiner Stelle da keinen großen Aufwand treiben. Ev. noch ein System, mit 
dem man Argumente bei einem sprintf in der Reihenfolge umdrehen kann, 
und ansonsten genau den #ifdef Ansatz, den du schon in Erwägung gezogen 
hast. Keine Strings konkatenieren. Gut überlegen, welche Strings 
tatsächlich zusammengezogen werden können (Es kann sein, dass man zb im 
Deutschen an 2 Stellen denselben Begrif benutzt, die aber im Englischen 
verschieden übersetzen würde). Lieber konservativ arbeiten, als dass die 
Einheimischen über einen lachen :-)

von ... .. (docean) Benutzerseite


Lesenswert?

hier:
http://old.wowace.com/wiki/WelcomeHome_-_Your_first_Ace2_Addon#Localizing_Your_Strings_with_AceLocale

Wird einen finde echt nette Variante beschrieben...

Weiß aber nicht ob sowas auch in C geht.

Zur Funktionsweise:

Im Quellcode steht einfach (im C Stil)
1
text1=L("Hello World");

wenn EN gewählt steht Hello World im String wenn DE gewählt steht Hallo 
Welt im String (wenn es denn passend hinterlegt ist)

Großer Vorteil ist die gute Lesbarkeit des Quellcodes.

von Mark B. (markbrandis)


Lesenswert?

David 1 schrieb:
> Hat jemand schon Erfahrungen im Mikrocontrollerbereich mit I18N
> Packeten/Bibliotheken gemacht und kann ein spezielle/s empfehlen?

Wenn der Speicher sowieso schon knapp wie Sau ;-) ist, wieso sollte dann 
die Installation einer zusätzlichen Softwarebibliothek Hilfe bringen? 
:-)

Eventuell ist aber nur der Speicher im RAM wirklich knapp, und im Flash 
geht vielleicht doch noch was? Ich persönlich mag sowas hier:

1
#include <stdio.h>
2
3
int main()
4
{
5
  unsigned int language;
6
  const char* text[3] = { "Dies ist der deutsche Text", \
7
        "This is the English text", \
8
        "Ceci est le texte français" };
9
10
  language = 0; /* deutsch */
11
  printf("%s\n", text[language]);
12
  
13
  language = 1; /* englisch */
14
  printf("%s\n", text[language]);
15
16
  language = 2; /* französisch */
17
  printf("%s\n", text[language]);
18
19
  return 0;
20
}

Man muss nur eine Variable verändern und kann den Text in den 
verschiedensten Sprachen ausgeben, und vor allem kann man dies auch zur 
Laufzeit ändern. Dabei muss man natürlich darauf achten, dass Texte 
unterschiedlicher Länge keine Probleme bei der Bildschirmdarstellung 
machen - versteht sich.

Oder eben der Vorschlag von Läubi zusammen mit den #ifdefs, die dann für 
jede Sprache ein unterschiedliches Binary ergeben.

von David 1 (Gast)


Lesenswert?

Danke für die vielen gute Hinweise.
Ich werden meinen Ansatz beibehalten aber auf die Kontenaktionen 
verzichten.

Ein paar Bibliotheken für die i18n würde ich aber schon mal gerne sehen, 
allein interessehalber um zu schauen wie dort vorgegangen wird.

von P. S. (Gast)


Lesenswert?

Ich habe alles mit const-Strings gemacht, ein Headerfile in dem diese 
extern deklariert werden und dann fuer jede Sprache ein C-File, und ein 
Wrapper-c-file, das aehnlich wie du mit den ifdefs entscheidet, welches 
C-File inkludiert wird.

von David 1 (Gast)


Lesenswert?

Im Zusatz zu dem Kommentar von docean habe ich noch folgendes gefunden:
http://www.gnu.org/prep/standards/standards.html#Internationalization

Das angewandte Verfahren ist dort ähnlich und sicher für umschaltbare 
Versionen während der Laufzeit hilfreich.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.