2009-09-01 15 views
8

W aplikacji wielojęzycznej z tabelami odpowiednimi, jaki jest najlepszy sposób obsługi tłumaczeń?Jaki jest najlepszy sposób na obsługę I18N w tabelach odnośników?

Na przykład dla tabeli przyporządkowania kraju użytkownik z USA powinien zobaczyć angielskie nazwy krajów, ponieważ niemiecki powinien widzieć niemieckie nazwy. Ale nadal ich identyfikatory powinny być takie same.

mogę myśleć, co następuje:

  • Dodaj inną tabelę przeglądową dla każdego języka
  • użyć pojedynczego tabeli odnośników z wielu wpisów dla tego samego kraju oflagowane zgodnie z jego języka.
  • Pozbądź się wszystkich tabel przeglądowych i zrobić wszystkie wyszukiwań za pomocą kodu programu
  • [Każda inna idea nie myśleć?]

Odpowiedz

8

Wielkie pytanie brzmi - może tłumaczenia mogą być zmienione do końca użytkownicy?

Jeśli odpowiedź brzmi "NIE", pakiety zasobów są łatwiejsze i szybsze w użyciu niż tabele. Zamiast faktycznego tekstu twoje tabele będą zawierały klucz zasobów (lub możesz użyć klucza podstawowego do tego celu, jeśli jest to tekstowy, a nie numeryczny), a odpowiedni pakiet zasobów będzie zawierał tłumaczenie.

Jeśli odpowiedź brzmi "TAK", musisz przechowywać tłumaczenia w bazie danych. Odkryłem jednak, że najłatwiejszym podejściem w tym scenariuszu jest naśladowanie powyższej funkcji pakietu zasobów w bazie danych - np. posiadać pojedynczą tabelę z kolumnami "locale", "klucz zasobów", "wartość zasobów", które wszystkie inne tabele będą wykorzystywać do wyszukiwania rzeczywistego zlokalizowanego tekstu.

3

Rozłączna prezentacja z programowania. Wewnętrznie, używaj identyfikatorów do wszystkiego; prezentując użytkownikom, prezentuj zlokalizowane dane.

1

Raz zrobiłem aplikację wielojęzyczną. Wszystko musiało być wielojęzyczne, łącznie z treściami wprowadzonymi przez użytkowników, a także musiało być łatwe do przetłumaczenia tych treści.

Teraz, jeśli jest to tylko do tekstu statycznego, najlepiej zaleca pliki zasobów xml. Wierzę, że jest to obsługiwane przez platformę .NET całkiem dobrze.

Jeśli ma być dynamiczna, to nie struktura tabeli

ResourceStrings Stołowych RESOURCEID GUID PK cultureCode String PK tekst String

ten następnie pozwolono mi todo kaskada przeczytać na kodzie kultury także. Więc jeśli ktoś miał kod kulturowy en-us, mogę zrobić kwerendę gdzie zrobiłem

SELECT FROM ResourceStrings 
WHERE resourceId = <AND ID> AND cultureCode IS IN ('en','en-us') 
ORDER BY cultureCode DESC 

tamtędy najdłuższy kod kultura wróci pierwszy i najbardziej specyficzny. Teraz polecam TYLKO, jeśli zezwalacie użytkownikom na wprowadzanie tekstu i tłumaczenie. Potrzebowałem tego, ponieważ treść musiała być wielojęzyczna, a także sama aplikacja.

0

Sprawdź coś takiego jak struktury danych i algorytmy danych: Adobe Source Libraries 'xstring. Lokalizacja jest obsługiwana z identyfikatorem ciągu, jak również kontekstem szczegółowym lokalizacji. Tabele lokalizacyjne mogą być przechowywane w języku XML, a łańcuchy znaków są lokalizowane w środowisku wykonawczym w zależności od kontekstu wykonawczego (język, kraj, platforma itp.) Chociaż sam kod działa, nie uważałbym go za jakość produkcji. Niemniej jednak koncepcje są solidne.

1

W moim bieżącym projekcie (niestandardowy CMS napisany w django), nasze rozwiązanie dla modeli I18N oparte jest na tym przykładowym fragmencie kodu: http://www.djangosnippets.org/snippets/855/, który został rozszerzony, aby mógł być bardziej przydatny w szablonach i zintegrowany z interfejsem administracyjnym.

Zasadniczo, każda treść rodzajowa ma dwie tabele: jedną z typowymi polami (jak kategoria artykułów) i jedną z treścią podlegającą tłumaczeniu (tytuł, treść, treść - unikalna etykieta użyta w adresie URL - itp.). Oczywiście istnieje relacja między wieloma modelami a modelem tłumaczenia. Oto przykład autor podaje:

class Article(models.Model): 
    author = models.CharField(max_length = 40) 

class ArticleI18N(I18NModel): 
    title = models.CharField(max_length = 120) 
    body = models.TextField() 

Myślę, że w ten sposób układ bazy danych jest bardzo blisko do koncepcji posiadania treści z wspólnych cech i pola tłumaczenia.

Ale najtrudniejszą częścią jest pozostanie DRY w swoim kodzie, albo skończysz z bałaganem z tablicy za każdym razem, gdy potrzebujesz obsługi treści do przetłumaczenia. Na szczęście elastyczność Pythona była bardzo pomocna.

Jeśli twój język programowania i środowisko nie pozwalają na podobne triki (takie jak dynamiczne tworzenie podklas, python's metaclasses - jakiś rodzaj haczyka dziedziczenia, itp.), Myślę, że ten rodzaj układu bazy danych będzie bardziej przekleństwem niż błogosławieństwo.

Pamiętaj o zasadzie YAGNI. Jeśli potrzebujesz tłumaczenia wewnątrz modeli z mniej powikłań, widziałem inne skuteczne sposoby, które są w porządku tak długo, jak można sobie pozwolić na ograniczoną elastyczność i brak pojęciowej integralności tych alternatyw:

  • 1) Użyj dodatkowe kolumny dla każdej tłumaczalnej kolumny i każdego języka: title_en, title_fr, title_de, content_en, content_fr, content_de, ...
  • 2) serializacja wielu języków w jednej kolumnie.
    Na przykład: title = "| EN | Witamy | FR | Bienvenue | DE | Willkommen"
    Nie lubię tego szczególnie, ale tak naprawdę ważne jest to, czy dobrze integruje się z istniejącym środowiskiem.
  • 3) Czasami związek między tą samą treścią w różnych językach nie musi być ścisły. Myślę, że tak jest w przypadku artykułów w Wikipedii - tłumaczenia to tylko hiperłącza ręcznie ustawione przez autorów. W rezultacie łącza te są mniej przydatne dla oprogramowania, ale ważne jest, aby użytkownik mógł je przeglądać.
1

Oto sposób wykonania tej czynności na poziomie bazy danych.

Kiedy musiałem to zrobić, zepsułem każdą tablicę kodów na dwie tabele. Jedna zawierała niezmienne dane kulturowe: wewnętrzny identyfikator kodu na pewno, sam kod, jeśli kod był niezmiennikiem kultury i ewentualnie inne kolumny (jak kategorie sortowania/grupowania). Pozostałe zawierały dane specyficzne dla kultury: opisy, kody specyficzne dla kultury, jeśli to właściwe, i tak dalej.

(Kultura specyficzne kody gniazdo szerszeni, nie kopać go, jeśli nie trzeba To może być trochę trudno dostać głowę wokół idei, że US i EU są tego samego kodu w inny. Ale są kraje, w których może być politycznie niesmaczne, aby francuskojęzyczni użytkownicy używali US jako swojego skrótu do États-Unis. Cóż, kraj.)

Posiadanie tabeli kodów niezmienników kultury umożliwia ustanowienie ograniczeń klucza obcego między nią a głównymi tabelami, które jej używają. Konstruowanie zapytań specyficzne kulturowo jest dość prosta:

SELECT m.*, c.Code, ISNULL(s.Description, lf.Message) 
FROM MainTable m 
JOIN FooCodeData c ON m.CodeID = c.ID 
LEFT JOIN CultureSpecificFooCodeData s ON s.CodeID = c.ID AND s.Culture = @Culture 
JOIN LookupFailure lf ON lf.Culture = @Culture 

Zauważ, że jeśli kody są specyficzne kulturowo, nawet nie trzeba dołączyć FooCodeData w tym zapytaniu, wybierając s.Code zamiast.

Uwaga również jeden nieodłączny słabością tego podejścia, jak pokazano przez LEFT JOIN i ISNULL w tym zapytaniu: nie można utworzyć ograniczenie w celu zagwarantowania, że ​​istnieje rząd kultura specyficzne dla każdej kombinacji kodu/hodowlanej. To jest właśnie dla: pobiera komunikat specyficzny dla kultury, który wskazuje, że rekord kodowy specyficzny dla kultury nie został wprowadzony dla danego kodu.

Powiązane problemy