Witam!
Otóż, chciałbym się was zapytać czy znacie jakiś dobry sposób na pisanie wielojęzycznej aplikacji. Chcę o tym pomyśleć nim zacznę cokolwiek tworzyć, aby potem nie było problemu.
Wbudowany "system" w Visualu ogranicza się chyba tylko do przycisków itp. A ja chciałbym aby wszystko w programie było przetłumaczalne.
Myślałem o tym aby w programie po prostu wszędzie gdzie jest jakiś tekst używać zmiennych, a wraz ze zmianą języka wczytywać do tych zmiennych odpowiednie teksty. Ale właśnie, skąd je wczytywać ? :) Szukałem czy są jakieś darmowe gotowe systemy, ale nie znalazłem nic ciekawego.
Proszę o pomoc ;)
- Rejestracja:ponad 13 lat
- Ostatnio:około miesiąc
- Postów:51
- Rejestracja:prawie 12 lat
- Ostatnio:ponad 6 lat
- Postów:149
Możesz albo zwykłe pliki txt i stworzyć funkcję , która będzie dopisywać do zmiennej tłumaczenie. Lub pliczek dll.

- Rejestracja:około 17 lat
- Ostatnio:2 dni
- Lokalizacja:Wrocław
Przecież wszystko jest wbudowane we framework, możliwości globalizacji interfejsu użytkownika są wystarczające.
Ustawiasz we właściwościach formatek Localizable
na true
, tworzysz sobie pliki zasobów (resx) dla poszczególnych kultur (pl-PL, en-US, itd.), i aplikacja uruchamia się z zasobami dopasowanymi do języka ustawionego w systemie.
Hint dla Google: "windows forms globalization"
- Rejestracja:około 13 lat
- Ostatnio:około 14 godzin
- Postów:22
Przekazujesz argument do konstruktora okienka komunikatu w postaci "pl-PL" i w konstruktorze okienka:
konstruktor(string lang) {
Thread.CurrentThread.CurrentUICulture=new CultureInfo(lang);
}
i aplikujesz z plikow resource napisy do kontrolek.
Czyli, gdy masz utworzony plik resource o nazwie np string i string.pl
textBox.Text=string.Hello;
Hello to nazwa wartości w pliku resource.
Tu masz część wytłumaczone:
http://stackoverflow.com/questions/1142802/how-to-use-localization-in-c-sharp
Tu jest część mojego kodu odpowiedzialnego za zmiane języka na głównej formatce:
private void changeLang(string lang)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
if (Saved)
Saved = true;
else
Saved = false;
ComponentResourceManager res = new ComponentResourceManager(typeof(MainWindow));
foreach (ToolStripItem item in menuStrip.Items)
{
res.ApplyResources(item, item.Name, new CultureInfo(lang));
ToolStripMenuItem submenu = item as ToolStripMenuItem;
if (submenu != null)
foreach (ToolStripItem subitem in submenu.DropDownItems)
{
if (subitem is ToolStripMenuItem)
res.ApplyResources(subitem, subitem.Name, new CultureInfo(lang));
}
}
foreach (ToolStripButton tsb in toolStrip.Items)
res.ApplyResources(tsb, tsb.Name, new CultureInfo(lang));
foreach (ToolStripItem item in contextMenuStrip.Items)
res.ApplyResources(item, item.Name, new CultureInfo(lang));
}
Jak chcesz mogę ci dać cały projekt, bo sporo rzeczy w nim lokalizowałem. Np. zobaczysz też jak zlokalizować ustawienia.



- Rejestracja:około 17 lat
- Ostatnio:2 dni
- Lokalizacja:Wrocław
Uściślę trochę teraz:
- Dla elementów GUI (np. labeli) znajdujących się na
Form1
tworzą się odpowiednie wpisy w plikuForm1.resx
. Zasoby z tego pliku zostaną użyte, jeśli język systemu nie będzie pasował do żadnego języka obsługiwanego przez aplikację. My musimy zrobić jedynie pliki innych języków, np.:Form1.pl-PL.resx
,Form1.en-US.resx
i tam nadpisać wartości zForm1.resx
. Nadpisać wartości, czyli dodać zasoby o takiej samej nazwie. - Dla innych tekstów (czyli np. treści komunikatów) tworzymy plik zasobów np.
TextResources.resx
, robimy w nim wpisy "domyślne", które następnie nadpisujemy wTextResources.pl-PL.resx
iTextResources.en-US.resx
. W kodzie aplikacji odwołujemy się do nich po prostu tak:
MessageBox.Show(TextResources.SuperExtraMessageName);
- Rejestracja:ponad 13 lat
- Ostatnio:około miesiąc
- Postów:51
Znalazłem chyba łatwiejszy sposób: http://www.codeproject.com/Articles/15248/Globalization-of-Windows-Applications-in-20-Minute
Tylko niestety jest jakiś problem. Korzystam z Visual C# 2010. Jeśli próbuję skompilować chociażby przykład dołączony do artykułu to nie działa i wywala błąd przy:
label1.Text=rm.GetString("0001");
Wiecie jak to pozmieniać aby działało w VS 2010 (autor korzystał chyba z 2003) ?

- Rejestracja:ponad 13 lat
- Ostatnio:około miesiąc
- Postów:51
Ok, odkryłem łatwość waszego sposobu :). Rozumiem, że program automatycznie wykrywa język ustawiony w systemie. Chciałbym jednak dać też możliwość manualnej zmiany języka.
Udaje mi się zmienić język tylko jeśli dam
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
przed InitializeComponent();
Korzystając z "Properties" zrobiłem tak, że zapisuje wybrany język w ustawieniach i przy tworzeniu okna go wczytuje. Nie wiem jednak jak zabrać się za "dynamiczną" zmianę tego języka.
Jeśli chodzi o zmienne z TextResources to kompletnie nie wiem dlaczego, ale da się je zmienić tylko raz w trakcie trwania programu :) .
edit:
ok znalazłem rozwiązanie:
```csharp
foreach (Control c in this.Controls)
{
ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
resources.ApplyResources(c, c.Name, new CultureInfo("en-US"));
}
Dzięki za pomoc :)
- Rejestracja:ponad 13 lat
- Ostatnio:około miesiąc
- Postów:51
Sorki za trzeciego posta z rzędu, ale mam jeszcze jedno pytanko. Nie jest dla mnie ważne rozgraniczanie na regionalne "wersje" danego języka i wystarczy mi np. samo "en". Czy będzie to miało jakieś negatywne skutki przy automatycznym rozpoznawaniu języka? Czy niezależnie czy ktoś jest z USA, Australii czy Wielkiej Brytanii będą mu się ładować stringi "en" ?