Po prostu nie mogę uruchomić lokalizacji.
Mam bibliotekę klas. Teraz chcę tam utworzyć pliki resx i zwrócić niektóre wartości oparte na kulturze wątków.
Jak mogę to zrobić?
c#
localization
cultureinfo
J L.
źródło
źródło
Odpowiedzi:
Kliknij prawym przyciskiem myszy Właściwości w projekcie, wybierz Dodaj -> Nowy element ... w menu kontekstowym, a następnie na liście Elementy Visual C # wybierają „Plik zasobów” i nadają mu nazwę
strings.resx
.System.Threading
iSystem.Globalization
Uruchom ten kod:
Powinien wypisać „Cześć”.
Teraz dodaj nowy plik zasobów o nazwie „strings.fr.resx” (zwróć uwagę na część „fr”; ta będzie zawierać zasoby w języku francuskim). Dodaj zasób łańcucha o takiej samej nazwie jak w strings.resx, ale o wartości w języku francuskim (Name = „Hello”, Value = „Salut”). Teraz, jeśli uruchomisz następujący kod, powinien wypisać Salut:
Co się dzieje, system szuka zasobu dla „fr-FR”. Nie znajdzie żadnego (ponieważ w pliku określono „fr”). Następnie wróci do sprawdzania „fr”, które znajdzie (i używa).
Poniższy kod wyświetli „Hello”:
Wynika to z tego, że nie znajduje żadnego zasobu „en-US”, a także zasobu „en”, więc powróci do domyślnego, czyli tego, który dodaliśmy od samego początku.
W razie potrzeby możesz tworzyć pliki z bardziej szczegółowymi zasobami (na przykład strings.fr-FR.resx i strings.fr-CA.resx odpowiednio dla francuskiego we Francji i Kanadzie). W każdym takim pliku musisz dodać zasoby dla tych ciągów, które różnią się od zasobu, do którego by się wycofał. Więc jeśli tekst jest taki sam we Francji i Kanadzie, możesz umieścić go w strings.fr.resx, podczas gdy łańcuchy, które różnią się w kanadyjskim francuskim, mogą przejść do strings.fr-CA.resx.
źródło
Access Modifier
należy ustawićPublic
dla generowania klasy zasobów. Klasa niekoniecznie musi znajdować się w przestrzeni nazw Właściwości, tam umieszcza się plik .resx.Właściwie to całkiem proste. Utwórz na przykład nowy plik zasobów
Strings.resx
. UstawAccess Modifier
naPublic
. Użyj odpowiedniego szablonu pliku, aby Visual Studio automatycznie wygenerował klasę akcesorium (Strings
w tym przypadku będzie to nazwa ). To jest twój domyślny język.Teraz, jeśli chcesz dodać, powiedzmy, niemiecką lokalizację, dodaj zlokalizowany plik resx. Zazwyczaj tak będzie
Strings.de.resx
w tym przypadku. Jeśli chcesz dodać dodatkową lokalizację, powiedzmy w Austrii, dodatkowo utworzyszStrings.de-AT.resx
.Teraz stwórz ciąg - powiedzmy ciąg z nazwą
HelloWorld
. W swoimStrings.resx
dodaj ten ciąg o wartości „Witaj, świecie!”. WStrings.de.resx
dodaj „Cześć, Welt!”. IStrings.de-AT.resx
dodaj „Servus, Welt!”. To wszystko na razie.Teraz masz wygenerowaną
Strings
klasę i ma ona właściwość z geteremHelloWorld
. Uzyskanie tej właściwości spowoduje załadowanie „Servus, Welt!” gdy twoje ustawienia regionalne to de-AT, „Cześć, Welt!”, gdy twoje ustawienia regionalne to dowolne inne ustawienia regionalne (w tym de-DE i de-CH) oraz „Hello, World!”, gdy twoje ustawienia regionalne są czymś innym. Jeśli ciąg znaków jest brak w zlokalizowanej wersji, menedżer zasobów automatycznie przejdzie przez łańcuch, od najbardziej wyspecjalizowanego do niezmiennego zasobu.Możesz użyć tej
ResourceManager
klasy, aby uzyskać większą kontrolę nad tym, jak dokładnie ładujesz rzeczy. GenerowanaStrings
klasa również z niej korzysta.źródło
Ponadto świetna odpowiedź @Fredrik Mörk na ciągi znaków, aby dodać lokalizację do formularza, wykonaj następujące czynności:
"Localizable"
dotrue
Language
żądany język (z miłego menu rozwijanego z wszystkimi nimi)Edycja: ten artykuł MSDN na temat lokalizowania formularzy Windows nie jest oryginalnym, który połączyłem ... ale w razie potrzeby może rzucić więcej światła. (stary został zabrany)
źródło
Świetna odpowiedź F.Mörk. Ale jeśli chcesz zaktualizować tłumaczenie lub dodać nowe języki po wydaniu aplikacji, utkniesz, ponieważ zawsze musisz ją ponownie skompilować, aby wygenerować zasoby.dll.
Oto rozwiązanie, aby ręcznie skompilować bibliotekę zasobów. Wykorzystuje narzędzia resgen.exe i al.exe (zainstalowane z SDK).
Załóżmy, że masz plik zasobów Strings.fr.resx, możesz skompilować dll zasobów z następującą partią:
Pamiętaj, aby zachować oryginalną przestrzeń nazw w nazwach plików (tutaj „WpfRibbonApplication1”)
źródło
Poprawka i opracowanie odpowiedzi @Fredrik Mörk .
strings.resx
plik zasobów do swojego projektu (lub inną nazwę pliku)Access Modifier
naPublic
(wstrings.resx
zakładce otwartego pliku)Hello
, wartośćHello
)Program Visual Studio automatycznie generuje odpowiednią
strings
klasę, która jest faktycznie umieszczanastrings.Designer.cs
. Klasa znajduje się w tej samej przestrzeni nazw, w której można oczekiwać umieszczenia nowo utworzonego.cs
pliku.Ten kod zawsze jest drukowany
Hello
, ponieważ jest to domyślny zasób i nie są dostępne zasoby specyficzne dla języka:Teraz dodaj nowy zasób specyficzny dla języka:
strings.fr.resx
(dla francuskiego)Hello
, wartośćSalut
)Drukuje się następujący kod
Salut
:Z jakiego zasobu korzysta się, zależy
Thread.CurrentThread.CurrentUICulture
. Ustawia się go w zależności od ustawień języka interfejsu użytkownika systemu Windows lub można ustawić ręcznie, jak w tym przykładzie. Dowiedz się więcej o tym tutaj .Możesz dodać zasoby specyficzne dla kraju, takie jak
strings.fr-FR.resx
lubstrings.fr-CA.resx
.Ciąg, który ma zostać użyty, jest ustalany w następującej kolejności:
strings.fr-CA.resx
strings.fr.resx
strings.resx
Pamiętaj, że zasoby specyficzne dla języka generują zespoły satelitarne .
Dowiedz się również, czym się
CurrentCulture
różni odCurrentUICulture
tego .źródło
W moim przypadku
w AssemblyInfo.cs uniemożliwił normalne działanie.
źródło
Oprócz odpowiedzi @Eric Bole-Feysot :
Dzięki zespołom satelitarnym można tworzyć lokalizację na podstawie plików .dll / .exe . Tą drogą:
Istnieje mało znane narzędzie o nazwie LSACreator (bezpłatne do niekomercyjnego użytku lub opcji zakupu), które umożliwia tworzenie lokalizacji na podstawie plików .dll / .exe. W rzeczywistości wewnętrznie (w katalogu projektu językowego) tworzy / zarządza zlokalizowanymi wersjami plików resx i kompiluje zespół w podobny sposób, jak opisał @Eric Bole-Feysot .
źródło
ResourceManager i .resx są nieco niechlujne.
Możesz użyć Lexical.Localization ¹, który pozwala na osadzenie wartości domyślnych i wartości specyficznych dla kultury w kodzie, i może zostać rozszerzony w zewnętrznych plikach lokalizacyjnych dla późniejszych kultur (takich jak .json lub .resx).
¹ (jestem opiekunem tej biblioteki)
źródło
Zasadniczo umieszczasz swoje tłumaczenia w plikach zasobów, np. Resources.resx.
Każda konkretna kultura ma inną nazwę, np. Resources.nl.resx, resources.fr.resx, resources.de.resx,…
Teraz najważniejszą częścią rozwiązania jest utrzymanie tłumaczeń. W Visual Studio zainstaluj narzędzie Microsoft MAT: Multilingual App Toolkit (MAT). Działa z winforms, wpf, asp.net (core), uwp,…
Ogólnie, np. Dla rozwiązania WPF, w projekcie WPF
[assembly: System.Resources.NeutralResourcesLanguage("en")]
Zobaczysz, że zostanie utworzony nowy folder o nazwie „MultilingualResources” zawierający
....nl.xlf
plik.Jedyne, co musisz teraz zrobić, to:
(pliki .xlf powinny otwierać się za pomocą „Multilingual Editor”, jeśli tak nie jest, kliknij prawym przyciskiem myszy plik .xlf, wybierz „Otwórz za pomocą…” i wybierz „Multilingual Editor”.
Baw się dobrze! teraz możesz także zobaczyć to, co nie zostało przetłumaczone, wyeksportować tłumaczenia w formacie xlf do zewnętrznych biur tłumaczeń, zaimportować je ponownie, przetłumaczyć tłumaczenia z innych projektów itp.
Więcej informacji:
źródło