Implemetieren von verschiedenen Sprachversionen

Gast #1638477
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
Gast #1638750
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
Gast #1638847
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?
#1638880
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 :-)
Persönliche Seite #1638900
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.
#1639025
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.
Gast #1641410
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.
Gast #1641415
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren