Cześć, temat był wałkowany, ale ja chcę spojrzeć na niego trochę inaczej. Stworzyłem sobie mechanizm do obsługi językowej aplikacji. Wszystko opiera się o plikach INI. No i ładnie działa. Jednak, jeśli podczas działania aplikacji, zmienimy język, to gdy inne formy będą otwarte (chociażby główna), język nie ulegnie na nich zmianie. Wymaga to restartu aplikacji. Ale ja chcę sobie trochę utrudnić życie. Tylko zastanawiam się, w którą stronę. Chcę uzyskać to, że po zmianie języka w ustawieniach, wszystkie otwarte formy zaczytają sobie nowe stringi bez konieczności restartu aplikacji. Problem niby nie jest ciężki, można by zastosować chociażby komunikaty Windows. Ale ja się zastanawiam, jak jeszcze to można zrobić. Moje pomysły:
- Jedna forma bazowa z abstrakcyjną metodą "Localize". Po tej formie dziedziczą wszystkie formy w aplikacji (łącznie z MainForm!). Po zmianie języka, forma bazowa przechwytuje komunikat i wywołuje metodę Localize.
- Podobnie do punktu 1, ale każda forma przechwytuje sobie ten komunikat. Nie ma jednej, głównej formy bazowej.
- Zastosowanie interfejsów. Mam interfejs z metodą "Localize", którą muszą przesłonić wszystkie klasy po nim dziedziczące. Obiekty "rejestrują" się w jakimś singletonie, np:
LanguageHelper.RegisterLangObject(self);
powoduje to dodanie obiektu do jakiejś listy w singletonie LanguageHelper. W momencie zmiany języka, language helper wywołuje metodę Localize w każdym obiekcie z tej listy.
4. Metoda podobna jak w punkcie 3, tyle że zamiast wywoływania RegisterLangObject, chcę się posłużyć atrybutami. Ale tutaj nie mam zielonego pojęcia jak to ugryźć. Dodatkowo może nie potrzebowałbym interfejsu, tylko mógłbym dodawać same metody?
Jak sądzicie, który sposób będzie najlepszy? Tzn. który sami byście wybrali? A może jeszcze coś innego? Chyba skłaniam się do ostatniego sposobu (jeśli się w ogóle da), który wydaje się sprawiać najmniej kłopotu i roboty podczas rozwoju aplikacji.
Sposób pierwszy ma co najmniej 2 minusy
- MainForm, który dziedziczy po formie bazowej
- Podczas dodawania nowych form powinienem pamiętać o formie bazowej.
Punkt drugi ma za dużo roboty (w każdej formie muszę robić to samo)
Punkt trzeci wymaga użycia dodatkowej metody.
Punkt czwarty w sumie chyba najlepszy (jeśli w ogóle się da), bo wydaje się sprawiać najmniej kłopotu i roboty podczas rozwijania aplikacji.