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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694
|
=========================
Horde Translation Guide
=========================
:Author: Jan Schneider <jan@horde.org>
:Author: Chuck Hagenbuch <chuck@horde.org>
:Author: Joris Braakman <jbraakman@yahoo.com>
:Contact: horde@lists.horde.org (for administrators)
:Contact: i18n@lists.horde.org (for translators)
.. contents:: Contents
.. section-numbering::
---------------------
Administrator Guide
---------------------
For translator documentation see the `Translator Guide`_ below.
GNU gettext, PHP and Horde
==========================
Horde uses GNU gettext for internationalization (i18n) and localization
(l10n). The manual at http://www.gnu.org/software/gettext/manual/gettext.html
is biased against C and using Emacs. This is more for Horde.
There is a good explanation for PHP and gettext at:
http://www.faqts.com/knowledge-base/view.phtml/aid/2953/fid/422
People seem to like learning from examples better, so I have used dutch
(nl_NL) as an example everywhere.
There is a command line tool written in PHP for creating and managing
translations in the ``/usr/bin/`` or ``horde/bin/`` directory. Usage
instructions can be found in the `Translator Guide`_ below as well as
instructions on how to start and maintain translations.
Translations don't work
=======================
If all or some translations don't work on your system, please follow the steps
described below. If you want to ask for help either on the `i18n mailing
list`_ or on `Horde's bug system`_, please explain which steps you tried and
which failed.
You might also find some more information in the FAQ_.
Please note that Dutch (nl_NL) is only used as an example here. If you have
problems with a certain translation use this translation's language code
instead. Most locales only use the language part of the locale name (the first
two lowercase letters) for the actual translation directories, i.e. ``nl`` in
this example. Prominent exceptions from this rule are Chinese (zh_TW, zh_CN)
and Brazilian Portuguese (pt_BR).
1. Is this locale (nl_NL) installed at all?
``locale -a`` should list all locales installed on your system.
On Debian and Ubuntu not all locales may be enabled by default. On Debian
edit ``/etc/locale.gen`` and run ``locale-gen`` after you changed the list
of enabled locales. On Ubuntu run ``locale-gen nl_NL`` for all locales that
you want to install.
2. Do you have any .mo files?
Usually in ``/usr/share/locale/``
e.g. ``/usr/share/locale/nl/LC_MESSAGES/tar.mo``
3. Does gettext even work?
Get a string to translate::
$ strings /bin/tar | grep Memory
Memory exhausted
$ (LANG=nl_NL; LANGUAGE=nl_NL; LC_MESSAGES=nl_NL; gettext tar "Memory exhausted" )
Geheugen uitgeput
4. Does the local Horde file work?
Assuming that you have put the translated Horde file in
``/var/www/horde/locale/nl/LC_MESSAGES/horde.mo``::
$ export TEXTDOMAINDIR=/var/www/horde/locale
$ (LANG=nl_NL; LANGUAGE=nl_NL; LC_MESSAGES=nl_NL; gettext horde "Message" )
Bericht
Create a file in the horde directory, langtest.php::
<?php
setlocale(LC_MESSAGES, 'nl_NL');
putenv('LANG=nl_NL');
putenv('LANGUAGE=nl_NL');
// use the tar test.
echo dgettext('tar', 'Memory exhausted');
echo '<br />';
// Specify location of translation tables
bindtextdomain('horde', './locale');
// Choose domain
textdomain('horde');
// Print the already tested message
echo _("Message");
echo '<br />';
// this should print the same.
echo dgettext('horde', 'Message');
?>
Output web browser::
Geheugen uitgeput
Bericht
Bericht
.. _`i18n mailing list`: http://www.horde.org/community/mail
.. _`Horde's bug system`: http://bugs.horde.org
.. _FAQ: http://wiki.horde.org/FAQ
Solaris
=======
Since the .mo files are binary, they are platform specific. You have to rerun
make in all po directories.
On Solaris 7, you don't have the ``Partial Locales (SUNWploc)`` and
``Supplementary Partial Locales (SUNWploc1)`` packages installed if you get::
$ LANG=nl_NL
couldn't set locale correctly
On Solaris 8, you must install the local packages required for the locales you
desire (for example, you may need to install ``SUNWweuos`` for Western
European locales or ``SUNWmeaos`` for Middle Eastern locales). The packages
are located on Software Disk 1 of 2 in the directory:
``sol_8_1001_sparc/s0/Solaris_8/Product``
This is what it should say:
Solaris 7::
$ pkginfo | grep ploc
system SUNWploc Partial Locales
system SUNWploc1 Supplementary Partial Locales
Solaris 8::
$ pkginfo | grep euo
system SUNWceuos Central Europe OS Support
system SUNWceuox Central Europe 64-bit OS Support
system SUNWeeuos Eastern Europe OS Support
system SUNWeeuox Eastern Europe 64-bit OS Support
system SUNWneuos Northern Europe OS Support
system SUNWneuox Northern Europe 64-bit OS Support
system SUNWseuos Southern Europe OS Support
system SUNWseuox Southern Europe 64-bit OS Support
system SUNWweuos Western Europe OS Support
system SUNWweuox Western Europe 64-bit OS Support
The stuff is installed in ``/usr/lib/locale``::
$ ls /usr/lib/locale/nl
LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME nl.so.1
It was reported that the HTTP server has to be linked to the same libintl.so
file as PHP on Solaris. Also, it may be required that libintl.so be loaded
before libc is loaded. If you are having conflicts, you may be able to reside
them by starting apache with one of the following commands::
$ LD_PRELOAD=libintl.so apachectl start
FreeBSD
=======
You also need UTF-8 support in FreeBSD. This is not installed by default in
FreeBSD versions before 5.3, you need to install the
``utf8locale-without-swidth-040319`` package or port in older versions.
------------------
Translator Guide
------------------
Translation Tool
================
``horde-translation`` is a small PHP script that should help translators doing
their work.
Any feedback, bug reports and feature requests should be send to the `i18n
mailing list`_. This is also the right place for new translations and general
discussions of i18n and l10n questions and problems.
``horde-translation`` is installed to your ``/usr/bin/`` directory by default,
if using PEAR to install Horde. Otherwise it's located in ``horde/bin/``
For a list of available commands run::
horde-translation help
For detailed help on a certain command run::
horde-translation help command
Additional information about creating translations and fixing problems can be
found in the `Administrator Guide`_.
.. _i18n mailing list: http://www.horde.org/community/mail
Prerequisites
~~~~~~~~~~~~~
To run this script you'll need a PHP command line executable with `gettext
support`_ compiled in, and the basic `PEAR`_ libraries. The script expects
your PHP executable to be in the binary search path. If your PHP executable
cannot be found, either edit the first line of ``translation`` to reflect your
location or call the script like::
/usr/local/bin/php translation.
You'll need the `gettext`_ package version 0.12 or greater.
You'll need the PEAR packages `Console_Getopt`_ 0.11 or greater,
`Console_Table`_ and `File_Find`_. To install all needed packages, run::
pear upgrade PEAR Console_Getopt
pear install Console_Table File_Find
or download the newest package from the `PEAR`_ server and install them
manually in your PEAR directory.
.. _gettext support: http://www.php.net/gettext/
.. _gettext: http://www.gnu.org/software/gettext/
.. _PEAR: http://pear.php.net/
.. _Console_Getopt: http://pear.php.net/package/Console_Getopt/
.. _Console_Table: http://pear.php.net/package/Console_Table/
.. _File_Find: http://pear.php.net/package/File_Find/
Creating a new translation
~~~~~~~~~~~~~~~~~~~~~~~~~~
To create a new translation you first have to extract all gettext messages
from the PHP sources. There are already template files with the ``.pot``
suffix in the ``locale`` directories that you can use if you have troubles
extracting the messages, though these templates might be slightly
outdated. Run::
horde-translation extract
You now have to create a new PO file for your language. A locale has the form
``ll_CC`` where ``ll`` is the two letter `ISO 639`_ code of the language and
``CC`` the two letter `ISO 3166`_ code of the country, e.g. ``de_DE``,
``en_US`` or ``pt_BR``. Only some languages require to specify the complete
locale name, like Chinese (``zh_CN`` or ``zh_TW``). If you want to provide a
country-specific language variant, e.g Brazilian Portuguese (``pt_BR``) or
Canadian French (``fr_CA``) you need to use the full locale too. All other
languages should only use the ``ll`` part of the locale as a parameter for the
``translation`` script.
horde-translation init -l ll
Now you can start the translation by editing the created
``locale/ll/LC_MESSAGES/[modulename].po`` files. You should fill out the the
complete header of the created PO file, e.g.::
# Dutch translation for Horde.
# Copyright 2004-2014 Horde LLC (http://www.horde.org/)
# This file is distributed under the same license as the Horde package.
# Joris Braakman <jbraakman@yahoo.com>, 2004.
#
msgid ""
msgstr ""
"Project-Id-Version: Horde 4.0\n"
"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
"POT-Creation-Date: 2004-04-14 10:30+0200\n"
"PO-Revision-Date: 2004-04-14 17:17+02:00\n"
"Last-Translator: Joris Braakman <jbraakman@yahoo.com>\n"
"Language-Team: i18n@lists.horde.org\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8-bit\n"
To compile the translations to a binary format run::
horde-translation make -l ll
After you created the new translation you have to add entries for this locale
in the configuration file horde/config/nls.php.
If you create a new translation for a certain module but there are already
translations for the same language for other modules, then you should use a
compendium. This will save you a lot of time and it will make translations
much more consistent.
.. _ISO 639: http://www.loc.gov/standards/iso639-2/
.. _ISO 3166: http://www.iso.ch/iso/en/prods-services/iso3166ma/index.html
Compendiums
~~~~~~~~~~~
This tool utilizes a nice feature of gettext: compendium files. A compendium
is a special PO file containing a set of translations recurring in many
different packages. These compendiums will be used in the background without
much intervention required. But you have to create and edit a compendium
before you can use it.
To create a compendium of all existing translations for a certain locale run::
horde-translation compendium -l ll
The ``compendium.po`` being created will contain all modules' translations of
this locale merged into a single file. You should take a closer look at this
file because you may find a lot of special marked lines where you translated
certain strings differently in the various modules. It's a good idea to fix
the modules' translations now so that all modules use the same translations for
the same strings. You can always recreate your compendium with the above
command.
If you're maintaining translations for different `branches`_ and assumed that
you have all modules of the development branch in one directory and all of the
stalbe branch in another, you probably want to share a compendium between
these directories.
To do this, you should first create a compendium in the stable branch, review
it and fix all translations until you're happy with the results. Then create a
second compendium in the head branch and include your first one with the --add
option. Now fix the translations in this branch. If you're ready you can
remove the first compendium and for now on use the compendium in the
development branch for both branches. To do so, use the ``-c`` or
``--compendium`` option to specify a path to your compendium.
If you translate directly from a git checkout, this is usually not necessary
because you work with all branches in the same directory and simply switch
between them with ``git checkout``.
.. _branches: http://www.horde.org/development/modules
Updating translations
~~~~~~~~~~~~~~~~~~~~~
The process of updating translations is a cycle where you extract new gettext
strings from the sources, translate those new strings or update the already
translated strings and compile them after.
To update the translation for a module, run::
horde-translation update -m modulename -l ll
This extracts the new strings from the sources and tries to update them from
already existing translations in the compendium. You just have to translate
all untranslated strings in the ``modulename.po`` file in the
``locale/ll_CC/LC_MESSAGES`` directory of the module you updated.
If extracting new strings fails for some reason, you can use the provided
``.pot`` file instead to update your translation::
horde-translation merge -m modulename -l ll
If your compendium is in a different directory than the ``translation``
script, you can specify the path to the compendium::
horde-translation update -m modulename -l ll -c /path/to/compendium
Once this is done, you can compile the translation by calling::
horde-translation make -m modulename -l ll
Extending existent translations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To have your own string (e.g. that you added to config files) displayed in
several languages, you have to
1. specify your texts as gettext arguments, in English, e.g. by using the
_() function or Horde_Translation methods.
2. edit the translation files for the required national languages,
3. compile those translation files.
Be sure to keep records of your extensions, as you will probably have to
repeat steps 2 and 3 after the next update.
E.g., you plan to offer two IMAP servers to select from in the Webmail login
screen:
1. In ``horde/imp/config/servers.php``, you specify::
$servers['Central'] = array(
'name' => _("Central Mail Service"),
...
$servers['CompSci'] = array(
'name' => _("Mail Service of Computer Science Dpt.")
...
2. In ``horde/imp/locale/de/imp.po`` you add two entries::
msgid "Central Mail Service"
msgstr "Zentraler Mailserver"
msgid "Mail Service of Computer Science Dpt."
msgstr "Mailserver Informatik"
Likewise, you amend the translation files for other languages, as needed.
3. You compile the translations using the commands::
horde-translation make --module imp --no-compendium
"Raw" gettext strings
~~~~~~~~~~~~~~~~~~~~~
Horde provides a non-standard way to define a translatable string without
having that string translated in the code. By using the Horde_Translation::r()
method, the string will be marked as a translatable string and extracted by the
Horde translation script, but the string will not be altered in the PHP code.
Example::
// For a Horde package named Horde_Foo::
$str = Horde_Translation_Foo::r("Foo");
// -OR- For a Horde application::
$str = Horde_Translation_Core::r("Foo");
echo $str; // Output: Foo
echo _($str); // Output: [Translation of 'Foo']
Access Keys
===========
Access keys, also known as shortcut keys, allow easy access to important
functions, normally by hitting the Alt/Meta key in combination with another
key. This key is marked in most user interfaces by being underlined.
As the access key is part of the word representing the action being executed,
it is in the translators responsibility to select an access key when he
translates these words. The action is always a link in Horde. The access key
of a link is selected by prefixing it with an underscore.
The help link in the menu for example is always "_Help". This means that the
"H" of the link will be underlined and the help can be opened by hitting
Alt+H. In the PO file this string will appear as::
#: templates/menu/menu.inc:53
msgid "_Help"
msgstr ""
A Spanish translator might want to translate this to::
#: templates/menu/menu.inc:53
msgid "_Help"
msgstr "_Ayuda"
Translators of multibyte languages need to do this a bit differently as only
ASCII characters are allowed for access keys. A Traditional Chinese translator
might want to use::
#: templates/menu/menu.inc:53
msgid "_Help"
msgstr "_H說明"
This renders to "說明(H)" in the interface and you can
access this link with "H" as the access key.
Right-to-Left Languages
=======================
Translations for languages that are written from right to left might cause
unexpected behavior if parenthesis or similar characters appear inside a
translated string. To fix this broken string rendering you have to insert
special Unicode codepoints into the translated string.
Before such a string in parenthesis, add the U+202D codepoint. If there is
more right-to-left text to come after the closing parenthesis, add the U+202E
codepoint after it. If using the PO mode of the Emacs editor you can add
codepoints with the "ucs-insert" command.
Help Texts
==========
Organization of the help files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The help texts are available in the ``horde/locale/``, and
``horde/APP/locale/``, directories, where APP is any Horde application. Every
available translation is kept in a file called ``help.xml``, in a subdirectory
named according to the language name. Examples:
- Horde's original help texts are in the ``horde/locale/en/help.xml`` file.
- IMP's Brazilian help texts are in the ``horde/imp/locale/pt_BR/help.xml``
file.
When, for any desired application and locale, there is no ``help.xml`` file
available, Horde's help system will use the application's
``locale/en/help.xml`` file, instead.
The help files must be encoded in the UTF-8 character set.
There is no compilation step involved: Every modification to, or addition of,
a ``help.xml`` file takes immediate effect.
Syntax of the help files
~~~~~~~~~~~~~~~~~~~~~~~~
Each help file must consist of syntactically valid XML code.
There are no predefined entities beyond the XML standard entities:
- < (less than)
- > (greater than)
- & (ampersand)
- ' (ASCII apostrophe)
- " (ASCII quotation mark)
Any character available in the language's preferred character set can be
entered as a numerical character reference (based on its Unicode scalar
value), such as `` `` for the No-Break Space character.
The general structure can be learned from the existing examples; of course,
the XML tags must be syntactically valid, and properly nested.
.. Note:: A PHP error message like ``Undefined index: url in
/var/www/horde/lib/Horde/Help.php`` means that you have mis-spelled,
or omitted, an attribute (``url``, in this example).
The following tags are available:
+---------+--------+---------------+-------------------------------+
| XML-Tag | Parent | Attributes | Purpose |
+=========+========+===============+===============================+
| help | — | — | List of help texts |
+---------+--------+---------------+-------------------------------+
| entry | help | id | Help text |
+---------+--------+---------------+-------------------------------+
| title | entry | — | Entry in the help index |
+---------+--------+---------------+-------------------------------+
| heading | entry | — | Level 2 heading |
+---------+--------+---------------+-------------------------------+
| para | entry | — | Paragraph |
+---------+--------+---------------+-------------------------------+
| ref | para | module, entry | Link into the help system |
+---------+--------+---------------+-------------------------------+
| eref | para | url | External link |
+---------+--------+---------------+-------------------------------+
| href | para | app, url | Link into a Horde application |
+---------+--------+---------------+-------------------------------+
| b | para | — | Bold text |
+---------+--------+---------------+-------------------------------+
| i | para | — | Italic text on new line |
+---------+--------+---------------+-------------------------------+
| pre | entry | — | Example box |
+---------+--------+---------------+-------------------------------+
| tip | entry | — | Tip/hint box |
+---------+--------+---------------+-------------------------------+
| warn | entry | — | Warning box |
+---------+--------+---------------+-------------------------------+
The elements marked ``para``, in the Parent column, may also be used within
``pre``, ``tip``, and ``warn`` elements.
The following attributes are available:
+---------+-----------+----------------------------------+
| XML-Tag | Attribute | Purpose/Syntax |
+=========+===========+==================================+
| entry | id | Anchor |
+---------+-----------+----------------------------------+
| ref | module | Index of Horde application, see |
| | | ``horde/config/registry.php`` |
| +-----------+----------------------------------+
| | entry | Id of help file entry, see above |
+---------+-----------+----------------------------------+
| eref | url | arbitrary URL |
+---------+-----------+----------------------------------+
| href | app | Index of Horde application, see |
| | | ``horde/config/registry.php`` |
| +-----------+----------------------------------+
| | url | URL within Horde application |
+---------+-----------+----------------------------------+
Examples::
<ref module="imp" entry="compose-attachments">selecting attachments</ref>
<eref url="http://wiki.horde.org/FAQ/User/IMP?referer=FAQ/User#toc17">
UW-IMAP quirk</eref>
<href app="turba" url="search.php">Address search</href>
The `Translation Tool`_ will introduce additional attributes:
+---------+-----------+--------------------------------+
| XML-Tag | Attribute | Purpose/Syntax |
+=========+===========+================================+
| entry | state | See `Finishing a translation`_ |
| +-----------+--------------------------------+
| | md5 | Used internally |
+---------+-----------+--------------------------------+
Reference from the Horde applications
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The typical incantation, e.g.::
<?php echo Horde_Help::link('imp', 'compose-buttons') ?>
will yield a link, adorned with the ``help.png`` icon, to the entry marked
``id="compose-buttons"`` in the IMP help file pertaining to the user's current
locale. Usually, these links are placed in the template files, next to the
item to be explained by the pertinent help entry.
The Horde menu will usually contain a general help item, which is generated in
``lib/Horde/Menu.php``.
Creating a new translation
~~~~~~~~~~~~~~~~~~~~~~~~~~
If necessary, define a suitable language name. E.g., if you plan to add an
Austrian translation, you would use ``de_AT`` as your language name.
For Horde, and for all relevant applications, copy the ``help.xml`` files from
the ``locale/en/`` subdirectories to the ``locale/ll/`` subdirectories,
creating them if necessary.
Translate each new ``locale/ll/help.xml`` file, leaving all tags and
attributes unchanged. Just translate the text between the tags.
.. Important:: The ``id`` attributes must be kept unchanged, under any
circumstances.
If the application is already translated and only the help files are missing,
then be sure to use the same terminology as the existing translation. In any
case, try to use a lucid, coherent terminology.
Finishing a translation
~~~~~~~~~~~~~~~~~~~~~~~
If you want to submit a translation to be included in the Horde code base,
make sure that you have completed all translations. Then run::
horde-translation make-help -l ll
This will mark all entries as being up-to-date so that you or other
translators can later see which entries have been changed since then.
Updating an existing translation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run::
horde-translation update-help -l ll
This will merge your existing help file with all changes from the original,
English help file since your last translation. Changed entries are marked with
the attribute ``state="changed"``, new entries with ``state="new"``. The
original entry from the English help file is added in a comment below a
changed entry, so that you can easily compare them.
Translate the remaining English phrases, like discussed above. When your
finished, remove any English entries and follow the steps at `Finishing a
translation`_.
Extending existent translations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you feel that some feature should be better explained to the end user, then
proceed as following:
1. Determine, whether you will have to extend an existing entry, or add a new
one.
2. In the latter case, choose a suitable ``id`` for your new help entry.
3. Edit the existing entry in, or add a new entry to, the application's
``en/help.xml`` file. Change all translations needed in your site in the
same way. Be sure to use the same ``id`` everywhere.
4. If you have added a new entry, you might want to add a link to it from a
template, as explained above in `Reference from the Horde applications`_.
5. If you feel that your enhancement may be useful to other users, file an
enhancement request at http://bugs.horde.org/ with a patch including your
changes to the template and the ``help.xml`` files.
6. In any case, keep notes of your changes, so you can apply them to later
versions if necessary.
|