Wielojęzykowość w programie.

dział ogólny

Wielojęzykowość w programie.

Nowy postprzez esmet » Å›roda, 7 wrzeÅ›nia 2011, 07:38

Witam.
Szef dał mi za zadanie w jakiś sposób wprowadzić opcję w programie, aby ten miał możliwość zmiany języka. Tak jak w wielu programach. Czy ma może ktoś z was jakieś pomysły, albo rady jak to zrobić i jakie mogą być pomocne elementy do rozwiązania tego problemu??
Z góry dzięki za pomoc.
Avatar użytkownika
esmet
Bladawiec
Bladawiec
 
Posty: 18
Dołączył(a): piątek, 29 lipca 2011, 13:25
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: windows XP Home Edition SP3
Kompilator: Embarcadero RAD Studio 2010 Professional.
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez Cyfrowy Baron » Å›roda, 7 wrzeÅ›nia 2011, 09:15

Musisz po zmianie języka zmieniać etykiety komponentów, czyli musisz w zasobach np. programu lub w jakimś pliku przechowywać dla każdego komponentu posiadającego etykietę jej nazwę dla każdego języka. Taki spis etykiet można zbudować na bazie plików *.INI.

Swego czasu stworzyłem komponent TLangcb ułatwiający tworzenie komponentów w różnych wersjach językowych. Komponent został stworzony dla środowiska C++Builder 6, więc jest już mocno przestarzały, ale modyfikując pliki Langcb.cpp i Langcb.h można go bez problemu przystosować do każdej wersji środowiska. Paczka instalacyjna PackLangcb.* jest przystosowana do C++Builder 6 i w innych wersjach się nie zainstaluje, trzeba więc stworzyć nową paczkę i włączyć do niej pliki Langcb.cpp i Langcb.h.

Czytaj o komponencie TLangcb: http://programowanie.cal.pl/cyfbar/components/lang/lang.htm



Pobierz komponent:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
esmet
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez esmet » Å›roda, 7 wrzeÅ›nia 2011, 14:53

Wielkie dzięki.
A czy można za pomocą tego komponentu przechwytywać np. wiadomości z messagebox'a i je też tłumaczyć??
Avatar użytkownika
esmet
Bladawiec
Bladawiec
 
Posty: 18
Dołączył(a): piątek, 29 lipca 2011, 13:25
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: windows XP Home Edition SP3
Kompilator: Embarcadero RAD Studio 2010 Professional.
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez Cyfrowy Baron » czwartek, 8 wrzeÅ›nia 2011, 07:55

Nie można. Komponent nie został do tego przystosowany. Komunikaty możesz przechowywać w plikach na podobnych zasadach, po prosty po wybraniu wersji językowej programu wszystkie komunikaty wyświetlane przez program zostaną wczytane z odpowiedniego pliku językowego.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez Cyfrowy Baron » czwartek, 8 wrzeÅ›nia 2011, 08:00

Zapoznaj się z poradą: serwis Cyfrowy Baron dział: porady -> różne -> Tworzenie tablicy łańcuchów znaków i umieszczenie jej w zasobach programu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez esmet » czwartek, 8 wrzeÅ›nia 2011, 08:08

OK, zapoznam siÄ™.
Avatar użytkownika
esmet
Bladawiec
Bladawiec
 
Posty: 18
Dołączył(a): piątek, 29 lipca 2011, 13:25
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: windows XP Home Edition SP3
Kompilator: Embarcadero RAD Studio 2010 Professional.
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez esmet » piÄ…tek, 9 wrzeÅ›nia 2011, 11:38

mam jedno pytanie, czy to może ja coś źle robię, czy może po prostu się nie da zastosować tego komponentu dla dużej ilości formatek (dochodzę jakoś do 14, a jest 46). Może coś źle robię, a może trzeba te komponenty ustawiać tak, aby wskazywały na siebie bezpośrednio w sposób w jaki includowane są poszczególne nagłówki(w takiej samej kolejności.)?
Avatar użytkownika
esmet
Bladawiec
Bladawiec
 
Posty: 18
Dołączył(a): piątek, 29 lipca 2011, 13:25
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: windows XP Home Edition SP3
Kompilator: Embarcadero RAD Studio 2010 Professional.
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez Cyfrowy Baron » piÄ…tek, 9 wrzeÅ›nia 2011, 12:16

Tworzenie programu wielojęzykowego z wieloma formularzami.

Jeżeli tworzymy aplikację wielojęzykową na którą składa się wiele formularzy, to zaczynamy od tego, że na każdym formularzu umieszczamy jeden (tylko jeden) komponent Langcb1, następnie w komponencie Langcb1 znajdującym się na pierwszym, a więc głównym formularzu we właściwości 'LangList' tworzymy listę językową tak jak to zostało opisane wyżej, gdy lista jest już gotowa przystępujemy do szeregowego łączenia ze sobą wszystkich komponentów. Załóżmy, że mamy aplikację składającą się z 4 formularzy, Form1 - główny; Form2; Form3 i Form4. Na każdym formularzu umieściliśmy po jednym komponencie Langcb1, najpierw w plikach źródłowych dla każdego formularza (Unit1.cpp; Unit2.cpp; Unit3.cpp i Unit4.cpp) w sekcji include umieszczamy odwołanie do pozostałych formularzy, czyli w każdym pliku źródłowym powinien znaleźć się następujący wpis:

#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Unit4.h"

To jest ważne ponieważ formularze, a co za tym idzie komponenty Langcb1 "muszą o sobie wiedzieć". Gdy zostanie to już zrobione zapisujemy projekt, a następnie przechodzimy do komponentu Langcb1 znajdującego się na formularzu Form1 i w jego właściwości 'OtherLangcb' wybieramy 'Form2->Langcb1' (wybieramy nie wpisujemy) łącząc w ten sposób Langcb1 z Form1 z komponentem Langcb1 z Form2, jeśli na liście wyboru nie ma podanego wpisu to znaczy, że zapomnieliśmy połączyć ze sobą pliki źródłowe poprzez sekcję include. Następnie przechodzimy do komponentu Langcb1 znajdującego się na formularzu Form2 i w jego właściwości 'OtherLangcb' wybieramy 'Form3->Langcb1', potem przechodzimy do komponentu Langcb1 znajdującego się na formularzu Form3 i w jego właściwości 'OtherLangcb' wybieramy 'Form4->Langcb1', ostatniego komponentu Langcb1 znajdującego się na formularzu Form4 nie łączymy z niczym, w żadnym razie nie podłączamy go pod 'Form1->Langcb1', ani pod żaden inny komponent typu TLangcb, ponieważ spowodowałoby to zapętlenie programu, a w efekcie jego zawieszenie. Jest to klasyczne połączenie szeregowe, tworzące łańcuch w którym komponent Langcb1 znajdujący się na Form1 automatycznie steruje pozostałymi komponentami, komponent znajdujący się na końcu łańcucha nie jest do niczego podłączany.

Po połączeniu komponentów musimy jeszcze zaktualizować właściwości 'LangList' we wszystkich komponentach by były identyczne jak w komponencie znajdującym się na początku łańcucha, czyli w Langcb1 znajdującym się na formularzu głównym Form1. Podczas podłączania do siebie komponentów listy językowe (właściwość 'LangList') powinna kopiować się z pierwszego komponentu, ale należy to sprawdzić, ponieważ jeśli pomyliliśmy kolejności łączenia, to lista się nie przekopiuje i wtedy należy ją przekopiować ręcznie z pierwszego komponentu.

UWAGA!
Listy językowe - właściwość 'LangList' muszą być identyczne we wszystkich komponentach.
Pierwszym komponentem jest zawsze ten znajdujący się na początku łańcucha.
Komponenty nie mogą wzajemnie się do siebie odwoływać, czyli komponent Langcb1 z formularza Form1 może się odwoływać do komponentu Langcb1 z formularza Form2, ale wtedy komponent Langcb1 z formularza Form2 nie może się odwoływać do komponentu Langcb1 z formularza Form1.
Ostatni komponent w łańcuchy nie może się odwoływać do żadnego innego komponentu.

Po szeregowym połączeniu ze sobą komponentów postępujemy dalej tak samo jak przy tworzeniu aplikacji z jednym formularzem, czyli programujemy tylko pierwszy komponent Langcb1 i to on będzie sterował pozostałymi komponentami znajdującymi się na innych formularzach.
Przy takim połączeniu zmiana języka na formularzu Form1 powoduje równoczesną zmianę języków na pozostałych formularzach.



W aplikacji z wieloma formularzami język jest zmieniany tylko na formularzu głównym.

Sprawdź połączenia we wszystkich komponentach, na wszystkich formularzach, zwróć uwagę na to, czy gdzieś nie występuje przerwa w połączeniu łańcucha, następnie sprawdź czy we wszystkich komponentach Langcb na wszystkich formularzach listy językowe umieszczone we właściwości LangList są identyczne.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez esmet » piÄ…tek, 9 wrzeÅ›nia 2011, 12:26

Ok,a można np. w stworzonym przez siebie nagłówku, umieścić po prostu te wszystkie includy, bo trochę nie ciekawie to będzie wyglądało jak w 46(tych które mają formatki) plikach .cpp będzie 46 includów??
Avatar użytkownika
esmet
Bladawiec
Bladawiec
 
Posty: 18
Dołączył(a): piątek, 29 lipca 2011, 13:25
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: windows XP Home Edition SP3
Kompilator: Embarcadero RAD Studio 2010 Professional.
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez Cyfrowy Baron » sobota, 10 wrzeÅ›nia 2011, 09:33

Problem ogranicza się do tego, że wszystkie formularze muszą "wiedzieć" o sobie nawzajem. Jeżeli więc stworzysz jeden plik zawierający te nagłówki i włączysz ten plik do każdego z 46 formularzy to powinno zadziałać. Komponent i tak nie czyta tych nagłówków.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez esmet » poniedziaÅ‚ek, 12 wrzeÅ›nia 2011, 07:30

Ok, to z 1 plikiem nagłówkowym się sprawdzi, ale co mam zrobić, jeśli nie widzi mi sporej części plików(chodzi o wybór OtherLangcb). Mam komponent w pliku, który nie jest widziany, przez inne komponenty, ale sam te inne komponenty widzi.Wszystko jest połączone w poprawny sposób sekcją include. Czy można kilkoma komponentami wskazywać na jeden w przypadku np. jeżeli te komponenty nie wskazywałyby już na żadne inne.
Avatar użytkownika
esmet
Bladawiec
Bladawiec
 
Posty: 18
Dołączył(a): piątek, 29 lipca 2011, 13:25
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: windows XP Home Edition SP3
Kompilator: Embarcadero RAD Studio 2010 Professional.
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez esmet » poniedziaÅ‚ek, 12 wrzeÅ›nia 2011, 07:54

Dlaczego nawet w małych nowo stworzonych projektach(4 formatki i parę buttonów) podczas kompilacji wywala access violation?
Avatar użytkownika
esmet
Bladawiec
Bladawiec
 
Posty: 18
Dołączył(a): piątek, 29 lipca 2011, 13:25
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: windows XP Home Edition SP3
Kompilator: Embarcadero RAD Studio 2010 Professional.
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 12 wrzeÅ›nia 2011, 11:54

http://programowanie.cal.pl/cyfbar/components/lang/lang.htm napisał(a):UWAGA!
Listy językowe - właściwość 'LangList' muszą być identyczne we wszystkich komponentach.
Pierwszym komponentem jest zawsze ten znajdujący się na początku łańcucha.
Komponenty nie mogą wzajemnie się do siebie odwoływać, czyli komponent Langcb1 z formularza Form1 może się odwoływać do komponentu Langcb1 z formularza Form2, ale wtedy komponent Langcb1 z formularza Form2 nie może się odwoływać do komponentu Langcb1 z formularza Form1.
Ostatni komponent w łańcuchy nie może się odwoływać do żadnego innego komponentu.


Błąd access violation mogą wywoływać jakieś komponenty znajdujące się na którymś formularzu, gdyż komponent wylicza wszystkie komponenty. Komponent współpracuje tylko z komponentami dziedziczącymi po TWinControl, być może masz jakiś nietypowy komponent na formularzu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wielojęzykowość w programie.

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 12 wrzeÅ›nia 2011, 15:39

Komponent TLangcb stworzyłem na potrzeby jednego programu i to w dodatku dla środowiska C++Builder 6. Nigdy nie testowałem go w innych środowiskach. Kod komponentu jest jawny i możesz go dowolnie modyfikować.

Do tak dużej aplikacji potrzebujesz bardziej zaawansowanego komponentu jak np. TsiLang 6.5.3.

Strona komponentu: http://www.sicomponents.com/tsilang1.html
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Google [Bot] i 3 gości