Kimai can be localized to any language and is already translated to Arabic, Czech, Danish, German, German (Swiss), Greek, English, Esperanto, Spanish, Basque, Persian, Finnish, Faroese, French, Hebrew, Croatian, Hungarian, Italian, Japanese, Korean, Norwegian (Bokmål), Dutch, Polish, Portuguese, Portuguese (Brazilian), Romanian, Russian, Slovakian, Swedish, Turkish, Ukrainian, Vietnamese, Chinese (traditional), Chinese (simplified)
Feel free to send your self-made language files or contributing to the weblate project below – we’re looking for translators and would appreciate your support!
Languages and translations in Kimai are configurable. Read below how to add a new language and configure the output formats for date and time values.
We try to separate translations in logical units, in order to make it easier to identify the location of application messages.
enversion (as english is the fallback language for all missing keys in any language)
messagesas it holds the most important application translations
The files in
translations/ as a quick overview:
about- the about screen with license information
actions- the “action” dropdowns in all data-tables
daterangepicker- the date range picker dialog to choose a timeframe in screens with data-tables
exceptions- error pages and exception handlers
flashmessages- success and error messages (alerts), which will be shown after submitting data
invoice-calculator- invoice calculator types (see
Adding invoice calculatorin developers-section)
invoice-numbergenerator- invoice calculator (see
Adding invoice-number generatorin developers-section)
invoice-renderer- holds translations of all invoice templates (read more)
messages- most of the visible application translations (like menu, buttons and forms)
plugins- the plugin screen
system-configuration- all system configuration, which can be changed through the UI
tags- the tags administration screen
teams- the team administration screen
validators- related to violations/validation of submitted form data (or API calls)
When you create a new translation, please open a Pull Request in this repository as well.
In the next section I will explain how to add a new language with the (not existing) locale
Copy each translation from it’s english version
translations/*.en.xlf and rename them to
target-language attributes in the file header, as example for the new file
<file source-language="en" target-language="xx" datatype="plaintext" original="exceptions.en.xlf">`
For a language variant
xx_YY, the fallback will always be the base language
Only some specific keys may need to be changed for this variant and its possible to add only the respective files like i.e.
translations/messages.de_CH.xlf including only the changed translations:
<?xml version="1.0" encoding="utf-8"?> <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"> <file source-language="de" target-language="de-CH" datatype="plaintext" original="messages.en.xlf"> <body> <trans-unit resname="action.close"> <source>action.close</source> <target>Schliessen</target> </trans-unit> </body> </file> </xliff>
Adjust the file
config/packages/kimai.yaml and add the language (or the language variant) settings below the key
kimai: languages: # copy all settings from 'en' and adjust them to your language xx: date_time_type: 'yyyy-MM-dd HH:mm' date_type: 'yyyy-MM-dd' date: 'Y-m-d' date_time: 'm-d H:i' duration: '%%h:%%m h'
This is not necessary if your language uses the same configuration like
en, which will be used as fallback.
You only have to overwrite the keys that are different, so if you new language
xx only has a different duration format, then adding this is sufficient:
kimai: languages: # copy all settings from 'en' and adjust them to your language xx: duration: '%%h hours and %%m minutes'
Add the new locale (or the locale variant) in the file
parameters.app_locales divided by a pipe:
parameters: locale: en app_locales: en|de|ru|it|xx
Make sure the new locale is included in the frontend dependencies. For example Kimai includes moment.js, which ships its own translations.
Kimai ONLY compiles the moment.js locales which are needed.
Check and adapt the JS files in the
const Moment = require('moment'); global.moment = Moment; require('moment/locale/xx');
Be careful with the naming of language variants, in JS the variants are written like xx-yy, not xx_YY. To be sure please check the moment.js locales.
The number formats on the Kimai frontend as well as in the invoices are defined by the frontend locales. If you get wrong decimal separator or thousands separator keys, please import the correct frontend locale as described above.
Kimai uses configurations from
kimai.yaml to format the values in the frontend.
so they must create the same output.
Kimai uses the 24-hour format by default but can be switched to use AM/PM instead, please read the AM/PM format documentation to find out how.
This will validate if the technical changes are okay / if the changed and new files can be used by Kimai:
bin/console lint:xliff translations
You can search for missing keys by issuing this command (replace
xx with your locale):
bin/console debug:translation --only-missing de
bin/console translation:update --dump-messages --force de