Budowanie bazy danych tłumaczeń ciągów dla wielu (wewnętrznych) projektów

9

W naszej firmie mamy istniejącą tabelę tłumaczeń ms-sql, która przechowuje takie ciągi:

Id |     Key     | Language | Value 
 1 | hello-world |  nl-BE   | Hallo Wereld
 2 | hello-world |  en-GB   | Hello World

System ma 3 języki i spodziewam się, że w przyszłości liczba ta wzrośnie do maksymalnie 10

Ta tabela jest odczytywana przez wiele bardzo różnych projektów (około 60 projektów, głównie stron internetowych / aplikacji internetowych i niektórych usług internetowych), z których każdy otwiera połączenie bazy danych z bazą tłumaczeń, buforuje tłumaczenia

Informacje zwrotne od deweloperów front-end są takie, że nasz interfejs użytkownika wprowadza lub modyfikuje największą wadę tłumaczeń, ponieważ nie mogą wiedzieć, który projekt używa jakich ciągów.

Czasami modyfikują ciągi, nie wiedząc, że zrywają z nim 7 projektów.

Teraz muszą po prostu wpisać coś podobnego, this.Translate("Hello World")a system zajmie się resztą.

Mógłbym oczywiście zmusić ich do czegoś takiego, this.Translate("Hello World","AwesomeApplication1")ale wydaje się, że będzie to wymagało sporo refaktoryzacji w wielu projektach.

Jak poszedłbyś na temat zapewnienia tego rozwiązania? W jaki sposób jako twórca podałbyś tłumaczenie nazwy projektu? Jak miałbyś to przechowywać w bazie danych?

Ważna uwaga: ponowne użycie tłumaczenia stanowi cały punkt scentralizowanej bazy danych, dlatego też zakres tłumaczenia jest przenoszony do jednego projektu

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1
5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2

nie jest tak naprawdę poszukiwaną opcją.

Wolałbym coś takiego:

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2

lub klucz obcy równoważny po prostu umieszczeniu nazw w tabeli.

AKTUALIZACJA

Na podstawie porady dotyczącej normalizacji bazy danych do tej pory wymyśliłem coś takiego:

//this allows me to distinquish if translations where added by developer or by translator

UPDATE2: dodano edmx zamiast tekstu. Jeśli ludzie są zainteresowani, mogę zamienić projekt WCF. Pakuję tę koncepcję, aby inni mogli ją przetestować i wykorzystać.

Mvision
źródło
Ty dla normalizacji. głosował q i a. Wierzę, że wiosenny java github pomógłby.
tgkprog,

Odpowiedzi:

5

Uwaga wstępna nr 1: Nie mówisz nam, w jaki sposób obecnie obsługiwane są tłumaczenia

Uwaga wstępna # 2: Twoja baza danych nie jest znormalizowana. Niezależnie od wybranego rozwiązania, najpierw znormalizuj bazę danych . Jeśli nie zrobisz tego teraz, napotkasz później poważne problemy z konserwacją

Tak bym zrobił.

  1. Przepisz swoje tłumaczenie, aby przenosiło identyfikator programu z powrotem na serwer

  2. Translator zaplecza umieści ciąg w tabeli bazy danych, jeśli jeszcze nie istnieje, i oznaczy go identyfikatorem programu

  3. Jeśli ciąg już istnieje, zostanie zaktualizowany tylko wtedy, gdy identyfikator programu pasuje do oryginalnego identyfikatora programu, z którym utworzono ciąg. Jeśli nie, zwróć powiadomienie o konflikcie.

Wariacje:

  • Możesz użyć „ID programisty / tłumacza” zamiast ID programu. Uważam to za lepsze, ponieważ są ludzie, którzy znają język obcy i ci, którzy myślą, że znają. Tylko pierwsza grupa ma prawa do modyfikacji.

  • Możesz przechowywać identyfikatory wszystkich programów, które używają ciągu w bazie danych, aby wiedzieć, które programy powodują konflikty.

  • Możesz rozszerzyć tę myśl o „własności” na każdy język: jedna osoba potrafi mówić po angielsku, a druga po holendersku.

  • Gdy baza danych zostanie znormalizowana, dodajesz złożoność kompilacji, np. „Program A jest w językach 1,2,3; B jest w 3 i 5”

Proponuję również napisać osobny program do obsługi tłumaczeń, który pokaże brakujące tłumaczenia itp. Kiedyś to zrobiłem z 2-poziomową autoryzacją: każde tłumaczenie musi być sprawdzone przez drugą osobę (zwykle native speakera).

Jan Doggen
źródło
1
Zaktualizowałem moje pytanie na podstawie twoich pomysłów
Mvision
5

Ponieważ odnoszą się do „tego” ... możesz raz przypisać nazwę projektu do „tego” (na przykład za pomocą konstruktora), a interfejs funkcji tłumaczących nie zmieniłby się dla koderów. Pod maską dodaje nazwę projektu do zapytania do bazy danych. Alternatywnie możesz podać „to” jako sposób na samodzielne poznanie nazwy projektu. To naprawdę będzie zależeć od tego, jak zorganizujesz swoje zajęcia.

Do przechowywania możesz zrobić coś takiego:

1 ! hello-world ! nl-EN ! Hello World  ! *
2 ! hello-world ! nl-EN ! Howdy, World ! CowboyApp
3 ! hello-world ! nl-EN ! Arrgh        ! PirateApp

Użyj wieloznacznej karty, aby zastosować ogólne tłumaczenie do wszystkich aplikacji, ale nazwę konkretnej aplikacji, jeśli chcesz zastąpić tłumaczenie dla konkretnej aplikacji. Spowoduje to ograniczenie duplikacji do minimum.

Aby zobaczyć, który program używa jakich tłumaczeń, znasz to teraz - jeśli nie chcesz przechodzić i ręcznie zbierać tych informacji, możesz zalogować się do zleceń tłumaczenia.

Grandmaster B.
źródło
Pomysł przeniesienia go do klasy „ta” wydaje mi się dobry, myślę, że zamierzam przenieść nazwę projektu do pliku web / app.config i stamtąd go przeczytać. Czy uważasz, że pomysł na dziką kartę / nazwy projektów jest skalowalny do około 4000 tłumaczeń?
Mvision
3
Jako rozszerzenie można dodać wyzwalacz do bazy danych lub bazy danych DBAL, która aktualizuje kolumnę „programy subskrybowane” za każdym razem, gdy czytane jest przetłumaczone słowo.
W jaki sposób wyzwalacz bazy danych mógł kiedykolwiek znać nazwę projektu? (Używamy frameworku encji 4)
Mvision
@Mvision Nie rozumiem, dlaczego nie - głośność nie powinna stanowić większego problemu. Jeśli wiele tłumaczeń specyficznych dla aplikacji po prostu wstawia nazwę aplikacji, możesz również użyć stałych, aby zmniejszyć duplikaty.
GrandmasterB
nvm źle zrozumiałem. tak, wyzwalacz mógłby zrobić i przyspieszyłby rzeczy w porównaniu do sprawdzania i aktualizowania tych rzeczy przez EF przy czytaniu .... dobre połączenie
Mvision
1

Jeśli wszystkie projekty są napisane w języku C #, a wszystkie wywołania tłumacza wyglądają tak

this.Translate("hello-world")

gdzie „hello-world” jest kluczem w tabeli tłumaczeń, napisanie małego skanera kodu źródłowego przy użyciu wyrażeń regularnych nie powinno być trudne do znalezienia wszystkich wywołań tłumacza i przypisania słowom kluczowym odpowiednich nazw projektów. W ten sposób nie musisz zmieniać żadnego z istniejących interfejsów kodu lub translatora.

W zależności od rzeczywistej struktury programu alternatywnie może być łatwiej wyodrębnić te informacje z kodu IL twoich zestawów. Jakiś czas temu zrobiłem coś bardzo podobnego, również do celów tłumaczenia, używając tego przykładowego kodu do analizowania zestawów.

Doktor Brown
źródło
Lubiłem takie rozwiązanie. Wymagałoby to jednak pełnego przetestowania wszystkich 60 projektów (niektóre nawet moich) przed przejściem do produkcji z tym nowym systemem. Sugerowane rozwiązanie przeniesienia nazwy projektu do kodu wywołującego działa dobrze i spowoduje znacznie mniej kłopotów, i tak dzięki!
Mvision
1
@Mvision: Myślę, że jest odwrotnie. Jeśli określisz nazwę projektu dla tłumaczeń w czasie wykonywania, musisz upewnić się, że każda strona internetowa z każdym tłumaczeniem dla wszystkich twoich 60 projektów musi być wywołana raz, aby upewnić się, że wszystkie zostały zarejestrowane. Jednak statyczne skanowanie źródła lub zestawów daje pełną listę bez potrzeby przeprowadzania jakichkolwiek testów lub uruchamiania całego systemu.
Doc Brown