From e61d660ecc3931e5948a53247f2559662f1fd942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 16 Jan 2020 23:34:04 +0100 Subject: [PATCH] Translations: Start documentation for translations. --- doxygen/images/translate-glade.png | Bin 0 -> 15007 bytes doxygen/translation.dox | 53 +++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 doxygen/images/translate-glade.png create mode 100644 doxygen/translation.dox diff --git a/doxygen/images/translate-glade.png b/doxygen/images/translate-glade.png new file mode 100644 index 0000000000000000000000000000000000000000..a25e8019f763109ae3754eb69d399d9158c2e08b GIT binary patch literal 15007 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 YW{G@rePY1($?p={8u|}VYL8$3FH;LWM*si- literal 0 HcmV?d00001 diff --git a/doxygen/translation.dox b/doxygen/translation.dox new file mode 100644 index 0000000..a4d5ab4 --- /dev/null +++ b/doxygen/translation.dox @@ -0,0 +1,53 @@ +/** + +@page translation Translations / Internationalization + +@section lang-available Available Languages + +The development, documentation and default application language of gds-render is English. +Translations of GUI and console output exist for the following locales/languages + +- de German (Deutsch) +- ja Japanese (日本語) (Work in progess) + +On how to add new languages, see @ref lang-add + +@section lang-internals Internals +This progamm uses gettext for translations. + +@subsection lang-coding Make Strings Translatable in Code +Only strings, that are marked as translatable are actually available for translation and shown in the user's language. +All other text is displayed as written in the source files. + +@subsubsection lang-add-glade Make GUI Elements in Glade Files Translatable +Text inside Glade's GUI files can be made translatable by checking the *translatable* option for the specific text property. +The following image shows the label property of a button. Notice the checked Translatable option. +@image html translate-glade.png +@image latex translate-glade.png + +@subsubsection lang-add-c Make C Strings Translatable +In order to make strings in C code translatable, the following header has to be included: +@code +#inlcude +@endcode +This header provides a few macros useful for translation. The most important one is the function-like macro +@code +_("Text here") +@endcode +which is just a underline character. +You can use this marco to encapsulate all static strings that shall be translated. The whole expression is still usable like any other string (except for compile time concatenation, like: "This is foo" " and this is bar") + +Example: +@code +printf(_("The value of foo is %d\n"), foo); +@endcode + +Text that must not be translated can be encapsulated inside a N_ macro like +@code +N_("This has to stay in English") +@endcode +The N_ macro is basically an empty macro and just for visualization. + +@subsection lang-add Add a New Language + +*/