LibreOffice plugin to pipe whole Writer documents through Google Translate, that ought to keep most of the page formatting.

⌈⌋ branch:  PageTranslate


So, what have we learned?

There's a few gotchas when integrating a config dialog. Notably the lack of examples and spotty documentation made this somewhat tedious to figure out. Hence a few notes to the existing xml data and code in this project.

Some references / archive links:


The .xcu registers the dialog within one of the Configuration leaves.

  • Both the leaf name= and the Id property can be arbitrary.

    <node oor:name="pkg.vnd-name.OptionsPageTranslate.leaf" oor:op="fuse">
  • It doesn't even have to be identical, but perhaps should show some resemblence to the package name still:

    <prop oor:name="Id"><value>pkg.vnd-name.OptionsPageTranslate</value></prop>
  • The .xdl reference in <prop OptionsPage> should use %origin% and perhaps be relative to the .xcu:

    <prop oor:name="OptionsPage"> <value>%origin%/OptionsDialog.xdl</value> </prop>
  • EventHandlerService registers a callback, which is meant to populate the dialog widgets or save data changes.

      <prop oor:name="EventHandlerService">
  • The implementation identifier here can be arbitrary again, doesn't have to be service:pyuno URL, nor strictly match Id or the node leaf name= either. Although it's for the best to use the same ID for all three. For Apache OpenOffice compatibility, the leaf name must match the handler ID however.

  • The EventServiceHandler string is used for the UNO handler registration:

    g_ImplementationHelper.addImplementation( class, "pkg.vnd-name.OptionsHandlerImplId", () )

    The service name () list is likely redundant, because of the absurd number of stubs like getServiceNames() etc.

  • For testing, you can define this property to be empty at first:

     <prop oor:name="EventHandlerService"> <value /> </prop>

    So the dialog will at least show up in the configuration section, without actually doing anything.


The .xdl can be edited using LibreOffice > Tools > Manage Macros > Edit Dialogs..

  • The <window property for titlebars must be disabled however:

      <dlg:window  …  dlg:withtitlebar="false">

    (Not sure if that can be done in the Dialog editor.)

  • The dlg:id="OptionsPageTranslate" is arbitrary again. (It probably doesn't need to match any of the .xcu identifiers: leaf/id/handler.)

  • Note that AOO might hiccup if the dialog is too large (>= 200x180px).


The component-scheme .xcs prepares entries and defaults for the Openoffice registry. It's somewhat redundant in declaring both names and storage types for a single registry tree. (The approach probably made sense for extensions that had multiple "leaves".)

Anyway, the $nodepath to access the registry later on would be a combination of oor:package=, the schema oor:name=, Leaves, and the <group oor:name=…, e.g.

                                 oor:name=          group name
                                     ↓                  ↓
            ↑                                   ↑
        package id                           "Leaves"


Must list both the dialog .xcu and the registry schema .xcs:

<manifest:file-entry manifest:media-type="application/"
<manifest:file-entry manifest:media-type="application/"
                      manifest:full-path="./OptionsSchema.xcs" />