TN057: lokalizacja składników MFC
[!UWAGA]
Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.
Uwaga Ta opisano niektóre projekty i procedury, których można użyć do zlokalizowania składnika, jeśli to kontrolować aplikacji lub OLE lub biblioteki DLL, która używa MFC.
Omówienie
Naprawdę są dwa problemy, aby rozwiązać kiedy lokalizacji elementu, który używa biblioteki MFC.Po pierwsze, trzeba przetłumaczyć własnych zasobów — ciągów, okien dialogowych i innych zasobów, które są specyficzne dla danego składnika.Większość składników zbudowany przy użyciu biblioteki MFC również obejmują i użyć liczby zasobów, które są definiowane przez MFC.Musisz podać również zlokalizowanych zasobów MFC.Na szczęście kilku językach są już udostępniane przez sam MFC.
Ponadto składnik powinna być przygotowana do uruchomienia w swoim środowisku docelowym (Europejskie lub funkcję Środowisko).W większości zależy to aplikacja poprawnie traktowanie znaków z ustawionym bitem wysoki i obsługi ciągów zawierające znaki dwubajtowe.MFC jest włączona, domyślnie dla obu tych środowiskach takich, że jest możliwe, że jeden na całym świecie pliku binarnego, który jest używany na wszystkich platformach z tylko różne zasoby podłączony w czasie instalacji.
Lokalizowanie zasobów danego składnika
Lokalizowanie aplikacji lub biblioteka DLL powinny obejmować tylko zastąpienie zasobów z zasobami, które odpowiadają języka docelowego.W przypadku własnych zasobów, jest stosunkowo prosta: edytowanie zasobów w edytorze zasobów i budowanie aplikacji.Jeśli kod jest napisane poprawnie, nie będzie żadnych ciągów lub tekst, który chcesz zlokalizować zakodowane do kodu źródłowego języka C++ — wszystkich lokalizacji jest możliwe po prostu zmieniając zasobów.W rzeczywistości takie, że dostarczanie wszystkich zlokalizowanych wersji nawet niepowodujący kompilacji oryginalnego kodu można zaimplementować składnika.To jest bardziej złożony, ale warto jest i jest przyjętym dla MFC sam.Jest również możliwe do zlokalizowania aplikacji przez załadowanie pliku EXE lub DLL do edytora zasobów i bezpośrednie edytowanie zasobów.O ile możliwe to wymaga ponownego tych zmian każdorazowo w przypadku tworzenia nowej wersji aplikacji.
Jednym ze sposobów uniknięcia, który jest odnalezienie wszystkich zasobów w oddzielnych DLL, czasami nazywane towarzyszącej biblioteki DLL.Ten plik DLL jest następnie ładowany dynamicznie w czasie wykonywania i zasoby są ładowane z tej biblioteki DLL zamiast z modułu głównego z cały kod.MFC bezpośrednio obsługuje tego podejścia.Należy wziąć pod uwagę aplikacji o nazwie MOJAAPLIKACJA.EXE; może mieć wszystkich jego zasobów znajdujących się w bibliotece DLL, o nazwie MYRES.DLL.W aplikacji InitInstance będzie wykonywać następujące czynności, aby załadować tego pliku DLL i powodować MFC załadować zasobów z tej lokalizacji:
CMyApp::InitInstance()
{
// one of the first things in the init code
HINSTANCE hInst = LoadLibrary("myres.dll");
if (hInst != NULL)
AfxSetResourceHandle(hInst);
// other initialization code would follow
.
.
.
}
Następnie od MFC będzie ładować zasoby z tej biblioteki DLL zamiast z myapp.exe.Wszystkie zasoby, jednak musi znajdować się w tej bibliotece DLL; MFC nie odnajdzie wystąpienie aplikacji w poszukiwaniu danego zasobu.Ta technika ma zastosowanie równie dobrze regularnych biblioteki dll, a także formanty OLE.Twój program instalacyjny czy kopiować odpowiednią wersję programu MYRES.DLL w zależności od ustawień regionalnych zasobów, które użytkownik chciałby.
Stosunkowo łatwo utworzyć zasób biblioteki DLL.Tworzenie projektu biblioteki DLL, Dodaj użytkownika.RC plik do niego i dodać niezbędne zasoby.Jeżeli masz istniejący projekt, który nie korzysta z tej techniki, można skopiować zasoby z tego projektu.Po dodaniu pliku zasobów do projektu, jesteś już prawie gotowe do budowania projektu.Jedyne co musi zrobić jest ustawić opcje dołączania linker /NOENTRY.Informuje program łączący że biblioteka DLL nie ma wpisu punktu — ponieważ nie ma on żadnego kodu, to nie ma wpisu punktu.
[!UWAGA]
Edytor zasobów w Visual C++ 4.0 i nowszej obsługuje wiele języków na.Plik RC.Może to jej bardzo łatwe w zarządzaniu swoimi lokalizacji w jednym projekcie.Zasoby dla poszczególnych języków są kontrolowane przez dyrektywy preprocesora generowane przez Edytor zasobów.
Za pomocą podanych MFC zlokalizowane zasoby
Dowolnej aplikacji MFC, skompiluj ponownie używa dwóch rzeczy z MFC: kod i zasoby.Oznacza to MFC ma różne komunikaty o błędach, wbudowanych oknach dialogowych i innych zasobów, które są używane przez klas MFC.Aby całkowicie lokalizacji aplikacji, musisz zlokalizować nie tylko zasoby aplikacji, ale również zasoby, które pochodzą bezpośrednio z biblioteki MFC.MFC udostępnia wiele różnych języka plików zasobów automatycznie, tak, że jeśli języka, w którym są kierowane jest jednym z języków, które obsługuje już MFC, wystarczy upewnij się, że używasz tych zlokalizowanych zasobów.
W chwili pisania MFC obsługuje chiński, niemiecki, hiszpański, francuski, włoski, japoński i koreański.Pliki, które zawierają te zlokalizowane wersje są w MFC\INCLUDE\L.* ("L" oznacza zlokalizowane) katalogów.Niemiecki pliki są w MFC\INCLUDE\L.DEU, np.Aby spowodować, że aplikacja do korzystania z tych RC plików zamiast plików znajdujących się w MFC\INCLUDE, dodać /IC:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\MFC\INCLUDE\L.DEU RC linii poleceń (jest to tylko przykład; trzeba zastąpić ustawienia regionalne wybór, a także katalog, w którym jest zainstalowany program Visual C++).
Powyższe instrukcje będzie działać, jeśli aplikacja statycznie łączy się z MFC.Połączona jest większość aplikacji dynamicznie (ponieważ jest to wartość domyślna AppWizard).W tym scenariuszu nie tylko kod jest dynamicznie połączone — tak stanowią zasoby.W rezultacie zasobów można lokalizować w aplikacji, ale zasoby wdrażania MFC zostaną jeszcze załadowane z MFC7x.DLL (lub nowszej wersji) lub z MFC7xLOC.DLL Jeśli istnieje.Można to podejście pod dwoma różnymi kątami.
Bardziej kompleksowe podejście jest statku, jeden z MFC7xLOC.DLLs zlokalizowanych (na przykład MFC7xDEU dla języka niemieckiego, MFC7xESP.DLL dla hiszpański, itp.) lub nowszym i zainstaluje odpowiedni MFC7xLOC.DLL w katalogu systemu podczas instalowania aplikacji przez użytkownika.Może to być bardzo skomplikowane zarówno dla autora i użytkownika końcowego i jako takie nie jest zalecane.Zobacz technicznej 56 Uwaga uzyskać więcej informacji na temat tej techniki i jej zastrzeżenia.
Najprostszy i najbezpieczniejszy podejście jest umieszczenie zlokalizowanych zasobów MFC w aplikacji lub DLL sam (lub jego towarzyszącej biblioteki DLL, jeśli jest używany jeden).Pozwala to uniknąć problemów instalacji MFC7xLOC.DLL prawidłowo.W tym celu wykonaj takie same instrukcje jak w przypadku statycznych podanych powyżej (ustawienie RC wiersza polecenia poprawnie, aby wskazywały zlokalizowanych zasobów), z wyjątkiem że należy również usunąć /D_AFXDLL zdefiniować, który został dodany przez AppWizard.Gdy /D_AFXDLL jest zdefiniowany, AFXRES.H (i inne pliki MFC RC) nie faktycznie definiują wszystkie zasoby (ponieważ one będą być pobierane z biblioteki MFC dll zamiast).