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ć?
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ć?
Odpowiedzi:
strings.resx
.System.Threading
iSystem.Globalization
Uruchom ten kod:
Console.WriteLine(Properties.strings.Hello);
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:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);
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”:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.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.
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
. Ustaw Access Modifier
na Public
. 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 utworzysz Strings.de-AT.resx
.
Teraz stwórz ciąg - powiedzmy ciąg z nazwą HelloWorld
. W swoim Strings.resx
dodaj ten ciąg o wartości „Witaj, świecie!”. W Strings.de.resx
dodaj „Cześć, Welt!”. I Strings.de-AT.resx
dodaj „Servus, Welt!”. To wszystko na razie.
Teraz masz wygenerowaną Strings
klasę i ma ona właściwość z geterem HelloWorld
. 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. Generowana Strings
klasa również z niej korzysta.
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)
Ś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ą:
resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources
Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll"
del WpfRibbonApplication1.Strings.fr.resources
pause
Pamiętaj, aby zachować oryginalną przestrzeń nazw w nazwach plików (tutaj „WpfRibbonApplication1”)
Poprawka i opracowanie odpowiedzi @Fredrik Mörk .
strings.resx
plik zasobów do swojego projektu (lub inną nazwę pliku)Access Modifier
na Public
(w strings.resx
zakładce otwartego pliku)Hello
, wartość Hello
)Program Visual Studio automatycznie generuje odpowiednią strings
klasę, która jest faktycznie umieszczana strings.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:
Console.WriteLine(strings.Hello);
Teraz dodaj nowy zasób specyficzny dla języka:
strings.fr.resx
(dla francuskiego)Hello
, wartość Salut
)Drukuje się następujący kod Salut
:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(strings.Hello);
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
lub strings.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 od CurrentUICulture
tego .
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 .
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).
public class MyClass
{
/// <summary>
/// Localization root for this class.
/// </summary>
static ILine localization = LineRoot.Global.Type<MyClass>();
/// <summary>
/// Localization key "Ok" with a default string, and couple of inlined strings for two cultures.
/// </summary>
static ILine ok = localization.Key("Success")
.Text("Success")
.fi("Onnistui")
.sv("Det funkar");
/// <summary>
/// Localization key "Error" with a default string, and couple of inlined ones for two cultures.
/// </summary>
static ILine error = localization.Key("Error")
.Format("Error (Code=0x{0:X8})")
.fi("Virhe (Koodi=0x{0:X8})")
.sv("Sönder (Kod=0x{0:X8})");
public void DoOk()
{
Console.WriteLine( ok );
}
public void DoError()
{
Console.WriteLine( error.Value(0x100) );
}
}
¹ (jestem opiekunem tej biblioteki)
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: