Suche // Search:

19.01.2010

Mehrsprachige Formulare
//
Multilingual forms

In manchen Situationen ist es erforderlich ein Formular in mehrere Sprachen verfügbar zu machen.
Nun kann man dafür natürlich jeweils ein separates Formular pro Sprache erstellen und verteilen, aber wenn das Formular mal aktualisiert werden muss, müsen gleich alle Sprachversionen überarbeitet werden.
Das kann unnötig viel Zeit kosten.

Dieses Beispiel zeigt Ihnen, wie sie ein mehrsprachiges Formular erstellen können, bei dem Sie die Sprache zur Laufzeit ganz einfach ändern können.

Erstellen Sie ein Scriptobjekt im Root-Knoten ihres Formulars (unter Formular1) und benennen Sie es "FormLanguages".
In diesen Scriptobject benötigen Sie eine Funktion "ChangeFormLanguages" zum Deklarieren der Eigenschaften und Formularobjekte, deren Sprache sie ändern wollen.
Für jede Sprache, kommt dann jeweils noch eine Funktion "GermanCaption" & "EnglishCaption" dazu, die die deklarierten Objekte und Eigenschaften mit neuen Wörtern füttert.

There are situation you need a form present in several languages.
Of course you can create and distribute the form as a separate file for each language.
But what if you need to update the form? Then you have to update each single form, that can be a waste of time.

In this example you can see, how to create a multilingual form, where you can easily change the language easy during runtime.

Create a script object in the root node of your form (under form1) and name it "FormLanguages".
In this script object you have to put a function "ChangeFormLanguage" to define all the form object and properties you would like to change the language for.
For every singe language you also need a function "GermanCaption" & "EnglishCaption" etc. with the words for the predefined objects and properties.

Scriptobjekt- Funktion zu Deklarieren der zu veränderden Formularobjekte //
Script Object - Function to define changable form objects: 
function ChangeFormLanguage(L01, L02, L03)

{
xfa.form.form1.Page1.FirstName.caption.value.text.value = L01;
xfa.form.form1.Page1.LastName.caption.value.text.value = L02;
xfa.form.form1.Page1.Age.caption.value.text.value = L03
}

Funktionen mit den Wörtern in der jeweiligen Sprache // Functions with the language specific words:
function GermanCaption()
{
FormLanguages.ChangeFormLanguage( "Vornahme:",
"Nachname:",
"Alter:";
}


function EnglishCaption()
{
FormLanguages.ChangeFormLanguage( "First name.",
"Last name:",
"Age:";
}
Als letztes brauchen Sie nur noch ein Objekt, über das sie die Sprache wählen.
Das kann z.B. eine Dropdown-Feld oder eine Optionsliste sein.


Finally you need an object to select the desired language.
This can be a drop down field or a radio button list.


JavaScript für Dropdown Feld // JavaScript for drop down Field:

if(xfa.event.newText == "Deutsch")

{
xfa.form.form1.FormLanguages.GermanCaption();
}
if(xfa.event.newText == "English")
{
xfa.form.form1.FormLanguages.EnglishCaption();
}


Deutsche Beschriftungen // German Captions:

Englische Beschriftungen // English Captions:


Beispiel // Example:
https://acrobat.com/?d=nEDFzJRnPT-dLJgwONSIbQ

Kommentare:

  1. Hallo,
    sehr schön, funktioniert dies auch bei PDF-basierten Druckformularen? Hier will ich z.B
    pro Sprache ein anderes Teilformular zur Laufzeit aufrufen.
    Viele Grüße
    solman

    AntwortenLöschen
  2. Das Formular muss interaktiv sein, sonst funktioniert diese Methode nicht.
    Statische Formulare kommen dafür also nicht infrage.

    AntwortenLöschen
  3. Erstmal vielen Dank für die tolle Vorlage.
    Bei mir funktionierts leider nicht ganz...
    Das Auswahlfeld für die Sprache liegt bei mir auf der Masterseite. Alle Objekte der Masterseite sowie das erste Textfeld im Formularbereich werden übersetzt. Das sind aber leider nur 4 von 94 Feldern. Was danach kommt (z.T. in Unterformularen) wird nicht übersetzt. Spielt die Reihenfolge der Auflistung eine Rolle? Muss das mit der Struktur übereinstimmen oder gibt es eine Abhängigkeit von der Hierarchieebene?
    Ich habe viel versucht und gesucht.

    AntwortenLöschen
  4. Ja, das mit den Masterseiten is nicht so einfach.
    Wenn man versucht innerhalb einer Funktion Objekte sowohl auf der Masterseite als auch einer anderen Seite anzusprechen funktioniert das Ganze nicht.

    Man kann das beheben, indem man für die Masterseiten eine separate Funktion benutzt.

    Ein Beispiel: Wenn das Auswahlfeld der Sprache auf der Masterseite namens "Master" liegt und eine Beschriftung "Sprache" hat, sieht das Skript so aus, um dies zu ändern:

    function ChangeFormLanguageMaster(L01) {
    for (var i = 0; i < xfa.host.numPages; i++) {
    var masterPages = xfa.resolveNode("form1.#pageSet.Master[" + i + "]");
    masterPages.SelectLanguage.caption.value.text.value = L01;
    }
    }

    Die Funktion kann man nach oder vor der Funktion zum Ändern der Sprache auf den andere Seiten aufrufen.

    function GermanCaption() {
    // Erste Funktion aufrufen
    FormLanguages.ChangeFormLanguage("Geben Sie bitte ihre Personendaten ein.\rDie Angaben sind freiwillig.",
    "Name:",
    "Adresse:",
    "PLZ:",
    "Bundesland/Kanton:",
    "Land:",
    "Telefon:",
    "Fax:",
    "E-Mail:");
    // Zweite Funktion aufrufen
    FormLanguages.ChangeFormLanguageMaster("Sprache");
    }

    AntwortenLöschen
  5. Super!
    Jetzt klappt alles... auch die Übersetzung auf der Masterseite - exakt wie angegeben.
    Nochmals vielen Dank für die tolle Vorlage!

    AntwortenLöschen
  6. Hallo,
    vielen Dank für die gute Vorlage. Ich habe diese benutzt um ein Formular ins Chinesische zu übersetzten. Die übersetzten Labels habe ich in einer Funktion hinterlegt. Nachdem ich das chinesische Sprachpaket installiert habe ging das ganze sehr gut. Mir ist nur aufgefallen dass einige chinesiche Zeichen mal in fetter Schrift erscheinen und manche normal wie im Englischen. Ich habe die Zeichen per Copy&Paste aus einem Excel in die Script-Funktion übertragen. Kann es sein, das hier noch irgendwelche Steuerzeichen mitkopiert werden?

    Viele Grüße,

    Sebastian

    AntwortenLöschen
  7. Hi,

    mit Chinesisch kenne ich mich nicht aus, aber Du solltest in jedem Fall nur Fonts verwenden, die auch die entsprechenden chinesischen Zeichen mitbringen.
    Ich habe mal mein Formular mit Chinesisch als dritte Sprache ausgestattet (sofern mir das mit einem Übersetzer möglich war).
    Rein optisch konnte ich keine Fehler feststellen, aber ich habe auch keinen Schimmer von Chinesisch.
    Hier das Formular:
    https://acrobat.com/#d=am97SaH-OJl*-aotQ6-Umg

    Du kannst den Designer auch in einen Modus für die Eingabe mit chinesischen Schriften nach GB18030 schalten.
    Vielleicht hift das deine Probleme mit den Schriften zu beheben.
    Siehe Extras > Optionen > International > Schrift auswählen.
    GB18030 auswählen und Designer neustarten.

    Mehr Infos unter:
    http://de.wikipedia.org/wiki/GB_18030

    AntwortenLöschen
  8. Hi,

    ist es auch Möglich den Text welches in den Eingabefeldern eingegeben ist automatisch zu übersetzten? D.h. wie in diesem Beispiel wählt man per drob down aus welche Sprache z.b. englisch dann wird der Text von deutsch in englisch übersetzt vielleicht via googletranslator?

    Gruß
    Icould

    AntwortenLöschen
  9. Um die Daten zur Laufzeit übersetzen zu lassen, bräuchte man einen Online-Dienst mit einer API, die man per JavaScript/HTTP ansprechen kann.
    Google und Microsoft haben zwar solche API's, aber Google's ist inzwischen schon kostenpflichtig.
    Desweiteren wüsste ich nicht, welche API-Methode von Acrobat's JavaScript sich dafür anbietet. NET.HTTP läuft nur in Folder Level Skripten, scheidet daher schon aus. Net.SOAP würde vielleicht gehen, aber probiert hab ich das selbst noch nicht.

    AntwortenLöschen
  10. Thank you
    -Srinivas from Adobe forums

    AntwortenLöschen
  11. Hey thx for the topic Thumbs up!
    Can you help me with one thing.
    Id like to make a new line on my translated captions, and unfortunatly didnt know what to use. I mean new line break. something like this code.
    function EnglishCaption()
    {
    FormLanguages.ChangeFormLanguage( "First name.
    Last Name
    Middle Name
    ",
    "bla bla bla",
    "bla bla bla;
    }

    AntwortenLöschen
  12. Hi,

    to add new lines use the escape sequence \n within your strings.

    function EnglishCaption() {
    FormLanguages.ChangeFormLanguage("First Name\nLast Name\nMiddle Name", "lorem", "ipsum", "dolor");
    }

    To add tab stops you can use \t also.

    AntwortenLöschen
  13. Hi - excellent topic and really useful! Except, I just can't get it to work! Any pointers?

    AntwortenLöschen
  14. Sorry, you should provide a few more details, what's not working.

    AntwortenLöschen