Tylko jak zrobić by program za pomocą buttonaClick wiedział z której ścieżki czytać [...]
Jeśli program będzie używał jedynie ścieżek względnych to wystarczy umieścić katalogi językowe w tym samym folderze co plik wykonywalny aplikacji, a w programie (w kodzie) skorzystać ze ścieżek, które podałem w tabelce w poprzednim swoim poście;
Przyda się też określić miejsce dla plików konfiguracyjnych ze spisem słów; Wcześniej nic na ten temat nie pisałem (liczyłem na to, że sama coś zaproponujesz...), więc załóżmy, że będą się znajdować w osobnym podkatalogu, np. o nazwie lang
;
Struktura plików podkatalogów powinna wyglądać tak (w komentarzach ścieżki względne):
- application.exe // application.exe
+ lang // lang\
- pl.ini // lang\pl.ini
- en.ini // lang\en.ini
+ words // words\
+ pl // words\pl\
- *.mp3 // words\pl\*.mp3
+ en // words\en\
- *.mp3 // words\en\*.mp3
I teraz aby przetłumaczyć słówko, należy otworzyć odpowiedni plik konfiguracyjny i odczytać wartość klucza o nazwie takiej, jakie słówko chcemy przetłumaczyć; Przykładowy kod:
type
TLanguageKind = (lkPolish, lkEnglish);
const
LANG_NAMES: array [TLanguageKind] of String = ('pl', 'en');
function TranslateWord(const AWord: String; ALanguage: TLanguageKind): String;
var
LLangFile: TIniFile;
begin
LLangFile := TIniFile.Create(Format('lang\%s.ini', [LANG_NAMES[ALanguage]]));
try
Result := LLangFile.ReadString('WORDS', AWord, '');
finally
LLangFile.Free();
end;
end;
I teraz wywołanie funkcji TranslateWord
w poniższy sposób:
var
LTranslatedWord: String;
begin
LTranslatedWord := TranslateWord('pierwszy', lkPolish, lkEnglish);
spowoduje otwarcie pliku lang\pl.ini
, pobranie tłumaczenia słowa pierwszy
(co da słówko first
) i zwrócenie go przez funkcję; Aby odwrócić ten proces, należy podać rodzaje języków odwrotnie:
LTranslatedWord := TranslateWord('first', lkEnglish, lkPolish);
Natomiast funkcja budująca ścieżkę do pliku dźwiękowego na podstawie danego słówka może wyglądać np. tak:
function GetWordSoundPath(const AWord: String; ALanguage: TLanguageKind): String;
begin
Result := Format('words\%s\%s.mp3', [LANG_NAMES[ALanguage], AWord]);
end;
Wywołanie funkcji w poniższy sposób:
var
LSoundPath: String;
begin
LSoundPath := GetWordSoundPath('pierwszy', lkPolish);
spowoduje zwrócenie przez funkcję ścieżki words\pl\pierwszy.mp3
dla podanego w parametrze słówka pierwszy
;
To tylko przykłady kodów dla programu, który obsługuje na sztywno dwa języki - polski i angielski; Jeśli Twój program ma obsługiwać dowolną liczbę języków to trzeba będzie się również zastanowić nad mechanizmem obsługującym wiele plików z podkatalogu lang
oraz wiele podkatalogów w folderze words
.