XML->C++ Ländersprachenänderung
-
Hallo loebe C++ Gemeinde,
ich aheb ein mittelgroßes Problem. Mein Chef hat mich gebeten ein Programm mehrsprachig zu halten. Gleichzeitig soll die Umbennung von den Captions usw. automatisch erfaolgen. Dazu wurde eine ein Editor Programmiert, der eine XML-Datei erstellt und darin sowhol eine ID wie ein Prefix, als auch die Captoin-Names auf den verschiedenen Sprachen enthält. Siehe das Beispiel:<?xml version="1.0" encoding="ISO-8859-1" ?>
- <text-list>
- <text prefix="PREFIX" id="Caption_Test">
<deu>Hallo</deu>
<eng>Hello</eng>
<fra>Salu</fra>
</text>
- <text prefix="PREFIX" id="HALLO">
<deu>s</deu>
<eng>d</eng>
<fra>asd asd asd</fra>
</text>
- <text prefix="PREFIX" id="Button1">
<deu>But1</deu>
<eng>Knopf1</eng>
<fra>Button1</fra>
</text>
</text-list>Mein Problem ist nun daraus ein Automatismus zu entwickeln, um die Captions der Buttons und Labels bei knopfdruck automatisch in die Gewünschte Sprache zu übergeben. Mein Chef möchte nicht, dass die einfachere Wariante (einfach bei Knopfdruck die Captions durch ...->Captions = "..."; ändern) angewandt wird, da später auch Chinesich und sonstige Sprachen eingesetzt werden sollen. Hinzu kommt, dass da Programm ständig erweitert werden soll. Wie gesagt, es soll automatisiert werden.
Jetzt meine Frage:
Hat jemand einen Lösungsansatz oder eine Idee dieses Problem mit Hilfe von Vergleichen und durchsuchen zu lösen ohne alles Captions-Texte in dem Quelltext zu hinterlegen?
Wenn jemand dafür eine Idee hat wäre ich ihm sehr dankbar.

Ich nutze nicht die Enterprise edition von BCB 2006 sondern nur die Professionalversion!!
-
Hallo
Mein Chef möchte nicht, dass die einfachere Wariante (einfach bei Knopfdruck die Captions durch ...->Captions = "..."; ändern) angewandt wird
Verstehe ich nicht. Wie soll sonst z.B. die Eigenschaft Caption eines Labels geändert werden? (Außer über WinAPI-Funktionen, aber anders macht die Eigenschaft auch bloß)
Ich glaube ihr verwechselt da etwas. Klar kannst du in gewöhnlichen C++ Quellcode keine Chinesischen Zeichen direkt als String-Literale verwenden, weil der Compiler nicht Unicode-Fähig ist (zumindestens beim BCB5).
Das ist aber auch gar nicht nötig, denn zur Laufzeit werden Unicode als Multibyte-Strings behandelt (siehe WideString).
Wenn du also eine Chinesische Sprachdatei in Unicode öffnest, und die Werte an Unicode-Fähige Controls übergibst, wird der Text korrekt angezeit.bis bald
akari
-
Sorry, habe mich öfter vertippt. Meinte, das mein Chef nicht die einfache Variante haben möchte!
-
Hallo
Das habe ich schon verstanden. Deshalb meine Frage, was du sonst machen willst. Es gibt keine "schwerere" Möglichkeit.
bis bald
akari
-
Sorry,
ich habe nun eine XML-Datei eingebunden und möchte bei Start des Programms mit Hilfe des DAtenbindungsexperten, der schon die datei eingebunden hat, die Werte aus dieser datei auslesen. Dazu besitzt jede Caption eine eindutige Zuweisung, die sich auch in der XML-DAtei wiederfindet. Diese soll gesucht werden und je nach Sprache soll dann der dazugehörige String an die Captions übertragen werden. Habe erst auch nicht verstanden wie er das haben wollte. Das Problem was ich nun nur noch habe ist der Zugriff auf die XML-Datei. Meine Frage lautet nun anders. Welche Methode muss ich nun überschreiben um meine Button-ID zu erhalten und wie? Hier anbei nochmal meine Quelltext, welcher vom Datenbindungsexperten von BCB 2006 erstellt wurde.Header-Datei:
// ********************************************************** //
//
// XML-Datenbindung
//
// Generiert am: 18.09.2006 13:47:24
// Generiert von: C:\Tausch\Language.xml
// Einstellungen gespeichert in: C:\Tausch\Language.xdb
//
// ********************************************************** //#ifndef LanguageH
#define LanguageH#include <System.hpp>
#include <xmldom.hpp>
#include <XMLDoc.hpp>
#include <XMLIntf.hpp>
#include <XMLNodeImp.h>// Forward-Deklarationen
__interface IXMLtextlistType;
typedef System::DelphiInterface<IXMLtextlistType> _di_IXMLtextlistType;
__interface IXMLtextType;
typedef System::DelphiInterface<IXMLtextType> _di_IXMLtextType;// IXMLtextlistType
__interface INTERFACE_UUID("{C294E5E9-242B-49C9-A020-3620CE101F2B}") IXMLtextlistType : public IXMLNodeCollection
{
public:
public:
// Eigenschaftszugriff
virtual _di_IXMLtextType __fastcall Get_text(int Index) = 0;
// Methoden & Eigenschaften
virtual _di_IXMLtextType __fastcall Add() = 0;
virtual _di_IXMLtextType __fastcall Insert(const int Index) = 0;
__property _di_IXMLtextType text[int Index] = { read=Get_text };/* default */
};// IXMLtextType
__interface INTERFACE_UUID("{8AFD581D-6E04-41F6-9BBE-F04E5A91C2C2}") IXMLtextType : public IXMLNode
{
public:
// Eigenschaftszugriff
virtual WideString __fastcall Get_prefix() = 0;
virtual WideString __fastcall Get_id() = 0;
virtual WideString __fastcall Get_deu() = 0;
virtual WideString __fastcall Get_eng() = 0;
virtual WideString __fastcall Get_fra() = 0;
virtual void __fastcall Set_prefix(WideString Value) = 0;
virtual void __fastcall Set_id(WideString Value) = 0;
virtual void __fastcall Set_deu(WideString Value) = 0;
virtual void __fastcall Set_eng(WideString Value) = 0;
virtual void __fastcall Set_fra(WideString Value) = 0;
// Methoden & Eigenschaften
__property WideString prefix = { read=Get_prefix, write=Set_prefix };
__property WideString id = { read=Get_id, write=Set_id };
__property WideString deu = { read=Get_deu, write=Set_deu };
__property WideString eng = { read=Get_eng, write=Set_eng };
__property WideString fra = { read=Get_fra, write=Set_fra };
};// Forward-Deklarationen
class TXMLtextlistType;
class TXMLtextType;// TXMLtextlistType
class TXMLtextlistType : public TXMLNodeCollection, public IXMLtextlistType
{
__IXMLNODECOLLECTION_IMPL__
protected:
// IXMLtextlistType
virtual _di_IXMLtextType __fastcall Get_text(int Index);
virtual _di_IXMLtextType __fastcall Add();
virtual _di_IXMLtextType __fastcall Insert(const int Index);
public:
virtual void __fastcall AfterConstruction(void);
};// TXMLtextType
class TXMLtextType : public TXMLNode, public IXMLtextType
{
__IXMLNODE_IMPL__
//protected:
protected:
// IXMLtextType
virtual WideString __fastcall Get_prefix();
virtual WideString __fastcall Get_id();
virtual WideString __fastcall Get_deu();
virtual WideString __fastcall Get_eng();
virtual WideString __fastcall Get_fra();
virtual void __fastcall Set_prefix(WideString Value);
virtual void __fastcall Set_id(WideString Value);
virtual void __fastcall Set_deu(WideString Value);
virtual void __fastcall Set_eng(WideString Value);
virtual void __fastcall Set_fra(WideString Value);
};// Globale Funktionen
_di_IXMLtextlistType __fastcall Gettextlist(_di_IXMLDocument Doc);
_di_IXMLtextlistType __fastcall Gettextlist(TXMLDocument *Doc);
_di_IXMLtextlistType __fastcall Loadtextlist(const WideString FileName);
_di_IXMLtextlistType __fastcall Newtextlist();#define TargetNamespace ""
#endif
Quelltext:
// ********************************************************** //
//
// XML-Datenbindung
//
// Generiert am: 18.09.2006 13:47:24
// Generiert von: C:\Tausch\Language.xml
// Einstellungen gespeichert in: C:\Tausch\Language.xdb
//
// ********************************************************** //#include <vcl.h>
#pragma hdrstop#include "Language.h"
// Globale Funktionen
_di_IXMLtextlistType __fastcall Gettextlist(_di_IXMLDocument Doc)
{
return (_di_IXMLtextlistType) Doc->GetDocBinding("text-list", __classid(TXMLtextlistType), TargetNamespace);
};_di_IXMLtextlistType __fastcall Gettextlist(TXMLDocument *Doc)
{
_di_IXMLDocument DocIntf;
Doc->GetInterface(DocIntf);
return Gettextlist(DocIntf);
};_di_IXMLtextlistType __fastcall Loadtextlist(const WideString FileName)
{
return (_di_IXMLtextlistType) LoadXMLDocument(FileName)->GetDocBinding("text-list", __classid(TXMLtextlistType), TargetNamespace);
};_di_IXMLtextlistType __fastcall Newtextlist()
{
return (_di_IXMLtextlistType) NewXMLDocument()->GetDocBinding("text-list", __classid(TXMLtextlistType), TargetNamespace);
};// TXMLtextlistType
void __fastcall TXMLtextlistType::AfterConstruction(void)
{
RegisterChildNode(WideString("text"), __classid(TXMLtextType));
ItemTag = "text";
ItemInterface = __uuidof(IXMLtextType);
TXMLNodeCollection::AfterConstruction();
};_di_IXMLtextType __fastcall TXMLtextlistType::Get_text(int Index)
{
return (_di_IXMLtextType) TXMLNodeCollection::List->Nodes[Index];
};_di_IXMLtextType __fastcall TXMLtextlistType::Add()
{
return (_di_IXMLtextType) AddItem(-1);
};_di_IXMLtextType __fastcall TXMLtextlistType::Insert(const int Index)
{
return (_di_IXMLtextType) AddItem(Index);
};// TXMLtextType
WideString __fastcall TXMLtextType::Get_prefix()
{
return TXMLNode::AttributeNodes->Nodes[WideString("prefix")]->Text;
};void __fastcall TXMLtextType::Set_prefix(WideString Value)
{
TXMLNode::SetAttribute(WideString("prefix"), Value);
};WideString __fastcall TXMLtextType::Get_id()
{
return TXMLNode::AttributeNodes->Nodes[WideString("id")]->Text;
};void __fastcall TXMLtextType::Set_id(WideString Value)
{
TXMLNode::SetAttribute(WideString("id"), Value);
};WideString __fastcall TXMLtextType::Get_deu()
{
return TXMLNode::ChildNodes->Nodes[WideString("deu")]->Text;
};void __fastcall TXMLtextType::Set_deu(WideString Value)
{
TXMLNode::ChildNodes->Nodes[WideString("deu")]->NodeValue = Value;
};WideString __fastcall TXMLtextType::Get_eng()
{
return TXMLNode::ChildNodes->Nodes[WideString("eng")]->Text;
};void __fastcall TXMLtextType::Set_eng(WideString Value)
{
TXMLNode::ChildNodes->Nodes[WideString("eng")]->NodeValue = Value;
};WideString __fastcall TXMLtextType::Get_fra()
{
return TXMLNode::ChildNodes->Nodes[WideString("fra")]->Text;
};void __fastcall TXMLtextType::Set_fra(WideString Value)
{
TXMLNode::ChildNodes->Nodes[WideString("fra")]->NodeValue = Value;
};Nochmal sorry, habe es falsch verstanden.
-
Schau dir mal die Get*Prop/Set*Prop/GetPropInfo API, <TypInfo.hpp> und <DesignEditors.hpp> an.
AnsiString CurrentCaption = GetStrProp(Component, "Caption"); SetStrProp(Component, "Caption", "someNewCaption"); TStrings *someList = reinterpet_cast<TStrings*>(GetOrdProp(Component, "Items")); someList->Text = someText;VCL benutzt diese API wohl auch intern um aus den dfm Resourcen zur Laufzeit die Forms zu erstellen.
Hoffe das hilft weiter.
