Eine der komplizierten Aufgaben, die dem Entwickler erstellt sein kann, ist die Berichtslokalisation. Mit anderen Worten, die Erstellung von mehrsprachigen Berichten. Was soll das bedeuten?
Für verschiedene Sprachen wird die gleiche Berichtsschablone verwendet. Die Sprache von den Titeln oder Dateien wählt der Benutzter selbst oder wird diese Sprache im Programm bestimmt.
Solche Berichte sind in den Unternehmen aufgefordert, die auf dem Weltmarkt arbeiten. Außerdem, erleichtert die automatische Übersetzung in verschiedene Sprachen weitere Unterstützung von komplizierten Berichten und befreit von der Notwendigkeit, die Berichten für jede Sprache zu speichern.
Für Programmierer, die FastReport .Net verwenden, wird die Lokalisationsertellung ohne große Schwierigkeiten.
Also, wie kann man dieses Problem lösen?
Beide Varianten haben seine Vor- und Nachteile.
In erstem Fall, bei der Steigerung von der Datenmenge, die eine Lokalisierung braucht, steigt die Zahl von geschriebenen Codezeilen in der Benutzeranwendung. Aber hier braucht man keine Erstellung vom neuen Datenlager oder einer neuen Tabelle im schon erstellten. Dieses Verfahren passt besser zur kleinen Menge lokalisierender Daten.
Im zweiten Fall, alle Daten speichert man im Datenlager und nicht im Anwendungscode. Die Tabelle vom Datenlager kann man skalieren und neue Daten hinzufügen. Aber dazu braucht man eine neue Tabelle zu erstellen, weiter mit ihr die Verbindung aufzubauen und ein Paar Codezeilen im Skript zu schreiben. Solches Verfahren passt besser zu den großen Datenmengen der lokalisierenden Daten.
Betrachten wir beide Variante praktisch:
Berichtserstellung.
Jede Titel und Anschriften sollen im Bericht durch entsprechende Parameteren umgetauscht werden.
Wie man auf dem Bild sieht, sind alle Titel durch die Berichtsparameter repräsentiert.
Wenn es irgendwelche Parameter gibt, die Sie nicht übergeben wollen, dann können Sie diesen Parameter Defaultwerte ansetzen. Dazu benutzt man die Eigenschaft des Parameters Expression. Textsvalue setzt man in den doppelten Anführungszeichen an. Zum Beispiel setzt man dem Parameter pOurCompany die Defaultwert “Fast Reports Inc.”.
7. Für die Demonstration des zweiten Verfahren brauchen wir eine Tabelle, die die gleichen Felder wie Berichtsparameter und die Daten in drei Sprachen enthält.
Benutzen wir zum Beispiel den Datenlager Microsoft Access.
Field name |
Data type |
Id |
Counter |
pInvoice |
Text |
pOurCompany |
Text |
pOurCompanyAddress |
Text |
pOurCompanyPhone |
Text |
pCustomerId |
Text |
pCustomerCompany |
Text |
pCustomerName |
Text |
pCustomerAddress |
Text |
pCustomerPostalCode |
Text |
pCustomerPhone |
Text |
pCustomerFax |
Text |
pCurrency |
Text |
pProductName |
Text |
pQuantity |
Text |
pUnitPrice |
Text |
pAmount |
Text |
pTotal |
Text |
pSignature |
Text |
pName |
Text |
pDate |
Text |
pLang |
Text |
pAgree |
Text |
Erfüllen wir die Tabelle mit den Daten.
8. Fügen wir noch eine Datenquelle ins Bericht. Wählen wir im Access erstellten Datenlager hinzu.
9. Jetzt braucht man den Berichtsparametern, die im Skript sind, die Werte von den Feldern der Tabelle Localization anzusetzen. Erstellen wir ein Berichtsevent StartReport:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private void _StartReport(object sender, EventArgs e) { string lang =(string)Report.GetParameterValue("pLang"); DataSourceBase ds=Report.GetDataSource("Localization"); ds.Init(); while (ds.HasMoreRows) { string val=(string)Report.GetColumnValue("Localization.pLang"); if (val==lang) { Report.SetParameterValue("pInvoice", (string)Report.GetColumnValue("Localization.pInvoice")); Report.SetParameterValue("pOurCompany", (string)Report.GetColumnValue("Localization.pOurCompany")); Report.SetParameterValue("pOurCompanyAddress", (string)Report.GetColumnValue("Localization.pOurCompanyAddress")); Report.SetParameterValue("pOurCompanyPhone", (string)Report.GetColumnValue("Localization.pOurCompanyPhone")); Report.SetParameterValue("pCustomerId", (string)Report.GetColumnValue("Localization.pCustomerId")); Report.SetParameterValue("pCustomerCompany", (string)Report.GetColumnValue("Localization.pCustomerCompany")); Report.SetParameterValue("pCustomerName", (string)Report.GetColumnValue("Localization.pCustomerName")); Report.SetParameterValue("pCustomerAddress", (string)Report.GetColumnValue("Localization.pCustomerAddress")); Report.SetParameterValue("pCustomerPostalCode", (string)Report.GetColumnValue("Localization.pCustomerPostalCode")); Report.SetParameterValue("pCustomerPhone", (string)Report.GetColumnValue("Localization.pCustomerPhone")); Report.SetParameterValue("pCustomerFax", (string)Report.GetColumnValue("Localization.pCustomerFax")); Report.SetParameterValue("pCurrency", (string)Report.GetColumnValue("Localization.pCurrency")); Report.SetParameterValue("pProductName", (string)Report.GetColumnValue("Localization.pProductName")); Report.SetParameterValue("pQuantity", (string)Report.GetColumnValue("Localization.pQuantity")); Report.SetParameterValue("pUnitPrice", (string)Report.GetColumnValue("Localization.pUnitPrice")); Report.SetParameterValue("pAmount", (string)Report.GetColumnValue("Localization.pAmount")); Report.SetParameterValue("pTotal", (string)Report.GetColumnValue("Localization.pTotal")); Report.SetParameterValue("pSignature", (string)Report.GetColumnValue("Localization.pSignature")); Report.SetParameterValue("pName", (string)Report.GetColumnValue("Localization.pName")); Report.SetParameterValue("pDate", (string)Report.GetColumnValue("Localization.pDate")); Report.SetParameterValue("pAgree", (string)Report.GetColumnValue("Localization.pAgree")); } ds.Next(); } } |
In der ersten Codezeile erhalten wir den Wert vom Parameter pLang. Später erzähle ich Ihnen, dass man in diesem Parameter den Identifikator der Sprache, die im Programm gewählt wurde, speichert.
Dann bekommen wir die Datenquelle Localization damit im Zyklus einen gespeicherten Wert für gewählte Sprache zu finden.
Weiter setzen wir den Berichtsparametern die Werte, die gleichgenannt sind, von der Tabelle an.
Der Bericht ist fertig. Speichern wir ihn.
Erstellen wir die Anwendung.
Auf der Form fügen wir zwei Umschalter, die Dropdown-Liste und ein Paar Tasten hinzu.
In der Dropdown-Liste fügen wir 3 Sprachen hinzu:
Der Hauptcode der Anwendung wird beim Druck der Taste Show report aufgeruft:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
using (Report report = new Report()) { report.Load(Environment.CurrentDirectory + "\\Invoice.frx"); // Here begins the code responsible for the first method of localization if ((radioButton1.Checked) && (LanguagesCmdBox.SelectedIndex == 0)) { report.SetParameterValue("pInvoice", "Invoice"); report.SetParameterValue("pOurCompany", "FastReports Inc"); report.SetParameterValue("pOurCompanyAddress", "US Alexandria VA 22314"); report.SetParameterValue("pOurCompanyPhone", "Phone: 800-985-8986"); report.SetParameterValue("pCustomerId", "Customer Id:"); report.SetParameterValue("pCustomerCompany", "Company:"); report.SetParameterValue("pCustomerName", "Name:"); report.SetParameterValue("pCustomerAddress", "Address:"); report.SetParameterValue("pCustomerPostalCode", "Postal Code: "); report.SetParameterValue("pCustomerPhone", "Phone:"); report.SetParameterValue("pCustomerFax", "Fax:"); report.SetParameterValue("pCurrency", "Currency: $"); report.SetParameterValue("pProductName", "Product Name"); report.SetParameterValue("pQuantity", "Quantity"); report.SetParameterValue("pUnitPrice", "Unit Price"); report.SetParameterValue("pAmount", "Amount"); report.SetParameterValue("pTotal", "Total"); report.SetParameterValue("pSignature", "Signature"); report.SetParameterValue("pName", "Name"); report.SetParameterValue("pDate", "Date"); report.SetParameterValue("pAgree", "I declare that the above information is true and correct to the best of my knowledge"); } if ((radioButton1.Checked) && (LanguagesCmdBox.SelectedIndex == 1)) { report.SetParameterValue("pInvoice", "Счет"); report.SetParameterValue("pOurCompany", "ООО Фаст Репортс"); report.SetParameterValue("pOurCompanyAddress", "Россия, Ростов-на-Дону"); report.SetParameterValue("pOurCompanyPhone", "Телефон: +7(863)227-07-40"); report.SetParameterValue("pCustomerId", "Идентификатор:"); report.SetParameterValue("pCustomerCompany", "Компания:"); report.SetParameterValue("pCustomerName", "Имя:"); report.SetParameterValue("pCustomerAddress", "Адрес:"); report.SetParameterValue("pCustomerPostalCode", "Индекс:"); report.SetParameterValue("pCustomerPhone", "Телефон:"); report.SetParameterValue("pCustomerFax", "Факс:"); report.SetParameterValue("pCurrency", "Валюта: руб"); report.SetParameterValue("pProductName", "Наименование"); report.SetParameterValue("pQuantity", "Количество"); report.SetParameterValue("pUnitPrice", "Цена"); report.SetParameterValue("pAmount", "Подитог"); report.SetParameterValue("pTotal", "Итого"); report.SetParameterValue("pSignature", "Подпись"); report.SetParameterValue("pName", "ФИО"); report.SetParameterValue("pDate", "Дата"); report.SetParameterValue("pAgree", "Я объявляю, что вышеупомянутая информация верна и правильна насколько я знаю"); } if ((radioButton1.Checked) && (LanguagesCmdBox.SelectedIndex == 2)) { report.SetParameterValue("pInvoice", "Rechnung"); report.SetParameterValue("pOurCompany", "Fast Reports Inc"); report.SetParameterValue("pOurCompanyAddress", "US Alexandria VA 22314"); report.SetParameterValue("pOurCompanyPhone", "Telefon: +4930568373928"); report.SetParameterValue("pCustomerId", "Kundennummer:"); report.SetParameterValue("pCustomerCompany", "Unternehmen:"); report.SetParameterValue("pCustomerName", "Name:"); report.SetParameterValue("pCustomerAddress", "Anschrift:"); report.SetParameterValue("pCustomerPostalCode", "Postleitzahl:"); report.SetParameterValue("pCustomerPhone", "Telefon:"); report.SetParameterValue("pCustomerFax", "Faxen:"); report.SetParameterValue("pCurrency", "Währung: eur"); report.SetParameterValue("pProductName", "Produktname"); report.SetParameterValue("pQuantity", "Menge"); report.SetParameterValue("pUnitPrice", "Stückpreis"); report.SetParameterValue("pAmount", "Höhe"); report.SetParameterValue("pTotal", "Gesamt"); report.SetParameterValue("pSignature", "Signatur"); report.SetParameterValue("pName", "Name"); report.SetParameterValue("pDate", "Datum"); report.SetParameterValue("pAgree", "Nach bestem Wissen und Gewissen erkläre Ich, dass die oben genannten Informationen wahr und korrekt sind") } // Here begins the code responsible for the second method of localization if (radioButton2.Checked) { switch (LanguagesCmdBox.SelectedIndex) { case 0: report.SetParameterValue("pLang", "En"); break; case 1: report.SetParameterValue("pLang", "Ru"); break; case 2: report.SetParameterValue("pLang", "De"); break; } } |
Betrachten wir den Code deutlicher. Wie wir sehen, ist der Code mit den Kommentaren in zwei Teilen geteilt – erstes und zweites Lokalisationsverfahren. Zuerst wird von uns erstellter Bericht herunterladen.
Weiter wird es geprüft, ob erstes Lokalisationsverfahren gewählt ist und welche Sprache in der Dropdown-Liste eingegeben ist. Drei Bedingungsoperator für drei Sprachen. Innen jeder Bedingung stellt man die Werte von den Berichtsparametern ein. In der Methode SetParameterValue gibt es zwei Parameter: Name des Berichtsparameters und sein Wert. Auf diese Weise erfüllen wir alle Parameter in der gewählten Sprache.
Für das zweite Lokalisationsverfahren verwendet man gleiche Bedingungsoperatoren. Aber innen der Bedingung setzt man nur einen Parameter an – pLang - gewählte Sprache. Nach der Wertübergabe dieses Parameters wählt der Bericht nötigen Wert von der Lokalisationstabelle.
Dieses Verfahren hat einen Vorteil, der am Anfang nicht besprochen wurde. Einen Datenlager mit den Lokalisationen kann man im Bericht speichern, das erleichtert weitere Unterstützung und nimmt zusätzliche Datenquelle aus. Dafür soll man im Berichtsdatenbaum wählen und die Eigenschaft StoreData = True einsetzen.
Die Tabelle wird in der Shablone gespeichert. Im diesem Fall braucht man keine Einstellungen eines Datenlagers im Programm einzusetzen. Aber es gibt auch eine Unbequemlichkeit der Tabellen- oder Datenlagerverwendung – beim Hinzufügen der neuen Felder soll man die Verbindung mit der Tabelle noch einmal stellen.
So, wir betrachten zwei Lokalisierungsverfahren des Berichts in FastReport .Net. Welches Verfahren besser ist, wählt der Entwickler, das hängt vom Fall ab. Weiter werden die Ergebnisse der Arbeit angezeigt.
Auf Englisch:
Und auf Deutsch: