Merge branch 'development' of https://github.com/Worklenz/worklenz into release/v2.0.4-bug-fix
This commit is contained in:
16
backup.sh
Normal file
16
backup.sh
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# Adjust these as needed:
|
||||||
|
CONTAINER=worklenz_db
|
||||||
|
DB_NAME=worklenz_db
|
||||||
|
DB_USER=postgres
|
||||||
|
BACKUP_DIR=./pg_backups
|
||||||
|
mkdir -p "$BACKUP_DIR"
|
||||||
|
|
||||||
|
timestamp=$(date +%Y-%m-%d_%H-%M-%S)
|
||||||
|
outfile="${BACKUP_DIR}/${DB_NAME}_${timestamp}.sql"
|
||||||
|
echo "Creating backup $outfile ..."
|
||||||
|
|
||||||
|
docker exec -t "$CONTAINER" pg_dump -U "$DB_USER" -d "$DB_NAME" > "$outfile"
|
||||||
|
echo "Backup saved to $outfile"
|
||||||
@@ -83,7 +83,11 @@ services:
|
|||||||
POSTGRES_DB: ${DB_NAME:-worklenz_db}
|
POSTGRES_DB: ${DB_NAME:-worklenz_db}
|
||||||
POSTGRES_PASSWORD: ${DB_PASSWORD:-password}
|
POSTGRES_PASSWORD: ${DB_PASSWORD:-password}
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: [ "CMD-SHELL", "pg_isready -d ${DB_NAME:-worklenz_db} -U ${DB_USER:-postgres}" ]
|
test:
|
||||||
|
[
|
||||||
|
"CMD-SHELL",
|
||||||
|
"pg_isready -d ${DB_NAME:-worklenz_db} -U ${DB_USER:-postgres}",
|
||||||
|
]
|
||||||
interval: 10s
|
interval: 10s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 5
|
||||||
@@ -93,23 +97,65 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- worklenz_postgres_data:/var/lib/postgresql/data
|
- worklenz_postgres_data:/var/lib/postgresql/data
|
||||||
- type: bind
|
- type: bind
|
||||||
source: ./worklenz-backend/database
|
source: ./worklenz-backend/database/sql
|
||||||
target: /docker-entrypoint-initdb.d
|
target: /docker-entrypoint-initdb.d/sql
|
||||||
consistency: cached
|
consistency: cached
|
||||||
|
- type: bind
|
||||||
|
source: ./worklenz-backend/database/migrations
|
||||||
|
target: /docker-entrypoint-initdb.d/migrations
|
||||||
|
consistency: cached
|
||||||
|
- type: bind
|
||||||
|
source: ./worklenz-backend/database/00_init.sh
|
||||||
|
target: /docker-entrypoint-initdb.d/00_init.sh
|
||||||
|
consistency: cached
|
||||||
|
- type: bind
|
||||||
|
source: ./pg_backups
|
||||||
|
target: /docker-entrypoint-initdb.d/pg_backups
|
||||||
command: >
|
command: >
|
||||||
bash -c ' if command -v apt-get >/dev/null 2>&1; then
|
bash -c '
|
||||||
apt-get update && apt-get install -y dos2unix
|
if command -v apt-get >/dev/null 2>&1; then
|
||||||
elif command -v apk >/dev/null 2>&1; then
|
apt-get update && apt-get install -y dos2unix
|
||||||
apk add --no-cache dos2unix
|
elif command -v apk >/dev/null 2>&1; then
|
||||||
fi && find /docker-entrypoint-initdb.d -type f -name "*.sh" -exec sh -c '\''
|
apk add --no-cache dos2unix
|
||||||
dos2unix "{}" 2>/dev/null || true
|
fi
|
||||||
chmod +x "{}"
|
|
||||||
'\'' \; && exec docker-entrypoint.sh postgres '
|
find /docker-entrypoint-initdb.d -type f -name "*.sh" -exec sh -c '"'"'
|
||||||
|
for f; do
|
||||||
|
dos2unix "$f" 2>/dev/null || true
|
||||||
|
chmod +x "$f"
|
||||||
|
done
|
||||||
|
'"'"' sh {} +
|
||||||
|
|
||||||
|
exec docker-entrypoint.sh postgres
|
||||||
|
'
|
||||||
|
db-backup:
|
||||||
|
image: postgres:15
|
||||||
|
container_name: worklenz_db_backup
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: ${DB_USER:-postgres}
|
||||||
|
POSTGRES_DB: ${DB_NAME:-worklenz_db}
|
||||||
|
POSTGRES_PASSWORD: ${DB_PASSWORD:-password}
|
||||||
|
depends_on:
|
||||||
|
db:
|
||||||
|
condition: service_healthy
|
||||||
|
volumes:
|
||||||
|
- ./pg_backups:/pg_backups #host dir for backups files
|
||||||
|
#setup bassh loop to backup data evey 24h
|
||||||
|
command: >
|
||||||
|
bash -c 'while true; do
|
||||||
|
sleep 86400;
|
||||||
|
PGPASSWORD=$$POSTGRES_PASSWORD pg_dump -h worklenz_db -U $$POSTGRES_USER -d $$POSTGRES_DB \
|
||||||
|
> /pg_backups/worklenz_db_$$(date +%Y-%m-%d_%H-%M-%S).sql;
|
||||||
|
find /pg_backups -type f -name "*.sql" -mtime +30 -delete;
|
||||||
|
done'
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- worklenz
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
worklenz_postgres_data:
|
worklenz_postgres_data:
|
||||||
worklenz_minio_data:
|
worklenz_minio_data:
|
||||||
|
pgdata:
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
worklenz:
|
worklenz:
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# This script controls the order of SQL file execution during database initialization
|
|
||||||
echo "Starting database initialization..."
|
|
||||||
|
|
||||||
# Check if we have SQL files in expected locations
|
|
||||||
if [ -f "/docker-entrypoint-initdb.d/sql/0_extensions.sql" ]; then
|
|
||||||
SQL_DIR="/docker-entrypoint-initdb.d/sql"
|
|
||||||
echo "Using SQL files from sql/ subdirectory"
|
|
||||||
elif [ -f "/docker-entrypoint-initdb.d/0_extensions.sql" ]; then
|
|
||||||
# First time setup - move files to subdirectory
|
|
||||||
echo "Moving SQL files to sql/ subdirectory..."
|
|
||||||
mkdir -p /docker-entrypoint-initdb.d/sql
|
|
||||||
|
|
||||||
# Move all SQL files (except this script) to the subdirectory
|
|
||||||
for f in /docker-entrypoint-initdb.d/*.sql; do
|
|
||||||
if [ -f "$f" ]; then
|
|
||||||
cp "$f" /docker-entrypoint-initdb.d/sql/
|
|
||||||
echo "Copied $f to sql/ subdirectory"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
SQL_DIR="/docker-entrypoint-initdb.d/sql"
|
|
||||||
else
|
|
||||||
echo "SQL files not found in expected locations!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Execute SQL files in the correct order
|
|
||||||
echo "Executing 0_extensions.sql..."
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$SQL_DIR/0_extensions.sql"
|
|
||||||
|
|
||||||
echo "Executing 1_tables.sql..."
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$SQL_DIR/1_tables.sql"
|
|
||||||
|
|
||||||
echo "Executing indexes.sql..."
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$SQL_DIR/indexes.sql"
|
|
||||||
|
|
||||||
echo "Executing 4_functions.sql..."
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$SQL_DIR/4_functions.sql"
|
|
||||||
|
|
||||||
echo "Executing triggers.sql..."
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$SQL_DIR/triggers.sql"
|
|
||||||
|
|
||||||
echo "Executing 3_views.sql..."
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$SQL_DIR/3_views.sql"
|
|
||||||
|
|
||||||
echo "Executing 2_dml.sql..."
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$SQL_DIR/2_dml.sql"
|
|
||||||
|
|
||||||
echo "Executing 5_database_user.sql..."
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$SQL_DIR/5_database_user.sql"
|
|
||||||
|
|
||||||
echo "Database initialization completed successfully"
|
|
||||||
88
worklenz-backend/database/00_init.sh
Normal file
88
worklenz-backend/database/00_init.sh
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Starting database initialization..."
|
||||||
|
|
||||||
|
SQL_DIR="/docker-entrypoint-initdb.d/sql"
|
||||||
|
MIGRATIONS_DIR="/docker-entrypoint-initdb.d/migrations"
|
||||||
|
BACKUP_DIR="/docker-entrypoint-initdb.d/pg_backups"
|
||||||
|
|
||||||
|
# --------------------------------------------
|
||||||
|
# 🗄️ STEP 1: Attempt to restore latest backup
|
||||||
|
# --------------------------------------------
|
||||||
|
|
||||||
|
if [ -d "$BACKUP_DIR" ]; then
|
||||||
|
LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/*.sql 2>/dev/null | head -n 1)
|
||||||
|
else
|
||||||
|
LATEST_BACKUP=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$LATEST_BACKUP" ]; then
|
||||||
|
echo "🗄️ Found latest backup: $LATEST_BACKUP"
|
||||||
|
echo "⏳ Restoring from backup..."
|
||||||
|
psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" < "$LATEST_BACKUP"
|
||||||
|
echo "✅ Backup restoration complete. Skipping schema and migrations."
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "ℹ️ No valid backup found. Proceeding with base schema and migrations."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --------------------------------------------
|
||||||
|
# 🏗️ STEP 2: Continue with base schema setup
|
||||||
|
# --------------------------------------------
|
||||||
|
|
||||||
|
# Create migrations table if it doesn't exist
|
||||||
|
psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "
|
||||||
|
CREATE TABLE IF NOT EXISTS schema_migrations (
|
||||||
|
version TEXT PRIMARY KEY,
|
||||||
|
applied_at TIMESTAMP DEFAULT now()
|
||||||
|
);
|
||||||
|
"
|
||||||
|
|
||||||
|
# List of base schema files to execute in order
|
||||||
|
BASE_SQL_FILES=(
|
||||||
|
"0_extensions.sql"
|
||||||
|
"1_tables.sql"
|
||||||
|
"indexes.sql"
|
||||||
|
"4_functions.sql"
|
||||||
|
"triggers.sql"
|
||||||
|
"3_views.sql"
|
||||||
|
"2_dml.sql"
|
||||||
|
"5_database_user.sql"
|
||||||
|
)
|
||||||
|
|
||||||
|
echo "Running base schema SQL files in order..."
|
||||||
|
|
||||||
|
for file in "${BASE_SQL_FILES[@]}"; do
|
||||||
|
full_path="$SQL_DIR/$file"
|
||||||
|
if [ -f "$full_path" ]; then
|
||||||
|
echo "Executing $file..."
|
||||||
|
psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -d "$POSTGRES_DB" -f "$full_path"
|
||||||
|
else
|
||||||
|
echo "WARNING: $file not found, skipping."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✅ Base schema SQL execution complete."
|
||||||
|
|
||||||
|
# --------------------------------------------
|
||||||
|
# 🚀 STEP 3: Apply SQL migrations
|
||||||
|
# --------------------------------------------
|
||||||
|
|
||||||
|
if [ -d "$MIGRATIONS_DIR" ] && compgen -G "$MIGRATIONS_DIR/*.sql" > /dev/null; then
|
||||||
|
echo "Applying migrations..."
|
||||||
|
for f in "$MIGRATIONS_DIR"/*.sql; do
|
||||||
|
version=$(basename "$f")
|
||||||
|
if ! psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -tAc "SELECT 1 FROM schema_migrations WHERE version = '$version'" | grep -q 1; then
|
||||||
|
echo "Applying migration: $version"
|
||||||
|
psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -f "$f"
|
||||||
|
psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "INSERT INTO schema_migrations (version) VALUES ('$version');"
|
||||||
|
else
|
||||||
|
echo "Skipping already applied migration: $version"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "No migration files found or directory is empty, skipping migrations."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "🎉 Database initialization completed successfully."
|
||||||
@@ -12,7 +12,7 @@ CREATE TYPE DEPENDENCY_TYPE AS ENUM ('blocked_by');
|
|||||||
|
|
||||||
CREATE TYPE SCHEDULE_TYPE AS ENUM ('daily', 'weekly', 'yearly', 'monthly', 'every_x_days', 'every_x_weeks', 'every_x_months');
|
CREATE TYPE SCHEDULE_TYPE AS ENUM ('daily', 'weekly', 'yearly', 'monthly', 'every_x_days', 'every_x_weeks', 'every_x_months');
|
||||||
|
|
||||||
CREATE TYPE LANGUAGE_TYPE AS ENUM ('en', 'es', 'pt');
|
CREATE TYPE LANGUAGE_TYPE AS ENUM ('en', 'es', 'pt', 'alb', 'de', 'zh_cn');
|
||||||
|
|
||||||
-- START: Users
|
-- START: Users
|
||||||
CREATE SEQUENCE IF NOT EXISTS users_user_no_seq START 1;
|
CREATE SEQUENCE IF NOT EXISTS users_user_no_seq START 1;
|
||||||
|
|||||||
4
worklenz-frontend/public/locales/zh/404-page.json
Normal file
4
worklenz-frontend/public/locales/zh/404-page.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"doesNotExistText": "抱歉,您访问的页面不存在。",
|
||||||
|
"backHomeButton": "返回首页"
|
||||||
|
}
|
||||||
27
worklenz-frontend/public/locales/zh/account-setup.json
Normal file
27
worklenz-frontend/public/locales/zh/account-setup.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"continue": "继续",
|
||||||
|
"setupYourAccount": "设置您的Worklenz账户。",
|
||||||
|
"organizationStepTitle": "命名您的组织",
|
||||||
|
"organizationStepLabel": "为您的Worklenz账户选择一个名称。",
|
||||||
|
"projectStepTitle": "创建您的第一个项目",
|
||||||
|
"projectStepLabel": "您现在正在做什么项目?",
|
||||||
|
"projectStepPlaceholder": "例如:营销计划",
|
||||||
|
"tasksStepTitle": "创建您的第一个任务",
|
||||||
|
"tasksStepLabel": "输入您将在其中完成的几个任务",
|
||||||
|
"tasksStepAddAnother": "添加另一个",
|
||||||
|
"emailPlaceholder": "电子邮件地址",
|
||||||
|
"invalidEmail": "请输入有效的电子邮件地址",
|
||||||
|
"or": "或",
|
||||||
|
"templateButton": "从模板导入",
|
||||||
|
"goBack": "返回",
|
||||||
|
"cancel": "取消",
|
||||||
|
"create": "创建",
|
||||||
|
"templateDrawerTitle": "从模板中选择",
|
||||||
|
"step3InputLabel": "通过电子邮件邀请",
|
||||||
|
"addAnother": "添加另一个",
|
||||||
|
"skipForNow": "暂时跳过",
|
||||||
|
"formTitle": "创建您的第一个任务。",
|
||||||
|
"step3Title": "邀请您的团队一起工作",
|
||||||
|
"maxMembers": "(您最多可以邀请5名成员)",
|
||||||
|
"maxTasks": "(您最多可以创建5个任务)"
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"title": "账单",
|
||||||
|
"currentBill": "当前账单",
|
||||||
|
"configuration": "配置",
|
||||||
|
"currentPlanDetails": "当前计划详情",
|
||||||
|
"upgradePlan": "升级计划",
|
||||||
|
"cardBodyText01": "免费试用",
|
||||||
|
"cardBodyText02": "(您的试用计划将在1个月19天后到期)",
|
||||||
|
"redeemCode": "兑换码",
|
||||||
|
"accountStorage": "账户存储",
|
||||||
|
"used": "已用:",
|
||||||
|
"remaining": "剩余:",
|
||||||
|
"charges": "费用",
|
||||||
|
"tooltip": "当前账单周期的费用",
|
||||||
|
"description": "描述",
|
||||||
|
"billingPeriod": "账单周期",
|
||||||
|
"billStatus": "账单状态",
|
||||||
|
"perUserValue": "每用户费用",
|
||||||
|
"users": "用户",
|
||||||
|
"amount": "金额",
|
||||||
|
"invoices": "发票",
|
||||||
|
"transactionId": "交易ID",
|
||||||
|
"transactionDate": "交易日期",
|
||||||
|
"paymentMethod": "支付方式",
|
||||||
|
"status": "状态",
|
||||||
|
"ltdUsers": "您最多可以添加{{ltd_users}}名用户。",
|
||||||
|
"totalSeats": "总席位",
|
||||||
|
"availableSeats": "可用席位",
|
||||||
|
"addMoreSeats": "添加更多席位",
|
||||||
|
"drawerTitle": "兑换码",
|
||||||
|
"label": "兑换码",
|
||||||
|
"drawerPlaceholder": "输入您的兑换码",
|
||||||
|
"redeemSubmit": "提交",
|
||||||
|
"modalTitle": "为您的团队选择最佳计划",
|
||||||
|
"seatLabel": "席位数量",
|
||||||
|
"freePlan": "免费计划",
|
||||||
|
"startup": "初创",
|
||||||
|
"business": "商业",
|
||||||
|
"tag": "最受欢迎",
|
||||||
|
"enterprise": "企业",
|
||||||
|
"freeSubtitle": "永远免费",
|
||||||
|
"freeUsers": "最适合个人使用",
|
||||||
|
"freeText01": "100MB存储",
|
||||||
|
"freeText02": "3个项目",
|
||||||
|
"freeText03": "5名团队成员",
|
||||||
|
"startupSubtitle": "固定费率/月",
|
||||||
|
"startupUsers": "最多15名用户",
|
||||||
|
"startupText01": "25GB存储",
|
||||||
|
"startupText02": "无限活跃项目",
|
||||||
|
"startupText03": "日程",
|
||||||
|
"startupText04": "报告",
|
||||||
|
"startupText05": "订阅项目",
|
||||||
|
"businessSubtitle": "每用户/月",
|
||||||
|
"businessUsers": "16 - 200名用户",
|
||||||
|
"enterpriseUsers": "200 - 500+名用户",
|
||||||
|
"footerTitle": "请提供一个我们可以联系您的电话号码。",
|
||||||
|
"footerLabel": "联系电话",
|
||||||
|
"footerButton": "联系我们",
|
||||||
|
"redeemCodePlaceHolder": "输入您的兑换码",
|
||||||
|
"submit": "提交",
|
||||||
|
"trialPlan": "免费试用",
|
||||||
|
"trialExpireDate": "有效期至{{trial_expire_date}}",
|
||||||
|
"trialExpired": "您的免费试用已于{{trial_expire_string}}到期",
|
||||||
|
"trialInProgress": "您的免费试用将在{{trial_expire_string}}到期",
|
||||||
|
"required": "此字段为必填项",
|
||||||
|
"invalidCode": "无效的代码",
|
||||||
|
"selectPlan": "为您的团队选择最佳计划",
|
||||||
|
"changeSubscriptionPlan": "更改您的订阅计划",
|
||||||
|
"noOfSeats": "席位数量",
|
||||||
|
"annualPlan": "专业 - 年度",
|
||||||
|
"monthlyPlan": "专业 - 月度",
|
||||||
|
"freeForever": "永远免费",
|
||||||
|
"bestForPersonalUse": "最适合个人使用",
|
||||||
|
"storage": "存储",
|
||||||
|
"projects": "项目",
|
||||||
|
"teamMembers": "团队成员",
|
||||||
|
"unlimitedTeamMembers": "无限团队成员",
|
||||||
|
"unlimitedActiveProjects": "无限活跃项目",
|
||||||
|
"schedule": "日程",
|
||||||
|
"reporting": "报告",
|
||||||
|
"subscribeToProjects": "订阅项目",
|
||||||
|
"billedAnnually": "按年计费",
|
||||||
|
"billedMonthly": "按月计费",
|
||||||
|
"pausePlan": "暂停计划",
|
||||||
|
"resumePlan": "恢复计划",
|
||||||
|
"changePlan": "更改计划",
|
||||||
|
"cancelPlan": "取消计划",
|
||||||
|
"perMonthPerUser": "每用户/月",
|
||||||
|
"viewInvoice": "查看发票",
|
||||||
|
"switchToFreePlan": "切换到免费计划",
|
||||||
|
"expirestoday": "今天",
|
||||||
|
"expirestomorrow": "明天",
|
||||||
|
"expiredDaysAgo": "{{days}}天前",
|
||||||
|
"continueWith": "继续使用{{plan}}",
|
||||||
|
"changeToPlan": "更改为{{plan}}"
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"overview": "概览",
|
||||||
|
"name": "组织名称",
|
||||||
|
"owner": "组织所有者",
|
||||||
|
"admins": "组织管理员",
|
||||||
|
"contactNumber": "添加联系电话",
|
||||||
|
"edit": "编辑"
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"membersCount": "成员数量",
|
||||||
|
"createdAt": "创建于",
|
||||||
|
"projectName": "项目名称",
|
||||||
|
"teamName": "团队名称",
|
||||||
|
"refreshProjects": "刷新项目",
|
||||||
|
"searchPlaceholder": "按项目名称搜索",
|
||||||
|
"deleteProject": "您确定要删除此项目吗?",
|
||||||
|
"confirm": "确认",
|
||||||
|
"cancel": "取消",
|
||||||
|
"delete": "删除项目"
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"overview": "概览",
|
||||||
|
"users": "用户",
|
||||||
|
"teams": "团队",
|
||||||
|
"billing": "账单",
|
||||||
|
"projects": "项目",
|
||||||
|
"adminCenter": "管理中心"
|
||||||
|
}
|
||||||
33
worklenz-frontend/public/locales/zh/admin-center/teams.json
Normal file
33
worklenz-frontend/public/locales/zh/admin-center/teams.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"title": "团队",
|
||||||
|
"subtitle": "团队",
|
||||||
|
"tooltip": "刷新团队",
|
||||||
|
"placeholder": "按名称搜索",
|
||||||
|
"addTeam": "添加团队",
|
||||||
|
"team": "团队",
|
||||||
|
"membersCount": "成员数量",
|
||||||
|
"members": "成员",
|
||||||
|
"drawerTitle": "创建新团队",
|
||||||
|
"label": "团队名称",
|
||||||
|
"drawerPlaceholder": "名称",
|
||||||
|
"create": "创建",
|
||||||
|
"delete": "删除",
|
||||||
|
"settings": "设置",
|
||||||
|
"popTitle": "您确定吗?",
|
||||||
|
"message": "请输入名称",
|
||||||
|
"teamSettings": "团队设置",
|
||||||
|
"teamName": "团队名称",
|
||||||
|
"teamDescription": "团队描述",
|
||||||
|
"teamMembers": "团队成员",
|
||||||
|
"teamMembersCount": "团队成员数量",
|
||||||
|
"teamMembersPlaceholder": "按名称搜索",
|
||||||
|
"addMember": "添加成员",
|
||||||
|
"add": "添加",
|
||||||
|
"update": "更新",
|
||||||
|
"teamNamePlaceholder": "团队名称",
|
||||||
|
"user": "用户",
|
||||||
|
"role": "角色",
|
||||||
|
"owner": "所有者",
|
||||||
|
"admin": "管理员",
|
||||||
|
"member": "成员"
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"title": "用户",
|
||||||
|
"subTitle": "用户",
|
||||||
|
"placeholder": "按名称搜索",
|
||||||
|
"user": "用户",
|
||||||
|
"email": "电子邮件",
|
||||||
|
"lastActivity": "最后活动",
|
||||||
|
"refresh": "刷新用户"
|
||||||
|
}
|
||||||
23
worklenz-frontend/public/locales/zh/all-project-list.json
Normal file
23
worklenz-frontend/public/locales/zh/all-project-list.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "名称",
|
||||||
|
"client": "客户",
|
||||||
|
"category": "类别",
|
||||||
|
"status": "状态",
|
||||||
|
"tasksProgress": "任务进度",
|
||||||
|
"updated_at": "最后更新",
|
||||||
|
"members": "成员",
|
||||||
|
"setting": "设置",
|
||||||
|
"projects": "项目",
|
||||||
|
"refreshProjects": "刷新项目",
|
||||||
|
"all": "全部",
|
||||||
|
"favorites": "收藏",
|
||||||
|
"archived": "已归档",
|
||||||
|
"placeholder": "按名称搜索",
|
||||||
|
"archive": "归档",
|
||||||
|
"unarchive": "取消归档",
|
||||||
|
"archiveConfirm": "您确定要归档此项目吗?",
|
||||||
|
"unarchiveConfirm": "您确定要取消归档此项目吗?",
|
||||||
|
"clickToFilter": "点击以筛选",
|
||||||
|
"noProjects": "未找到项目",
|
||||||
|
"addToFavourites": "添加到收藏"
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"loggingOut": "正在登出...",
|
||||||
|
"authenticating": "正在认证...",
|
||||||
|
"gettingThingsReady": "正在为您准备..."
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"headerDescription": "重置您的密码",
|
||||||
|
"emailLabel": "电子邮件",
|
||||||
|
"emailPlaceholder": "输入您的电子邮件",
|
||||||
|
"emailRequired": "请输入您的电子邮件!",
|
||||||
|
"resetPasswordButton": "重置密码",
|
||||||
|
"returnToLoginButton": "返回登录",
|
||||||
|
"passwordResetSuccessMessage": "密码重置链接已发送到您的电子邮件。",
|
||||||
|
"orText": "或",
|
||||||
|
"successTitle": "重置指令已发送!",
|
||||||
|
"successMessage": "重置信息已发送到您的电子邮件。请检查您的电子邮件。"
|
||||||
|
}
|
||||||
27
worklenz-frontend/public/locales/zh/auth/login.json
Normal file
27
worklenz-frontend/public/locales/zh/auth/login.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"headerDescription": "登录到您的账户",
|
||||||
|
"emailLabel": "电子邮件",
|
||||||
|
"emailPlaceholder": "输入您的电子邮件",
|
||||||
|
"emailRequired": "请输入您的电子邮件!",
|
||||||
|
"passwordLabel": "密码",
|
||||||
|
"passwordPlaceholder": "输入您的密码",
|
||||||
|
"passwordRequired": "请输入您的密码!",
|
||||||
|
"rememberMe": "记住我",
|
||||||
|
"loginButton": "登录",
|
||||||
|
"signupButton": "注册",
|
||||||
|
"forgotPasswordButton": "忘记密码?",
|
||||||
|
"signInWithGoogleButton": "使用Google登录",
|
||||||
|
"dontHaveAccountText": "没有账户?",
|
||||||
|
"orText": "或",
|
||||||
|
"successMessage": "您已成功登录!",
|
||||||
|
"loginError": "登录失败",
|
||||||
|
"googleLoginError": "Google登录失败",
|
||||||
|
"validationMessages": {
|
||||||
|
"email": "请输入有效的电子邮件地址",
|
||||||
|
"password": "密码必须至少包含8个字符"
|
||||||
|
},
|
||||||
|
"errorMessages": {
|
||||||
|
"loginErrorTitle": "登录失败",
|
||||||
|
"loginErrorMessage": "请检查您的电子邮件和密码并重试"
|
||||||
|
}
|
||||||
|
}
|
||||||
29
worklenz-frontend/public/locales/zh/auth/signup.json
Normal file
29
worklenz-frontend/public/locales/zh/auth/signup.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"headerDescription": "注册以开始使用",
|
||||||
|
"nameLabel": "全名",
|
||||||
|
"namePlaceholder": "输入您的全名",
|
||||||
|
"nameRequired": "请输入您的全名!",
|
||||||
|
"nameMinCharacterRequired": "全名必须至少包含4个字符!",
|
||||||
|
"emailLabel": "电子邮件",
|
||||||
|
"emailPlaceholder": "输入您的电子邮件",
|
||||||
|
"emailRequired": "请输入您的电子邮件!",
|
||||||
|
"passwordLabel": "密码",
|
||||||
|
"passwordPlaceholder": "输入您的密码",
|
||||||
|
"passwordRequired": "请输入您的密码!",
|
||||||
|
"passwordMinCharacterRequired": "密码必须至少包含8个字符!",
|
||||||
|
"passwordPatternRequired": "密码不符合要求!",
|
||||||
|
"strongPasswordPlaceholder": "输入更强的密码",
|
||||||
|
"passwordValidationAltText": "密码必须至少包含8个字符,包括大小写字母、一个数字和一个符号。",
|
||||||
|
"signupSuccessMessage": "您已成功注册!",
|
||||||
|
"privacyPolicyLink": "隐私政策",
|
||||||
|
"termsOfUseLink": "使用条款",
|
||||||
|
"bySigningUpText": "通过注册,您同意我们的",
|
||||||
|
"andText": "和",
|
||||||
|
"signupButton": "注册",
|
||||||
|
"signInWithGoogleButton": "使用Google登录",
|
||||||
|
"alreadyHaveAccountText": "已经有账户了?",
|
||||||
|
"loginButton": "登录",
|
||||||
|
"orText": "或",
|
||||||
|
"reCAPTCHAVerificationError": "reCAPTCHA验证错误",
|
||||||
|
"reCAPTCHAVerificationErrorMessage": "我们无法验证您的reCAPTCHA。请重试。"
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"title": "验证重置电子邮件",
|
||||||
|
"description": "输入您的新密码",
|
||||||
|
"placeholder": "输入您的新密码",
|
||||||
|
"confirmPasswordPlaceholder": "确认您的新密码",
|
||||||
|
"passwordHint": "至少8个字符,包括大小写字母、一个数字和一个符号。",
|
||||||
|
"resetPasswordButton": "重置密码",
|
||||||
|
"orText": "或",
|
||||||
|
"resendResetEmail": "重新发送重置电子邮件",
|
||||||
|
"passwordRequired": "请输入您的新密码",
|
||||||
|
"returnToLoginButton": "返回登录",
|
||||||
|
"confirmPasswordRequired": "请确认您的新密码",
|
||||||
|
"passwordMismatch": "两次输入的密码不匹配"
|
||||||
|
}
|
||||||
9
worklenz-frontend/public/locales/zh/common.json
Normal file
9
worklenz-frontend/public/locales/zh/common.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"login-success": "登录成功!",
|
||||||
|
"login-failed": "登录失败。请检查您的凭据并重试。",
|
||||||
|
"signup-success": "注册成功!欢迎加入。",
|
||||||
|
"signup-failed": "注册失败。请确保填写所有必填字段并重试。",
|
||||||
|
"reconnecting": "与服务器断开连接。",
|
||||||
|
"connection-lost": "无法连接到服务器。请检查您的互联网连接。",
|
||||||
|
"connection-restored": "成功连接到服务器"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"formTitle": "创建您的第一个项目",
|
||||||
|
"inputLabel": "您现在正在做什么项目?",
|
||||||
|
"or": "或",
|
||||||
|
"templateButton": "从模板导入",
|
||||||
|
"createFromTemplate": "从模板创建",
|
||||||
|
"goBack": "返回",
|
||||||
|
"continue": "继续",
|
||||||
|
"cancel": "取消",
|
||||||
|
"create": "创建",
|
||||||
|
"templateDrawerTitle": "从模板中选择",
|
||||||
|
"createProject": "创建项目"
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"formTitle": "创建您的第一个任务。",
|
||||||
|
"inputLable": "输入您将在其中完成的几个任务",
|
||||||
|
"addAnother": "添加另一个",
|
||||||
|
"goBack": "返回",
|
||||||
|
"continue": "继续"
|
||||||
|
}
|
||||||
46
worklenz-frontend/public/locales/zh/home.json
Normal file
46
worklenz-frontend/public/locales/zh/home.json
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"todoList": {
|
||||||
|
"title": "待办事项列表",
|
||||||
|
"refreshTasks": "刷新任务",
|
||||||
|
"addTask": "+ 添加任务",
|
||||||
|
"noTasks": "没有任务",
|
||||||
|
"pressEnter": "按",
|
||||||
|
"toCreate": "创建。",
|
||||||
|
"markAsDone": "标记为完成"
|
||||||
|
},
|
||||||
|
"projects": {
|
||||||
|
"title": "项目",
|
||||||
|
"refreshProjects": "刷新项目",
|
||||||
|
"noRecentProjects": "您当前未被分配到任何项目。",
|
||||||
|
"noFavouriteProjects": "没有项目被标记为收藏。",
|
||||||
|
"recent": "最近",
|
||||||
|
"favourites": "收藏"
|
||||||
|
},
|
||||||
|
"tasks": {
|
||||||
|
"assignedToMe": "分配给我",
|
||||||
|
"assignedByMe": "由我分配",
|
||||||
|
"all": "全部",
|
||||||
|
"today": "今天",
|
||||||
|
"upcoming": "即将到来",
|
||||||
|
"overdue": "逾期",
|
||||||
|
"noDueDate": "没有截止日期",
|
||||||
|
"noTasks": "没有任务可显示。",
|
||||||
|
"addTask": "+ 添加任务",
|
||||||
|
"name": "名称",
|
||||||
|
"project": "项目",
|
||||||
|
"status": "状态",
|
||||||
|
"dueDate": "截止日期",
|
||||||
|
"dueDatePlaceholder": "设置截止日期",
|
||||||
|
"tomorrow": "明天",
|
||||||
|
"nextWeek": "下周",
|
||||||
|
"nextMonth": "下个月",
|
||||||
|
"projectRequired": "请选择一个项目",
|
||||||
|
"pressTabToSelectDueDateAndProject": "按Tab键选择截止日期和项目",
|
||||||
|
"dueOn": "任务截止于",
|
||||||
|
"taskRequired": "请添加一个任务",
|
||||||
|
"list": "列表",
|
||||||
|
"calendar": "日历",
|
||||||
|
"tasks": "任务",
|
||||||
|
"refresh": "刷新"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"formTitle": "邀请您的团队一起工作",
|
||||||
|
"inputLable": "通过电子邮件邀请",
|
||||||
|
"addAnother": "添加另一个",
|
||||||
|
"goBack": "返回",
|
||||||
|
"continue": "继续",
|
||||||
|
"skipForNow": "暂时跳过"
|
||||||
|
}
|
||||||
19
worklenz-frontend/public/locales/zh/kanban-board.json
Normal file
19
worklenz-frontend/public/locales/zh/kanban-board.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"rename": "重命名",
|
||||||
|
"delete": "删除",
|
||||||
|
"addTask": "添加任务",
|
||||||
|
"addSectionButton": "添加部分",
|
||||||
|
"changeCategory": "更改类别",
|
||||||
|
"deleteTooltip": "删除",
|
||||||
|
"deleteConfirmationTitle": "您确定吗?",
|
||||||
|
"deleteConfirmationOk": "是",
|
||||||
|
"deleteConfirmationCancel": "取消",
|
||||||
|
"dueDate": "截止日期",
|
||||||
|
"cancel": "取消",
|
||||||
|
"today": "今天",
|
||||||
|
"tomorrow": "明天",
|
||||||
|
"assignToMe": "分配给我",
|
||||||
|
"archive": "归档",
|
||||||
|
"newTaskNamePlaceholder": "写一个任务名称",
|
||||||
|
"newSubtaskNamePlaceholder": "写一个子任务名称"
|
||||||
|
}
|
||||||
6
worklenz-frontend/public/locales/zh/license-expired.json
Normal file
6
worklenz-frontend/public/locales/zh/license-expired.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"title": "您的Worklenz试用已过期!",
|
||||||
|
"subtitle": "请立即升级。",
|
||||||
|
"button": "立即升级",
|
||||||
|
"checking": "正在检查订阅状态..."
|
||||||
|
}
|
||||||
31
worklenz-frontend/public/locales/zh/navbar.json
Normal file
31
worklenz-frontend/public/locales/zh/navbar.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"logoAlt": "Worklenz Logo",
|
||||||
|
"home": "首页",
|
||||||
|
"projects": "项目",
|
||||||
|
"schedule": "日程",
|
||||||
|
"reporting": "报告",
|
||||||
|
"clients": "客户",
|
||||||
|
"teams": "团队",
|
||||||
|
"labels": "标签",
|
||||||
|
"jobTitles": "职位",
|
||||||
|
"upgradePlan": "升级计划",
|
||||||
|
"upgradePlanTooltip": "升级计划",
|
||||||
|
"invite": "邀请",
|
||||||
|
"inviteTooltip": "邀请团队成员加入",
|
||||||
|
"switchTeamTooltip": "切换团队",
|
||||||
|
"help": "帮助",
|
||||||
|
"notificationTooltip": "查看通知",
|
||||||
|
"profileTooltip": "查看个人资料",
|
||||||
|
"adminCenter": "管理中心",
|
||||||
|
"settings": "设置",
|
||||||
|
"logOut": "登出",
|
||||||
|
"notificationsDrawer": {
|
||||||
|
"read": "已读通知",
|
||||||
|
"unread": "未读通知",
|
||||||
|
"markAsRead": "标记为已读",
|
||||||
|
"readAndJoin": "阅读并加入",
|
||||||
|
"accept": "接受",
|
||||||
|
"acceptAndJoin": "接受并加入",
|
||||||
|
"noNotifications": "没有通知"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"nameYourOrganization": "命名您的组织。",
|
||||||
|
"worklenzAccountTitle": "为您的Worklenz账户选择一个名称。",
|
||||||
|
"continue": "继续"
|
||||||
|
}
|
||||||
7
worklenz-frontend/public/locales/zh/phases-drawer.json
Normal file
7
worklenz-frontend/public/locales/zh/phases-drawer.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"configurePhases": "配置阶段",
|
||||||
|
"phaseLabel": "阶段标签",
|
||||||
|
"enterPhaseName": "输入阶段标签名称",
|
||||||
|
"addOption": "添加选项",
|
||||||
|
"phaseOptions": "阶段选项:"
|
||||||
|
}
|
||||||
42
worklenz-frontend/public/locales/zh/project-drawer.json
Normal file
42
worklenz-frontend/public/locales/zh/project-drawer.json
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"createProject": "创建项目",
|
||||||
|
"editProject": "编辑项目",
|
||||||
|
"enterCategoryName": "输入类别名称",
|
||||||
|
"hitEnterToCreate": "按回车键创建!",
|
||||||
|
"enterNotes": "备注",
|
||||||
|
"youCanManageClientsUnderSettings": "您可以在设置中管理客户",
|
||||||
|
"addCategory": "向项目添加类别",
|
||||||
|
"newCategory": "新类别",
|
||||||
|
"notes": "备注",
|
||||||
|
"startDate": "开始日期",
|
||||||
|
"endDate": "结束日期",
|
||||||
|
"estimateWorkingDays": "估算工作日",
|
||||||
|
"estimateManDays": "估算人天",
|
||||||
|
"hoursPerDay": "每天小时数",
|
||||||
|
"create": "创建",
|
||||||
|
"update": "更新",
|
||||||
|
"delete": "删除",
|
||||||
|
"typeToSearchClients": "输入以搜索客户",
|
||||||
|
"projectColor": "项目颜色",
|
||||||
|
"pleaseEnterAName": "请输入名称",
|
||||||
|
"enterProjectName": "输入项目名称",
|
||||||
|
"name": "名称",
|
||||||
|
"status": "状态",
|
||||||
|
"health": "健康状况",
|
||||||
|
"category": "类别",
|
||||||
|
"projectManager": "项目经理",
|
||||||
|
"client": "客户",
|
||||||
|
"deleteConfirmation": "您确定要删除吗?",
|
||||||
|
"deleteConfirmationDescription": "这将删除所有相关数据且无法撤销。",
|
||||||
|
"yes": "是",
|
||||||
|
"no": "否",
|
||||||
|
"createdAt": "创建于",
|
||||||
|
"updatedAt": "更新于",
|
||||||
|
"by": "由",
|
||||||
|
"add": "添加",
|
||||||
|
"asClient": "作为客户",
|
||||||
|
"createClient": "创建客户",
|
||||||
|
"searchInputPlaceholder": "按名称或电子邮件搜索",
|
||||||
|
"hoursPerDayValidationMessage": "每天小时数必须是1到24之间的数字",
|
||||||
|
"noPermission": "无权限"
|
||||||
|
}
|
||||||
14
worklenz-frontend/public/locales/zh/project-view-files.json
Normal file
14
worklenz-frontend/public/locales/zh/project-view-files.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"attachedTaskColumn": "附加任务",
|
||||||
|
"sizeColumn": "大小",
|
||||||
|
"uploadedByColumn": "上传者",
|
||||||
|
"uploadedAtColumn": "上传时间",
|
||||||
|
"fileIconAlt": "文件图标",
|
||||||
|
"titleDescriptionText": "此项目中任务的所有附件将显示在这里。",
|
||||||
|
"deleteConfirmationTitle": "您确定吗?",
|
||||||
|
"deleteConfirmationOk": "是",
|
||||||
|
"deleteConfirmationCancel": "取消",
|
||||||
|
"segmentedTooltip": "即将推出!在列表视图和缩略图视图之间切换。",
|
||||||
|
"emptyText": "项目中没有附件。"
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"overview": {
|
||||||
|
"title": "概览",
|
||||||
|
"statusOverview": "状态概览",
|
||||||
|
"priorityOverview": "优先级概览",
|
||||||
|
"lastUpdatedTasks": "最近更新的任务"
|
||||||
|
},
|
||||||
|
"members": {
|
||||||
|
"title": "成员",
|
||||||
|
"tooltip": "成员",
|
||||||
|
"tasksByMembers": "按成员分类任务",
|
||||||
|
"tasksByMembersTooltip": "按成员分类任务",
|
||||||
|
"name": "名称",
|
||||||
|
"taskCount": "任务计数",
|
||||||
|
"contribution": "贡献",
|
||||||
|
"completed": "已完成",
|
||||||
|
"incomplete": "未完成",
|
||||||
|
"overdue": "逾期",
|
||||||
|
"progress": "进度"
|
||||||
|
},
|
||||||
|
"tasks": {
|
||||||
|
"overdueTasks": "逾期任务",
|
||||||
|
"overLoggedTasks": "超额记录任务",
|
||||||
|
"tasksCompletedEarly": "提前完成的任务",
|
||||||
|
"tasksCompletedLate": "延迟完成的任务",
|
||||||
|
"overLoggedTasksTooltip": "记录时间超过预计时间的任务",
|
||||||
|
"overdueTasksTooltip": "超过截止日期的任务"
|
||||||
|
},
|
||||||
|
"common": {
|
||||||
|
"seeAll": "查看全部",
|
||||||
|
"totalLoggedHours": "总记录小时数",
|
||||||
|
"totalEstimation": "总估算",
|
||||||
|
"completedTasks": "已完成任务",
|
||||||
|
"incompleteTasks": "未完成任务",
|
||||||
|
"overdueTasks": "逾期任务",
|
||||||
|
"overdueTasksTooltip": "超过截止日期的任务",
|
||||||
|
"totalLoggedHoursTooltip": "任务估算和任务记录时间。",
|
||||||
|
"includeArchivedTasks": "包含已归档任务",
|
||||||
|
"export": "导出"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"jobTitleColumn": "职位",
|
||||||
|
"emailColumn": "电子邮件",
|
||||||
|
"tasksColumn": "任务",
|
||||||
|
"taskProgressColumn": "任务进度",
|
||||||
|
"accessColumn": "访问权限",
|
||||||
|
"fileIconAlt": "文件图标",
|
||||||
|
"deleteConfirmationTitle": "您确定吗?",
|
||||||
|
"deleteConfirmationOk": "是",
|
||||||
|
"deleteConfirmationCancel": "取消",
|
||||||
|
"refreshButtonTooltip": "刷新成员",
|
||||||
|
"deleteButtonTooltip": "从项目中移除",
|
||||||
|
"memberCount": "成员",
|
||||||
|
"membersCountPlural": "成员",
|
||||||
|
"emptyText": "项目中没有附件。"
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"inputPlaceholder": "添加评论",
|
||||||
|
"addButton": "添加",
|
||||||
|
"cancelButton": "取消",
|
||||||
|
"deleteButton": "删除"
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"importTaskTemplate": "导入任务模板",
|
||||||
|
"templateName": "模板名称",
|
||||||
|
"templateDescription": "模板描述",
|
||||||
|
"selectedTasks": "已选任务",
|
||||||
|
"tasks": "任务",
|
||||||
|
"templates": "模板",
|
||||||
|
"remove": "移除",
|
||||||
|
"cancel": "取消",
|
||||||
|
"import": "导入"
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"title": "项目成员",
|
||||||
|
"searchLabel": "通过添加名称或电子邮件添加成员",
|
||||||
|
"searchPlaceholder": "输入名称或电子邮件",
|
||||||
|
"inviteAsAMember": "邀请为成员",
|
||||||
|
"inviteNewMemberByEmail": "通过电子邮件邀请新成员"
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"importTasks": "导入任务",
|
||||||
|
"createTask": "创建任务",
|
||||||
|
"settings": "设置",
|
||||||
|
"subscribe": "订阅",
|
||||||
|
"unsubscribe": "取消订阅",
|
||||||
|
"deleteProject": "删除项目",
|
||||||
|
"startDate": "开始日期",
|
||||||
|
"endDate": "结束日期",
|
||||||
|
"projectSettings": "项目设置",
|
||||||
|
"projectSummary": "项目摘要",
|
||||||
|
"receiveProjectSummary": "每晚接收项目摘要。"
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"title": "保存为模板",
|
||||||
|
"templateName": "模板名称",
|
||||||
|
"includes": "项目中应包含哪些内容到模板中?",
|
||||||
|
"includesOptions": {
|
||||||
|
"statuses": "状态",
|
||||||
|
"phases": "阶段",
|
||||||
|
"labels": "标签"
|
||||||
|
},
|
||||||
|
"taskIncludes": "任务中应包含哪些内容到模板中?",
|
||||||
|
"taskIncludesOptions": {
|
||||||
|
"statuses": "状态",
|
||||||
|
"phases": "阶段",
|
||||||
|
"labels": "标签",
|
||||||
|
"name": "名称",
|
||||||
|
"priority": "优先级",
|
||||||
|
"status": "状态",
|
||||||
|
"phase": "阶段",
|
||||||
|
"label": "标签",
|
||||||
|
"timeEstimate": "预计用时",
|
||||||
|
"description": "描述",
|
||||||
|
"subTasks": "子任务"
|
||||||
|
},
|
||||||
|
"cancel": "取消",
|
||||||
|
"save": "保存",
|
||||||
|
"templateNamePlaceholder": "输入模板名称"
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"exportButton": "导出",
|
||||||
|
"timeLogsButton": "时间日志",
|
||||||
|
"activityLogsButton": "活动日志",
|
||||||
|
"tasksButton": "任务",
|
||||||
|
"searchByNameInputPlaceholder": "按名称搜索",
|
||||||
|
"overviewTab": "概览",
|
||||||
|
"timeLogsTab": "时间日志",
|
||||||
|
"activityLogsTab": "活动日志",
|
||||||
|
"tasksTab": "任务",
|
||||||
|
"projectsText": "项目",
|
||||||
|
"totalTasksText": "任务总数",
|
||||||
|
"assignedTasksText": "已分配任务",
|
||||||
|
"completedTasksText": "已完成任务",
|
||||||
|
"ongoingTasksText": "进行中任务",
|
||||||
|
"overdueTasksText": "逾期任务",
|
||||||
|
"loggedHoursText": "记录小时数",
|
||||||
|
"tasksText": "任务",
|
||||||
|
"allText": "全部",
|
||||||
|
"tasksByProjectsText": "按项目分类任务",
|
||||||
|
"tasksByStatusText": "按状态分类任务",
|
||||||
|
"tasksByPriorityText": "按优先级分类任务",
|
||||||
|
"todoText": "待办",
|
||||||
|
"doingText": "进行中",
|
||||||
|
"doneText": "已完成",
|
||||||
|
"lowText": "低",
|
||||||
|
"mediumText": "中",
|
||||||
|
"highText": "高",
|
||||||
|
"billableButton": "可计费",
|
||||||
|
"billableText": "可计费",
|
||||||
|
"nonBillableText": "不可计费",
|
||||||
|
"timeLogsEmptyPlaceholder": "没有时间日志可显示",
|
||||||
|
"loggedText": "记录",
|
||||||
|
"forText": "为",
|
||||||
|
"inText": "在",
|
||||||
|
"updatedText": "更新",
|
||||||
|
"fromText": "从",
|
||||||
|
"toText": "到",
|
||||||
|
"withinText": "在...之内",
|
||||||
|
"activityLogsEmptyPlaceholder": "没有活动日志可显示",
|
||||||
|
"filterByText": "筛选依据:",
|
||||||
|
"selectProjectPlaceholder": "选择项目",
|
||||||
|
"taskColumn": "任务",
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"projectColumn": "项目",
|
||||||
|
"statusColumn": "状态",
|
||||||
|
"priorityColumn": "优先级",
|
||||||
|
"dueDateColumn": "截止日期",
|
||||||
|
"completedDateColumn": "完成日期",
|
||||||
|
"estimatedTimeColumn": "预计用时",
|
||||||
|
"loggedTimeColumn": "记录时间",
|
||||||
|
"overloggedTimeColumn": "超额记录时间",
|
||||||
|
"daysLeftColumn": "剩余天数/逾期",
|
||||||
|
"startDateColumn": "开始日期",
|
||||||
|
"endDateColumn": "结束日期",
|
||||||
|
"actualTimeColumn": "实际时间",
|
||||||
|
"projectHealthColumn": "项目健康状况",
|
||||||
|
"categoryColumn": "类别",
|
||||||
|
"projectManagerColumn": "项目经理",
|
||||||
|
"tasksStatsOverviewDrawerTitle": "的任务",
|
||||||
|
"projectsStatsOverviewDrawerTitle": "的项目",
|
||||||
|
"cancelledText": "已取消",
|
||||||
|
"blockedText": "已阻塞",
|
||||||
|
"onHoldText": "暂停",
|
||||||
|
"proposedText": "提议",
|
||||||
|
"inPlanningText": "规划中",
|
||||||
|
"inProgressText": "进行中",
|
||||||
|
"completedText": "已完成",
|
||||||
|
"continuousText": "持续",
|
||||||
|
"daysLeftText": "天剩余",
|
||||||
|
"daysOverdueText": "天逾期",
|
||||||
|
"notSetText": "未设置",
|
||||||
|
"needsAttentionText": "需要关注",
|
||||||
|
"atRiskText": "有风险",
|
||||||
|
"goodText": "良好"
|
||||||
|
}
|
||||||
31
worklenz-frontend/public/locales/zh/reporting-members.json
Normal file
31
worklenz-frontend/public/locales/zh/reporting-members.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"yesterdayText": "昨天",
|
||||||
|
"lastSevenDaysText": "过去7天",
|
||||||
|
"lastWeekText": "上周",
|
||||||
|
"lastThirtyDaysText": "过去30天",
|
||||||
|
"lastMonthText": "上个月",
|
||||||
|
"lastThreeMonthsText": "过去3个月",
|
||||||
|
"allTimeText": "所有时间",
|
||||||
|
"customRangeText": "自定义范围",
|
||||||
|
"startDateInputPlaceholder": "开始日期",
|
||||||
|
"EndDateInputPlaceholder": "结束日期",
|
||||||
|
"filterButton": "筛选",
|
||||||
|
"membersTitle": "成员",
|
||||||
|
"includeArchivedButton": "包含已归档项目",
|
||||||
|
"exportButton": "导出",
|
||||||
|
"excelButton": "Excel",
|
||||||
|
"searchByNameInputPlaceholder": "按名称搜索",
|
||||||
|
"memberColumn": "成员",
|
||||||
|
"tasksProgressColumn": "任务进度",
|
||||||
|
"tasksAssignedColumn": "分配任务",
|
||||||
|
"completedTasksColumn": "已完成任务",
|
||||||
|
"overdueTasksColumn": "逾期任务",
|
||||||
|
"ongoingTasksColumn": "进行中任务",
|
||||||
|
"tasksAssignedColumnTooltip": "在选定日期范围内分配的任务",
|
||||||
|
"overdueTasksColumnTooltip": "在选定日期范围结束时逾期的任务",
|
||||||
|
"completedTasksColumnTooltip": "在选定日期范围内完成的任务",
|
||||||
|
"ongoingTasksColumnTooltip": "已开始但尚未完成的任务",
|
||||||
|
"todoText": "待办",
|
||||||
|
"doingText": "进行中",
|
||||||
|
"doneText": "已完成"
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"exportButton": "导出",
|
||||||
|
"projectsButton": "项目",
|
||||||
|
"membersButton": "成员",
|
||||||
|
"searchByNameInputPlaceholder": "按名称搜索",
|
||||||
|
"overviewTab": "概览",
|
||||||
|
"projectsTab": "项目",
|
||||||
|
"membersTab": "成员",
|
||||||
|
"projectsByStatusText": "按状态分类项目",
|
||||||
|
"projectsByCategoryText": "按类别分类项目",
|
||||||
|
"projectsByHealthText": "按健康状况分类项目",
|
||||||
|
"projectsText": "项目",
|
||||||
|
"allText": "全部",
|
||||||
|
"cancelledText": "已取消",
|
||||||
|
"blockedText": "已阻塞",
|
||||||
|
"onHoldText": "暂停",
|
||||||
|
"proposedText": "提议",
|
||||||
|
"inPlanningText": "规划中",
|
||||||
|
"inProgressText": "进行中",
|
||||||
|
"completedText": "已完成",
|
||||||
|
"continuousText": "持续",
|
||||||
|
"notSetText": "未设置",
|
||||||
|
"needsAttentionText": "需要关注",
|
||||||
|
"atRiskText": "有风险",
|
||||||
|
"goodText": "良好",
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"emailColumn": "电子邮件",
|
||||||
|
"projectsColumn": "项目",
|
||||||
|
"tasksColumn": "任务",
|
||||||
|
"overdueTasksColumn": "逾期任务",
|
||||||
|
"completedTasksColumn": "已完成任务",
|
||||||
|
"ongoingTasksColumn": "进行中任务"
|
||||||
|
}
|
||||||
22
worklenz-frontend/public/locales/zh/reporting-overview.json
Normal file
22
worklenz-frontend/public/locales/zh/reporting-overview.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"overviewTitle": "概览",
|
||||||
|
"includeArchivedButton": "包含已归档项目",
|
||||||
|
"teamCount": "团队",
|
||||||
|
"teamCountPlural": "团队",
|
||||||
|
"projectCount": "项目",
|
||||||
|
"projectCountPlural": "项目",
|
||||||
|
"memberCount": "成员",
|
||||||
|
"memberCountPlural": "成员",
|
||||||
|
"activeProjectCount": "活跃项目",
|
||||||
|
"activeProjectCountPlural": "活跃项目",
|
||||||
|
"overdueProjectCount": "逾期项目",
|
||||||
|
"overdueProjectCountPlural": "逾期项目",
|
||||||
|
"unassignedMemberCount": "未分配成员",
|
||||||
|
"unassignedMemberCountPlural": "未分配成员",
|
||||||
|
"memberWithOverdueTaskCount": "有逾期任务的成员",
|
||||||
|
"memberWithOverdueTaskCountPlural": "有逾期任务的成员",
|
||||||
|
"teamsText": "团队",
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"projectsColumn": "项目",
|
||||||
|
"membersColumn": "成员"
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
"exportButton": "导出",
|
||||||
|
"membersButton": "成员",
|
||||||
|
"tasksButton": "任务",
|
||||||
|
"searchByNameInputPlaceholder": "按名称搜索",
|
||||||
|
"overviewTab": "概览",
|
||||||
|
"membersTab": "成员",
|
||||||
|
"tasksTab": "任务",
|
||||||
|
"completedTasksText": "已完成任务",
|
||||||
|
"incompleteTasksText": "未完成任务",
|
||||||
|
"overdueTasksText": "逾期任务",
|
||||||
|
"allocatedHoursText": "已分配小时数",
|
||||||
|
"loggedHoursText": "已记录小时数",
|
||||||
|
"tasksText": "任务",
|
||||||
|
"allText": "全部",
|
||||||
|
"tasksByStatusText": "按状态分类任务",
|
||||||
|
"tasksByPriorityText": "按优先级分类任务",
|
||||||
|
"tasksByDueDateText": "按截止日期分类任务",
|
||||||
|
"todoText": "待办",
|
||||||
|
"doingText": "进行中",
|
||||||
|
"doneText": "已完成",
|
||||||
|
"lowText": "低",
|
||||||
|
"mediumText": "中",
|
||||||
|
"highText": "高",
|
||||||
|
"completedText": "已完成",
|
||||||
|
"upcomingText": "即将到来",
|
||||||
|
"overdueText": "逾期",
|
||||||
|
"noDueDateText": "无截止日期",
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"tasksCountColumn": "任务计数",
|
||||||
|
"completedTasksColumn": "已完成任务",
|
||||||
|
"incompleteTasksColumn": "未完成任务",
|
||||||
|
"overdueTasksColumn": "逾期任务",
|
||||||
|
"contributionColumn": "贡献",
|
||||||
|
"progressColumn": "进度",
|
||||||
|
"loggedTimeColumn": "记录时间",
|
||||||
|
"taskColumn": "任务",
|
||||||
|
"projectColumn": "项目",
|
||||||
|
"statusColumn": "状态",
|
||||||
|
"priorityColumn": "优先级",
|
||||||
|
"phaseColumn": "阶段",
|
||||||
|
"dueDateColumn": "截止日期",
|
||||||
|
"completedDateColumn": "完成日期",
|
||||||
|
"estimatedTimeColumn": "预计用时",
|
||||||
|
"overloggedTimeColumn": "超额记录时间",
|
||||||
|
"completedOnColumn": "完成于",
|
||||||
|
"daysOverdueColumn": "逾期天数",
|
||||||
|
"groupByText": "分组依据:",
|
||||||
|
"statusText": "状态",
|
||||||
|
"priorityText": "优先级",
|
||||||
|
"phaseText": "阶段"
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"searchByNamePlaceholder": "按名称搜索",
|
||||||
|
"searchByCategoryPlaceholder": "按类别搜索",
|
||||||
|
"statusText": "状态",
|
||||||
|
"healthText": "健康状况",
|
||||||
|
"categoryText": "类别",
|
||||||
|
"projectManagerText": "项目经理",
|
||||||
|
"showFieldsText": "显示字段",
|
||||||
|
"cancelledText": "已取消",
|
||||||
|
"blockedText": "已阻塞",
|
||||||
|
"onHoldText": "暂停",
|
||||||
|
"proposedText": "提议",
|
||||||
|
"inPlanningText": "规划中",
|
||||||
|
"inProgressText": "进行中",
|
||||||
|
"completedText": "已完成",
|
||||||
|
"continuousText": "持续",
|
||||||
|
"notSetText": "未设置",
|
||||||
|
"needsAttentionText": "需要关注",
|
||||||
|
"atRiskText": "有风险",
|
||||||
|
"goodText": "良好",
|
||||||
|
"nameText": "项目",
|
||||||
|
"estimatedVsActualText": "预计用时 vs 实际用时",
|
||||||
|
"tasksProgressText": "任务进度",
|
||||||
|
"lastActivityText": "最后活动",
|
||||||
|
"datesText": "开始/结束日期",
|
||||||
|
"daysLeftText": "剩余天数/逾期",
|
||||||
|
"projectHealthText": "项目健康状况",
|
||||||
|
"projectUpdateText": "项目更新",
|
||||||
|
"clientText": "客户",
|
||||||
|
"teamText": "团队"
|
||||||
|
}
|
||||||
44
worklenz-frontend/public/locales/zh/reporting-projects.json
Normal file
44
worklenz-frontend/public/locales/zh/reporting-projects.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"projectCount": "项目",
|
||||||
|
"projectCountPlural": "项目",
|
||||||
|
"includeArchivedButton": "包含已归档项目",
|
||||||
|
"exportButton": "导出",
|
||||||
|
"excelButton": "Excel",
|
||||||
|
"projectColumn": "项目",
|
||||||
|
"estimatedVsActualColumn": "预计用时 vs 实际用时",
|
||||||
|
"tasksProgressColumn": "任务进度",
|
||||||
|
"lastActivityColumn": "最后活动",
|
||||||
|
"statusColumn": "状态",
|
||||||
|
"datesColumn": "开始/结束日期",
|
||||||
|
"daysLeftColumn": "剩余天数/逾期",
|
||||||
|
"projectHealthColumn": "项目健康状况",
|
||||||
|
"categoryColumn": "类别",
|
||||||
|
"projectUpdateColumn": "项目更新",
|
||||||
|
"clientColumn": "客户",
|
||||||
|
"teamColumn": "团队",
|
||||||
|
"projectManagerColumn": "项目经理",
|
||||||
|
"openButton": "打开",
|
||||||
|
"estimatedText": "预计",
|
||||||
|
"actualText": "实际",
|
||||||
|
"todoText": "待办",
|
||||||
|
"doingText": "进行中",
|
||||||
|
"doneText": "已完成",
|
||||||
|
"cancelledText": "已取消",
|
||||||
|
"blockedText": "已阻塞",
|
||||||
|
"onHoldText": "暂停",
|
||||||
|
"proposedText": "提议",
|
||||||
|
"inPlanningText": "规划中",
|
||||||
|
"inProgressText": "进行中",
|
||||||
|
"completedText": "已完成",
|
||||||
|
"continuousText": "持续",
|
||||||
|
"daysLeftText": "天剩余",
|
||||||
|
"dayLeftText": "天剩余",
|
||||||
|
"daysOverdueText": "天逾期",
|
||||||
|
"notSetText": "未设置",
|
||||||
|
"needsAttentionText": "需要关注",
|
||||||
|
"atRiskText": "有风险",
|
||||||
|
"goodText": "良好",
|
||||||
|
"setCategoryText": "设置类别",
|
||||||
|
"searchByNameInputPlaceholder": "按名称搜索",
|
||||||
|
"todayText": "今天"
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"overview": "概览",
|
||||||
|
"projects": "项目",
|
||||||
|
"members": "成员",
|
||||||
|
"timeReports": "用时报告",
|
||||||
|
"estimateVsActual": "预计用时 vs 实际用时",
|
||||||
|
"currentOrganizationTooltip": "当前的组织"
|
||||||
|
}
|
||||||
34
worklenz-frontend/public/locales/zh/schedule.json
Normal file
34
worklenz-frontend/public/locales/zh/schedule.json
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"today": "今天",
|
||||||
|
"week": "周",
|
||||||
|
"month": "月",
|
||||||
|
"settings": "设置",
|
||||||
|
"workingDays": "工作日",
|
||||||
|
"monday": "星期一",
|
||||||
|
"tuesday": "星期二",
|
||||||
|
"wednesday": "星期三",
|
||||||
|
"thursday": "星期四",
|
||||||
|
"friday": "星期五",
|
||||||
|
"saturday": "星期六",
|
||||||
|
"sunday": "星期日",
|
||||||
|
"workingHours": "工作时间",
|
||||||
|
"hours": "小时",
|
||||||
|
"saveButton": "保存",
|
||||||
|
"totalAllocation": "总分配",
|
||||||
|
"timeLogged": "记录时间",
|
||||||
|
"remainingTime": "剩余时间",
|
||||||
|
"total": "总计",
|
||||||
|
"perDay": "每天",
|
||||||
|
"tasks": "任务",
|
||||||
|
"startDate": "开始日期",
|
||||||
|
"endDate": "结束日期",
|
||||||
|
"hoursPerDay": "每天小时数",
|
||||||
|
"totalHours": "总小时数",
|
||||||
|
"deleteButton": "删除",
|
||||||
|
"cancelButton": "取消",
|
||||||
|
"tabTitle": "没有开始和结束日期的任务",
|
||||||
|
"allocatedTime": "分配时间",
|
||||||
|
"totalLogged": "总记录",
|
||||||
|
"loggedBillable": "已记录可计费",
|
||||||
|
"loggedNonBillable": "已记录不可计费"
|
||||||
|
}
|
||||||
10
worklenz-frontend/public/locales/zh/settings/categories.json
Normal file
10
worklenz-frontend/public/locales/zh/settings/categories.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"categoryColumn": "类别",
|
||||||
|
"deleteConfirmationTitle": "您确定吗?",
|
||||||
|
"deleteConfirmationOk": "是",
|
||||||
|
"deleteConfirmationCancel": "取消",
|
||||||
|
"associatedTaskColumn": "关联项目",
|
||||||
|
"searchPlaceholder": "按名称搜索",
|
||||||
|
"emptyText": "在更新或创建项目时可以创建类别。",
|
||||||
|
"colorChangeTooltip": "点击更改颜色"
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"title": "更改密码",
|
||||||
|
"currentPassword": "当前密码",
|
||||||
|
"newPassword": "新密码",
|
||||||
|
"confirmPassword": "确认密码",
|
||||||
|
"currentPasswordPlaceholder": "输入您的当前密码",
|
||||||
|
"newPasswordPlaceholder": "新密码",
|
||||||
|
"confirmPasswordPlaceholder": "确认密码",
|
||||||
|
"currentPasswordRequired": "请输入您的当前密码!",
|
||||||
|
"newPasswordRequired": "请输入您的新密码!",
|
||||||
|
"passwordValidationError": "密码必须至少包含8个字符,包括一个大写字母、一个数字和一个符号。",
|
||||||
|
"passwordMismatch": "密码不匹配!",
|
||||||
|
"passwordRequirements": "新密码应至少包含8个字符,包括一个大写字母、一个数字和一个符号。",
|
||||||
|
"updateButton": "更新密码"
|
||||||
|
}
|
||||||
22
worklenz-frontend/public/locales/zh/settings/clients.json
Normal file
22
worklenz-frontend/public/locales/zh/settings/clients.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"projectColumn": "项目",
|
||||||
|
"noProjectsAvailable": "没有可用的项目",
|
||||||
|
"deleteConfirmationTitle": "您确定吗?",
|
||||||
|
"deleteConfirmationOk": "是",
|
||||||
|
"deleteConfirmationCancel": "取消",
|
||||||
|
"searchPlaceholder": "按名称搜索",
|
||||||
|
"createClient": "创建客户",
|
||||||
|
"pinTooltip": "点击将其固定到主菜单",
|
||||||
|
"createClientDrawerTitle": "创建客户",
|
||||||
|
"updateClientDrawerTitle": "更新客户",
|
||||||
|
"nameLabel": "名称",
|
||||||
|
"namePlaceholder": "名称",
|
||||||
|
"nameRequiredError": "请输入名称",
|
||||||
|
"createButton": "创建",
|
||||||
|
"updateButton": "更新",
|
||||||
|
"createClientSuccessMessage": "客户创建成功!",
|
||||||
|
"createClientErrorMessage": "客户创建失败!",
|
||||||
|
"updateClientSuccessMessage": "客户更新成功!",
|
||||||
|
"updateClientErrorMessage": "客户更新失败!"
|
||||||
|
}
|
||||||
20
worklenz-frontend/public/locales/zh/settings/job-titles.json
Normal file
20
worklenz-frontend/public/locales/zh/settings/job-titles.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"deleteConfirmationTitle": "您确定吗?",
|
||||||
|
"deleteConfirmationOk": "是",
|
||||||
|
"deleteConfirmationCancel": "取消",
|
||||||
|
"searchPlaceholder": "按名称搜索",
|
||||||
|
"createJobTitleButton": "创建职位",
|
||||||
|
"pinTooltip": "点击将其固定到主菜单",
|
||||||
|
"createJobTitleDrawerTitle": "创建职位",
|
||||||
|
"updateJobTitleDrawerTitle": "更新职位",
|
||||||
|
"nameLabel": "名称",
|
||||||
|
"namePlaceholder": "名称",
|
||||||
|
"nameRequiredError": "请输入名称",
|
||||||
|
"createButton": "创建",
|
||||||
|
"updateButton": "更新",
|
||||||
|
"createJobTitleSuccessMessage": "职位创建成功!",
|
||||||
|
"createJobTitleErrorMessage": "职位创建失败!",
|
||||||
|
"updateJobTitleSuccessMessage": "职位更新成功!",
|
||||||
|
"updateJobTitleErrorMessage": "职位更新失败!"
|
||||||
|
}
|
||||||
11
worklenz-frontend/public/locales/zh/settings/labels.json
Normal file
11
worklenz-frontend/public/locales/zh/settings/labels.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"labelColumn": "标签",
|
||||||
|
"deleteConfirmationTitle": "您确定吗?",
|
||||||
|
"deleteConfirmationOk": "是",
|
||||||
|
"deleteConfirmationCancel": "取消",
|
||||||
|
"associatedTaskColumn": "关联任务计数",
|
||||||
|
"searchPlaceholder": "按名称搜索",
|
||||||
|
"emptyText": "标签可以在更新或创建任务时创建。",
|
||||||
|
"pinTooltip": "点击将其固定到主菜单",
|
||||||
|
"colorChangeTooltip": "点击更改颜色"
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"language": "语言",
|
||||||
|
"language_required": "语言是必需的",
|
||||||
|
"time_zone": "时区",
|
||||||
|
"time_zone_required": "时区是必需的",
|
||||||
|
"save_changes": "保存更改"
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"title": "通知设置",
|
||||||
|
"emailTitle": "向我发送电子邮件通知",
|
||||||
|
"emailDescription": "包括新的任务分配",
|
||||||
|
"dailyDigestTitle": "向我发送每日摘要",
|
||||||
|
"dailyDigestDescription": "每天晚上,您将收到任务中最近活动的摘要。",
|
||||||
|
"popupTitle": "当Worklenz打开时,在我的电脑上弹出通知",
|
||||||
|
"popupDescription": "弹出通知可能会被您的浏览器禁用。更改您的浏览器设置以允许它们。",
|
||||||
|
"unreadItemsTitle": "显示未读项目的数量",
|
||||||
|
"unreadItemsDescription": "您将看到每个通知的计数。"
|
||||||
|
}
|
||||||
13
worklenz-frontend/public/locales/zh/settings/profile.json
Normal file
13
worklenz-frontend/public/locales/zh/settings/profile.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"uploadError": "您只能上传JPG/PNG文件!",
|
||||||
|
"uploadSizeError": "图片必须小于2MB!",
|
||||||
|
"upload": "上传",
|
||||||
|
"nameLabel": "名称",
|
||||||
|
"nameRequiredError": "名称是必需的",
|
||||||
|
"emailLabel": "电子邮件",
|
||||||
|
"emailRequiredError": "电子邮件是必需的",
|
||||||
|
"saveChanges": "保存更改",
|
||||||
|
"profileJoinedText": "一个月前加入",
|
||||||
|
"profileLastUpdatedText": "一个月前更新",
|
||||||
|
"avatarTooltip": "点击上传头像"
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"editToolTip": "编辑",
|
||||||
|
"deleteToolTip": "删除",
|
||||||
|
"confirmText": "您确定吗?",
|
||||||
|
"okText": "是",
|
||||||
|
"cancelText": "取消"
|
||||||
|
}
|
||||||
14
worklenz-frontend/public/locales/zh/settings/sidebar.json
Normal file
14
worklenz-frontend/public/locales/zh/settings/sidebar.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"profile": "个人资料",
|
||||||
|
"notifications": "通知",
|
||||||
|
"clients": "客户",
|
||||||
|
"job-titles": "职位",
|
||||||
|
"labels": "标签",
|
||||||
|
"categories": "类别",
|
||||||
|
"project-templates": "项目模板",
|
||||||
|
"task-templates": "任务模板",
|
||||||
|
"team-members": "团队成员",
|
||||||
|
"teams": "团队",
|
||||||
|
"change-password": "更改密码",
|
||||||
|
"language-and-region": "语言和地区"
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"createdColumn": "创建时间",
|
||||||
|
"editToolTip": "编辑",
|
||||||
|
"deleteToolTip": "删除",
|
||||||
|
"confirmText": "您确定吗?",
|
||||||
|
"okText": "是",
|
||||||
|
"cancelText": "取消"
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"nameColumn": "名称",
|
||||||
|
"projectsColumn": "项目",
|
||||||
|
"emailColumn": "电子邮件",
|
||||||
|
"teamAccessColumn": "团队访问",
|
||||||
|
"memberCount": "成员",
|
||||||
|
"membersCountPlural": "成员",
|
||||||
|
"searchPlaceholder": "按名称搜索成员",
|
||||||
|
"pinTooltip": "刷新成员列表",
|
||||||
|
"addMemberButton": "添加新成员",
|
||||||
|
"editTooltip": "编辑成员",
|
||||||
|
"deactivateTooltip": "停用成员",
|
||||||
|
"activateTooltip": "激活成员",
|
||||||
|
"deleteTooltip": "删除成员",
|
||||||
|
"confirmDeleteTitle": "您确定要删除此成员吗?",
|
||||||
|
"confirmActivateTitle": "您确定要更改此成员的状态吗?",
|
||||||
|
"okText": "是,继续",
|
||||||
|
"cancelText": "否,取消",
|
||||||
|
"deactivatedText": "(当前已停用)",
|
||||||
|
"pendingInvitationText": "(邀请待处理)",
|
||||||
|
"addMemberDrawerTitle": "添加新团队成员",
|
||||||
|
"updateMemberDrawerTitle": "更新团队成员",
|
||||||
|
"addMemberEmailHint": "无论是否接受邀请,成员都将被添加到团队中",
|
||||||
|
"memberEmailLabel": "电子邮件",
|
||||||
|
"memberEmailPlaceholder": "输入团队成员的电子邮件地址",
|
||||||
|
"memberEmailRequiredError": "请输入有效的电子邮件地址",
|
||||||
|
"jobTitleLabel": "职位",
|
||||||
|
"jobTitlePlaceholder": "选择或搜索职位(可选)",
|
||||||
|
"memberAccessLabel": "访问级别",
|
||||||
|
"addToTeamButton": "将成员添加到团队",
|
||||||
|
"updateButton": "保存更改",
|
||||||
|
"resendInvitationButton": "重新发送邀请邮件",
|
||||||
|
"invitationSentSuccessMessage": "团队邀请已成功发送!",
|
||||||
|
"createMemberSuccessMessage": "新团队成员已成功添加!",
|
||||||
|
"createMemberErrorMessage": "添加团队成员失败。请重试。",
|
||||||
|
"updateMemberSuccessMessage": "团队成员已成功更新!",
|
||||||
|
"updateMemberErrorMessage": "更新团队成员失败。请重试。",
|
||||||
|
"memberText": "成员",
|
||||||
|
"adminText": "管理员",
|
||||||
|
"ownerText": "团队所有者",
|
||||||
|
"addedText": "已添加",
|
||||||
|
"updatedText": "已更新",
|
||||||
|
"noResultFound": "输入电子邮件地址并按回车键..."
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"details": {
|
||||||
|
"task-key": "任务ID",
|
||||||
|
"phase": "阶段",
|
||||||
|
"assignees": "受托人",
|
||||||
|
"due-date": "截止日期",
|
||||||
|
"time-estimation": "估计时间",
|
||||||
|
"priority": "优先级",
|
||||||
|
"labels": "标签",
|
||||||
|
"billable": "可计费",
|
||||||
|
"notify": "通知",
|
||||||
|
"when-done-notify": "完成时通知",
|
||||||
|
"start-date": "开始日期",
|
||||||
|
"end-date": "结束日期",
|
||||||
|
"hide-start-date": "隐藏开始日期",
|
||||||
|
"show-start-date": "显示开始日期",
|
||||||
|
"hours": "小时",
|
||||||
|
"minutes": "分钟"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"title": "描述",
|
||||||
|
"placeholder": "添加更详细的描述..."
|
||||||
|
},
|
||||||
|
"subTasks": {
|
||||||
|
"title": "子任务",
|
||||||
|
"add-sub-task": "+ 添加子任务",
|
||||||
|
"refresh-sub-tasks": "刷新子任务"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
{
|
||||||
|
"taskHeader": {
|
||||||
|
"taskNamePlaceholder": "输入您的任务",
|
||||||
|
"deleteTask": "删除任务"
|
||||||
|
},
|
||||||
|
"taskInfoTab": {
|
||||||
|
"title": "信息",
|
||||||
|
"details": {
|
||||||
|
"title": "详情",
|
||||||
|
"task-key": "任务ID",
|
||||||
|
"phase": "阶段",
|
||||||
|
"assignees": "受托人",
|
||||||
|
"due-date": "截止日期",
|
||||||
|
"time-estimation": "估计时间",
|
||||||
|
"priority": "优先级",
|
||||||
|
"labels": "标签",
|
||||||
|
"billable": "可计费",
|
||||||
|
"notify": "通知",
|
||||||
|
"when-done-notify": "完成时通知",
|
||||||
|
"start-date": "开始日期",
|
||||||
|
"end-date": "结束日期",
|
||||||
|
"hide-start-date": "隐藏开始日期",
|
||||||
|
"show-start-date": "显示开始日期",
|
||||||
|
"hours": "小时",
|
||||||
|
"minutes": "分钟"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"labelInputPlaceholder": "搜索或创建",
|
||||||
|
"labelsSelectorInputTip": "按回车键创建"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"title": "描述",
|
||||||
|
"placeholder": "添加更详细的描述..."
|
||||||
|
},
|
||||||
|
"subTasks": {
|
||||||
|
"title": "子任务",
|
||||||
|
"addSubTask": "+ 添加子任务",
|
||||||
|
"addSubTaskInputPlaceholder": "输入您的任务并按回车键",
|
||||||
|
"refreshSubTasks": "刷新子任务",
|
||||||
|
"edit": "编辑",
|
||||||
|
"delete": "删除",
|
||||||
|
"confirmDeleteSubTask": "您确定要删除此子任务吗?",
|
||||||
|
"deleteSubTask": "删除子任务"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"title": "依赖关系",
|
||||||
|
"addDependency": "+ 添加新依赖",
|
||||||
|
"blockedBy": "被阻塞",
|
||||||
|
"searchTask": "输入以搜索任务",
|
||||||
|
"noTasksFound": "未找到任务",
|
||||||
|
"confirmDeleteDependency": "您确定要删除吗?"
|
||||||
|
},
|
||||||
|
"attachments": {
|
||||||
|
"title": "附件",
|
||||||
|
"chooseOrDropFileToUpload": "选择或拖放文件上传",
|
||||||
|
"uploading": "上传中..."
|
||||||
|
},
|
||||||
|
"comments": {
|
||||||
|
"title": "评论",
|
||||||
|
"addComment": "+ 添加新评论",
|
||||||
|
"noComments": "尚无评论。成为第一个评论的人!",
|
||||||
|
"delete": "删除",
|
||||||
|
"confirmDeleteComment": "您确定要删除此评论吗?"
|
||||||
|
},
|
||||||
|
"searchInputPlaceholder": "按名称搜索",
|
||||||
|
"pendingInvitation": "待处理邀请"
|
||||||
|
},
|
||||||
|
"taskTimeLogTab": {
|
||||||
|
"title": "时间日志",
|
||||||
|
"addTimeLog": "添加新时间日志",
|
||||||
|
"totalLogged": "总记录",
|
||||||
|
"exportToExcel": "导出到Excel",
|
||||||
|
"noTimeLogsFound": "未找到时间日志"
|
||||||
|
},
|
||||||
|
"taskActivityLogTab": {
|
||||||
|
"title": "活动日志"
|
||||||
|
}
|
||||||
|
}
|
||||||
54
worklenz-frontend/public/locales/zh/task-list-filters.json
Normal file
54
worklenz-frontend/public/locales/zh/task-list-filters.json
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"searchButton": "搜索",
|
||||||
|
"resetButton": "重置",
|
||||||
|
"searchInputPlaceholder": "按名称搜索",
|
||||||
|
"sortText": "排序",
|
||||||
|
"statusText": "状态",
|
||||||
|
"phaseText": "阶段",
|
||||||
|
"memberText": "成员",
|
||||||
|
"assigneesText": "受托人",
|
||||||
|
"priorityText": "优先级",
|
||||||
|
"labelsText": "标签",
|
||||||
|
"membersText": "成员",
|
||||||
|
"groupByText": "分组依据",
|
||||||
|
"showArchivedText": "显示已归档的任务",
|
||||||
|
"showFieldsText": "显示字段",
|
||||||
|
"keyText": "ID",
|
||||||
|
"taskText": "任务",
|
||||||
|
"descriptionText": "描述",
|
||||||
|
"phasesText": "阶段",
|
||||||
|
"listText": "列表",
|
||||||
|
"progressText": "进度",
|
||||||
|
"timeTrackingText": "时间跟踪",
|
||||||
|
"timetrackingText": "时间跟踪",
|
||||||
|
"estimationText": "估计",
|
||||||
|
"startDateText": "开始日期",
|
||||||
|
"startdateText": "开始日期",
|
||||||
|
"endDateText": "结束日期",
|
||||||
|
"dueDateText": "截止日期",
|
||||||
|
"duedateText": "截止日期",
|
||||||
|
"completedDateText": "完成日期",
|
||||||
|
"completeddateText": "完成日期",
|
||||||
|
"createdDateText": "创建日期",
|
||||||
|
"createddateText": "创建日期",
|
||||||
|
"lastUpdatedText": "最后更新",
|
||||||
|
"lastupdatedText": "最后更新",
|
||||||
|
"reporterText": "报告人",
|
||||||
|
"dueTimeText": "截止时间",
|
||||||
|
"duetimeText": "截止时间",
|
||||||
|
"lowText": "低",
|
||||||
|
"mediumText": "中",
|
||||||
|
"highText": "高",
|
||||||
|
"createStatusButtonTooltip": "状态设置",
|
||||||
|
"configPhaseButtonTooltip": "阶段设置",
|
||||||
|
"noLabelsFound": "未找到标签",
|
||||||
|
"addStatusButton": "添加状态",
|
||||||
|
"addPhaseButton": "添加阶段",
|
||||||
|
"createStatus": "创建状态",
|
||||||
|
"name": "名称",
|
||||||
|
"category": "类别",
|
||||||
|
"selectCategory": "选择类别",
|
||||||
|
"pleaseEnterAName": "请输入名称",
|
||||||
|
"pleaseSelectACategory": "请选择类别",
|
||||||
|
"create": "创建"
|
||||||
|
}
|
||||||
56
worklenz-frontend/public/locales/zh/task-list-table.json
Normal file
56
worklenz-frontend/public/locales/zh/task-list-table.json
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"keyColumn": "ID",
|
||||||
|
"taskColumn": "任务",
|
||||||
|
"descriptionColumn": "描述",
|
||||||
|
"progressColumn": "进度",
|
||||||
|
"membersColumn": "成员",
|
||||||
|
"assigneesColumn": "受托人",
|
||||||
|
"labelsColumn": "标签",
|
||||||
|
"phasesColumn": "阶段",
|
||||||
|
"phaseColumn": "阶段",
|
||||||
|
"statusColumn": "状态",
|
||||||
|
"priorityColumn": "优先级",
|
||||||
|
"timeTrackingColumn": "时间追踪",
|
||||||
|
"timetrackingColumn": "时间追踪",
|
||||||
|
"estimationColumn": "估算",
|
||||||
|
"startDateColumn": "开始日期",
|
||||||
|
"startdateColumn": "开始日期",
|
||||||
|
"dueDateColumn": "截止日期",
|
||||||
|
"duedateColumn": "截止日期",
|
||||||
|
"completedDateColumn": "完成日期",
|
||||||
|
"completeddateColumn": "完成日期",
|
||||||
|
"createdDateColumn": "创建日期",
|
||||||
|
"createddateColumn": "创建日期",
|
||||||
|
"lastUpdatedColumn": "最后更新",
|
||||||
|
"lastupdatedColumn": "最后更新",
|
||||||
|
"reporterColumn": "报告人",
|
||||||
|
"dueTimeColumn": "截止时间",
|
||||||
|
"todoSelectorText": "待办",
|
||||||
|
"doingSelectorText": "进行中",
|
||||||
|
"doneSelectorText": "已完成",
|
||||||
|
"lowSelectorText": "低",
|
||||||
|
"mediumSelectorText": "中",
|
||||||
|
"highSelectorText": "高",
|
||||||
|
"selectText": "选择",
|
||||||
|
"labelsSelectorInputTip": "按回车键创建!",
|
||||||
|
"addTaskText": "+ 添加任务",
|
||||||
|
"addSubTaskText": "+ 添加子任务",
|
||||||
|
"addTaskInputPlaceholder": "输入任务并按回车键",
|
||||||
|
"openButton": "打开",
|
||||||
|
"okButton": "确定",
|
||||||
|
"noLabelsFound": "未找到标签",
|
||||||
|
"searchInputPlaceholder": "搜索或创建",
|
||||||
|
"assigneeSelectorInviteButton": "通过电子邮件邀请新成员",
|
||||||
|
"labelInputPlaceholder": "搜索或创建",
|
||||||
|
"pendingInvitation": "待处理邀请",
|
||||||
|
"contextMenu": {
|
||||||
|
"assignToMe": "分配给我",
|
||||||
|
"moveTo": "移动到",
|
||||||
|
"unarchive": "取消归档",
|
||||||
|
"archive": "归档",
|
||||||
|
"convertToSubTask": "转换为子任务",
|
||||||
|
"convertToTask": "转换为任务",
|
||||||
|
"delete": "删除",
|
||||||
|
"searchByNameInputPlaceholder": "按名称搜索"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"createTaskTemplate": "创建任务模板",
|
||||||
|
"editTaskTemplate": "编辑任务模板",
|
||||||
|
"cancelText": "取消",
|
||||||
|
"saveText": "保存",
|
||||||
|
"templateNameText": "模板名称",
|
||||||
|
"selectedTasks": "已选任务",
|
||||||
|
"removeTask": "移除",
|
||||||
|
"cancelButton": "取消",
|
||||||
|
"saveButton": "保存"
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"taskSelected": "任务已选择",
|
||||||
|
"tasksSelected": "任务已选择",
|
||||||
|
"changeStatus": "更改状态/优先级/阶段",
|
||||||
|
"changeLabel": "更改标签",
|
||||||
|
"assignToMe": "分配给我",
|
||||||
|
"changeAssignees": "更改受托人",
|
||||||
|
"archive": "归档",
|
||||||
|
"unarchive": "取消归档",
|
||||||
|
"delete": "删除",
|
||||||
|
"moreOptions": "更多选项",
|
||||||
|
"deselectAll": "取消全选",
|
||||||
|
"status": "状态",
|
||||||
|
"priority": "优先级",
|
||||||
|
"phase": "阶段",
|
||||||
|
"member": "成员",
|
||||||
|
"createTaskTemplate": "创建任务模板",
|
||||||
|
"apply": "应用",
|
||||||
|
"createLabel": "+ 创建标签",
|
||||||
|
"hitEnterToCreate": "按回车键创建",
|
||||||
|
"pendingInvitation": "待处理邀请",
|
||||||
|
"noMatchingLabels": "没有匹配的标签",
|
||||||
|
"noLabels": "没有标签"
|
||||||
|
}
|
||||||
19
worklenz-frontend/public/locales/zh/template-drawer.json
Normal file
19
worklenz-frontend/public/locales/zh/template-drawer.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"title": "编辑任务模板",
|
||||||
|
"cancelText": "取消",
|
||||||
|
"saveText": "保存",
|
||||||
|
"templateNameText": "模板名称",
|
||||||
|
"selectedTasks": "已选任务",
|
||||||
|
"removeTask": "移除",
|
||||||
|
"description": "描述",
|
||||||
|
"phase": "阶段",
|
||||||
|
"statuses": "状态",
|
||||||
|
"priorities": "优先级",
|
||||||
|
"labels": "标签",
|
||||||
|
"tasks": "任务",
|
||||||
|
"noTemplateSelected": "未选择模板",
|
||||||
|
"noDescription": "无描述",
|
||||||
|
"worklenzTemplates": "Worklenz模板",
|
||||||
|
"yourTemplatesLibrary": "您的模板库",
|
||||||
|
"searchTemplates": "搜索模板"
|
||||||
|
}
|
||||||
23
worklenz-frontend/public/locales/zh/templateDrawer.json
Normal file
23
worklenz-frontend/public/locales/zh/templateDrawer.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"bugTracking": "错误跟踪",
|
||||||
|
"construction": "建筑与施工",
|
||||||
|
"designCreative": "设计与创意",
|
||||||
|
"education": "教育",
|
||||||
|
"finance": "金融",
|
||||||
|
"hrRecruiting": "人力资源与招聘",
|
||||||
|
"informationTechnology": "信息技术",
|
||||||
|
"legal": "法律",
|
||||||
|
"manufacturing": "制造业",
|
||||||
|
"marketing": "市场营销",
|
||||||
|
"nonprofit": "非营利",
|
||||||
|
"personalUse": "个人使用",
|
||||||
|
"salesCRM": "销售与客户关系管理",
|
||||||
|
"serviceConsulting": "服务与咨询",
|
||||||
|
"softwareDevelopment": "软件开发",
|
||||||
|
"description": "描述",
|
||||||
|
"phase": "阶段",
|
||||||
|
"statuses": "状态",
|
||||||
|
"priorities": "优先级",
|
||||||
|
"labels": "标签",
|
||||||
|
"tasks": "任务"
|
||||||
|
}
|
||||||
33
worklenz-frontend/public/locales/zh/time-report.json
Normal file
33
worklenz-frontend/public/locales/zh/time-report.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"includeArchivedProjects": "包含已归档项目",
|
||||||
|
"export": "导出",
|
||||||
|
"timeSheet": "时间表",
|
||||||
|
"searchByName": "按名称搜索",
|
||||||
|
"selectAll": "全选",
|
||||||
|
"teams": "团队",
|
||||||
|
"searchByProject": "按项目名称搜索",
|
||||||
|
"projects": "项目",
|
||||||
|
"searchByCategory": "按类别名称搜索",
|
||||||
|
"categories": "类别",
|
||||||
|
"billable": "可计费",
|
||||||
|
"nonBillable": "不可计费",
|
||||||
|
"total": "总计",
|
||||||
|
"projectsTimeSheet": "项目时间表",
|
||||||
|
"loggedTime": "已记录时间(小时)",
|
||||||
|
"exportToExcel": "导出到Excel",
|
||||||
|
"logged": "已记录",
|
||||||
|
"for": "为",
|
||||||
|
"membersTimeSheet": "成员时间表",
|
||||||
|
"member": "成员",
|
||||||
|
"estimatedVsActual": "预计用时 vs 实际用时",
|
||||||
|
"workingDays": "工作日",
|
||||||
|
"manDays": "人天",
|
||||||
|
"days": "天",
|
||||||
|
"estimatedDays": "预计天数",
|
||||||
|
"actualDays": "实际天数",
|
||||||
|
"noCategories": "未找到类别",
|
||||||
|
"noCategory": "无类别",
|
||||||
|
"noProjects": "未找到项目",
|
||||||
|
"noTeams": "未找到团队",
|
||||||
|
"noData": "未找到数据"
|
||||||
|
}
|
||||||
5
worklenz-frontend/public/locales/zh/unauthorized.json
Normal file
5
worklenz-frontend/public/locales/zh/unauthorized.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"title": "未授权!",
|
||||||
|
"subtitle": "您无权访问此页面",
|
||||||
|
"button": "返回首页"
|
||||||
|
}
|
||||||
@@ -76,6 +76,8 @@ const InfoTabFooter = () => {
|
|||||||
setIsCommentBoxExpand(false);
|
setIsCommentBoxExpand(false);
|
||||||
setSelectedFiles([]);
|
setSelectedFiles([]);
|
||||||
setAttachmentComment(false);
|
setAttachmentComment(false);
|
||||||
|
setCommentValue('');
|
||||||
|
setSelectedMembers([]);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check if comment is valid (either has text or files)
|
// Check if comment is valid (either has text or files)
|
||||||
@@ -157,7 +159,8 @@ const InfoTabFooter = () => {
|
|||||||
setAttachmentComment(false);
|
setAttachmentComment(false);
|
||||||
setIsCommentBoxExpand(false);
|
setIsCommentBoxExpand(false);
|
||||||
setCommentValue('');
|
setCommentValue('');
|
||||||
|
setSelectedMembers([]);
|
||||||
|
|
||||||
// Dispatch event to notify that a comment was created
|
// Dispatch event to notify that a comment was created
|
||||||
// This will trigger the task comments component to refresh and update Redux
|
// This will trigger the task comments component to refresh and update Redux
|
||||||
document.dispatchEvent(new CustomEvent('task-comment-create', {
|
document.dispatchEvent(new CustomEvent('task-comment-create', {
|
||||||
@@ -454,31 +457,27 @@ const InfoTabFooter = () => {
|
|||||||
<Flex align="center" justify="space-between" style={{ width: '100%', marginTop: 8 }}>
|
<Flex align="center" justify="space-between" style={{ width: '100%', marginTop: 8 }}>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
title={
|
title={
|
||||||
taskFormViewModel?.task?.created_at
|
taskFormViewModel?.task?.created_from_now
|
||||||
? formatDateTimeWithLocale(taskFormViewModel.task.created_at)
|
? `Created ${taskFormViewModel.task.created_from_now}`
|
||||||
: 'N/A'
|
: 'N/A'
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
|
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
|
||||||
Created{' '}
|
Created{' '}
|
||||||
{taskFormViewModel?.task?.created_at
|
{taskFormViewModel?.task?.created_from_now || 'N/A'}{' '}
|
||||||
? calculateTimeDifference(taskFormViewModel.task.created_at)
|
|
||||||
: 'N/A'}{' '}
|
|
||||||
by {taskFormViewModel?.task?.reporter}
|
by {taskFormViewModel?.task?.reporter}
|
||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
title={
|
title={
|
||||||
taskFormViewModel?.task?.updated_at
|
taskFormViewModel?.task?.updated_from_now
|
||||||
? formatDateTimeWithLocale(taskFormViewModel.task.updated_at)
|
? `Updated ${taskFormViewModel.task.updated_from_now}`
|
||||||
: 'N/A'
|
: 'N/A'
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
|
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
|
||||||
Updated{' '}
|
Updated{' '}
|
||||||
{taskFormViewModel?.task?.updated_at
|
{taskFormViewModel?.task?.updated_from_now || 'N/A'}
|
||||||
? calculateTimeDifference(taskFormViewModel.task.updated_at)
|
|
||||||
: 'N/A'}
|
|
||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ const LanguageSelector = () => {
|
|||||||
{ key: 'pt', label: 'Português' },
|
{ key: 'pt', label: 'Português' },
|
||||||
{ key: 'alb', label: 'Shqip' },
|
{ key: 'alb', label: 'Shqip' },
|
||||||
{ key: 'de', label: 'Deutsch' },
|
{ key: 'de', label: 'Deutsch' },
|
||||||
|
{ key: 'zh_cn', label: '简体中文' },
|
||||||
];
|
];
|
||||||
|
|
||||||
const languageLabels = {
|
const languageLabels = {
|
||||||
@@ -25,6 +26,7 @@ const LanguageSelector = () => {
|
|||||||
pt: 'Pt',
|
pt: 'Pt',
|
||||||
alb: 'Sq',
|
alb: 'Sq',
|
||||||
de: 'de',
|
de: 'de',
|
||||||
|
zh_cn: 'zh_cn',
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ export enum Language {
|
|||||||
PT = 'pt',
|
PT = 'pt',
|
||||||
ALB = 'alb',
|
ALB = 'alb',
|
||||||
DE = 'de',
|
DE = 'de',
|
||||||
|
ZH_CN = 'zh_cn',
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ILanguageType = `${Language}`;
|
export type ILanguageType = `${Language}`;
|
||||||
|
|||||||
@@ -55,6 +55,10 @@ const LanguageAndRegionSettings = () => {
|
|||||||
value: Language.DE,
|
value: Language.DE,
|
||||||
label: 'Deutsch',
|
label: 'Deutsch',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
value: Language.ZH_CN,
|
||||||
|
label: '简体中文',
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const handleLanguageChange = async (values: { language?: ILanguageType; timezone?: string }) => {
|
const handleLanguageChange = async (values: { language?: ILanguageType; timezone?: string }) => {
|
||||||
|
|||||||
@@ -41,6 +41,12 @@ export const greetingString = (name: string): string => {
|
|||||||
morning = 'Morgen';
|
morning = 'Morgen';
|
||||||
afternoon = 'Tag';
|
afternoon = 'Tag';
|
||||||
evening = 'Abend';
|
evening = 'Abend';
|
||||||
|
} else if (language === 'zh_cn') {
|
||||||
|
greetingPrefix = '你好';
|
||||||
|
greetingSuffix = '';
|
||||||
|
morning = '早上好';
|
||||||
|
afternoon = '下午好';
|
||||||
|
evening = '晚上好';
|
||||||
}
|
}
|
||||||
|
|
||||||
return `${greetingPrefix} ${name}, ${greetingSuffix} ${greet}!`;
|
return `${greetingPrefix} ${name}, ${greetingSuffix} ${greet}!`;
|
||||||
|
|||||||
Reference in New Issue
Block a user