sobota, kwietnia 04, 2009

Internacjonalizacja

Internacjonalizacja, czy też lokalizacja oprogramowania to dość dziwna rzecz.
W założeniach prosta. Wystarczy sprawić by aplikacja pozwalała na wprowadzanie, wyświetlanie i składowanie znaków z UTF-8, oraz wyprowadzić wszystkie teksty "na zewnątrz" kodu.
W przypadku aplikacji WEB, pierwszą część można osiągnąć przez odpowiednie zdeklarowanie kodowania dokumentów, oraz przez przekonanie serwera aplikacyjnego, że to co przychodzi od klienta jest w UTF-8.
Składowanie jest trudniejsze, ale i to można przewalczyć.
Kłopoty zaczynają się w przypadku wyprowadzania na zewnątrz kodu łańcuchów tekstowych.
Podstawy są proste.
W Java'ie używamy po prostu klasy java.util.ResourceBundle, która jest na tyle miła że potrafi pobierać zasoby dla zadanych Locale'i. Nasza praca sprowadza się więc do owijania istniejących w aplikacji String'ów w wywołania metody pobierającej łańcuchy z odpowiednich zasobów. Tracimy trochę na wydajności i czytelności, możemy mieć też większe wydatki na pamięć, ale prawdziwe problemy zaczynają się później ;-)

Jeżeli aplikacja jest po angielsku i znajduje się w niej np. taki tekst:

Before uploading your ${typeOfDocument} must be converted to ${format} format (${ext}). Do you want to convert and upload your ${typeOfDocument}?

Gdzie ${typeOfDocument} będzie przyjmować wartości:
  • document
  • presentation
  • spreadsheet

Po przetłumaczeniu na chiński uproszczony nie jest źle:

在上传${typeOfDocument} 之前必须将其转换为 ${format} 格式 (${ext})。是否要转换并上传该 ${typeOfDocument}?

Ale już przy polskim zaczynają się problemy:

Przed wysłaniem twój ${typeOfDocument} musi zostać skonwertowany do formatu ${format} (${ext}). Czy chcesz skonwertować i wysłać ${typeOfDocument}?

Świetnie to zadziała dla ${typeOfDocument} ze zbioru dokument, arkusz. Dla słowa prezentacja zabrzmi to źle:

Przed wysłaniem twój prezentacja musi zostać skonwertowany do formatu ${format} (${ext}). Czy chcesz skonwertować i wysłać prezentacja?

Prezentacja jest rodzaju żeńskiego, czyli trzeba odmienić słowo twój oraz skonwertowany na ich "żeńskie" wersje.

Dodatkowo w niektórych językach istnieją jeszcze przyimki określające rodzaj, albo tak jak w angielskim mówiące o tym że dany rzeczownik jest jednym z wielu, czy szczególnym.

Najprościej w momencie gdy dochodzimy do takiej sytuacji zrefaktorować kod tak byśmy mogli użyć kilku wariantów tekstu, np. w przypadku naszych łańcuchów przedstawionych powyżej, najlepiej wprowadzić 3 oddzielne łańcuchy dla każdego z typów dokumentu.

Ale to wszystko to jeszcze mięta ;-) Prawdziwe problemy zaczynają się przy językach takich jak arabski, czyli językach pisanych od prawej do lewej. Tutaj problem nie sprowadza się tylko do walki ze słowami i ich odmianą, problemem jest dynamiczne przekształcanie interfejsu.
Pole do wprowadzenie nazwy użytkownika nie może mieć już opisu po lewej stronie, bo będzie to nieczytelne. Elementy sterujące w liście dokumentów też powinny być ułożone od lewej do prawej....
Pierwszy problem z opisami pól w formularzach nie jest trudny, wystarczy gdzie się da używać układu w którym opis pola jest umieszczony NAD polem.
Gdy się nie da, dobrze używać komponentu nad którym będziemy mogli zapanować.
Sprawa elementów nawigacji w listach jest trochę bardziej skomplikowana, możemy użyć komponentu, ale on już musi być bardziej skomplikowany ;-)

I teraz powiedzcie szczerze, czyż pisanie programów komputerowych nie jest fascynujące? :-) Algorytmy w środku, komunikacja, logika biznesowa, a do tego wszystkiego GUI, które jest elastyczne aż do bólu ;-)
A do tego wszystkiego dobrze pamiętać jeszcze o tym, że nasze aplikacje mogą być używane przez osoby niewidome, lub słabowidzące, oraz przez inne programy....

I jak w tym wszystkim nie robić błędów? ;-)


Podobne postybeta
Proxy :-)
JNI i łańcuchy ;-)
Książkowy Stack Overflow ;-)
Bio"etyka"
11. Nie będziesz używał komunikatorów innych...