i18n: complete UI/achievement keying, fix help_view tr() and i18n syntax errors

This commit is contained in:
KINDNICK
2026-06-16 10:52:57 +09:00
parent f5751460e3
commit 63b0e324b9
34 changed files with 3400 additions and 1175 deletions
+19 -9
View File
@@ -8,6 +8,7 @@ from __future__ import annotations
from datetime import datetime
from core.settings_keys import AUTO_BREAK_ON_LOCK, CLOCK_IN_ON_UNLOCK
import sqlite3
class LockMonitor:
@@ -61,14 +62,23 @@ class LockMonitor:
clock_in_str = when.strftime("%H:%M:%S")
existing = self.db.get_today_record()
if existing:
conn = self.db.get_connection()
cursor = conn.cursor()
cursor.execute(
"UPDATE work_records SET clock_in = ?, is_manual = 0 WHERE date = ?",
(clock_in_str, today),
)
conn.commit()
conn.close()
with self.db._conn() as conn:
cursor = conn.cursor()
cursor.execute(
"UPDATE work_records SET clock_in = ?, is_manual = 0 WHERE date = ?",
(clock_in_str, today),
)
conn.commit()
else:
self.db.add_work_record(today, clock_in_str)
try:
self.db.add_work_record(today, clock_in_str)
except sqlite3.IntegrityError:
# get_today_record()와 add_work_record() 사이 경쟁 조건
with self.db._conn() as conn:
cursor = conn.cursor()
cursor.execute(
"UPDATE work_records SET clock_in = ?, is_manual = 0 WHERE date = ?",
(clock_in_str, today),
)
conn.commit()
w.update_display()
+21 -16
View File
@@ -10,6 +10,7 @@ from datetime import datetime
from core.settings_keys import (
HEALTH_CONSECUTIVE_OT_DAYS, WEEKLY_HOURS_THRESHOLD, OVERTIME_THRESHOLD_HOURS,
)
from core.i18n import tr
from utils.debug_log import dlog
@@ -54,12 +55,12 @@ class NotificationOrchestrator:
longest = max(closed, key=lambda r: r.get('total_hours') or 0)
longest_str = f"{longest['date']} ({longest.get('total_hours', 0):.1f}h)"
title = "📊 지난주 요약"
body = (f"기간: {last_mon} ~ {last_sun}\n"
f"총 근무: {total_h:.1f}시간 ({len(closed)}일)\n"
f"일 평균: {avg_h:.1f}시간\n"
f"연장근무: {ot_h}시간 {ot_m}분\n"
f"가장 긴 날: {longest_str}")
title = tr('notif.weekly_report.title')
body = tr('notif.weekly_report.body',
start=last_mon, end=last_sun,
total_h=total_h, days=len(closed),
avg_h=avg_h, ot_h=ot_h, ot_m=ot_m,
longest=longest_str)
self.notifier.notification_signal.emit(title, body)
self.db.log_notification('system', 'weekly_report')
@@ -70,13 +71,17 @@ class NotificationOrchestrator:
try:
from utils.discord_webhook import send, COLOR_BLUE
fields = [
{"name": "총 근무", "value": f"{total_h:.1f}시간 ({len(closed)}일)", "inline": True},
{"name": "일 평균", "value": f"{avg_h:.1f}시간", "inline": True},
{"name": "연장근무", "value": f"{ot_h}시간 {ot_m}분", "inline": True},
{"name": "가장 긴 날", "value": longest_str, "inline": False},
{"name": tr('field.total_work'), "value": tr('field.total_work_value', hours=total_h, days=len(closed)), "inline": True},
{"name": tr('field.avg_daily'), "value": tr('field.avg_daily_value', hours=avg_h), "inline": True},
{"name": tr('field.overtime'), "value": tr('field.overtime_value', hours=ot_h, minutes=ot_m), "inline": True},
{"name": tr('field.longest_day'), "value": longest_str, "inline": False},
]
ok = send(url, "📊 지난주 요약",
f"기간: {last_mon} ~ {last_sun}",
ok = send(url, tr('notif.weekly_report.title'),
tr('notif.weekly_report.body',
start=last_mon, end=last_sun,
total_h=total_h, days=len(closed),
avg_h=avg_h, ot_h=ot_h, ot_m=ot_m,
longest=longest_str),
color=COLOR_BLUE, fields=fields)
self.db.log_notification('discord', 'weekly_report', success=ok)
except Exception as e:
@@ -147,8 +152,8 @@ class NotificationOrchestrator:
for a in unlocked:
self.db.log_notification('system', f'achievement:{a.code}')
if notif_on:
title = f"{a.badge_icon} 도전과제 달성!"
body = f"{a.name}\n{a.description}"
title = tr('notif.achievement.title', icon=a.badge_icon)
body = tr('notif.achievement.body', name=a.name, description=a.description)
self.notifier.notification_signal.emit(title, body)
# Discord 통합 push (여러 개면 묶어서)
self._discord_achievements(unlocked)
@@ -167,8 +172,8 @@ class NotificationOrchestrator:
extra = (f"\n... 외 {len(unlocked) - 10}개" if len(unlocked) > 10 else '')
ok = discord_webhook.send(
url,
f"🏆 도전과제 {len(unlocked)}개 달성!",
f"새로 잠금 해제된 도전과제 입니다.{extra}",
tr('discord.achievement.title', count=len(unlocked)),
tr('discord.achievement.body', extra=extra),
color=discord_webhook.COLOR_YELLOW,
fields=fields,
)