Hi,
Ich hatte mich damit schonmal vor einiger Zeit beschäftigt:
Wie macht man ein Skript schnell multilingual.
Damals hab ich das mit RegEx gemacht, war aber dumm, weil er verschachtelte Strings nicht konnte... Also heute mit Schleifen und Zeile-für-Zeile abarbeiten.
Es ist noch ziemlich Beta, aber funktioniert in den meisten Fällen.
Probleme:
- Kommentare werden einfach verschluckt.
- Strings in Funktionsdefinitionen werden auch ersetzt, das muss man also von Hand korrigieren
- Man muss nach der Umwandlung per Hand an den Beginn des Skriptes $lang="de" (bzw. die gewünschte Sprache) stellen
Spoiler anzeigen
#include <Array.au3>
$file=Fileopen("dummy.au3")
$newfile=Fileopen("dummy_multilang.au3",1)
Global $iniID=0
$chars=""
For $i=1 To 9999999999
$chars = FileReadLine($file, $i)
If @error = -1 Then ExitLoop
$array = StringSplit($chars,"")
$result=_renderline($array)
FileWriteLine($newfile,$result)
Next
Func _renderline($array)
Local $state=0 ; 0=nix, 1=", 2='
Local $returnArray[1],$stringpos=0
For $i=1 To $array[0]
Switch $state
Case 0
;wir schauen nach allem
Switch $array[$i]
Case ";"
;Kommentar, nächste Zeile (vorerst auffressen)
ExitLoop
Case "'"
$state=2
$stringpos=$i
Case '"'
$state=1
$stringpos=$i
Case Else
_ArrayAdd($returnArray,$array[$i])
EndSwitch
Case 1
;wir schauen nach "
Switch $array[$i]
Case '"'
$state=0
$string=StringFromArray($array,$stringpos,$i)
$iniID +=1
IniWrite("multilang.ini","de",$iniID,$string)
_ArrayAdd($returnArray,"IniRead('multilang.ini',$lang," & $iniID & "," & $string & ")")
Case Else
ContinueLoop
EndSwitch
Case 2
;wir schauen nach '
Switch $array[$i]
Case "'"
$state=0
;~ $string="STRB" & StringFromArray($array,$stringpos,$i) & "SRTE"
$string=StringFromArray($array,$stringpos,$i)
$iniID +=1
IniWrite("multilang.ini","de",$iniID,$string)
_ArrayAdd($returnArray,"IniRead('multilang.ini',$lang," & $iniID & "," & $string & ")")
Case Else
ContinueLoop
EndSwitch
EndSwitch
Next
Return StringFromArray($returnArray)
EndFunc
Func StringFromArray($array,$stringpos="def",$i="def")
If not IsArray($array) Then MsgBox(0,"Error","Not an array inside StringFromArray")
If $stringpos="def" Then
$stringpos=0
$i= UBound($array)-1
EndIf
$ret=""
For $j=$stringpos To $i
$ret &= $array[$j]
Next
Return $ret
EndFunc