2011-07-10 12 views
6

Powiel możliwe:
C# localization , really confusing meC# lokalizacja

Czy ktoś mógłby podzielić się swoimi kroki lokalizacyjne dla ogromnych C# aplikacjami?

Jestem prawie pewien, że podstawowa strategia oparta na zasobach może działać, gdy mówimy o małych i średnich projektach.

Jednakże, jeśli mówimy o dużych produktach, podejście to powinno być połączone z niestandardowymi krokami kompilacji i niektórymi aplikacjami firm trzecich wykorzystywanymi specjalnie przez lingwistów.

Więc mógłbyś doradzić/podzielić się globalną strategię lokalizacji, która jest używana w aplikacjach (na tyle duże, oczywiście :)

Dziękuję.

+1

@Kon To nie jest duplikat, b bo widziałem każde pytanie związane z lokalizacją 'C# '. A ludzie mówią o korzystaniu z niestandardowych kroków konstrukcyjnych i zadawalających działaniach, dzięki którym lokalizacja jest wygodniejsza. Jednak tylko o nich wspominają i chciałbym zobaczyć kompletną odpowiedź. –

+0

Jasne, to, czego potrzebujesz, to w rzeczywistości internacjonalizacja (musisz najpierw przygotować swoją aplikację). Jak możesz sobie wyobrazić, to było [wcześniej udzielono odpowiedzi] (http://stackoverflow.com/questions/5253614/effective-strategies-for-localization-in-net/5524981#55249810) ... –

+0

Przepraszam, muszę źle zrozumieć coś ... Proszę zignorować mój poprzedni komentarz. –

Odpowiedz

2

Podstawowa strategia oparta na zasobach działa nawet w dużych aplikacjach korporacyjnych. Jest to wbudowane i łatwe do zrozumienia rozwiązanie, dlatego każdy programista może z niego korzystać bez problemu.

Jedyny problem polega na tym, że musisz w jakiś sposób przekształcić pliki zasobów w pliki pamięci tłumaczeniowej (tmx) iz powrotem - aby tłumacze mogli korzystać ze swoich standardowych narzędzi.

To, czego potrzebujesz, to w rzeczywistości proces lokalizacji. Czy różni się w przypadku dużych aplikacji? Cóż, jeśli skonfigurujesz poprawny proces, skalowałby się. Teraz na proces. Z mojego punktu widzenia powinno to wyglądać tak:

  1. Kopiowanie plików zasobów na odpowiednie struktury folderów (lokalizacyjne Inżynierowie nie powinni pracować bezpośrednio z aplikacji bazy kodu). Odpowiednia struktura folderów powinna być w jakiś sposób podobna do:
    [Nazwa projektu]
    .
    .
    [neutralny] [niemiecki] [japoński] [francuski]
    .
    .
    (każdy folder zawiera przetłumaczone zasoby w danym języku, neutralny jest zwykle angielski)
    Oczywiście trzeba by w jakiś sposób przekształcić bazę kodu w strukturę folderów, ale może to być zautomatyzowane.

  2. Przetwarzaj swoje możliwe do przetłumaczenia zasoby i twórz transkity - archiwum zip zawierające pliki, które należy przetłumaczyć (w tym przypadku wydaje się, że wszystkie z nich). Pliki powinny zostać prawdopodobnie przekształcone, abyś nie mógł wysyłać plików resx. Aplikacja do transformacji powinna odczytywać zawartość plików resx i umieszczać tłumaczenia w pliku o formacie uzgodnionym z tłumaczami (może to być po prostu Excel, ale nie zalecam tego rozwiązania). Teraz nie mogę podać nazw tych narzędzi, choć wiem, że istnieją aplikacje komercyjne, ponieważ pracowałem tylko z niestandardowymi.

  3. Wyślij transkrypcje tłumaczom (najprawdopodobniej tłumaczom).

  4. Po otrzymaniu przetłumaczonego pliku (transkit) z powrotem, musisz go zweryfikować (ten krok jest kluczowy). Musisz upewnić się, że transkit jest kompletny (tj.brak braków do przetłumaczenia) i technicznie poprawne (tzn. kodowanie plików jest poprawne, zwykle UTF-8 lub UTF-16). Przynajmniej dobrze jest rzucić okiem na plik, aby sprawdzić, czy nie ma żadnych dziwnych znaków, takich jak 1/2, 3/4 lub coś podobnego - zwykle oznacza to zepsute kodowanie.

  5. Zaimportuj transkit. Jest to odwrotny krok 2 - musisz wstawić przetłumaczone ciągi do odpowiednich plików.

  6. Skopiuj przetłumaczone pliki z powrotem do oryginalnej wersji kodu i uruchom kompilację "Lokalizacja".

  7. Przetestuj swoją aplikację pod kątem problemów z lokalizacją (np. Nakładające się kontrolki, ciągi obcinania, nieprawidłowe kodowanie itp. - zazwyczaj oznacza to, że i18n nie jest wykonywane prawidłowo).
  8. Naprawianie uszkodzeń lokalizacji/internacjonalizacji (lokalizowalności).
  9. Przejdź do 1, aż zakończy się okres interfejsu użytkownika/sznurka. Zakłada to, że tłumacze używaliby jakiejś pamięci tłumaczeniowej i nie będą ładować (lub ładować mniej) za ponowne tłumaczenie wcześniej przetłumaczonych łańcuchów.
  10. Zautomatyzuj wszystkie możliwe kroki i gotowe.

Poza tym nie będzie można ustanowić wspólnego słownika pojęć i dokonać lingwistycznej recenzji przetłumaczonych treści.

2

Myślę, że można w dużym stopniu polegać na strukturze zasobów dostarczanej przez .NET za pomocą kilku modyfikacji, aby było bardziej odpowiednie dla dużych projektów, a mianowicie do budowania i utrzymywania zasobów niezależnie od aplikacji i do eliminowania generowanych właściwości, które odnoszą się do każdy zasób według nazwy. Jeśli istnieją inne cele odpowiednie dla lokalizacji dużego projektu, których nie omówiono poniżej, opisz je, aby je również rozważyć.

  1. Utwórz samodzielny projekt do reprezentowania zasobów, które można załadować jako oddzielną bibliotekę DLL.
  2. Dodaj plik "Zasoby" do projektu, wybierając łącze na karcie Zasoby we właściwościach projektu: "Ten projekt nie zawiera domyślnego pliku zasobów. Kliknij tutaj, aby go utworzyć."
  3. Dodaj inny zasób o tej samej nazwie głównej, aby reprezentować inny język, na przykład "Resource.de.resx" dla języka niemieckiego. (Visual Studio najwyraźniej używa nazwy pliku do określenia języka, który reprezentuje plik zasobów). Przenieś go do tego samego katalogu/folderu, co domyślny plik zasobów. (Powtórz dla każdego języka.)
  4. We właściwościach pliku Resources.resx usuń "ResXFileCodeGenerator" z właściwości Custom Tool, aby zapobiec domyślnemu generowaniu kodu w przestrzeni nazw "Właściwości" aplikacji. (Powtórz tę czynność dla każdego języka).
  5. Jawnie/ręcznie zadeklarować własnego menedżera zasobów, który ładuje nowo utworzonych zasobów z linii takich jak:

    statycznych System.Resources.ResourceManager resourceMan = nowych System.Resources. ResourceManager ( "LocalizeDemo.Properties.Resources", typeof (Resources) .Assembly);

  6. Wdrożenie pliku, który może zostać wygenerowany, które zawiera listę wszystkich zasobów można odnieść się do (patrz rysunek 1)

  7. Wdrożenie funkcji do pobierania i ciągi formatu (patrz rysunek 2).

  8. Teraz masz dość, że możesz odnieść się do przetłumaczonych ciągów z dowolnej liczby aplikacji (patrz rysunek 3).

  9. Skorzystaj z System.Resources.ResXResourceWriter (z System.Windows.Forms.dll) lub System.Resources.ResourceWriter (System.dll), aby wygenerować zasoby, zamiast mieć pliki Resx jako główne źródło. W naszym projekcie mamy bazę danych SQL, która definiuje wszystkie nasze ciągi w każdym języku, a część naszego procesu budowania generuje wszystkie pliki Resx przed zbudowaniem projektu zasobów.

  10. Teraz, gdy możesz generować pliki Resx z dowolnego formatu, możesz użyć dowolnego żądanego formatu (w naszym przypadku bazy danych SQL, którą eksportujemy i importować z arkuszy kalkulacyjnych Excel), aby dostarczyć pliki do wysłania do tłumaczy .

  11. Zauważ, że przetłumaczone zasoby budowane są jako pliki DLL z satelitami. Można stworzyć dowolny język niezależnie za pomocą odpowiednich narzędzi wiersza poleceń. Jeśli to część twojego pytania (jak to zrobić) daj mi znać. Ale na razie zakładam, że o tym wiesz, ponieważ wspomniałeś już o niestandardowych krokach kompilacji.

Rysunek 1 - enum identyfikacji wszystkich dostępnych zasobów:

namespace MyResources 
{ 
    public enum StrId 
    { 
     Street 
     .... 
    } 
} 

Rysunek 2 - kod do załadowania i wrócić sformatowanych ciągi zasobów:

namespace MyResources 
{ 
    public class Resources 
    { 
     static System.Resources.ResourceManager resourceMan = 
     new System.Resources.ResourceManager("MyResources.Properties.Resources", 
     typeof(Resources).Assembly); 

     public static string GetString(StrId name, 
     System.Globalization.CultureInfo culture = null, params string[] substitutions) 
     { 
     if (culture == null) culture = System.Threading.Thread.CurrentThread.CurrentUICulture; 
     string format = resourceMan.GetString(name.ToString(), culture); 
     if (format != null) 
     { 
      return string.Format(format, substitutions); 
     } 
     return name.ToString(); 
     } 
    } 
} 

Rysunek 3 - dostęp do zasobów:

using MyResources; 

namespace LocalizationDemo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     System.Threading.Thread.CurrentThread.CurrentUICulture = 
      new System.Globalization.CultureInfo("de-DE"); 
     Console.WriteLine(Resources.GetString(StrId.Street)); 
     } 
    } 
} 
+0

Pamiętaj, że nasz projekt nie lokalizuje żadnych formularzy okien, ponieważ używamy interfejsu API innej firmy, który nie integruje się z lokalizacją .NET. Jeśli chcesz, aby system .NET automatycznie lokalizował formularze systemu Windows, zamiast ręcznie ładować łańcuchy znaków do elementów sterujących z pliku zasobów, musisz wykonać dodatkowe badanie, którego nie zrobiłem. – BlueMonkMN

+0

Zrobiłem test i wydaje się, że możliwe jest scalenie wszystkich przetłumaczonych zasobów z różnych plików Form.xx.resx do głównych plików Resource.xx.resx, ale wiąże się to z przesłonięciem wygenerowanego kodu, jeśli formularz nie znajduje się w zasobie DLL. – BlueMonkMN