German Mehreren Sprachen integrieren ?

Paulsche

Well-Known Member
Licensed User
Longtime User
Hallo,

wie macht Ihr das, wenn Ihr Euer Programm für mehrere Sprachen erstellt ?

Bei Auswahl einer anderen Sprache einfach alle Views duch neuen Text ersetzen ?

Oder gibt es da eine elegantere Möglichkeit ?
 

corwin42

Expert
Licensed User
Longtime User
Ja, eine andere Möglichkeit gibt es bei B4A nicht.

Kleiner Tipp: Es gibt die AHLocale Library mit dem Translator Objekt, die einem ein wenig hilft mit der Übersetzung. Wenn man dann einen Text ausgeben möchte, kann man das dann z.B. so machen:

msgbox(trans.GetText("This is a simple text"))

Wenn es dann für "This is a simple text" eine Übersetzung in eine andere Sprache gibt, dann wird die Übersetzung genommen, ansonsten wird der englische Text angezeigt.

Mit der AHLocale Library kann man sich die Übersetzungsdateien auch schreiben lassen. Ich schreibe mir dann immer ein Dummyprogramm, das einfach alle Texte aus meinem eigentlichen Programm enthält und ich kann mir damit dann die passenden Übersetzungsdateien erzeugen lassen. Ich will da demnächst auch mal ein Tutorial drüber machen, weiss aber nicht, wann ich dazu komme.
 

Amalkotey

Active Member
Licensed User
Longtime User
DB2000 Inifile-Demo

Moin,

Ich verwende Languagesfiles, welche aufgebaut sind wie Inifiles. Um die Language- und Inifiles zu lesen verwende ich von MaXim sein Codemodul Ini.bas, welche ich an meine Bedürfnisse angepasst habe.

B4X:
Sub ReadLanguageText(Language, Section, Key, Macro, Default) As String
   Dim Item As String
   Dim pos1 As Int
   Dim pos2 As Int
   Dim Blanks As Int
   Dim li As String
   Dim re As String
   
   Item = ""

   If File.Exists(cLngPath, Language) = True Then
      Item = ReadLanguageFile(cLngPath, Language, Section, Key, Default)
      If Item.IndexOf("<LF>") > -1 Then
         Do While Item.IndexOf("<LF>") > -1
            Item = Item.Replace("<LF>", CRLF)
         Loop
      End If
      If Macro.Length > 0 AND  Item.IndexOf("<DATA>") > -1 Then
       Item = Item.Replace("<DATA>", Macro)
      End If
      pos1 = Item.IndexOf("#")
      pos2 = Item.IndexOf2("#", pos1 + 1)
      If pos1 > -1 AND pos2 > -1 Then
         li = Item.SubString2(0, pos1)
         re = item.SubString(pos2 + 1)
         Blanks = Item.SubString2(pos1 + 1, pos2)
         For i = 0 To Blanks
            re = " " & re
         Next
         Item = li & re
      End If
   Else
      Item = "?"
   End If

   Return Item
End Sub

Sub Replace(text As String, search As String, exchange As String) As String
   Dim Item As String
   Item = ""
   If text.IndexOf(search) > -1 Then
      Do While text.IndexOf(search) > -1
         Item = text.Replace(search, exchange)
      Loop
   End If
   Return Item
End Sub

Sub ReadLanguageFile(directory As String, fileINI As String, session As String, key As String, default As String)
   Dim value As String
   Dim rSECTION As String
   Dim flgSESSION As Boolean
   Dim rKEY As String
   Dim flgKey As Boolean
   Dim rdTEXT As TextReader
   Dim p As Int
   Dim k As String

   LastError = ""
   value = default

   If File.Exists(directory, fileINI) = True Then
      rSECTION = ""
      flgSESSION = False
      flgKEY = False
      rKEY = ""
      rdTEXT.Initialize2(File.OpenInput(directory, fileINI), "ISO-8859-1")
      rSECTION = rdTEXT.ReadLine.Trim
      Do While rSECTION <> Null
         If (rSECTION <> "") AND (rSECTION.CharAt(0) <> ";") Then
            If rSECTION.CompareTo("[" & session & "]") = 0 Then
               flgSESSION = True
               rKEY = rdTEXT.ReadLine
               Do While rKEY <> Null
                  If rKEY <> "" Then
                     p = rKEY.IndexOf("=")
                     If p > -1 Then
                        If rKEY.SubString2(0, 0) <> "[" Then
                           k = rKEY.SubString2(0, p)
                           If key.CompareTo(k) = 0 Then
                              flgKEY = True
                              value = rKEY.SubString(p + 1)
                              Exit                              
                           End If
                        End If
                     End If
                  End If
                  rKEY = rdTEXT.ReadLine
               Loop
            End If
         End If
         If flgSESSION = True Then
            Exit
         Else
            rSECTION = rdTEXT.ReadLine
         End If
      Loop
      rdTEXT.Close
      If flgSESSION = False Then
         LastError = "SectionFoundError"
      Else If flgKEY = False Then
         LastError = "KeyFoundError"
      End If
   Else
      LastError = "FileNotFoundError"
   End If
   Return value
End Sub

Aufruf mit:

B4X:
ProgressDialogShow(Global.ReadLanguageText(Global.cLangFile, "Main", "10", "", ""))

Beispiel Language-File:

B4X:
; esdaS©'s ApplicationFavorites for Android
; (c) 08/2011 Copyright and all rights reserved by:
; esdaS© ESPRIT DATA SOFTWARE Bodo-Norbert Göldner
;
; This is the language file that accompanies
; esdaS©'s ApplicationFavorites for Android
;
; If you want to translate this language file into your own language,
; which is very easy, you should take care of the following:
;
; 1. Only translate the parts of the language file that are
;    preceeded by an '=' sign. So, do not translate the line
;    "[section]", for example!
;
; 2. This language file makes use of special control characters, which
;    you are not allowed to change. The following control characters
;    are distinguished:
;
;       <DATA> - a string will be inserted at this place at runtime
;       <LF>   - a Carige Return will be inserted at this place at runtime
;       #10#   - many Carige Return will be inserted at this place at runtime with blanks 10=number

[Programm]
ProgramName=esdaS©'s ApplicationFavorites for Android
Language=Deutsch
LastDate=31.10.2011
Version=1.00.9

[Main]
10=Installierte Apps werden ermittelt<LF>#1#und Favoritenliste wird gelesen!
20=alle Apps
30=Favoriten
40=Über...
50=Copyright und alle Rechte reserviert bei:
60=Lizenziert für:
70=unregistriert Kopie
80=IMEI-Nr.: <DATA>
90=freischalten
100=Applikation <DATA> wird zur Favoritenliste zugefügt.
110=Applikation <DATA> wird von der Favoritenliste gelöscht.

Damit der Anwender die LangaugeFiles änder kann, werden diese beim ersten Programmstart nach

B4X:
\data\data\<Package-Name>\language

kopiert. Der Vorteil ist, wenn der Anwender sein Android-Gerät per USB verbunden hat, und die SD-Karte unter Windows gemountet wird, er weiterhin Zugriff auf die Sprachtexte hat. Mittels Es Datei-Explorer kann der Anwender dann auf die Sprachtexte zugreifen.

Amalkotey
 

Attachments

  • db2000 Inifile-Demo.zip
    9.8 KB · Views: 183
Last edited:
D

Deleted member 103

Guest
Hallo Paulsche,

also ich mache es mir ganz einfach und zwar mit ein Code-Modul.

Für jeden Text definiere ich ein Varable.
So bleibt alles in mein Programm enthalten und muss keine Text-Datei pflegen.

Beispiel Code-Modul:
B4X:
'Code module
'Subs in this code module will be accessible from all modules.
Sub Process_Globals
   'These global variables will be declared once when the application starts.
   'These variables can be accessed from all modules.

   Dim locale As AHLocale
   Dim strJa,strNein,strExit As String
End Sub

Sub InitLanguage
   locale.Initialize
   
   'Log("Sprache=" & locale.Language)
   Select Case locale.Language
   Case "de"
      strJa="Ja"
      strNein="Nein"
      strExit="Beenden"
   Case "it"
      strJa="Sì"
      strNein="No"
      strExit="Esci"
   Case "fr"
      strJa="Oui"
      strNein="No"
      strExit="Sortir"
    Case Else
      strJa="Yes"
      strNein="No"
      strExit="Exit"
   End Select
End Sub

Activity module:
B4X:
Sub Process_Globals
   'These global variables will be declared once when the application starts.
   'These variables can be accessed from all modules.

End Sub

Sub Globals
   'These global variables will be redeclared each time the activity is created.
   'These variables can only be accessed from this module.
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Activity.LoadLayout("frmMain")

   'Init Language-Modul
   mLanguage.InitLanguage

   Test
End Sub

Sub Test
   Msgbox2("Test","Test 1",mLanguage.strJa,mLanguage.strNein,"",Null)
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


Ciao,
Filippo
 

Amalkotey

Active Member
Licensed User
Longtime User
@Filippo

Bei deiner methode, kann der Anwender die texte nicht bearbeiten. somit kann dein pool auf nicht wachsen. Der anwender in japan könnte seinen sprachtext selber erstellen. In meiner software wird die Sprache aus den sprachtext abgefragt, und ich bitte dann den anwender, mir den sprachtext per mail zu senden.
 

klaus

Expert
Licensed User
Longtime User
Ich mache es ähnlich wie Amalkotey.
Ich verwende ganz einfache Textdateien mit den Worten oder Sätzen und lese diese in ein Text Array und verwende diese Variablen zum Einfügen der Text. Ich verwende eigentlich zwei Textdateien und Textarrays pro Sprache, eine für allgemeine Texte die man in allen Programmen verwendet une eine mit Programm spezifischen Texten.

Beste Grüsse.
 

Watchkido1

Active Member
Licensed User
Longtime User
Habt ihr ein Codebeispiel dazu?

Ich hatte eigendlich vor meine IndustriemechanikerFormelDatenbank einfach Zweisprachig auszuführen... also je eine extra Spalte für den englischen Text dazuzumachen.
Wie wird meine Datenbank dann, aus euerer Sicht...
Komplizierter oder einfacher?

lg Frank
 

klaus

Expert
Licensed User
Longtime User
Willst Du es unbedingt mit einer Datenbank machen ?
Mit der Lösung mit Spachdateien hast Du den Vorteil dass jeder Kunde sich eine neue Datei in seine Sprache übesetzen kann ohne dass Du ihm etwas neues schicken musst.
Für mich hat eine Datenbank nur Nachteile, umständlicher zu erstellen und viel schwieriger oder sogar unmöglich von Benutzer zu ergänzen.
Das ist aber nur meine persönliche Meinung.

Vom Code her gesehen, ist es (bei mir) ganz einfach:
B4X:
Dim PText As List
.
.
Sub LoadProgTexts
    PText = File.ReadList(File.DirRootExternal, "gps.txt")
End Sub
.
.
MsgBox(PText.Get(10), PText.Get(11))
Man kann entweder die gewählte Sprachdatei umbenennen oder je nach Sprachwahl die entsprechende Datei laden.

Beste Grüsse.
 
Last edited:

Watchkido1

Active Member
Licensed User
Longtime User
Englisch in der Datenbank oder Nicht?

... Gar keine Frage...
ich mach es so wie es am einfachsten und effektivsten ist.
Alleine der englische Text würde meine Datenbank um 1/2 vergrößern.

txt Dateien vereinfachen alles sehr.

lg Frank
 

Amalkotey

Active Member
Licensed User
Longtime User
@Frank:
meine lösung hat den vorteil, dass du die texte mit zusatzinfo, zeilenumbruch und / oder leerzeichen formatieren kannst.

Beispiel:

B4X:
IMEI-Nr.: <DATA>

Das <DATA> wird gegen die IMEI-Nummer ausgetauscht. Dementsprehend wird dann

B4X:
IMEI-Nr.: 123456789012345

ausgegeben. In post #3 findest du alles, was du benötigtst.
 
Top