InfoPath Trick to Localize a form in a single view

TRICK: Localized form in a single view

Applies to: Microsoft Office InfoPath 2003 SP1

Need the same form in many languages? Here’s a trick that’s easier than multiple views.

Summary

By taking advantage of new SP1 features, there’s a simple way to create a multi-language view without duplicating bindings.

I have used a secondary data source with read-only borderless fields as labels for the view. This secondary data source is populated by an XML File Data Connection that grabs a file in the LabelsLanguage form library. This form lib populates a drop-dom, changes of this update the aux-dom and refresh the view.

There are 2 buttons for adding new languages and editing the current labels of the form. These pop up a second solution. To add a new language, just fill out the form and submit. Look at one of the existing languages for examples. If you see a typo in your language, feel free to correct it and save.

To work with button labels, manually update the view using xsl:value-of elements. Otherwise, use the workaround that I have in the screenshot.

Known issues:

  • If you update a language on the fly, you need to force IE to always update the cache so you will get the drop-down changes.
  • Some flashing when changing the language.

Example

Here’s a sample of what it might look like:

Picture with a language drop down selection

Form Code


public void ChangeLanguage(DataDOMEvent e)

{           

      if (e.IsUndoRedo) return;

      if (e.Operation.ToUpper() == "DELETE") return; //handle double notifications

      // Generate the new file name from the drop-down

      string strFileName = (string)e.NewValue; //from dropdown english.xml

      XMLFileAdapter2 xfaLabels = e.XDocument.DataAdapters["Labels"] as XMLFileAdapter2;

      string strCurrentUrl = xfaLabels.FileURL; //from adapter http://server/site/francais.xml

      string strBaseUrl = strCurrentUrl.Substring(0,strCurrentUrl.LastIndexOf("/")); // http://server/site

      string strCurrentFileName = strCurrentUrl.Substring(strCurrentUrl.LastIndexOf("/")); // francais.xml

      string strNewUrl = strBaseUrl + "/" + strFileName; // http://server/site/english.xml

      xfaLabels.FileURL = strNewUrl;

      // the drop-down refreshes everything

      xfaLabels.Query();

      (e.XDocument.DataAdapters["Languages"] as SharepointListAdapter).Query();

}

public void AddLanguage(DocActionEvent e)

{

      string strLanguagesFormUrl = "http://your-forms-url/template.xsn";

      thisApplication.XDocuments.NewFromSolution(strLanguagesFormUrl);

      (e.XDocument.DataAdapters["Languages"] as SharepointListAdapter).Query();

}

public void EditLabels(DocActionEvent e)

{

      XMLFileAdapter2 xfaLabels = e.XDocument.DataAdapters["Labels"] as XMLFileAdapter2;

      thisApplication.XDocuments.Open(xfaLabels.FileURL, 1);

}