Jak korzystać z lokalizacji w C#

Wydaje mi się, że lokalizacja nie działa.

Mam bibliotekę klasową. Teraz chcę utworzyć tam pliki resx i zwrócić pewne wartości bazujące na kulturze wątków.

Jak mogę to zrobić?

Author: Otiel, 2009-07-17

7 answers

  • Dodaj plik zasobów do swojego projektu (możesz go nazwać " strings.resx") wykonując następujące czynności:
    Kliknij prawym przyciskiem myszy Właściwościw projekcie wybierz Dodaj- > nowy element... w menu kontekstowym, następnie na liście Visual C# Items wybierz "resources file" i nazwij go strings.resx.
  • Dodaj łańcuch resouce w pliku resx i nadaj mu dobrą nazwę (przykład: nazwij go "Hello" i nadaj mu wartość "Hello")
  • Zapisz plik zasobu ( uwaga: będzie to plik źródłowy domyślny, ponieważ nie ma dwuliterowego kodu językowego)
  • Dodaj referencje do swojego programu: System.Threading i System.Globalization

Uruchom ten kod:

Console.WriteLine(Properties.strings.Hello);

Powinno być napisane "Hello".

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ńcuchowy o tej samej nazwie, co w łańcuchach.resx, ale z wartością w języku francuskim (Name= " Hello", Value= "Salut"). Teraz, jeśli uruchomisz następujący kod, powinien on wydrukować Salut:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);

Dzieje się tak, że system będzie szukał zasobu dla "fr-FR". Nie znajdzie żadnego(ponieważ podaliśmy" fr"w Twoim pliku"). Następnie powróci do sprawdzania "fr", które znajduje (i używa).

Następujący kod wydrukuje "Hello":

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);

To dlatego, że nie znajduje żadnego zasobu "en-US", a także nie ma zasobu "en", więc powróci do domyślnego, który to ten, który dodaliśmy od początku.

W razie potrzeby można tworzyć pliki z bardziej konkretnymi zasobami(na przykład strings. fr-FR.resx i strings.fr-CA. resx dla języka francuskiego odpowiednio we Francji i Kanadzie). W każdym takim Pliku będziesz musiał dodać zasoby dla tych ciągów znaków, które różnią się od zasobu, do którego miałby wrócić. Więc jeśli tekst jest taki sam we Francji i Kanadzie, można umieścić go w strings. fr. resx, podczas gdy struny, które są różne w kanadyjskim francuskim może przejść do strings.fr-CA. resx.

 516
Author: Fredrik Mörk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 14:48:32

To całkiem proste. Utwórz nowy plik zasobów, na przykład Strings.resx. Ustaw Access Modifier na Public. Użyj odpowiedniego szablonu pliku, więc Visual Studio automatycznie wygeneruje klasę dostępową(w tym przypadku nazwa będzie Strings). To jest Twój domyślny język.

Teraz, gdy chcesz dodać, powiedzmy, niemiecką lokalizację, dodaj zlokalizowany plik resx. W tym przypadku będzie to typowo Strings.de.resx. Jeśli chcesz dodać dodatkową lokalizację dla np. Austrii, dodatkowo utworzysz a Strings.de-AT.resx.

Teraz Utwórz łańcuch-powiedzmy łańcuch o nazwie HelloWorld. W Strings.resx dodaj ten ciąg o wartości " Hello, world!". W Strings.de.resx Dodaj "Hallo, Welt!". I w Strings.de-AT.resx Dodaj "Servus, Welt!". Na razie tyle.

Teraz masz wygenerowaną klasę Strings i ma ona właściwość z getterem HelloWorld. Zdobycie tej nieruchomości spowoduje załadowanie " Servus, Welt!"kiedy twoje miejsce jest de-AT," Hallo, Welt! gdy twoim locale jest dowolny inny de locale (w tym de-DE I de-CH), oraz "Witaj, Świecie!"gdy Twoja lokalizacja jest czymś innym. Jeśli brakuje ciągu znaków w wersji zlokalizowanej, Menedżer zasobów automatycznie przejdzie w górę łańcucha, od najbardziej wyspecjalizowanego do niezmiennego zasobu.

Możesz użyć klasy ResourceManager, aby uzyskać większą kontrolę nad tym, jak dokładnie ładujesz rzeczy. Generowana klasa Strings również z niej korzysta.

 35
Author: OregonGhost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 16:26:44

Świetna odpowiedź F. mörka. Ale jeśli chcesz zaktualizować tłumaczenie lub dodać nowe języki po wydaniu aplikacji, utknąłeś, ponieważ zawsze musisz przekompilować go, aby wygenerować zasoby.dll.

Oto rozwiązanie, aby ręcznie skompilować bibliotekę DLL zasobów. Używa resgen.exe i Al.narzędzia exe (instalowane z sdk).

Powiedzmy, że masz plik zasobów Strings.fr. resx, możesz skompilować bibliotekę DLL zasobów z następującej partii:

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ć oryginalna przestrzeń nazw w nazwach plików (tutaj "WpfRibbonApplication1")

 14
Author: Eric Bole-Feysot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-18 09:24:22

W dodatku @Fredrik Mörk ' s great answer on strings, aby dodać localization do formularza wykonaj następujące czynności:

  • ustaw właściwośćformularza "Localizable" na true
  • zmień właściwość formularza Language na język, który chcesz (z ładnego rozwijanego z nimi wszystkimi w)
  • Przetłumacz kontrolki w tej formie i przenieś je w razie potrzeby (squash te naprawdę długie pełne Francuskie zdania!)

This MSDN article on Localizing Windows Formularze dają więcej informacji na ten temat.

 14
Author: noelicus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-30 21:39:45

A fix and elaboration of @Fredrik Mörk answer.

  • Dodaj plik zasobu Strings.resx do projektu (lub inną nazwę pliku)
  • Ustaw Access Modifier na Public (w otwartej karcie pliku Strings.resx)
  • Dodaj resouce łańcucha w pliku resx: (przykład: nazwa Hello, wartość Hello)
  • Zapisz plik zasobów

Visual Studio automatycznie generuje odpowiednią klasę Strings, która jest faktycznie umieszczona w Strings.Designer.cs. Klasa jest w tej samej przestrzeni nazw, co Ty oczekuje, że nowo utworzony plik .cs zostanie umieszczony w.

Ten kod zawsze drukuje Hello, ponieważ jest to domyślny zasób i żadne zasoby specyficzne dla języka nie są dostępne:

Console.WriteLine(Strings.Hello);

Teraz Dodaj nowy zasób specyficzny dla języka:

  • Dodaj Strings.fr.resx (dla francuskiego)
  • Dodaj łańcuch o tej samej nazwie co poprzednio, ale innej wartości: (Nazwa Hello, wartość Salut)

Następujący kod drukuje Salut:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Strings.Hello);

Jaki zasób jest używany zależy na Thread.CurrentThread.CurrentUICulture. Jest on ustawiany w zależności od ustawień języka interfejsu systemu Windows lub może być ustawiony ręcznie, jak w tym przykładzie. Dowiedz się więcej o tym tutaj .

Możesz dodać zasoby specyficzne dla danego kraju, takie jak Strings.fr-FR.resx lub Strings.fr-CA.resx.

Używany ciąg znaków jest określony w tej kolejności priorytetów:

  • Z zasobów specyficznych dla danego kraju, takich jak Strings.fr-CA.resx
  • Z zasobów specyficznych dla języka, takich jak Strings.fr.resx
  • from default Strings.resx

Zauważ, że specyficzny dla języka zasoby generują zespoły satelitarne .

Dowiedz się także, Jak CurrentCulture różni się od CurrentUICulture tutaj .

 8
Author: Andrey Moiseev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:27

Oprócz @Eric Bole-Feysot Odpowiedź:

Dzięki zestawom satelitarnym, lokalizacje mogą być tworzone w oparciu o .dll/.pliki exe. W ten sposób:

  • kod źródłowy (vs project) może być oddzielony od projektu językowego,
  • dodanie nowego języka nie wymaga rekompilacji projektu,
  • tłumaczenie może być wykonane nawet przez użytkownika końcowego.

Istnieje mało znane narzędzie o nazwie LSACreator (darmowy dla niekomercyjnych use or buy option), która pozwala na tworzenie lokalizacji na podstawie .dll/.pliki exe. W rzeczywistości, wewnętrznie (w katalogu projektu językowego) tworzy/zarządza zlokalizowanymi wersjami plików resx i kompiluje assembly w podobny sposób jak opisano @Eric Bole-Feysot.

 0
Author: Tomasz Malik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-11 00:17:15

W moim przypadku

[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]

W AssemblyInfo.cs uniemożliwił działanie jak zwykle.

 0
Author: Aleksandr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 07:16:00