Hej, Mitt svar: Nä, nä. För besvärligt och inte speciellt snyggt. Grundlösningen för mig i ett sånt här fall är en korrekt normaliserad fildatabas, SQLite eller Access. Import av nya språk sker som en automatiserad import till databasen (t.ex. från en XML-fil). Jag som tyckte detta var en utmärkt och enkel lösning. Vill jag ändra eller utöka språk byter jag eller lägger till en activeX component (med nytt språk) samt att jag använder resursfiler som är tänkta för bland annat just denna uppgift. Dessutom ligger dll:n i minnet så jag slipper diskaccess. Alltså, ur min synvinkel. Jag tycker resursfiler är något för specialiserade och gillar dem inte. ActiveX är inte my cup of tea. Hm..är fortfarande inte helt med. Som jag förstår det: Observera först och främst att det här är mina åsikter, om du tycker att det blir krångligt är det bättre att du gör på ditt sätt. Stort tack för dina synpunkter. Jag ska fundera vidare på din lösning jag känner dock att jag vill undvika allt som har med databaser att göra (i nuläget...). Du har rätt i att min ursprunglig lösning är lite krånglig. Det är ingen större nytta med att använda resursfiler om det ändå bara är strängar jag vill hämta och enumerations...ja, jag får fundera lite. Min lösning lutar nu mot en aktiveX komponent med strängkonstanter som hämtas från ett dictionary. Jag återkommer med en ny lösning och tar gärna emot fler kommentarer från dig.Flerspråksapplikation VB 6.0
Har letat men inte funnit någon återkoppling rörande VB 6.0 i detta ämne.
Ska påbörja ett projekt där jag ska internationalisera en applikation. Det ska vara möjligt att välja olika språk, engelska och spanska, sett till controller, löptext osv. Applikationen är skriven i VB 6.0.
Min tanke är att använda mig av en acticveX dll per språk. ActiveX:erna skapas i VB 6.0 och innehåller en resursfil samt en publik metod. Denna metod tar emot ett id och returnerar en sträng utifrån resursfilens index.
För att öka läsbarheten tänker jag använda mig av enumerations i stil med:
Public enum btnCaption
close = 101
open = 102
end enum
...
btnClose.Caption= Value.getValue( btnCaption.close)
' I klassen Value finns metoden getValue från vilken vi gör ett metodanrop till
' activeX dll:n. Använder mig av late bindning rörande activeX dll:n för att göra det möjligt för användaren att ändra språk.
Kommentarer mottages gärna,
ThomasSv: Flerspråksapplikation VB 6.0
Sv:Flerspråksapplikation VB 6.0
Kan du peka mig till ytterliggare information eller utveckla din lösning? Är inte riktigt med på hur denna funkar. Vad innebär automatiserad import via XML? Vidare blir det inte väldig massa diskaccess om app. ständigt behöver läsa värden från DB? Hur ser tabellerna ut i DB? En för varje språk? En för alla labels, buttons löptext osv?Sv: Flerspråksapplikation VB 6.0
Jag köper dock resten, klart det blir smidigt i vissa delar.
Diskaccessen borde bli försumbar (och dessutom bara ske en gång), så det ser jag inte som ett problem
Min principlösning är typ:
Language
---
ID
Code
Name
Description
Default (bool)
Objects
---
ID
Captions
---
ObjectID
LanguageID
Text
Sen låter du varje objekt hålla reda på vad det har för ID, eller något i den stilen. Vid uppstart eller språkbyte hämtar du grejerna på nytt.
XML-grejen är mer hur man ska importera texter under tiden. Gör en enkel lösning som importerar ett nytt språk från en XML-fil (eller egen textfil etc.).Sv:Flerspråksapplikation VB 6.0
Language, Objects och Captions är tabeller i en DB. Läses dessa upp i en struktur i minnet, så att endast diskaccess sker vid uppstart av app. eller runtime byte av språk? Tabellen Caption borde väl även innehålla (förstår att du i stora drag beskrivit tabellerna(?)) fältet controlName så att vi vet vilken control vi vill ändra caption på? Sv: Flerspråksapplikation VB 6.0
Principen är så här:
1. Det finns en funktion (eller "sub" som de vill kalla det i vb) som "gör en översättning". Den laddar in alla strängar som används i programmet. Varje kontroll, form, etc. måste själv hålla reda på vad den har för texter. Vissa grejer får ligga i variabler, t.ex. text i en msgbox. Vad funktionen gör är att den uppdaterar alla variabler, alla kontroller osv.
2. Denna funktion anropas när programmet startar, eller när man har valt att man vill byta språk.
3. Den tar en parameter ("språk"), och gör sen följande:
- Hämtar upp IDt för språket.
- Hämtar in alla översättningar för detta språk ("SELECT ... FROM Captions WHERE LanguageID = ...")
- Sätter översättningarna för varje kontroll (Cancel.Caption = ...)
Eller så hämtar man en gång per kontroll (sker detta i en transaktion går det nog rätt fort), typ
- Hämtar upp IDt för språket.
- För varje kontroll eller sträng:
- Hämta översättning ("SELECT ... FROM Captions WHERE LanguageID = ... AND ObjectID = ...")
- Använd översättning
Exakt hur man får fram IDt varierar according to taste. Antingen håller varje objekt reda på vad det har för ID, eller så lägger man till det som ett fält i Objects. Då gör man t.ex. "SELECT ID FROM Objects WHERE Name = cmd.name".Sv:Flerspråksapplikation VB 6.0
Thomas