1. Oddzielenie kodu od tekstów
Podstawowym warunkiem każdej lokalizacji jest ścisłe oddzielenie kodu programu od treści tekstowych. Wszystkie wyświetlane teksty powinny być przechowywane w zewnętrznych plikach zasobów (np. Properties, JSON, YAML), a nie zakodowane na stałe w kodzie źródłowym. Dzięki temu tłumacze mogą pracować bez modyfikowania kodu. Należy używać unikalnych kluczy stringów jako odniesień w kodzie, które wskazują na odpowiednie tłumaczenia. To oddzielenie ułatwia również konserwację i pozwala na późniejsze dodawanie nowych języków bez zmian w kodzie. Upewnij się, że etykiety interfejsu, komunikaty błędów i tooltipy również znajdują się w tych plikach.
2. Symbole zastępcze i zmienne
Teksty często zawierają dynamiczne treści, takie jak liczby, nazwy lub daty. Należy je wstawiać za pomocą symboli zastępczych, np. formatowania printf (%s, %d) lub nowocześniejszych metod, jak nawiasy klamrowe {0}. Ważne jest, aby tłumacze znali kolejność i znaczenie symboli zastępczych. Używaj nazwanych symboli zastępczych (np. „{username}”), aby zapewnić kontekst. W językach o różnej strukturze zdania kolejność symboli może się zmieniać. Dlatego zapewnij możliwość dostosowania kolejności w tłumaczeniu. Przetestuj wszystkie warianty, aby uniknąć błędnych lub niekompletnych wyników.
3. Reguły liczby mnogiej i tworzenie liczby mnogiej
W języku niemieckim istnieje tylko liczba pojedyncza i mnoga, ale wiele języków ma bardziej złożone reguły liczby mnogiej (np. arabski z sześcioma kategoriami). Korzystaj z bibliotek takich jak ICU MessageFormat, które obsługują reguły liczby mnogiej specyficzne dla języka. Zdefiniuj w swoich zasobach osobne klucze dla różnych form liczby mnogiej (one, other). Kod automatycznie wybierze odpowiednią formę na podstawie liczby. Przykład: „{count} {count, plural, one {jabłko} other {jabłka}}”. Przetestuj każdy językowo z wieloma wartościami liczbowymi, aby upewnić się, że wyświetlana jest poprawna forma liczby mnogiej. Unikaj sztywnych instrukcji if – to podatne na błędy.
4. Długość tekstu i bufor układu
Tłumaczenia są często dłuższe lub krótsze niż oryginalny tekst. Szczególnie w przyciskach, menu i etykietach może to rozsadzić układ. Zaplanuj więc odpowiednią przestrzeń na rozszerzenia tekstu – dobrą wytyczną jest 30% dodatkowego miejsca dla języków zachodnich, więcej dla azjatyckich. Używaj dynamicznych układów, które dostosowują się do długości tekstu (np. Auto Layout w iOS lub Flexbox w sieci). Unikaj stałych szerokości. Pozwól elementom interfejsu na zawijanie tekstu. Przetestuj interfejs z najdłuższymi spodziewanymi tłumaczeniami, aby uniknąć nakładania się lub obcinania.
5. Klucze stringów, kontekst dla tłumaczy i RTL
Jednoznaczne klucze stringów są kręgosłupem lokalizacji. Używaj opisowych nazw (np. „login.button.title”) i dokumentuj cel użycia. Zapewnij tłumaczom kontekst: zrzuty ekranu, maksymalną długość znaków, ograniczenia (np. „nie dłuższe niż 20 znaków”). Dla języków RTL, takich jak arabski czy hebrajski, interfejs musi być odbity lustrzanie. Korzystaj z atrybutów układu, które automatycznie obsługują RTL (np. start/end zamiast left/right). Przetestuj całą nawigację w warunkach RTL. Pamiętaj również o ikonach i grafikach – mogą być różnie interpretowane w zależności od kultury.