Die Berichtslokalisierung in FastReport .Net

2016-02-24

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?

  1. Die Benutzeranwendung gibt die Titel und die Dateien des Berichts auf gebrauchte Sprache durch Parameter über.
  2. Alle Felder, die eine Lokalisation brauchen, werden im Datenlager gespeichert. Jede Zeile in der Tabelle wird die Daten auf bestimmte Sprache enthalten. Der Bericht verwendet die Tabellenfelder, die eine Lokalisation brauchen. Was zu tun bleibt, die notwendige Sprache zu wählen.

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.

  1. Am Anfang erstellen wir eine Anwendung Windows Forms Application.
  2. Jetzt fügen wir die Komponente Report vom Tab FastReport .Net hinzu.
  3. Machen wir einen Doppelklick auf der hinzugefügten Komponente report1. Schliessen wir die Form von der Wahl der Datenquelle. Jetzt startet der Berichtsdesigner.    
  4. Für die Demonstration der Localisierung wurde der Bericht „Invoice“ gewählt. Hier brauchen wir alle Titel und Aufschriften zu lokalisieren. Die Daten von Kunden und Waren werden vom Demonstrationsdatenlager  (nwind.xml) genommen, die in der Lieferung von Fast Report .Net sind.
  5. Erstellen wir eine Verbindung mit dem Datenlager (nwind.xml). Und wählen wir 4 Tabelle: Orders, Order Detail, Customers, Produkts.
  6. Um das erste Verfahren der Lokalisierung zu demonstrieren, brauchen wir die ganze Reihe von Parameteren zu erstellen.

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:

20. November 2024

Lokalisierung und Ändern von Sprachen in FastReport VCL

FastReport VCL unterstützt 40 Sprachen für die Schnittstellenlokalisierung und ermöglicht es Ihnen, die Sprache im laufenden Betrieb über Menüs oder Code ohne Neukompilierung zu ändern.
1. November 2024

Neue Funktionen des FastReport VCL Berichtseditors

Wir betrachten die neuen Funktionen des Berichtseditors: Hilfslinien, Hervorhebung von sich schneidenden Objekten, aktualisierte Berichts- und Datenbäume.
30. Oktober 2024

Verwendung von Stilen beim Erstellen von Berichten in FastReport VCL

Dieser Artikel beschreibt eine der neuen Funktionen von FastReport VCL - die Verwendung von Stilen und Stilseiten.
Fast Reports
  • 800-985-8986 (Englisch, die USA)
  • +4930568373928 (Deutsch)
  • +55 19 98147-8148 (Portugiesisch)
  • info@fast-report.com
  • 66 Canal Center Plaza, Ste 505, Alexandria, VA 22314

© 1998-2024 Fast Reports Inc.