Wielojęzyczna Aplikacja - Windows Forms

0

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 ;)

0

Możesz albo zwykłe pliki txt i stworzyć funkcję , która będzie dopisywać do zmiennej tłumaczenie. Lub pliczek dll.

1

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"

0

A co z np. z okienkami komunikatów ?

0

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.

0

Uściślę trochę teraz:

  1. Dla elementów GUI (np. labeli) znajdujących się na Form1 tworzą się odpowiednie wpisy w pliku Form1.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 z Form1.resx. Nadpisać wartości, czyli dodać zasoby o takiej samej nazwie.
  2. 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 w TextResources.pl-PL.resx i TextResources.en-US.resx. W kodzie aplikacji odwołujemy się do nich po prostu tak:
MessageBox.Show(TextResources.SuperExtraMessageName);
0

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) ?

0

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 :)

0

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" ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1