0
0
Fork 0
mirror of https://github.com/kevinpapst/kimai2.git synced 2025-03-17 14:32:38 +00:00

added chinese translations ()

This commit is contained in:
Kevin Papst 2019-12-09 12:56:38 +01:00 committed by GitHub
parent d62e1c4468
commit 261b4646e4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
34 changed files with 1836 additions and 72 deletions

View file

@ -28,6 +28,7 @@ require('select2/dist/js/i18n/ru');
require('select2/dist/js/i18n/sk');
require('select2/dist/js/i18n/sv');
require('select2/dist/js/i18n/tr');
require('select2/dist/js/i18n/zh-CN');
const Moment = require('moment');
global.moment = Moment;
@ -48,6 +49,7 @@ require('moment/locale/ru');
require('moment/locale/sk');
require('moment/locale/sv');
require('moment/locale/tr');
require('moment/locale/zh-cn');
require('daterangepicker');

View file

@ -19,5 +19,6 @@ require('fullcalendar/dist/locale/ru');
require('fullcalendar/dist/locale/sk');
require('fullcalendar/dist/locale/sv');
require('fullcalendar/dist/locale/tr');
require('fullcalendar/dist/locale/zh-cn');
require('fullcalendar/dist/fullcalendar.min.css');

View file

@ -40,7 +40,7 @@ export default class KimaiLoader {
constructor(configurations, translations) {
// set the current locale for all javascript components
moment.locale(configurations['locale']);
moment.locale(configurations['locale'].replace('_', '-').toLowerCase());
const kimai = new KimaiContainer(
new KimaiConfiguration(configurations),

View file

@ -105,7 +105,7 @@ export default class KimaiFormSelect extends KimaiPlugin {
}
options = {...options, ...{
language: this.getContainer().getConfiguration().get('locale'),
language: this.getContainer().getConfiguration().get('locale').replace('_', '-'),
theme: "bootstrap",
matcher: matcher
}};

10
composer.lock generated
View file

@ -3131,16 +3131,16 @@
},
{
"name": "kevinpapst/adminlte-bundle",
"version": "3.0.3",
"version": "3.0.4",
"source": {
"type": "git",
"url": "https://github.com/kevinpapst/AdminLTEBundle.git",
"reference": "ecb7ae25bc98f5f3fc7c5f36f06ff76b6782bb4b"
"reference": "92adcca485481b0c6b24f725f932cc49eb9e63e4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/kevinpapst/AdminLTEBundle/zipball/ecb7ae25bc98f5f3fc7c5f36f06ff76b6782bb4b",
"reference": "ecb7ae25bc98f5f3fc7c5f36f06ff76b6782bb4b",
"url": "https://api.github.com/repos/kevinpapst/AdminLTEBundle/zipball/92adcca485481b0c6b24f725f932cc49eb9e63e4",
"reference": "92adcca485481b0c6b24f725f932cc49eb9e63e4",
"shasum": ""
},
"require": {
@ -3192,7 +3192,7 @@
}
],
"description": "Admin theme bundle for Symfony 4 based on AdminLTE 2.4.8 with FOSUserBundle support",
"time": "2019-12-01T22:36:18+00:00"
"time": "2019-12-09T09:54:29+00:00"
},
{
"name": "kimai/kimai2-composer",

View file

@ -211,36 +211,26 @@ kimai:
# Locale specific settings, like date formats
# --------------------------------------------------------------------------------
languages:
ar:
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'
cs:
date_time_type: 'dd.MM.yyyy HH:mm'
date_type: 'dd.MM.yyyy'
date: 'd.m.Y'
date_time: 'd.m H:i'
duration: '%%h:%%m h'
da:
date_time_type: 'dd.MM.yyyy HH:mm'
date_type: 'dd.MM.yyyy'
date: 'd.m.Y'
date_time: 'd.m. H:i'
duration: '%%h:%%m h'
de:
date_time_type: 'dd.MM.yyyy HH:mm'
date_type: 'dd.MM.yyyy'
date: 'd.m.Y'
date_time: 'd.m. H:i'
duration: '%%h:%%m h'
de_CH:
date_time_type: 'dd.MM.yyyy HH:mm'
date_type: 'dd.MM.yyyy'
date: 'd.m.Y'
date_time: 'd.m. H:i'
duration: '%%h:%%m h'
en:
date_time_type: 'yyyy-MM-dd HH:mm'
date_type: 'yyyy-MM-dd'
@ -252,7 +242,6 @@ kimai:
date_type: 'dd.MM.yyyy'
date: 'd.m.Y'
date_time: 'd.m. H:i'
duration: '%%h:%%m h'
fr:
date_time_type: 'dd/MM/yyyy HH:mm'
date_type: 'dd/MM/yyyy'
@ -264,25 +253,11 @@ kimai:
date_type: 'yyyy.MM.dd.'
date: 'Y.m.d.'
date_time: 'm.d. H:i'
duration: '%%h:%%m h'
it:
date_time_type: 'dd.MM.yyyy HH:mm'
date_type: 'dd.MM.yyyy'
date: 'd.m.Y'
date_time: 'd.m. H:i'
duration: '%%h:%%m h'
ja:
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 tim'
ko:
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'
nl:
date_time_type: 'dd.MM.yyyy HH:mm'
date_type: 'dd.MM.yyyy'
@ -294,31 +269,18 @@ kimai:
date_type: 'dd-MM-yyyy'
date: 'd-m-Y'
date_time: 'd-m H:i'
duration: '%%h:%%m h'
ru:
date_time_type: 'dd.MM.yyyy HH:mm'
date_type: 'dd.MM.yyyy'
date: 'd.m.Y'
date_time: 'd.m. H:i'
duration: '%%h:%%m h'
sk:
date_time_type: 'dd. MM. yyyy HH:mm'
date_type: 'dd. MM. yyyy'
date: 'd. m. Y'
date_time: 'd. m. H:i'
duration: '%%h:%%m h'
sv:
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 tim'
tr:
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'
# --------------------------------------------------------------------------------

View file

@ -2,7 +2,7 @@
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
locale: en
app_locales: ar|cs|de|de_CH|da|en|es|fr|hu|it|ja|ko|nl|pt_BR|ru|sk|sv|tr
app_locales: ar|cs|de|de_CH|da|en|es|fr|hu|it|ja|ko|nl|pt_BR|ru|sk|sv|tr|zh_CN
services:
# default configuration for services in *this* file

View file

@ -1,3 +1,7 @@
parameters:
locale: en
app_locales: ar|cs|de|de_CH|da|en|es|fr|hu|it|ja|ko|nl|pt_BR|ru|sk|sv|tr|zh_CN
services:
_defaults:
public: true

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -5,7 +5,7 @@
"build/runtime.6ca1eea5.js",
"build/0.1a6ffb43.js",
"build/1.16767f92.js",
"build/app.e20e5313.js"
"build/app.23b99cbb.js"
],
"css": [
"build/app.ce77694e.css"
@ -24,7 +24,7 @@
"build/runtime.6ca1eea5.js",
"build/0.1a6ffb43.js",
"build/1.16767f92.js",
"build/calendar.a5a217f4.js"
"build/calendar.9e7cdb6a.js"
],
"css": [
"build/calendar.ade7bcdf.css"
@ -35,11 +35,11 @@
"build/runtime.6ca1eea5.js": "sha384-xNNrNinl64G3nCUrIskgSjU0mUXXCB9lj6XCSInBTwxSKXk8uTMafnLHtdWdIGtd",
"build/0.1a6ffb43.js": "sha384-vuVCyLVj2b4h3jpKl+JSANRCacmXeLk+ihK5T5NZBO7+SJ5Y+o6d4qju116hTPSD",
"build/1.16767f92.js": "sha384-JPoKdrVtBemSiVBoAnmSxLML7xXM9zYeuwOPYQv/kLzt/P4cmLY5r9gH8oaGRPFG",
"build/app.e20e5313.js": "sha384-1PclE77S5F9LtHCZjMABLamE9yPOR3w0+6GohN4bH3Ml6mM0DpcnSwoG6ik7b5DQ",
"build/app.23b99cbb.js": "sha384-OcCvUr52EqOwqv3QvQVwP6y4AOv3JRpxwp629Df5QnPAkZqHzX5NwbaZJQZ0Xzfl",
"build/app.ce77694e.css": "sha384-xUdH11jkeXQ1YfJ66YW+tlcQt23/PKuPZmMi4XJuVuMLdonUk0qKAJ0HJrRL5hvf",
"build/2.dad56560.js": "sha384-oKsefSmRq0GL+Qa6f6jExXvFay3cM6YZFHQRKoAHi2p54UOCtjJfjF2eAB1qykoL",
"build/chart.7f4d7f29.js": "sha384-I57c9DtU3AOG2kzKqIZkIu0hi1aGYHRZ5QG4LKC9+9slzJnAMttPGXoL2cQG3m6y",
"build/calendar.a5a217f4.js": "sha384-qAUUODRKt547V7Y+IKTJpXjdEtqkzpnunFeSsarxKfhivglgiEev9rIEMLugTOm0",
"build/calendar.9e7cdb6a.js": "sha384-RvFQJC1YvKq9BqRDObc5REPbi9ZiG5/fkqKP1xLJUlFDb2b8WqTR/f4F+hdE9cI1",
"build/calendar.ade7bcdf.css": "sha384-ta519W5+NY1a8FBh7rD4zORYTfUXCYTLci0Z25nf4BfodmuXqyPVNEe7dSe2/fRd"
}
}

View file

@ -3,9 +3,9 @@
"build/1.16767f92.js": "build/1.16767f92.js",
"build/2.dad56560.js": "build/2.dad56560.js",
"build/app.css": "build/app.ce77694e.css",
"build/app.js": "build/app.e20e5313.js",
"build/app.js": "build/app.23b99cbb.js",
"build/calendar.css": "build/calendar.ade7bcdf.css",
"build/calendar.js": "build/calendar.a5a217f4.js",
"build/calendar.js": "build/calendar.9e7cdb6a.js",
"build/chart.js": "build/chart.7f4d7f29.js",
"build/runtime.js": "build/runtime.6ca1eea5.js",
"build/fonts/fa-brands-400.eot": "build/fonts/fa-brands-400.8e49b728.eot",

View file

@ -11,20 +11,17 @@ namespace App\Configuration;
use App\Utils\MomentFormatConverter;
class LanguageFormattings
final class LanguageFormattings
{
/**
* @var array
*/
protected $settings;
private $settings;
/**
* @var MomentFormatConverter
*/
protected $momentFormatter;
private $momentFormatter;
/**
* @param array $languageSettings
*/
public function __construct(array $languageSettings)
{
$this->settings = $languageSettings;
@ -145,7 +142,7 @@ class LanguageFormattings
* @param string $locale
* @return string
*/
protected function getConfig(string $key, string $locale): string
private function getConfig(string $key, string $locale): string
{
if (!isset($this->settings[$locale])) {
throw new \InvalidArgumentException(sprintf('Unknown locale given: %s', $locale));

View file

@ -38,4 +38,8 @@ class Constants
* Homepage, used in multiple views
*/
public const HOMEPAGE = 'https://www.kimai.org';
/**
* Application wide default locale.
*/
public const DEFAULT_LOCALE = 'en';
}

View file

@ -9,6 +9,7 @@
namespace App\DependencyInjection;
use App\Constants;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
@ -52,7 +53,9 @@ class AppExtension extends Extension
$container->setParameter('kimai.data_dir', $config['data_dir']);
$container->setParameter('kimai.plugin_dir', $config['plugin_dir']);
$container->setParameter('kimai.languages', $config['languages']);
$this->setLanguageFormats($config['languages'], $container);
unset($config['languages']);
$container->setParameter('kimai.calendar', $config['calendar']);
$container->setParameter('kimai.dashboard', $config['dashboard']);
$container->setParameter('kimai.widgets', $config['widgets']);
@ -96,6 +99,29 @@ class AppExtension extends Extension
$container->setParameter('kimai.config', $config);
}
protected function setLanguageFormats(array $config, ContainerBuilder $container)
{
$locales = explode('|', $container->getParameter('app_locales'));
// make sure all allowed locales are registered
foreach ($locales as $locale) {
if (!array_key_exists($locale, $config)) {
$config[$locale] = $config[Constants::DEFAULT_LOCALE];
}
}
// make sure all keys are registered for every locale
foreach ($config as $locale => $settings) {
if ($locale === Constants::DEFAULT_LOCALE) {
continue;
}
// pre-fill all formats with the default locale settings
$config[$locale] = array_merge($config[Constants::DEFAULT_LOCALE], $config[$locale]);
}
$container->setParameter('kimai.languages', $config);
}
protected function setLdapParameter(array $config, ContainerBuilder $container)
{
if (!isset($config['connection']['baseDn'])) {

View file

@ -10,30 +10,26 @@
namespace App\Utils;
use App\Configuration\LanguageFormattings;
use App\Constants;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* Use this class, when you want information about formats for the "current request locale".
*/
class LocaleSettings
final class LocaleSettings
{
/**
* @var LanguageFormattings
*/
protected $formats;
private $formats;
/**
* @var string
*/
protected $locale = 'en';
private $locale = Constants::DEFAULT_LOCALE;
/**
* @param RequestStack $requestStack
* @param LanguageFormattings $formats
*/
public function __construct(RequestStack $requestStack, LanguageFormattings $formats)
{
// It can be null in a console command
// request is null in a console command
if (null !== $requestStack->getMasterRequest()) {
$this->locale = $requestStack->getMasterRequest()->getLocale();
}

View file

@ -36,6 +36,7 @@ class AppExtensionTest extends TestCase
private function getContainer()
{
$container = new ContainerBuilder();
$container->setParameter('app_locales', 'de|en|tr|zh_CN');
return $container;
}
@ -44,6 +45,15 @@ class AppExtensionTest extends TestCase
{
return [
'kimai' => [
'languages' => [
'en' => [
'date_type' => 'dd. MM. yyyy',
'date' => 'A-m-d'
],
'tr' => [
'date' => 'X-m-d'
],
],
'data_dir' => '/tmp/',
'plugin_dir' => '/tmp/',
'timesheet' => [],
@ -60,7 +70,46 @@ class AppExtensionTest extends TestCase
$expected = [
'kimai.data_dir' => '/tmp/',
'kimai.plugin_dir' => '/tmp/',
'kimai.languages' => [],
'kimai.languages' => [
'en' => [
'date_time_type' => 'yyyy-MM-dd HH:mm',
'date_type' => 'dd. MM. yyyy',
'date' => 'A-m-d',
'date_time' => 'm-d H:i',
'duration' => '%%h:%%m h',
'time' => 'H:i',
'24_hours' => true,
],
'de' => [
'date_time_type' => 'yyyy-MM-dd HH:mm',
'date_type' => 'dd. MM. yyyy',
'date' => 'A-m-d',
'date_time' => 'm-d H:i',
'duration' => '%%h:%%m h',
'time' => 'H:i',
'24_hours' => true,
],
'tr' => [
'date_time_type' => 'yyyy-MM-dd HH:mm',
// this value if pre-filled by the Configuration object, as "tr" is defined in the min config
// and the other languages (not defined in min config) are "only" copied during runtime from "en"
'date_type' => 'yyyy-MM-dd',
'date' => 'X-m-d',
'date_time' => 'm-d H:i',
'duration' => '%%h:%%m h',
'time' => 'H:i',
'24_hours' => true,
],
'zh_CN' => [
'date_time_type' => 'yyyy-MM-dd HH:mm',
'date_type' => 'dd. MM. yyyy',
'date' => 'A-m-d',
'date_time' => 'm-d H:i',
'duration' => '%%h:%%m h',
'time' => 'H:i',
'24_hours' => true,
],
],
'kimai.calendar' => [
'week_numbers' => true,
'day_limit' => 4,

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="about.en.xliff">
<body>
<trans-unit id="about.title">
<source>about.title</source>
<target>关于Kimai</target>
</trans-unit>
<trans-unit id="support">
<source>support</source>
<target>支持</target>
</trans-unit>
<trans-unit id="website">
<source>website</source>
<target>主页</target>
</trans-unit>
<trans-unit id="help">
<source>help</source>
<target>文件</target>
</trans-unit>
<trans-unit id="tab.thanks">
<source>tab.thanks</source>
<target>特别鸣谢</target>
</trans-unit>
<trans-unit id="donate">
<source>donate</source>
<target>为Kimai的未来捐款</target>
</trans-unit>
<trans-unit id="published_under">
<source>published_under</source>
<target>%kimai% 能够发布是因为</target>
</trans-unit>
<trans-unit id="special_thanks">
<source>special_thanks</source>
<target>特别鸣谢 …</target>
</trans-unit>
<trans-unit id="library_authors">
<source>library_authors</source>
<target>… 这些软件库里的作者们如果没有你们Kimai不可能建成 👍</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="none">
<body>
<trans-unit id="stop">
<source>stop</source>
<target>停止</target>
</trans-unit>
<trans-unit id="back">
<source>back</source>
<target>返回</target>
</trans-unit>
<trans-unit id="edit">
<source>edit</source>
<target>编辑</target>
</trans-unit>
<trans-unit id="trash">
<source>trash</source>
<target>删除</target>
</trans-unit>
<trans-unit id="report">
<source>report</source>
<target>报告</target>
</trans-unit>
<trans-unit id="repeat">
<source>repeat</source>
<target>再次开始</target>
</trans-unit>
<trans-unit id="profile-stats">
<source>profile-stats</source>
<target>个人资料</target>
</trans-unit>
<trans-unit id="settings">
<source>settings</source>
<target>参数选择</target>
</trans-unit>
<trans-unit id="timesheet">
<source>timesheet</source>
<target>时间表</target>
</trans-unit>
<trans-unit id="customer">
<source>customer</source>
<target>筛选用户</target>
</trans-unit>
<trans-unit id="project">
<source>project</source>
<target>筛选项目</target>
</trans-unit>
<trans-unit id="activity">
<source>activity</source>
<target>筛选活动</target>
</trans-unit>
<trans-unit id="copy">
<source>copy</source>
<target>创建复制</target>
</trans-unit>
<trans-unit id="home">
<source>home</source>
<target>主页</target>
</trans-unit>
<trans-unit id="create-project">
<source>create-project</source>
<target>创建项目</target>
</trans-unit>
<trans-unit id="create-activity">
<source>create-activity</source>
<target>创建活动</target>
</trans-unit>
<trans-unit id="create-timesheet">
<source>create-timesheet</source>
<target>创建时间表</target>
</trans-unit>
<trans-unit id="permissions">
<source>permissions</source>
<target>团队批准</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="daterangepicker.en.xliff">
<body>
<trans-unit id="daterangepicker.today">
<source>daterangepicker.today</source>
<target>今天</target>
</trans-unit>
<trans-unit id="daterangepicker.yesterday">
<source>daterangepicker.yesterday</source>
<target>昨天</target>
</trans-unit>
<trans-unit id="daterangepicker.lastWeek">
<source>daterangepicker.lastWeek</source>
<target>上周</target>
</trans-unit>
<trans-unit id="daterangepicker.thisWeek">
<source>daterangepicker.thisWeek</source>
<target>本周</target>
</trans-unit>
<trans-unit id="daterangepicker.lastMonth">
<source>daterangepicker.lastMonth</source>
<target>上月</target>
</trans-unit>
<trans-unit id="daterangepicker.thisMonth">
<source>daterangepicker.thisMonth</source>
<target>本月</target>
</trans-unit>
<trans-unit id="daterangepicker.lastYear">
<source>daterangepicker.lastYear</source>
<target>去年</target>
</trans-unit>
<trans-unit id="daterangepicker.thisYear">
<source>daterangepicker.thisYear</source>
<target>今年</target>
</trans-unit>
<trans-unit id="daterangepicker.customRange">
<source>daterangepicker.customRange</source>
<target>自定义范围</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="exceptions.en.xliff">
<body>
<trans-unit id="access.denied">
<source>access.denied</source>
<target>拒绝访问</target>
</trans-unit>
<trans-unit id="stacktrace">
<source>stacktrace</source>
<target>此处出现问题</target>
</trans-unit>
<trans-unit id="http_error.title">
<source>http_error.title</source>
<target>错误</target>
</trans-unit>
<trans-unit id="http_error.description">
<source>http_error.description</source>
<target>未知问题</target>
</trans-unit>
<trans-unit id="http_error.suggestion">
<source>http_error.suggestion</source>
<target>
出现严重错误,请重试。可能出现软件问题,若无法解决,请联系管理员。
</target>
</trans-unit>
<trans-unit id="http_error_404.description">
<source>http_error_404.description</source>
<target>无法找到该页</target>
</trans-unit>
<trans-unit id="http_error_404.suggestion">
<source>http_error_404.suggestion</source>
<target>
无法找到该页。请返回控制主页并重新开始。
</target>
</trans-unit>
<trans-unit id="http_error_403.description">
<source>http_error_403.description</source>
<target>页面受限</target>
</trans-unit>
<trans-unit id="http_error_403.suggestion">
<source>http_error_403.suggestion</source>
<target>抱歉您没有权限访问该页。如有疑问请联系管理员。
</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="flashmessages.en.xliff">
<body>
<trans-unit id="warning">
<source>warning</source>
<target>警告</target>
</trans-unit>
<trans-unit id="timesheet.stop.success">
<source>timesheet.stop.success</source>
<target>时间记录终止</target>
</trans-unit>
<trans-unit id="timesheet.stop.error">
<source>timesheet.stop.error</source>
<target>无法终止时间记录</target>
</trans-unit>
<trans-unit id="timesheet.start.success">
<source>timesheet.start.success</source>
<target>时间记录开始</target>
</trans-unit>
<trans-unit id="timesheet.start.error">
<source>timesheet.start.error</source>
<target>时间记录无法开始</target>
</trans-unit>
<trans-unit id="timesheet.start.exceeded_limit">
<source>timesheet.start.exceeded_limit</source>
<target>活动时间记录已达到限制,请先停止至少一次运行时间测量</target>
</trans-unit>
<trans-unit id="timesheet.locked.warning">
<source>timesheet.locked.warning</source>
<target>您正在编辑导出的记录</target>
</trans-unit>
<trans-unit id="action.update.success">
<source>action.update.success</source>
<target>保存更改</target>
</trans-unit>
<trans-unit id="action.update.error">
<source>action.update.error</source>
<target>更改无法保存: %reason%</target>
</trans-unit>
<trans-unit id="action.delete.success">
<source>action.delete.success</source>
<target>条目已被删除</target>
</trans-unit>
<trans-unit id="action.delete.error">
<source>action.delete.error</source>
<target>无法删除条目: %reason%</target>
</trans-unit>
<trans-unit id="invoice.first_template">
<source>invoice.first_template</source>
<target>您必须先创立一个自己的发票模板</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="invoice-calculator.en.xliff">
<body>
<trans-unit id="label.invoice_calculator">
<source>label.invoice_calculator</source>
<target>总和计算</target>
</trans-unit>
<trans-unit id="default">
<source>default</source>
<target>默认:每次记录一个条目</target>
</trans-unit>
<trans-unit id="short">
<source>short</source>
<target>时间:记录总和,只有一个条目</target>
</trans-unit>
<trans-unit id="user">
<source>user</source>
<target>用户:每个用户一个条目</target>
</trans-unit>
<trans-unit id="activity">
<source>activity</source>
<target>活动:每次活动一个条目</target>
</trans-unit>
<trans-unit id="project">
<source>project</source>
<target>项目:每个项目一个条目</target>
</trans-unit>
<trans-unit id="date">
<source>date</source>
<target>日期:每天一个条目(用户开始日期)</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="invoice-numbergenerator.en.xliff">
<body>
<trans-unit id="label.invoice_number_generator">
<source>label.invoice_number_generator</source>
<target>发票数字生成器</target>
</trans-unit>
<trans-unit id="default">
<source>default</source>
<target>日期(默认)</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="invoice-renderer.en.xliff">
<body>
<trans-unit id="label.invoice_renderer">
<source>label.invoice_renderer</source>
<target>发票文件</target>
</trans-unit>
<trans-unit id="default">
<source>default</source>
<target>发票(默认)</target>
</trans-unit>
<trans-unit id="timesheet">
<source>timesheet</source>
<target>时间表</target>
</trans-unit>
<trans-unit id="freelancer">
<source>freelancer</source>
<target>兼职人员</target>
</trans-unit>
<trans-unit id="open-spreadsheet">
<source>open-spreadsheet</source>
<target>电子表格</target>
</trans-unit>
<trans-unit id="spreadsheet">
<source>spreadsheet</source>
<target>Excel表格</target>
</trans-unit>
<trans-unit id="export">
<source>export</source>
<target>数据输出</target>
</trans-unit>
<trans-unit id="company">
<source>company</source>
<target>公司发票</target>
</trans-unit>
</body>
</file>
</xliff>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="pagerfanta.en.xliff">
<body>
<trans-unit id="previous">
<source>previous</source>
<target>以前</target>
</trans-unit>
<trans-unit id="next">
<source>next</source>
<target>下</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="plugins.en.xliff">
<body>
<trans-unit id="plugins.title">
<source>plugins.title</source>
<target>插件</target>
</trans-unit>
<trans-unit id="plugins.subtitle">
<source>plugins.subtitle</source>
<target>您可以通过安装插件以提升Kimai的性能。</target>
</trans-unit>
<trans-unit id="plugin.none_installed">
<source>plugin.none_installed</source>
<target>您尚未安装插件。</target>
</trans-unit>
<trans-unit id="plugin.marketplace">
<source>plugin.marketplace</source>
<target>Kimai市场</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,195 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="system-configuration.en.xliff">
<body>
<trans-unit id="title">
<source>title</source>
<target>设置</target>
</trans-unit>
<trans-unit id="subtitle">
<source>subtitle</source>
<target>修改您的时间追踪器的全球设置</target>
</trans-unit>
<trans-unit id="timesheet">
<source>timesheet</source>
<target>时间表</target>
</trans-unit>
<trans-unit id="form_customer">
<source>form_customer</source>
<target>创建客户-默认值</target>
</trans-unit>
<trans-unit id="form_user">
<source>form_user</source>
<target>用户—默认值</target>
</trans-unit>
<trans-unit id="theme">
<source>theme</source>
<target>主题</target>
</trans-unit>
<trans-unit id="calendar">
<source>calendar</source>
<target>日历</target>
</trans-unit>
<trans-unit id="label.theme.markdown_content">
<source>label.theme.markdown_content</source>
<target>在描述区和评论区允许更改格式。</target>
</trans-unit>
<trans-unit id="label.timesheet.mode">
<source>label.timesheet.mode</source>
<target>时间追踪模式</target>
</trans-unit>
<trans-unit id="label.timesheet.mode_default">
<source>label.timesheet.mode_default</source>
<target>[默认] 开始时间和结束时间可编辑</target>
</trans-unit>
<trans-unit id="label.timesheet.mode_duration_only">
<source>label.timesheet.mode_duration_only</source>
<target>[持续时间]用持续时间输入栏代替结束时间</target>
</trans-unit>
<trans-unit id="label.timesheet.mode_duration_fixed_begin">
<source>label.timesheet.mode_duration_fixed_begin</source>
<target>[持续时间] 可配置的固定开始时间,只有持续时间可以更改</target>
</trans-unit>
<trans-unit id="label.timesheet.mode_punch">
<source>label.timesheet.mode_punch</source>
<target>[打卡钟] 用户可以开始或停止记录,但是不能编辑时间或持续时间</target>
</trans-unit>
<trans-unit id="label.timesheet.rules.allow_future_times">
<source>label.timesheet.rules.allow_future_times</source>
<target>在未来允许时间条目</target>
</trans-unit>
<trans-unit id="label.timesheet.active_entries.hard_limit">
<source>label.timesheet.active_entries.hard_limit</source>
<target>允许可同时运行的时间条目数量</target>
</trans-unit>
<trans-unit id="label.timesheet.active_entries.soft_limit">
<source>label.timesheet.active_entries.soft_limit</source>
<target>展示警告信息的运行时间条目数量</target>
</trans-unit>
<trans-unit id="label.theme.select_type">
<source>label.theme.select_type</source>
<target>表格中筛选框的类型</target>
</trans-unit>
<trans-unit id="label.theme.autocomplete_chars">
<source>label.theme.autocomplete_chars</source>
<target>开启自动完成需达到的最少字母数</target>
</trans-unit>
<trans-unit id="label.calendar.week_numbers">
<source>label.calendar.week_numbers</source>
<target>显示周数字</target>
</trans-unit>
<trans-unit id="label.calendar.weekends">
<source>label.calendar.weekends</source>
<target>显示周末</target>
</trans-unit>
<trans-unit id="label.calendar.businessHours.begin">
<source>label.calendar.businessHours.begin</source>
<target>正常工作时间的开始时间(将被高亮)</target>
</trans-unit>
<trans-unit id="label.calendar.businessHours.end">
<source>label.calendar.businessHours.end</source>
<target>正常工作时间的结束时间(将被高亮)</target>
</trans-unit>
<trans-unit id="label.calendar.visibleHours.begin">
<source>label.calendar.visibleHours.begin</source>
<target>可见时间范围的开始时间</target>
</trans-unit>
<trans-unit id="label.calendar.visibleHours.end">
<source>label.calendar.visibleHours.end</source>
<target>可见时间范围的结束时间</target>
</trans-unit>
<trans-unit id="label.calendar.slot_duration">
<source>label.calendar.slot_duration</source>
<target>周和日查看的空隙持续时间(格式:时:分:秒)</target>
</trans-unit>
<trans-unit id="branding">
<source>branding</source>
<target>品牌</target>
</trans-unit>
<trans-unit id="label.theme.branding.logo">
<source>label.theme.branding.logo</source>
<target>标识 (图片链接,在登录界面替换公司)</target>
</trans-unit>
<trans-unit id="label.theme.branding.company">
<source>label.theme.branding.company</source>
<target>公司</target>
</trans-unit>
<trans-unit id="label.theme.branding.mini">
<source>label.theme.branding.mini</source>
<target>小标识(折叠侧面菜单)</target>
</trans-unit>
<trans-unit id="label.theme.branding.title">
<source>label.theme.branding.title</source>
<target>浏览器名称</target>
</trans-unit>
<trans-unit id="rounding">
<source>rounding</source>
<target>时间取整</target>
</trans-unit>
<trans-unit id="label.timesheet.rounding.default.begin">
<source>label.timesheet.rounding.default.begin</source>
<target>开始时间以分钟取整 (0 = 不活跃)</target>
</trans-unit>
<trans-unit id="label.timesheet.rounding.default.end">
<source>label.timesheet.rounding.default.end</source>
<target>结束时间以分钟取整 (0 = 不活跃)</target>
</trans-unit>
<trans-unit id="label.timesheet.rounding.default.duration">
<source>label.timesheet.rounding.default.duration</source>
<target>持续时间以分钟取整 (0 = 不活跃)</target>
</trans-unit>
<trans-unit id="label.timesheet.rounding.default.mode">
<source>label.timesheet.rounding.default.mode</source>
<target>取整模式</target>
</trans-unit>
<trans-unit id="label.timesheet.rounding.default.days">
<source>label.timesheet.rounding.default.days</source>
<target>取整模式适用时一周工作天数</target>
</trans-unit>
<trans-unit id="Monday">
<source>Monday</source>
<target>周一</target>
</trans-unit>
<trans-unit id="Tuesday">
<source>Tuesday</source>
<target>周二</target>
</trans-unit>
<trans-unit id="Wednesday">
<source>Wednesday</source>
<target>周三</target>
</trans-unit>
<trans-unit id="Thursday">
<source>Thursday</source>
<target>周四</target>
</trans-unit>
<trans-unit id="Friday">
<source>Friday</source>
<target>周五</target>
</trans-unit>
<trans-unit id="Saturday">
<source>Saturday</source>
<target>周六</target>
</trans-unit>
<trans-unit id="Sunday">
<source>Sunday</source>
<target>周日</target>
</trans-unit>
<trans-unit id="Ceil">
<source>Ceil</source>
<target>进一取整法: 开始时间, 结束时间以及持续时间都将取整处理</target>
</trans-unit>
<trans-unit id="Closest">
<source>Closest</source>
<target>最近值: 数学取整至最近值</target>
</trans-unit>
<trans-unit id="Default">
<source>Default</source>
<target>标准:开始时间会向下取整,结束时间和持续时间会向上取整</target>
</trans-unit>
<trans-unit id="Floor">
<source>Floor</source>
<target>Floor: 开始时间,结束时间和持续时间会向下取整</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="tags.en.xliff">
<body>
<trans-unit id="tags.title">
<source>tags.title</source>
<target>标签</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="teams.en.xliff">
<body>
<trans-unit id="teams.title">
<source>teams.title</source>
<target>团队</target>
</trans-unit>
<trans-unit id="teams.project_access">
<source>teams.project_access</source>
<target>授予访问项目权限</target>
</trans-unit>
<trans-unit id="teams.customer_access">
<source>teams.customer_access</source>
<target>授予访问客户权限</target>
</trans-unit>
</body>
</file>
</xliff>

View file

@ -0,0 +1,19 @@
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="zh-CN" datatype="plaintext" original="validators.en.xliff">
<body>
<trans-unit id="This value is not a valid role.">
<source>This value is not a valid role.</source>
<target>此值不是有效角色。</target>
</trans-unit>
<trans-unit id="End date must not be earlier then start date.">
<source>End date must not be earlier then start date.</source>
<target>结束日期必须早于开始日期。</target>
</trans-unit>
<trans-unit id="The begin date cannot be in the future.">
<source>The begin date cannot be in the future.</source>
<target>开始日期不能是未来的某一日期。</target>
</trans-unit>
</body>
</file>
</xliff>