W ostatnim czasie musiałem przerobić jeden z systemów na wersję wielojęzykową. Chodziło dokładnie o to, aby wszystkie Stringi zostały wywołane przez tzw. wrapper ze wstrzyknięciem pewnego kontekstu (Locale, kategoria grupująca, czy parametry).
Np. jeśli w kodzie był fragment:
|
String message = "Numer PESEL: " + pesel + " jest nieprawidłowy"; |
to został przerobiony na coś takiego:
|
String category = "FORM.EMPLOYEE"; ... String message = I18n.begin("Numer PESEL: {0} jest nieprawidłowy", category).locale(locale).param(pesel).translate(); |
lub coś takiego:
|
String message = I18n.begin("Numer PESEL: {0} jest nieprawidłowy").param(pesel); |
Typowy przykład Buildera z przeciążoną metodą toString() wykonującą translację. Taki wrapper wykonuje wyszukanie tekstu już zapisanego w systemie (czy to w bazie, czy w plikach), a jeśli nie istnieje – dopisuje go. W ten sposób zostają zdefiniowane szablony tekstów w ustalonym źródłowym języku i w celu dodania nowej wersji językowej, należy przypisać do każdego z nich odpowiednie tłumaczenie. System zaś z kontekstu użytkownika wybierze odpowiednie Locale i przypisze odpowiednią wersję.
Ale w zasadzie nie kwestię samych tłumaczeń chciałem tu poruszyć, a to co wymagało żmudnej pracy po finalnej refaktoryzacji kodu. Należało wyszukać wszystkie szablony i zapisać je. Problem w tym, że zmodyfikowanych plików źródłowych .java było mnóstwo, w różnych podkatalogach. Ze względu na to, że konieczne było wyciąganie dodatkowych zmiennych javy w źródłach (patrz zmienna category), postanowiłem zrobić proste narzędzie napisane również w javie wyszukujące wszystkie pliki z rozszerzeniem .java, a z nich wszystkie wywołania metody I18n.begin.
Czytaj dalej →