German App zweisprachig

peternmb

Well-Known Member
Licensed User
Longtime User
Da ich einige Nutzer meiner App im englischsprachigen Raum habe denke ich darüber nach meine App zweisprachig zu machen.
Gibt es da Tipps, wie ich das mit möglichst wenig Aufwand umsetzen kann - soviel Text hat die App eigentlich nicht.

In meinen Windows-Programmen nutze ich für alle Bezeichnungen/Texte numerische Platzhalter.
 

klaus

Expert
Licensed User
Longtime User
Ich sehe zwei Möglichkeiten:
- Einfache Textdateien welche in ein Text-Array geladen werden, eine Datei pro Sprache.
Beispiel: lblTest.Text = Texte(3)
- Die Localizator Class von Erel.
Das ist eine Datenbank in der die Übersetzungen enthalten sind und die mit Schlüsselwörtern aufgerufen werden können.
Sieht sich vielleicht am Anfang kompliziert an ist es aber nicht und im Gebrauch einfacher.
 

peternmb

Well-Known Member
Licensed User
Longtime User
- Die Localizator Class von Erel.
vielen Dank, das sehe ich mir einmal an.

In meinen Windowsprogrammen nutze ich dazu auch ein einfaches Array (Nummer,deutsch,englisch) das zum Programmstart aus einer einfachen Textdatei generiert wird. Im Programm stehen dann statt der Bezeichnungen die Zuordnungsnummer.
Das ließ sich recht einfach umsetzen und damit lassen sich auch Änderungen(Erweiterungen) leicht händeln (und es ist im Programm schnell).
 

BlueVision

Active Member
Licensed User
Longtime User
Ich stimme Klaus absolut zu. Ich habe mit Hilfe von Klaus eine App mit der Class inzwischen 8sprachig hinbekommen. Hat man das Prinzip verstanden, ist der Rest nur ein wenig Fleißarbeit.
Du musst nur so wie Klaus schon sagte auf entsprechende Schlüsselwörter reagieren, das kann das deutsche Wort im Original sein oder eben auch ein extra Platzhalter. Der Rest passiert dann automatisch.

Noch ein paar Tips zu dieser Variante:
- Achte bei den Übersetzungen darauf, dass die Textlänge der Übersetzungen annähernd gleich groß ist, schließlich soll der Text ja auch auf den Button oder in ein Label passen. Bei Englisch sehe ich da weniger ein Problem als bei Französisch, da werden die Texte meist etwas länger im Vergleich zu Englisch oder Deutsch.
- gliedere die Übersetzungstabelle (das ist ja eine Excel-Tabelle) gleich von Anfang an entsprechend der Views Deiner App bzw. ordne der Exceltabelle entsprechende Hintergrundfarben zu, das macht es später einfacher den Überblick zu behalten
- für die Übersetzung selbst empfehle ich Dir DeepL, google mal im Web danach. Dieser Übersetzer ist sehr genau im Gegensatz zum Google Translator
- und wenn Du schon einmal dabei bist, übersetze gleich auch noch in andere Sprachen (Spanisch, Französisch, Italienisch). Das geht mit DeepL sehr komfortabel.
- die Zuordnung der Sprachen kannst Du dann ebenfalls automatisieren. Frage einfach die eingestellte Sprache ab und starte die App mit der entsprechenden Sprache.
 

peternmb

Well-Known Member
Licensed User
Longtime User
für die Übersetzung selbst empfehle ich Dir DeepL
wirklich gut, habe ich mit goolge translator verglichen und ist tatsächlich wesentlich besser...

Schade, dass ich das nicht vorher kannte - ich habe über die Feiertage ein komplettes älteres Windows-Programm ins Englische übersetzt.
Die Ergebnisse von google waren teilweise katastrophal, besonders bei mehrzeiligen Hinweisen/Texten...
 

peternmb

Well-Known Member
Licensed User
Longtime User
Ich versuche es testweise mit einem kleine Array, das ich später dann als Liste speichern möchte.
Leider funktioniert mein Code nicht, der Bezeichner wird nicht gefunden.

B4X:
Dim language As List
language.Initialize
language.AddAll(Array As String(100,"neu","new"))
language.AddAll(Array As String(200,"bearbeiten","edit"))
language.AddAll(Array As String(300,"Einstellungen","settings"))


MsgboxAsync(TT(300),"Test")
    


Sub TT(num As Int)              'TranslateText = eigene Funktion
    Dim pos As Int
    Dim text As String
    Dim Larray() As String       'Array zum Einlesen der Bezeichnungen
    pos=language.IndexOf(num)
    If pos < 0 Then
        text="???"
   Else
      Larray=language.Get(pos)  'array mit nummer,de,en
      text=Larray(1)   
    End If
    '
    Return text
    '   
End Sub
 

klaus

Expert
Licensed User
Longtime User
Ich finde Deinen Versuch kompliziert.
Warum immer Alle Sprachen gleichzeitig zur Verfügung haben.
Für mich, reicht eine Sprache. Wenn man die Sprache ändern will, liest man die Datei der neuen Sprache.
Man muss aber, wie auch in Deinem Fall, die Texte der Views erneuern.

Du könntest einfach eine Textdatei mit den Texten der gewollten Sprache laden.
Dieses Prinzip habe ich in einigen von meinen Programmen genutzt, als Beispiel: Simple NotePad.
Kollegen im Forum hatten mir die Texte in einige Sprachen übersetzt, sogar Japanisch Arabisch.

Dann bleibt Dir immer noch die Localizator Möglichkeit.
Beiliegend ein B4A DemoProgramm für den Localizator2.
Und das B4J Programm für den Converter, und die Excel Datei, (nocn) nicht veröffentlicht

Localizator2 ist eine geänderte Version von Erels Localizator.
Der Unterschied ist eine einfachere Datenbank Struktur für die Sprachen, und man kann xls und xlsx Dateien laden.
 

Attachments

  • Localizator2Demo.zip
    36.1 KB · Views: 150
  • ConverterLocalizator2_3.zip
    11 KB · Views: 138
  • strings.xlsx
    11.6 KB · Views: 153

peternmb

Well-Known Member
Licensed User
Longtime User
Es geht ausschließlich um Englisch und es sind nicht viele Übersetzungen.
Ich wollte deshalb auf eine zusätzliche Lib verzichten. Auch in den views sollte es so einfach wie möglich sein.
Nach dem Ändern der Sprache ist ein Neustart der App kein Problem, die Sprache wird ja i.d.R. nicht allzuoft geändert.
 

klaus

Expert
Licensed User
Longtime User
Es waren nur Vorschläge.
Ein anderer Vorschlag wäre ein zwei dimensionales Array.
B4X:
Public Texte(2, 10) As String
Public Sprache As Int

Texte(0, 0) = "neu"
Texte(1, 0) = "new"
Texte(0, 1) = "bearbeiten"
Texte(1, 1) = "edit"
Texte(0, 2) = "Einstellungen"
Texte(1, 2) = "settings"
Texte(0, 3) = "Wollen Sie das Programm verlassen ?"
Texte(1, 3) = "Do you want to exit the program ?"
Texte(0, 4) = "Datei Name"
Texte(1, 4) = "File name"

Sprache = 0  'Deutsch = 0; Englisch = 1
lblDateiName.Text = Texte(Sprache, 4)
MsgboxAsync(Texte(Sprache, 3), Texte(Sprache, 4)
Den Namen der Variable Sprache könnte man natürlich auch kürzen.
 

peternmb

Well-Known Member
Licensed User
Longtime User
ja, ich möchte es auf alle Fälle über ein array realisieren.
Ggf. könnte ich auch für jede Sprache ein eigenes array verwenden, es geht ja nur um deutsch und englisch.
Mir geht es einfach darum, in meinem Code möglichst wenig Änderungen machen zu müssen.
Auch das Erstellen der wenigen Texte möchte ich direkt im Programm machen, nicht als seperate Exceldatei oder Datenbank.
 

Filippo

Expert
Licensed User
Longtime User
Hallo Peter,

wenn du etwas Einfaches und Bequemes suchst, dann empfehle ich dir meine Lösung:
 

peternmb

Well-Known Member
Licensed User
Longtime User
wenn du etwas Einfaches und Bequemes suchst, dann empfehle ich dir meine Lösung:
Danke, aber auch das ist mir für dieses Zweck zu aufwändig.

Ich habe es, ähnlich der Idee von Klaus, über 2 Arrays realisiert die je nach Spracheinstellung erzeugt werden.
Das hat den Vorteil, dass ich die Übersetzungen blockweise direkt zu DeepL kopieren und erstellen lassen kann - mit etwas Nachbearbeitung perfekt und kaum Arbeit...
 

Filippo

Expert
Licensed User
Longtime User
Ich habe es früher auch mit Arrays oder Text Dateien gemacht, aber seit ich meine Lösung, mit alle seine Vorteile verwende, möchte ist es nicht mehr missen.
Man kann einfach die erstellte Datenbank in eine neue App einbauen, ein paar Texte hinzufügen wenn nötig, und die neue App ist fertig.
 

pucki

Active Member
Licensed User
Longtime User
Ich würde das einfacher machen.

Ein normales 1 Dimensionales Aarry = Dim Sprache(1000).

Nun eine Lade_Sprache Sub

Dort auf eine Sprache SQL zugreifen. Spalte 1 = ID , Spalte 2 = Text-nr , Spalte 3 = DE, Spalte 4 = Fremdsprache 1 ......


Auf die weise kannst du OHNE viel Theater mit nur wenigen Zeilen Code eine neue Sprache in deine App machen.

Wenn es eng wird im Speicher kann man auch eine Funktion schreiben die dann die Texte jedes mal aus der DB läde. Dann spart man sich das Array aber das Prg. wird ein Tick langsamer.

Optimal wäre wenn die Sub gleich an die Button / Label etc. den richtigen Text schickt. Das würde Speicher sparen und man braucht nur noch das Array für die Meldungen.

Bei Visual-Basic unter Windows habe ich das selbe auch so gemacht. Da ich kein Französisch kann, habe ich einfach eine Excel-Datei erstellt aus der DB. Dann den Kunden die zugeschickt. Er hat das Übersetzen lassen und mir zurückgeschickt. Rein in die DB und das war's.

Die Local-Funktionen waren mit zu zickig und zu schwachsinnig aufgebaut.

Kleiner Tipp am Rande. Ich habe immer mit ' (Hochkomma) den deutschen Text dahinter geschrieben damit ich wusste was da geladen wird.

ABER. Ein wichtiger Hinweis. Ich habe mir in die DB für mich, ein Num-Feld gemacht wo die max. Anzahl von Zeichen drin steht, die in das Feld/Button etc. passt. Als die Übersetzung zurück kam, habe ich mit einer Excel-Funktion überprüft wo es zu Probleme kommt, und dann geschaut wie ich das löse. Es ist nämlich peinlich wenn irgendwo Text abgeschnitten wird. Auch ein Faktor den man überdenken sollte.

Es hat schon sein Grund warum Mehrsprachige Prg. so selten und dann Problematisch sind.


Gruß

Pucki

Nachtrag: Ich mache meist 2 Tabellen in diese Datenbank. 1 heißt SPRACHE und die andere EINSTELLUNGEN. Und in Einstellungen gibt es dann ID + 2 Felder.
ID, WAS + WERT (als Text).

In WAS steht , was der Wert bedeutet und in Wert steht drin, welcher Wert er hat.

Für Sprache wäre das dann :

(Select Wert from Einstellungen where Wert = 'Sprache')

Wenn ich ein Zahlenwert brauch muss ich ihn dann halt umwandeln. So habe ich alles in meine Prg. unter MEINER Kontrolle. Und muss mich nicht mit möglichen Restriktionen von Google herum ärgern.

Oder ich mach es mit einer Schleife , in der ich alle Werte auslese und mit if-Then den passenden Variablen zuweise. Je nachdem wie ich Lust habe.
 
Last edited:
Cookies are required to use this site. You must accept them to continue using the site. Learn more…