feat(i18n): add Japanese language support #384

This commit is contained in:
Hinata Oishi
2026-02-17 02:56:24 +09:00
committed by GitHub
parent 29b80b1905
commit 8723393b66
11 changed files with 1475 additions and 145 deletions

View File

@@ -6,6 +6,7 @@ import CreateTaskModal from './CreateTaskModal';
import { useTaskMaster } from '../contexts/TaskMasterContext';
import Shell from './Shell';
import { api } from '../utils/api';
import { useTranslation } from 'react-i18next';
const TaskList = ({
tasks = [],
@@ -31,8 +32,9 @@ const TaskList = ({
const [showHelpGuide, setShowHelpGuide] = useState(false);
const [isTaskMasterComplete, setIsTaskMasterComplete] = useState(false);
const [showPRDDropdown, setShowPRDDropdown] = useState(false);
const { projectTaskMaster, refreshProjects, refreshTasks, setCurrentProject } = useTaskMaster();
const { t } = useTranslation('tasks');
// Close PRD dropdown when clicking outside
useEffect(() => {
@@ -143,45 +145,45 @@ const TaskList = ({
// Organize tasks by status for Kanban view
const kanbanColumns = useMemo(() => {
const allColumns = [
{
id: 'pending',
title: '📋 To Do',
status: 'pending',
{
id: 'pending',
title: t('kanban.pending'),
status: 'pending',
color: 'bg-slate-50 dark:bg-slate-900/50 border-slate-200 dark:border-slate-700',
headerColor: 'bg-slate-100 dark:bg-slate-800 text-slate-800 dark:text-slate-200'
},
{
id: 'in-progress',
title: '🚀 In Progress',
status: 'in-progress',
{
id: 'in-progress',
title: t('kanban.inProgress'),
status: 'in-progress',
color: 'bg-blue-50 dark:bg-blue-900/50 border-blue-200 dark:border-blue-700',
headerColor: 'bg-blue-100 dark:bg-blue-800 text-blue-800 dark:text-blue-200'
},
{
id: 'done',
title: '✅ Done',
status: 'done',
{
id: 'done',
title: t('kanban.done'),
status: 'done',
color: 'bg-emerald-50 dark:bg-emerald-900/50 border-emerald-200 dark:border-emerald-700',
headerColor: 'bg-emerald-100 dark:bg-emerald-800 text-emerald-800 dark:text-emerald-200'
},
{
id: 'blocked',
title: '🚫 Blocked',
status: 'blocked',
{
id: 'blocked',
title: t('kanban.blocked'),
status: 'blocked',
color: 'bg-red-50 dark:bg-red-900/50 border-red-200 dark:border-red-700',
headerColor: 'bg-red-100 dark:bg-red-800 text-red-800 dark:text-red-200'
},
{
id: 'deferred',
title: '⏳ Deferred',
status: 'deferred',
{
id: 'deferred',
title: t('kanban.deferred'),
status: 'deferred',
color: 'bg-amber-50 dark:bg-amber-900/50 border-amber-200 dark:border-amber-700',
headerColor: 'bg-amber-100 dark:bg-amber-800 text-amber-800 dark:text-amber-200'
},
{
id: 'cancelled',
title: '❌ Cancelled',
status: 'cancelled',
{
id: 'cancelled',
title: t('kanban.cancelled'),
status: 'cancelled',
color: 'bg-gray-50 dark:bg-gray-900/50 border-gray-200 dark:border-gray-700',
headerColor: 'bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200'
}
@@ -199,7 +201,7 @@ const TaskList = ({
...column,
tasks: filteredAndSortedTasks.filter(task => task.status === column.status)
}));
}, [filteredAndSortedTasks]);
}, [filteredAndSortedTasks, t]);
const handleSortChange = (newSortBy) => {
if (sortBy === newSortBy) {
@@ -236,26 +238,26 @@ const TaskList = ({
<Settings className="w-12 h-12 mx-auto mb-4" />
</div>
<h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-2">
TaskMaster AI is not configured
{t('notConfigured.title')}
</h3>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-6">
TaskMaster helps break down complex projects into manageable tasks with AI-powered assistance
{t('notConfigured.description')}
</p>
{/* What is TaskMaster section */}
<div className="mb-6 p-4 bg-blue-50 dark:bg-blue-950 rounded-lg text-left">
<h4 className="text-sm font-medium text-blue-900 dark:text-blue-100 mb-3">
🎯 What is TaskMaster?
{t('notConfigured.whatIsTitle')}
</h4>
<div className="text-xs text-blue-800 dark:text-blue-200 space-y-1">
<p> <strong>AI-Powered Task Management:</strong> Break complex projects into manageable subtasks</p>
<p> <strong>PRD Templates:</strong> Generate tasks from Product Requirements Documents</p>
<p> <strong>Dependency Tracking:</strong> Understand task relationships and execution order</p>
<p> <strong>Progress Visualization:</strong> Kanban boards and detailed task analytics</p>
<p> <strong>CLI Integration:</strong> Use taskmaster commands for advanced workflows</p>
<p> {t('notConfigured.features.aiPowered')}</p>
<p> {t('notConfigured.features.prdTemplates')}</p>
<p> {t('notConfigured.features.dependencyTracking')}</p>
<p> {t('notConfigured.features.progressVisualization')}</p>
<p> {t('notConfigured.features.cliIntegration')}</p>
</div>
</div>
<button
onClick={() => {
setIsTaskMasterComplete(false); // Reset completion state
@@ -264,7 +266,7 @@ const TaskList = ({
className="px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg font-medium transition-colors flex items-center gap-2 mx-auto"
>
<Terminal className="w-4 h-4" />
Initialize TaskMaster AI
{t('notConfigured.initializeButton')}
</button>
</div>
) : (
@@ -276,8 +278,8 @@ const TaskList = ({
<FileText className="w-5 h-5 text-blue-600 dark:text-blue-400" />
</div>
<div>
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">Getting Started with TaskMaster</h2>
<p className="text-sm text-gray-600 dark:text-gray-400">TaskMaster is initialized! Here's what to do next:</p>
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">{t('gettingStarted.title')}</h2>
<p className="text-sm text-gray-600 dark:text-gray-400">{t('gettingStarted.subtitle')}</p>
</div>
</div>
@@ -287,8 +289,8 @@ const TaskList = ({
<div className="flex gap-3 p-3 bg-white dark:bg-gray-800/50 rounded-lg border border-blue-100 dark:border-blue-800/50">
<div className="flex-shrink-0 w-6 h-6 bg-blue-600 text-white text-xs font-semibold rounded-full flex items-center justify-center">1</div>
<div>
<h4 className="font-medium text-gray-900 dark:text-white mb-1">Create a Product Requirements Document (PRD)</h4>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-2">Discuss your project idea and create a PRD that describes what you want to build.</p>
<h4 className="font-medium text-gray-900 dark:text-white mb-1">{t('gettingStarted.steps.createPRD.title')}</h4>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-2">{t('gettingStarted.steps.createPRD.description')}</p>
<button
onClick={() => {
onShowPRDEditor?.();
@@ -296,13 +298,13 @@ const TaskList = ({
className="inline-flex items-center gap-1 text-xs bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 px-2 py-1 rounded hover:bg-purple-200 dark:hover:bg-purple-900/50 transition-colors"
>
<FileText className="w-3 h-3" />
Add PRD
{t('gettingStarted.steps.createPRD.addButton')}
</button>
{/* Show existing PRDs if any */}
{existingPRDs.length > 0 && (
<div className="mt-3 pt-3 border-t border-gray-200 dark:border-gray-700">
<p className="text-xs text-gray-500 dark:text-gray-400 mb-2">Existing PRDs:</p>
<p className="text-xs text-gray-500 dark:text-gray-400 mb-2">{t('gettingStarted.steps.createPRD.existingPRDs')}</p>
<div className="flex flex-wrap gap-2">
{existingPRDs.map((prd) => (
<button
@@ -341,8 +343,8 @@ const TaskList = ({
<div className="flex gap-3 p-3 bg-white dark:bg-gray-800/50 rounded-lg border border-blue-100 dark:border-blue-800/50">
<div className="flex-shrink-0 w-6 h-6 bg-blue-600 text-white text-xs font-semibold rounded-full flex items-center justify-center">2</div>
<div>
<h4 className="font-medium text-gray-900 dark:text-white mb-1">Generate Tasks from PRD</h4>
<p className="text-sm text-gray-600 dark:text-gray-400">Once you have a PRD, ask your AI assistant to parse it and TaskMaster will automatically break it down into manageable tasks with implementation details.</p>
<h4 className="font-medium text-gray-900 dark:text-white mb-1">{t('gettingStarted.steps.generateTasks.title')}</h4>
<p className="text-sm text-gray-600 dark:text-gray-400">{t('gettingStarted.steps.generateTasks.description')}</p>
</div>
</div>
@@ -350,8 +352,8 @@ const TaskList = ({
<div className="flex gap-3 p-3 bg-white dark:bg-gray-800/50 rounded-lg border border-blue-100 dark:border-blue-800/50">
<div className="flex-shrink-0 w-6 h-6 bg-blue-600 text-white text-xs font-semibold rounded-full flex items-center justify-center">3</div>
<div>
<h4 className="font-medium text-gray-900 dark:text-white mb-1">Analyze & Expand Tasks</h4>
<p className="text-sm text-gray-600 dark:text-gray-400">Ask your AI assistant to analyze task complexity and expand them into detailed subtasks for easier implementation.</p>
<h4 className="font-medium text-gray-900 dark:text-white mb-1">{t('gettingStarted.steps.analyzeTasks.title')}</h4>
<p className="text-sm text-gray-600 dark:text-gray-400">{t('gettingStarted.steps.analyzeTasks.description')}</p>
</div>
</div>
@@ -359,8 +361,8 @@ const TaskList = ({
<div className="flex gap-3 p-3 bg-white dark:bg-gray-800/50 rounded-lg border border-blue-100 dark:border-blue-800/50">
<div className="flex-shrink-0 w-6 h-6 bg-blue-600 text-white text-xs font-semibold rounded-full flex items-center justify-center">4</div>
<div>
<h4 className="font-medium text-gray-900 dark:text-white mb-1">Start Building</h4>
<p className="text-sm text-gray-600 dark:text-gray-400">Ask your AI assistant to begin working on tasks, update their status, and add new tasks as your project evolves.</p>
<h4 className="font-medium text-gray-900 dark:text-white mb-1">{t('gettingStarted.steps.startBuilding.title')}</h4>
<p className="text-sm text-gray-600 dark:text-gray-400">{t('gettingStarted.steps.startBuilding.description')}</p>
</div>
</div>
</div>
@@ -376,7 +378,7 @@ const TaskList = ({
style={{ zIndex: 10 }}
>
<FileText className="w-4 h-4" />
Add PRD
{t('buttons.addPRD')}
</button>
</div>
</div>
@@ -384,7 +386,7 @@ const TaskList = ({
<div className="text-center">
<div className="text-sm text-gray-500 dark:text-gray-400 mb-2">
💡 <strong>Tip:</strong> Start with a PRD to get the most out of TaskMaster's AI-powered task generation
{t('gettingStarted.tip')}
</div>
</div>
</div>
@@ -401,8 +403,8 @@ const TaskList = ({
<Terminal className="w-4 h-4 text-blue-600 dark:text-blue-400" />
</div>
<div>
<h2 className="text-lg font-semibold text-gray-900 dark:text-white">TaskMaster Setup</h2>
<p className="text-sm text-gray-500 dark:text-gray-400">Interactive CLI for {currentProject?.displayName}</p>
<h2 className="text-lg font-semibold text-gray-900 dark:text-white">{t('setupModal.title')}</h2>
<p className="text-sm text-gray-500 dark:text-gray-400">{t('setupModal.subtitle', { projectName: currentProject?.displayName })}</p>
</div>
</div>
<button
@@ -464,10 +466,10 @@ const TaskList = ({
{isTaskMasterComplete ? (
<span className="flex items-center gap-2 text-green-600 dark:text-green-400">
<div className="w-2 h-2 bg-green-500 rounded-full"></div>
TaskMaster setup completed! You can now close this window.
{t('setupModal.completed')}
</span>
) : (
"TaskMaster initialization will start automatically"
t('setupModal.willStart')
)}
</div>
<button
@@ -485,12 +487,12 @@ const TaskList = ({
}}
className={cn(
"px-4 py-2 text-sm font-medium rounded-md transition-colors",
isTaskMasterComplete
? "bg-green-600 hover:bg-green-700 text-white"
isTaskMasterComplete
? "bg-green-600 hover:bg-green-700 text-white"
: "text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600"
)}
>
{isTaskMasterComplete ? "Close & Continue" : "Close"}
{isTaskMasterComplete ? t('setupModal.closeContinueButton') : t('setupModal.closeButton')}
</button>
</div>
</div>
@@ -510,7 +512,7 @@ const TaskList = ({
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-4 h-4" />
<input
type="text"
placeholder="Search tasks..."
placeholder={t('search.placeholder')}
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
className="pl-10 pr-4 py-2 w-full border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
@@ -529,7 +531,7 @@ const TaskList = ({
? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-white shadow-sm'
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'
)}
title="Kanban view"
title={t('views.kanban')}
>
<Columns className="w-4 h-4" />
</button>
@@ -537,11 +539,11 @@ const TaskList = ({
onClick={() => setViewMode('list')}
className={cn(
'p-2 rounded-md transition-colors',
viewMode === 'list'
? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-white shadow-sm'
viewMode === 'list'
? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-white shadow-sm'
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'
)}
title="List view"
title={t('views.list')}
>
<List className="w-4 h-4" />
</button>
@@ -549,11 +551,11 @@ const TaskList = ({
onClick={() => setViewMode('grid')}
className={cn(
'p-2 rounded-md transition-colors',
viewMode === 'grid'
? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-white shadow-sm'
viewMode === 'grid'
? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-white shadow-sm'
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'
)}
title="Grid view"
title={t('views.grid')}
>
<Grid className="w-4 h-4" />
</button>
@@ -570,7 +572,7 @@ const TaskList = ({
)}
>
<Filter className="w-4 h-4" />
<span className="hidden sm:inline">Filters</span>
<span className="hidden sm:inline">{t('filters.button')}</span>
<ChevronDown className={cn('w-4 h-4 transition-transform', showFilters && 'rotate-180')} />
</button>
@@ -581,7 +583,7 @@ const TaskList = ({
<button
onClick={() => setShowHelpGuide(true)}
className="p-2 text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors border border-gray-300 dark:border-gray-600"
title="TaskMaster Getting Started Guide"
title={t('buttons.help')}
>
<HelpCircle className="w-4 h-4" />
</button>
@@ -594,16 +596,16 @@ const TaskList = ({
<button
onClick={() => setShowPRDDropdown(!showPRDDropdown)}
className="flex items-center gap-2 px-3 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg transition-colors font-medium"
title={`${existingPRDs.length} PRD${existingPRDs.length > 1 ? 's' : ''} available`}
title={t('buttons.prdsAvailable', { count: existingPRDs.length })}
>
<FileText className="w-4 h-4" />
<span className="hidden sm:inline">PRDs</span>
<span className="hidden sm:inline">{t('buttons.prds')}</span>
<span className="px-1.5 py-0.5 text-xs bg-purple-500 rounded-full min-w-[1.25rem] text-center">
{existingPRDs.length}
</span>
<ChevronDown className={cn('w-3 h-3 transition-transform hidden sm:block', showPRDDropdown && 'rotate-180')} />
</button>
{showPRDDropdown && (
<div className="absolute right-0 top-full mt-2 w-56 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-xl z-30">
<div className="p-2">
@@ -615,10 +617,10 @@ const TaskList = ({
className="w-full text-left px-3 py-2 text-sm font-medium text-purple-700 dark:text-purple-300 hover:bg-purple-50 dark:hover:bg-purple-900/30 rounded flex items-center gap-2"
>
<Plus className="w-4 h-4" />
Create New PRD
{t('buttons.createNewPRD')}
</button>
<div className="border-t border-gray-200 dark:border-gray-700 my-1"></div>
<div className="text-xs text-gray-500 dark:text-gray-400 px-3 py-1 font-medium">Existing PRDs:</div>
<div className="text-xs text-gray-500 dark:text-gray-400 px-3 py-1 font-medium">{t('gettingStarted.steps.createPRD.existingPRDs')}</div>
{existingPRDs.map((prd) => (
<button
key={prd.name}
@@ -639,7 +641,7 @@ const TaskList = ({
}
}}
className="w-full text-left px-3 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded flex items-center gap-2"
title={`Modified: ${new Date(prd.modified).toLocaleDateString()}`}
title={t('prd.modified', { date: new Date(prd.modified).toLocaleDateString() })}
>
<FileText className="w-4 h-4" />
<span className="truncate">{prd.name}</span>
@@ -656,10 +658,10 @@ const TaskList = ({
onShowPRDEditor?.();
}}
className="flex items-center gap-2 px-3 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg transition-colors font-medium"
title="Create Product Requirements Document"
title={t('buttons.addPRD')}
>
<FileText className="w-4 h-4" />
<span className="hidden sm:inline">Add PRD</span>
<span className="hidden sm:inline">{t('buttons.addPRD')}</span>
</button>
)}
</div>
@@ -669,10 +671,10 @@ const TaskList = ({
<button
onClick={() => setShowCreateModal(true)}
className="flex items-center gap-2 px-3 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg transition-colors font-medium"
title="Add a new task"
title={t('buttons.addTask')}
>
<Plus className="w-4 h-4" />
<span className="hidden sm:inline">Add Task</span>
<span className="hidden sm:inline">{t('buttons.addTask')}</span>
</button>
)}
</>
@@ -687,17 +689,17 @@ const TaskList = ({
{/* Status Filter */}
<div>
<label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
Status
{t('filters.status')}
</label>
<select
value={statusFilter}
onChange={(e) => setStatusFilter(e.target.value)}
className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500"
>
<option value="all">All Statuses</option>
<option value="all">{t('filters.allStatuses')}</option>
{statuses.map(status => (
<option key={status} value={status}>
{status.charAt(0).toUpperCase() + status.slice(1).replace('-', ' ')}
{t(`statuses.${status}`, status.charAt(0).toUpperCase() + status.slice(1).replace('-', ' '))}
</option>
))}
</select>
@@ -706,17 +708,17 @@ const TaskList = ({
{/* Priority Filter */}
<div>
<label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
Priority
{t('filters.priority')}
</label>
<select
value={priorityFilter}
onChange={(e) => setPriorityFilter(e.target.value)}
className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500"
>
<option value="all">All Priorities</option>
<option value="all">{t('filters.allPriorities')}</option>
{priorities.map(priority => (
<option key={priority} value={priority}>
{priority.charAt(0).toUpperCase() + priority.slice(1)}
{t(`priorities.${priority}`, priority.charAt(0).toUpperCase() + priority.slice(1))}
</option>
))}
</select>
@@ -725,7 +727,7 @@ const TaskList = ({
{/* Sort By */}
<div>
<label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
Sort By
{t('filters.sortBy')}
</label>
<select
value={`${sortBy}-${sortOrder}`}
@@ -736,14 +738,14 @@ const TaskList = ({
}}
className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500"
>
<option value="id-asc">ID (Ascending)</option>
<option value="id-desc">ID (Descending)</option>
<option value="title-asc">Title (A-Z)</option>
<option value="title-desc">Title (Z-A)</option>
<option value="status-asc">Status (Pending First)</option>
<option value="status-desc">Status (Done First)</option>
<option value="priority-asc">Priority (High First)</option>
<option value="priority-desc">Priority (Low First)</option>
<option value="id-asc">{t('sort.idAsc')}</option>
<option value="id-desc">{t('sort.idDesc')}</option>
<option value="title-asc">{t('sort.titleAsc')}</option>
<option value="title-desc">{t('sort.titleDesc')}</option>
<option value="status-asc">{t('sort.statusAsc')}</option>
<option value="status-desc">{t('sort.statusDesc')}</option>
<option value="priority-asc">{t('sort.priorityAsc')}</option>
<option value="priority-desc">{t('sort.priorityDesc')}</option>
</select>
</div>
</div>
@@ -751,13 +753,13 @@ const TaskList = ({
{/* Filter Actions */}
<div className="flex items-center justify-between">
<div className="text-sm text-gray-600 dark:text-gray-400">
Showing {filteredAndSortedTasks.length} of {tasks.length} tasks
{t('filters.showing', { filtered: filteredAndSortedTasks.length, total: tasks.length })}
</div>
<button
onClick={clearFilters}
className="text-sm text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 font-medium"
>
Clear Filters
{t('filters.clearFilters')}
</button>
</div>
</div>
@@ -769,34 +771,34 @@ const TaskList = ({
onClick={() => handleSortChange('id')}
className={cn(
'flex items-center gap-1 px-3 py-1.5 rounded-md text-sm transition-colors',
sortBy === 'id'
? 'bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300'
sortBy === 'id'
? 'bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300'
: 'bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'
)}
>
ID {getSortIcon('id')}
{t('sort.id')} {getSortIcon('id')}
</button>
<button
onClick={() => handleSortChange('status')}
className={cn(
'flex items-center gap-1 px-3 py-1.5 rounded-md text-sm transition-colors',
sortBy === 'status'
? 'bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300'
sortBy === 'status'
? 'bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300'
: 'bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'
)}
>
Status {getSortIcon('status')}
{t('sort.status')} {getSortIcon('status')}
</button>
<button
onClick={() => handleSortChange('priority')}
className={cn(
'flex items-center gap-1 px-3 py-1.5 rounded-md text-sm transition-colors',
sortBy === 'priority'
? 'bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300'
sortBy === 'priority'
? 'bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300'
: 'bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'
)}
>
Priority {getSortIcon('priority')}
{t('sort.priority')} {getSortIcon('priority')}
</button>
</div>
@@ -805,8 +807,8 @@ const TaskList = ({
<div className="text-center py-12">
<div className="text-gray-500 dark:text-gray-400">
<Search className="w-12 h-12 mx-auto mb-4 opacity-50" />
<h3 className="text-lg font-medium mb-2">No tasks match your filters</h3>
<p className="text-sm">Try adjusting your search or filter criteria.</p>
<h3 className="text-lg font-medium mb-2">{t('noMatchingTasks.title')}</h3>
<p className="text-sm">{t('noMatchingTasks.description')}</p>
</div>
</div>
) : viewMode === 'kanban' ? (
@@ -844,13 +846,13 @@ const TaskList = ({
<div className="w-3 h-3 rounded-full bg-gray-300 dark:bg-gray-600"></div>
</div>
<div className="text-xs font-medium text-gray-500 dark:text-gray-400">
No tasks yet
{t('kanban.noTasksYet')}
</div>
<div className="text-xs text-gray-400 dark:text-gray-500 mt-1">
{column.status === 'pending' ? 'Tasks will appear here' :
column.status === 'in-progress' ? 'Move tasks here when started' :
column.status === 'done' ? 'Completed tasks appear here' :
'Tasks with this status will appear here'}
{column.status === 'pending' ? t('kanban.tasksWillAppear') :
column.status === 'in-progress' ? t('kanban.moveTasksHere') :
column.status === 'done' ? t('kanban.completedTasksHere') :
t('kanban.statusTasksHere')}
</div>
</div>
) : (
@@ -911,8 +913,8 @@ const TaskList = ({
<FileText className="w-5 h-5 text-blue-600 dark:text-blue-400" />
</div>
<div>
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">Getting Started with TaskMaster</h2>
<p className="text-sm text-gray-600 dark:text-gray-400">Your guide to productive task management</p>
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">{t('helpGuide.title')}</h2>
<p className="text-sm text-gray-600 dark:text-gray-400">{t('helpGuide.subtitle')}</p>
</div>
</div>
<button
@@ -930,8 +932,8 @@ const TaskList = ({
<div className="flex gap-4 p-4 bg-gradient-to-r from-blue-50 to-indigo-50 dark:from-blue-950/50 dark:to-indigo-950/50 rounded-lg border border-blue-200 dark:border-blue-800">
<div className="flex-shrink-0 w-8 h-8 bg-blue-600 text-white text-sm font-semibold rounded-full flex items-center justify-center">1</div>
<div>
<h4 className="font-medium text-gray-900 dark:text-white mb-2">Create a Product Requirements Document (PRD)</h4>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">Discuss your project idea and create a PRD that describes what you want to build.</p>
<h4 className="font-medium text-gray-900 dark:text-white mb-2">{t('gettingStarted.steps.createPRD.title')}</h4>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">{t('gettingStarted.steps.createPRD.description')}</p>
<button
onClick={() => {
onShowPRDEditor?.();
@@ -940,7 +942,7 @@ const TaskList = ({
className="inline-flex items-center gap-2 text-sm bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 px-3 py-1.5 rounded-lg hover:bg-purple-200 dark:hover:bg-purple-900/50 transition-colors"
>
<FileText className="w-4 h-4" />
Add PRD
{t('buttons.addPRD')}
</button>
</div>
</div>
@@ -949,12 +951,11 @@ const TaskList = ({
<div className="flex gap-4 p-4 bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-950/50 dark:to-emerald-950/50 rounded-lg border border-green-200 dark:border-green-800">
<div className="flex-shrink-0 w-8 h-8 bg-green-600 text-white text-sm font-semibold rounded-full flex items-center justify-center">2</div>
<div>
<h4 className="font-medium text-gray-900 dark:text-white mb-2">Generate Tasks from PRD</h4>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">Once you have a PRD, ask your AI assistant to parse it and TaskMaster will automatically break it down into manageable tasks with implementation details.</p>
<h4 className="font-medium text-gray-900 dark:text-white mb-2">{t('gettingStarted.steps.generateTasks.title')}</h4>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">{t('gettingStarted.steps.generateTasks.description')}</p>
<div className="bg-white dark:bg-gray-800/50 rounded border border-green-200 dark:border-green-700/50 p-3 mb-2">
<p className="text-xs font-medium text-gray-600 dark:text-gray-400 mb-1">💬 Example:</p>
<p className="text-xs text-gray-900 dark:text-white font-mono">
"I've just initialized a new project with Claude Task Master. I have a PRD at .taskmaster/docs/prd.txt. Can you help me parse it and set up the initial tasks?"
<p className="text-xs text-gray-900 dark:text-white font-mono whitespace-pre-wrap">
{t('helpGuide.examples.parsePRD')}
</p>
</div>
</div>
@@ -964,12 +965,11 @@ const TaskList = ({
<div className="flex gap-4 p-4 bg-gradient-to-r from-amber-50 to-orange-50 dark:from-amber-950/50 dark:to-orange-950/50 rounded-lg border border-amber-200 dark:border-amber-800">
<div className="flex-shrink-0 w-8 h-8 bg-amber-600 text-white text-sm font-semibold rounded-full flex items-center justify-center">3</div>
<div>
<h4 className="font-medium text-gray-900 dark:text-white mb-2">Analyze & Expand Tasks</h4>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">Ask your AI assistant to analyze task complexity and expand them into detailed subtasks for easier implementation.</p>
<h4 className="font-medium text-gray-900 dark:text-white mb-2">{t('gettingStarted.steps.analyzeTasks.title')}</h4>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">{t('gettingStarted.steps.analyzeTasks.description')}</p>
<div className="bg-white dark:bg-gray-800/50 rounded border border-amber-200 dark:border-amber-700/50 p-3 mb-2">
<p className="text-xs font-medium text-gray-600 dark:text-gray-400 mb-1">💬 Example:</p>
<p className="text-xs text-gray-900 dark:text-white font-mono">
"Task 5 seems complex. Can you break it down into subtasks?"
<p className="text-xs text-gray-900 dark:text-white font-mono whitespace-pre-wrap">
{t('helpGuide.examples.expandTask')}
</p>
</div>
</div>
@@ -979,12 +979,11 @@ const TaskList = ({
<div className="flex gap-4 p-4 bg-gradient-to-r from-purple-50 to-pink-50 dark:from-purple-950/50 dark:to-pink-950/50 rounded-lg border border-purple-200 dark:border-purple-800">
<div className="flex-shrink-0 w-8 h-8 bg-purple-600 text-white text-sm font-semibold rounded-full flex items-center justify-center">4</div>
<div>
<h4 className="font-medium text-gray-900 dark:text-white mb-2">Start Building</h4>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">Ask your AI assistant to begin working on tasks, update their status, and add new tasks as your project evolves.</p>
<h4 className="font-medium text-gray-900 dark:text-white mb-2">{t('gettingStarted.steps.startBuilding.title')}</h4>
<p className="text-sm text-gray-600 dark:text-gray-400 mb-3">{t('gettingStarted.steps.startBuilding.description')}</p>
<div className="bg-white dark:bg-gray-800/50 rounded border border-purple-200 dark:border-purple-700/50 p-3 mb-3">
<p className="text-xs font-medium text-gray-600 dark:text-gray-400 mb-1">💬 Example:</p>
<p className="text-xs text-gray-900 dark:text-white font-mono">
"Please add a new task to implement user profile image uploads using Cloudinary, research the best approach."
<p className="text-xs text-gray-900 dark:text-white font-mono whitespace-pre-wrap">
{t('helpGuide.examples.addTask')}
</p>
</div>
<a
@@ -993,50 +992,50 @@ const TaskList = ({
rel="noopener noreferrer"
className="inline-block text-xs text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 underline"
>
View more examples and usage patterns
{t('helpGuide.moreExamples')}
</a>
</div>
</div>
{/* Pro Tips */}
<div className="mt-6 p-4 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700">
<h4 className="font-medium text-gray-900 dark:text-white mb-3">💡 Pro Tips</h4>
<h4 className="font-medium text-gray-900 dark:text-white mb-3">{t('helpGuide.proTips.title')}</h4>
<ul className="space-y-2 text-sm text-gray-600 dark:text-gray-400">
<li className="flex items-start gap-2">
<span className="w-1.5 h-1.5 bg-blue-500 rounded-full mt-2 flex-shrink-0"></span>
Use the search bar to quickly find specific tasks
{t('helpGuide.proTips.search')}
</li>
<li className="flex items-start gap-2">
<span className="w-1.5 h-1.5 bg-green-500 rounded-full mt-2 flex-shrink-0"></span>
Switch between Kanban, List, and Grid views using the view toggles
{t('helpGuide.proTips.views')}
</li>
<li className="flex items-start gap-2">
<span className="w-1.5 h-1.5 bg-purple-500 rounded-full mt-2 flex-shrink-0"></span>
Use filters to focus on specific task statuses or priorities
{t('helpGuide.proTips.filters')}
</li>
<li className="flex items-start gap-2">
<span className="w-1.5 h-1.5 bg-orange-500 rounded-full mt-2 flex-shrink-0"></span>
Click on any task to view detailed information and manage subtasks
{t('helpGuide.proTips.details')}
</li>
</ul>
</div>
{/* Learn More Section */}
<div className="mt-6 p-4 bg-blue-50 dark:bg-blue-950/50 rounded-lg border border-blue-200 dark:border-blue-800">
<h4 className="font-medium text-blue-900 dark:text-blue-100 mb-3">📚 Learn More</h4>
<h4 className="font-medium text-blue-900 dark:text-blue-100 mb-3">{t('helpGuide.learnMore.title')}</h4>
<p className="text-sm text-blue-800 dark:text-blue-200 mb-3">
TaskMaster AI is an advanced task management system built for developers. Get documentation, examples, and contribute to the project.
{t('helpGuide.learnMore.description')}
</p>
<a
href="https://github.com/eyaltoledano/claude-task-master"
target="_blank"
<a
href="https://github.com/eyaltoledano/claude-task-master"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-2 text-sm bg-blue-600 hover:bg-blue-700 text-white px-3 py-2 rounded-lg font-medium transition-colors"
>
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 0C4.477 0 0 4.484 0 10.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0110 4.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.203 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.942.359.31.678.921.678 1.856 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0020 10.017C20 4.484 15.522 0 10 0z" clipRule="evenodd" />
</svg>
View on GitHub
{t('helpGuide.learnMore.githubButton')}
<svg className="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
</svg>

View File

@@ -20,6 +20,7 @@ import enAuth from './locales/en/auth.json';
import enSidebar from './locales/en/sidebar.json';
import enChat from './locales/en/chat.json';
import enCodeEditor from './locales/en/codeEditor.json';
import enTasks from './locales/en/tasks.json';
import koCommon from './locales/ko/common.json';
import koSettings from './locales/ko/settings.json';
@@ -35,6 +36,14 @@ import zhSidebar from './locales/zh-CN/sidebar.json';
import zhChat from './locales/zh-CN/chat.json';
import zhCodeEditor from './locales/zh-CN/codeEditor.json';
import jaCommon from './locales/ja/common.json';
import jaSettings from './locales/ja/settings.json';
import jaAuth from './locales/ja/auth.json';
import jaSidebar from './locales/ja/sidebar.json';
import jaChat from './locales/ja/chat.json';
import jaCodeEditor from './locales/ja/codeEditor.json';
import jaTasks from './locales/ja/tasks.json';
// Import supported languages configuration
import { languages } from './languages.js';
@@ -66,6 +75,7 @@ i18n
sidebar: enSidebar,
chat: enChat,
codeEditor: enCodeEditor,
tasks: enTasks,
},
ko: {
common: koCommon,
@@ -83,6 +93,15 @@ i18n
chat: zhChat,
codeEditor: zhCodeEditor,
},
ja: {
common: jaCommon,
settings: jaSettings,
auth: jaAuth,
sidebar: jaSidebar,
chat: jaChat,
codeEditor: jaCodeEditor,
tasks: jaTasks,
},
},
// Default language
@@ -95,7 +114,7 @@ i18n
debug: import.meta.env.DEV,
// Namespaces - load only what's needed
ns: ['common', 'settings', 'auth', 'sidebar', 'chat', 'codeEditor'],
ns: ['common', 'settings', 'auth', 'sidebar', 'chat', 'codeEditor', 'tasks'],
defaultNS: 'common',
// Key separator for nested keys (default: '.')

View File

@@ -24,6 +24,11 @@ export const languages = [
label: 'Simplified Chinese',
nativeName: '简体中文',
},
{
value: 'ja',
label: 'Japanese',
nativeName: '日本語',
},
];
/**

View File

@@ -0,0 +1,142 @@
{
"notConfigured": {
"title": "TaskMaster AI is not configured",
"description": "TaskMaster helps break down complex projects into manageable tasks with AI-powered assistance",
"whatIsTitle": "🎯 What is TaskMaster?",
"features": {
"aiPowered": "AI-Powered Task Management: Break complex projects into manageable subtasks",
"prdTemplates": "PRD Templates: Generate tasks from Product Requirements Documents",
"dependencyTracking": "Dependency Tracking: Understand task relationships and execution order",
"progressVisualization": "Progress Visualization: Kanban boards and detailed task analytics",
"cliIntegration": "CLI Integration: Use taskmaster commands for advanced workflows"
},
"initializeButton": "Initialize TaskMaster AI"
},
"gettingStarted": {
"title": "Getting Started with TaskMaster",
"subtitle": "TaskMaster is initialized! Here's what to do next:",
"steps": {
"createPRD": {
"title": "Create a Product Requirements Document (PRD)",
"description": "Discuss your project idea and create a PRD that describes what you want to build.",
"addButton": "Add PRD",
"existingPRDs": "Existing PRDs:"
},
"generateTasks": {
"title": "Generate Tasks from PRD",
"description": "Once you have a PRD, ask your AI assistant to parse it and TaskMaster will automatically break it down into manageable tasks with implementation details."
},
"analyzeTasks": {
"title": "Analyze & Expand Tasks",
"description": "Ask your AI assistant to analyze task complexity and expand them into detailed subtasks for easier implementation."
},
"startBuilding": {
"title": "Start Building",
"description": "Ask your AI assistant to begin working on tasks, update their status, and add new tasks as your project evolves."
}
},
"tip": "💡 Tip: Start with a PRD to get the most out of TaskMaster's AI-powered task generation"
},
"setupModal": {
"title": "TaskMaster Setup",
"subtitle": "Interactive CLI for {{projectName}}",
"willStart": "TaskMaster initialization will start automatically",
"completed": "TaskMaster setup completed! You can now close this window.",
"closeButton": "Close",
"closeContinueButton": "Close & Continue"
},
"helpGuide": {
"title": "Getting Started with TaskMaster",
"subtitle": "Your guide to productive task management",
"examples": {
"parsePRD": "💬 Example:\n\"I've just initialized a new project with Claude Task Master. I have a PRD at .taskmaster/docs/prd.txt. Can you help me parse it and set up the initial tasks?\"",
"expandTask": "💬 Example:\n\"Task 5 seems complex. Can you break it down into subtasks?\"",
"addTask": "💬 Example:\n\"Please add a new task to implement user profile image uploads using Cloudinary, research the best approach.\""
},
"moreExamples": "View more examples and usage patterns →",
"proTips": {
"title": "💡 Pro Tips",
"search": "Use the search bar to quickly find specific tasks",
"views": "Switch between Kanban, List, and Grid views using the view toggles",
"filters": "Use filters to focus on specific task statuses or priorities",
"details": "Click on any task to view detailed information and manage subtasks"
},
"learnMore": {
"title": "📚 Learn More",
"description": "TaskMaster AI is an advanced task management system built for developers. Get documentation, examples, and contribute to the project.",
"githubButton": "View on GitHub"
}
},
"search": {
"placeholder": "Search tasks..."
},
"filters": {
"button": "Filters",
"status": "Status",
"priority": "Priority",
"sortBy": "Sort By",
"allStatuses": "All Statuses",
"allPriorities": "All Priorities",
"showing": "Showing {{filtered}} of {{total}} tasks",
"clearFilters": "Clear Filters"
},
"sort": {
"id": "ID",
"status": "Status",
"priority": "Priority",
"idAsc": "ID (Ascending)",
"idDesc": "ID (Descending)",
"titleAsc": "Title (A-Z)",
"titleDesc": "Title (Z-A)",
"statusAsc": "Status (Pending First)",
"statusDesc": "Status (Done First)",
"priorityAsc": "Priority (High First)",
"priorityDesc": "Priority (Low First)"
},
"views": {
"kanban": "Kanban view",
"list": "List view",
"grid": "Grid view"
},
"kanban": {
"pending": "📋 To Do",
"inProgress": "🚀 In Progress",
"done": "✅ Done",
"blocked": "🚫 Blocked",
"deferred": "⏳ Deferred",
"cancelled": "❌ Cancelled",
"noTasksYet": "No tasks yet",
"tasksWillAppear": "Tasks will appear here",
"moveTasksHere": "Move tasks here when started",
"completedTasksHere": "Completed tasks appear here",
"statusTasksHere": "Tasks with this status will appear here"
},
"buttons": {
"help": "TaskMaster Getting Started Guide",
"prds": "PRDs",
"addPRD": "Add PRD",
"addTask": "Add Task",
"createNewPRD": "Create New PRD",
"prdsAvailable": "{{count}} PRD(s) available"
},
"prd": {
"modified": "Modified: {{date}}"
},
"statuses": {
"pending": "Pending",
"in-progress": "In Progress",
"done": "Done",
"blocked": "Blocked",
"deferred": "Deferred",
"cancelled": "Cancelled"
},
"priorities": {
"high": "High",
"medium": "Medium",
"low": "Low"
},
"noMatchingTasks": {
"title": "No tasks match your filters",
"description": "Try adjusting your search or filter criteria."
}
}

View File

@@ -0,0 +1,37 @@
{
"login": {
"title": "おかえりなさい",
"description": "Claude Code UIアカウントにサインイン",
"username": "ユーザー名",
"password": "パスワード",
"submit": "サインイン",
"loading": "サインイン中...",
"errors": {
"invalidCredentials": "ユーザー名またはパスワードが正しくありません",
"requiredFields": "すべての項目を入力してください",
"networkError": "ネットワークエラー。もう一度お試しください。"
},
"placeholders": {
"username": "ユーザー名を入力",
"password": "パスワードを入力"
}
},
"register": {
"title": "アカウント作成",
"username": "ユーザー名",
"password": "パスワード",
"confirmPassword": "パスワードの確認",
"submit": "アカウントを作成",
"loading": "アカウントを作成中...",
"errors": {
"passwordMismatch": "パスワードが一致しません",
"usernameTaken": "このユーザー名は既に使用されています",
"weakPassword": "パスワードが弱すぎます"
}
},
"logout": {
"title": "サインアウト",
"confirm": "サインアウトしてもよろしいですか?",
"button": "サインアウト"
}
}

View File

@@ -0,0 +1,205 @@
{
"codeBlock": {
"copy": "コピー",
"copied": "コピーしました",
"copyCode": "コードをコピー"
},
"messageTypes": {
"user": "U",
"error": "エラー",
"tool": "ツール",
"claude": "Claude",
"cursor": "Cursor",
"codex": "Codex"
},
"tools": {
"settings": "ツール設定",
"error": "ツールエラー",
"result": "ツール結果",
"viewParams": "入力パラメータを表示",
"viewRawParams": "生パラメータを表示",
"viewDiff": "編集差分を表示:",
"creatingFile": "新規ファイルを作成:",
"updatingTodo": "Todoリストを更新中",
"read": "読み取り",
"readFile": "ファイルを読み取り",
"updateTodo": "Todoリストを更新",
"readTodo": "Todoリストを読み取り",
"searchResults": "件の結果"
},
"search": {
"found": "{{count}}件の{{type}}が見つかりました",
"file": "ファイル",
"files": "ファイル",
"pattern": "パターン:",
"in": "場所:"
},
"fileOperations": {
"updated": "ファイルを更新しました",
"created": "ファイルを作成しました",
"written": "ファイルを書き込みました",
"diff": "差分",
"newFile": "新規ファイル",
"viewContent": "ファイルの内容を表示",
"viewFullOutput": "全出力を表示({{count}}文字)",
"contentDisplayed": "ファイルの内容は上の差分ビューに表示されています"
},
"interactive": {
"title": "インタラクティブプロンプト",
"waiting": "CLIでの応答を待っています",
"instruction": "Claudeが実行されているターミナルでオプションを選択してください。",
"selectedOption": "✓ Claudeがオプション{{number}}を選択しました",
"instructionDetail": "CLIでは、矢印キーまたは番号を入力してオプションを選択します。"
},
"thinking": {
"title": "思考中...",
"emoji": "💭 思考中..."
},
"json": {
"response": "JSONレスポンス"
},
"permissions": {
"grant": "{{tool}}に権限を付与",
"added": "権限を追加しました",
"addTo": "{{entry}}を許可されたツールに追加します。",
"retry": "権限を保存しました。ツールを使用するにはリクエストを再試行してください。",
"error": "権限を更新できませんでした。もう一度お試しください。",
"openSettings": "設定を開く"
},
"todo": {
"updated": "Todoリストを更新しました",
"current": "現在のTodoリスト"
},
"plan": {
"viewPlan": "📋 実装プランを表示",
"title": "実装プラン"
},
"usageLimit": {
"resetAt": "Claudeの使用制限に達しました。制限は**{{time}} {{timezone}}** - {{date}}にリセットされます"
},
"codex": {
"permissionMode": "権限モード",
"modes": {
"default": "デフォルトモード",
"acceptEdits": "編集を許可",
"bypassPermissions": "権限をバイパス",
"plan": "プランモード"
},
"descriptions": {
"default": "信頼されたコマンドls、cat、grep、git statusなどのみ自動実行。その他のコマンドはスキップ。ワークスペースへの書き込みは可能。",
"acceptEdits": "ワークスペース内ですべてのコマンドを自動実行。サンドボックス環境での完全自動モード。",
"bypassPermissions": "制限なしの完全なシステムアクセス。すべてのコマンドがディスクとネットワークへの完全なアクセスで自動実行されます。注意して使用してください。",
"plan": "プランニングモード - コマンドは実行されません"
},
"technicalDetails": "技術的な詳細"
},
"input": {
"placeholder": "/ でコマンド、@ でファイル指定、または {{provider}} に何でも聞いてください...",
"placeholderDefault": "メッセージを入力...",
"disabled": "入力無効",
"attachFiles": "ファイルを添付",
"attachImages": "画像を添付",
"send": "送信",
"stop": "停止",
"hintText": {
"ctrlEnter": "Ctrl+Enterで送信 • Shift+Enterで改行 • Tabでモード切替 • / でスラッシュコマンド",
"enter": "Enterで送信 • Shift+Enterで改行 • Tabでモード切替 • / でスラッシュコマンド"
},
"clickToChangeMode": "クリックで権限モードを変更または入力欄でTab",
"showAllCommands": "すべてのコマンドを表示"
},
"thinkingMode": {
"selector": {
"title": "思考モード",
"description": "拡張思考によりClaudeがより多くの選択肢を検討できます",
"active": "有効",
"tip": "高い思考モードは時間がかかりますが、より深い分析が得られます"
},
"modes": {
"none": {
"name": "標準",
"description": "通常のClaudeの応答",
"prefix": ""
},
"think": {
"name": "Think",
"description": "基本的な拡張思考",
"prefix": "think"
},
"thinkHard": {
"name": "Think Hard",
"description": "より深い検討",
"prefix": "think hard"
},
"thinkHarder": {
"name": "Think Harder",
"description": "代替案を含む深い分析",
"prefix": "think harder"
},
"ultrathink": {
"name": "Ultrathink",
"description": "最大限の思考予算",
"prefix": "ultrathink"
}
},
"buttonTitle": "思考モード: {{mode}}"
},
"providerSelection": {
"title": "AIアシスタントを選択",
"description": "新しい会話を始めるプロバイダーを選択してください",
"selectModel": "モデルを選択",
"providerInfo": {
"anthropic": "by Anthropic",
"openai": "by OpenAI",
"cursorEditor": "AIコードエディタ"
},
"readyPrompt": {
"claude": "{{model}}でClaudeを使用する準備ができました。下にメッセージを入力してください。",
"cursor": "{{model}}でCursorを使用する準備ができました。下にメッセージを入力してください。",
"codex": "{{model}}でCodexを使用する準備ができました。下にメッセージを入力してください。",
"default": "上からプロバイダーを選択して開始してください"
}
},
"session": {
"continue": {
"title": "会話を続ける",
"description": "コードについて質問したり、変更をリクエストしたり、開発タスクのサポートを受けられます"
},
"loading": {
"olderMessages": "過去のメッセージを読み込んでいます...",
"sessionMessages": "セッションメッセージを読み込んでいます..."
},
"messages": {
"showingOf": "{{total}}件中{{shown}}件を表示",
"scrollToLoad": "上にスクロールしてさらに読み込む",
"showingLast": "最新{{count}}件を表示(全{{total}}件)",
"loadEarlier": "過去のメッセージを読み込む"
}
},
"shell": {
"selectProject": {
"title": "プロジェクトを選択",
"description": "プロジェクトを選択してそのディレクトリでシェルを開きます"
},
"status": {
"newSession": "新しいセッション",
"initializing": "初期化中...",
"restarting": "再起動中..."
},
"actions": {
"disconnect": "切断",
"disconnectTitle": "シェルから切断",
"restart": "再起動",
"restartTitle": "シェルを再起動(先に切断してください)",
"connect": "シェルで続行",
"connectTitle": "シェルに接続"
},
"loading": "ターミナルを読み込んでいます...",
"connecting": "シェルに接続しています...",
"startSession": "新しいClaudeセッションを開始",
"resumeSession": "セッションを再開: {{displayName}}...",
"runCommand": "{{projectName}}で{{command}}を実行",
"startCli": "{{projectName}}でClaude CLIを起動しています",
"defaultCommand": "コマンド"
}
}

View File

@@ -0,0 +1,30 @@
{
"toolbar": {
"changes": "件の変更",
"previousChange": "前の変更",
"nextChange": "次の変更",
"hideDiff": "差分ハイライトを非表示",
"showDiff": "差分ハイライトを表示",
"settings": "エディタ設定",
"collapse": "エディタを折りたたむ",
"expand": "エディタを全幅に展開"
},
"loading": "{{fileName}}を読み込んでいます...",
"header": {
"showingChanges": "変更を表示中"
},
"actions": {
"download": "ファイルをダウンロード",
"save": "保存",
"saving": "保存中...",
"saved": "保存しました!",
"exitFullscreen": "全画面を終了",
"fullscreen": "全画面",
"close": "閉じる"
},
"footer": {
"lines": "行数:",
"characters": "文字数:",
"shortcuts": "Ctrl+Sで保存 • Escで閉じる"
}
}

View File

@@ -0,0 +1,222 @@
{
"buttons": {
"save": "保存",
"cancel": "キャンセル",
"delete": "削除",
"create": "作成",
"edit": "編集",
"close": "閉じる",
"confirm": "確認",
"submit": "送信",
"retry": "再試行",
"refresh": "更新",
"search": "検索",
"clear": "クリア",
"copy": "コピー",
"download": "ダウンロード",
"upload": "アップロード",
"browse": "参照"
},
"tabs": {
"chat": "チャット",
"shell": "シェル",
"files": "ファイル",
"git": "ソース管理",
"tasks": "タスク"
},
"status": {
"loading": "読み込み中...",
"success": "成功",
"error": "エラー",
"failed": "失敗",
"pending": "保留中",
"completed": "完了",
"inProgress": "進行中"
},
"messages": {
"savedSuccessfully": "保存しました",
"deletedSuccessfully": "削除しました",
"updatedSuccessfully": "更新しました",
"operationFailed": "操作に失敗しました",
"networkError": "ネットワークエラー。接続を確認してください。",
"unauthorized": "認証されていません。ログインしてください。",
"notFound": "見つかりません",
"invalidInput": "入力が無効です",
"requiredField": "この項目は必須です",
"unknownError": "不明なエラーが発生しました"
},
"navigation": {
"settings": "設定",
"home": "ホーム",
"back": "戻る",
"next": "次へ",
"previous": "前へ",
"logout": "ログアウト"
},
"common": {
"language": "言語",
"theme": "テーマ",
"darkMode": "ダークモード",
"lightMode": "ライトモード",
"name": "名前",
"description": "説明",
"enabled": "有効",
"disabled": "無効",
"optional": "任意",
"version": "バージョン",
"select": "選択",
"selectAll": "すべて選択",
"deselectAll": "すべて解除"
},
"time": {
"justNow": "たった今",
"minutesAgo": "{{count}}分前",
"hoursAgo": "{{count}}時間前",
"daysAgo": "{{count}}日前",
"yesterday": "昨日"
},
"fileOperations": {
"newFile": "新規ファイル",
"newFolder": "新規フォルダ",
"rename": "名前の変更",
"move": "移動",
"copyPath": "パスをコピー",
"openInEditor": "エディタで開く"
},
"mainContent": {
"loading": "Claude Code UI を読み込んでいます",
"settingUpWorkspace": "ワークスペースを準備しています...",
"chooseProject": "プロジェクトを選択",
"selectProjectDescription": "サイドバーからプロジェクトを選択して、Claudeとコーディングを始めましょう。各プロジェクトにはチャットセッションとファイル履歴が含まれています。",
"tip": "ヒント",
"createProjectMobile": "上部のメニューボタンからプロジェクトにアクセスできます",
"createProjectDesktop": "サイドバーのフォルダアイコンをクリックして新しいプロジェクトを作成できます",
"newSession": "新しいセッション",
"untitledSession": "無題のセッション",
"projectFiles": "プロジェクトファイル"
},
"fileTree": {
"loading": "ファイルを読み込んでいます...",
"files": "ファイル",
"simpleView": "シンプル表示",
"compactView": "コンパクト表示",
"detailedView": "詳細表示",
"searchPlaceholder": "ファイルやフォルダを検索...",
"clearSearch": "検索をクリア",
"name": "名前",
"size": "サイズ",
"modified": "更新日時",
"permissions": "権限",
"noFilesFound": "ファイルが見つかりません",
"checkProjectPath": "プロジェクトのパスがアクセス可能か確認してください",
"noMatchesFound": "一致するものが見つかりません",
"tryDifferentSearch": "別の検索語を試すか、検索をクリアしてください",
"justNow": "たった今",
"minAgo": "{{count}}分前",
"hoursAgo": "{{count}}時間前",
"daysAgo": "{{count}}日前"
},
"projectWizard": {
"title": "新規プロジェクトを作成",
"steps": {
"type": "種類",
"configure": "設定",
"confirm": "確認"
},
"step1": {
"question": "既存のワークスペースがありますか?それとも新しく作成しますか?",
"existing": {
"title": "既存のワークスペース",
"description": "サーバー上に既存のワークスペースがあり、プロジェクト一覧に追加したい"
},
"new": {
"title": "新しいワークスペース",
"description": "新しいワークスペースを作成し、必要に応じてGitHubリポジトリからクローンする"
}
},
"step2": {
"existingPath": "ワークスペースのパス",
"newPath": "ワークスペースのパス",
"existingPlaceholder": "/path/to/existing/workspace",
"newPlaceholder": "/path/to/new/workspace",
"existingHelp": "既存のワークスペースディレクトリのフルパス",
"newHelp": "ワークスペースディレクトリのフルパス",
"githubUrl": "GitHub URL任意",
"githubPlaceholder": "https://github.com/username/repository",
"githubHelp": "任意: リポジトリをクローンするためのGitHub URLを入力してください",
"githubAuth": "GitHub認証任意",
"githubAuthHelp": "プライベートリポジトリの場合のみ必要です。パブリックリポジトリは認証なしでクローンできます。",
"loadingTokens": "保存済みトークンを読み込んでいます...",
"storedToken": "保存済みトークン",
"newToken": "新しいトークン",
"nonePublic": "なし(パブリック)",
"selectToken": "トークンを選択",
"selectTokenPlaceholder": "-- トークンを選択 --",
"tokenPlaceholder": "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"tokenHelp": "このトークンはこの操作にのみ使用されます",
"publicRepoInfo": "パブリックリポジトリには認証は不要です。パブリックリポジトリをクローンする場合、トークンは省略できます。",
"noTokensHelp": "保存済みトークンがありません。設定 → APIキーでトークンを追加すると再利用が簡単になります。",
"optionalTokenPublic": "GitHubトークンパブリックリポジトリの場合は任意",
"tokenPublicPlaceholder": "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxパブリックリポジトリの場合は空欄可"
},
"step3": {
"reviewConfig": "設定の確認",
"workspaceType": "ワークスペースの種類:",
"existingWorkspace": "既存のワークスペース",
"newWorkspace": "新しいワークスペース",
"path": "パス:",
"cloneFrom": "クローン元:",
"authentication": "認証:",
"usingStoredToken": "保存済みトークンを使用:",
"usingProvidedToken": "入力されたトークンを使用",
"noAuthentication": "認証なし",
"sshKey": "SSHキー",
"existingInfo": "ワークスペースがプロジェクト一覧に追加され、Claude/Cursorセッションで使用できるようになります。",
"newWithClone": "このフォルダからリポジトリがクローンされます。",
"newEmpty": "ワークスペースがプロジェクト一覧に追加され、Claude/Cursorセッションで使用できるようになります。",
"cloningRepository": "リポジトリをクローンしています..."
},
"buttons": {
"cancel": "キャンセル",
"back": "戻る",
"next": "次へ",
"createProject": "プロジェクトを作成",
"creating": "作成中...",
"cloning": "クローン中..."
},
"errors": {
"selectType": "既存のワークスペースか新規作成かを選択してください",
"providePath": "ワークスペースのパスを入力してください",
"failedToCreate": "ワークスペースの作成に失敗しました",
"failedToCreateFolder": "フォルダの作成に失敗しました"
}
},
"versionUpdate": {
"title": "アップデートのお知らせ",
"newVersionReady": "新しいバージョンが利用可能です",
"currentVersion": "現在のバージョン",
"latestVersion": "最新バージョン",
"whatsNew": "変更点:",
"viewFullRelease": "リリース全文を見る",
"updateProgress": "アップデートの進捗:",
"manualUpgrade": "手動アップグレード:",
"manualUpgradeHint": "または「今すぐ更新」をクリックして自動的にアップデートを実行できます。",
"updateCompleted": "アップデートが完了しました!",
"restartServer": "変更を適用するにはサーバーを再起動してください。",
"updateFailed": "アップデートに失敗しました",
"buttons": {
"close": "閉じる",
"later": "後で",
"copyCommand": "コマンドをコピー",
"updateNow": "今すぐ更新",
"updating": "更新中..."
},
"ariaLabels": {
"closeModal": "バージョンアップグレードモーダルを閉じる",
"showSidebar": "サイドバーを表示",
"settings": "設定",
"updateAvailable": "アップデートあり",
"closeSidebar": "サイドバーを閉じる"
}
}
}

View File

@@ -0,0 +1,418 @@
{
"title": "設定",
"tabs": {
"account": "アカウント",
"permissions": "権限",
"mcpServers": "MCPサーバー",
"appearance": "外観"
},
"account": {
"title": "アカウント",
"language": "言語",
"languageLabel": "表示言語",
"languageDescription": "インターフェースの表示言語を選択してください",
"username": "ユーザー名",
"email": "メールアドレス",
"profile": "プロフィール",
"changePassword": "パスワードを変更"
},
"mcp": {
"title": "MCPサーバー",
"addServer": "サーバーを追加",
"editServer": "サーバーを編集",
"deleteServer": "サーバーを削除",
"serverName": "サーバー名",
"serverType": "サーバーの種類",
"config": "設定",
"testConnection": "接続テスト",
"status": "状態",
"connected": "接続済み",
"disconnected": "未接続",
"scope": {
"label": "スコープ",
"user": "ユーザー",
"project": "プロジェクト"
}
},
"appearance": {
"title": "外観",
"theme": "テーマ",
"codeEditor": "コードエディタ",
"editorTheme": "エディタのテーマ",
"wordWrap": "折り返し",
"showMinimap": "ミニマップを表示",
"lineNumbers": "行番号",
"fontSize": "フォントサイズ"
},
"actions": {
"saveChanges": "変更を保存",
"resetToDefaults": "デフォルトに戻す",
"cancelChanges": "変更をキャンセル"
},
"quickSettings": {
"title": "クイック設定",
"sections": {
"appearance": "外観",
"toolDisplay": "ツール表示",
"viewOptions": "表示オプション",
"inputSettings": "入力設定",
"whisperDictation": "Whisper音声入力"
},
"darkMode": "ダークモード",
"autoExpandTools": "ツールを自動展開",
"showRawParameters": "生パラメータを表示",
"showThinking": "思考を表示",
"autoScrollToBottom": "自動スクロール",
"sendByCtrlEnter": "Ctrl+Enterで送信",
"sendByCtrlEnterDescription": "有効にすると、Enterではなく Ctrl+Enter でメッセージを送信します。IMEユーザーの誤送信防止に便利です。",
"dragHandle": {
"dragging": "ドラッグ中",
"closePanel": "設定パネルを閉じる",
"openPanel": "設定パネルを開く",
"draggingStatus": "ドラッグ中...",
"toggleAndMove": "クリックで切替、ドラッグで移動"
},
"whisper": {
"modes": {
"default": "標準モード",
"defaultDescription": "音声をそのまま文字起こしします",
"prompt": "プロンプト強化",
"promptDescription": "ラフなアイデアを明確で詳細なAIプロンプトに変換します",
"vibe": "バイブモード",
"vibeDescription": "アイデアを明確なエージェント指示に整形します"
}
}
},
"mainTabs": {
"agents": "エージェント",
"appearance": "外観",
"git": "Git",
"apiTokens": "API & トークン",
"tasks": "タスク"
},
"appearanceSettings": {
"darkMode": {
"label": "ダークモード",
"description": "ライトテーマとダークテーマを切り替えます"
},
"projectSorting": {
"label": "プロジェクトの並び順",
"description": "サイドバーでのプロジェクトの並び順を設定します",
"alphabetical": "アルファベット順",
"recentActivity": "最近のアクティビティ順"
},
"codeEditor": {
"title": "コードエディタ",
"theme": {
"label": "エディタのテーマ",
"description": "コードエディタのデフォルトテーマ"
},
"wordWrap": {
"label": "折り返し",
"description": "エディタでデフォルトで折り返しを有効にします"
},
"showMinimap": {
"label": "ミニマップを表示",
"description": "差分ビューでナビゲーション用のミニマップを表示します"
},
"lineNumbers": {
"label": "行番号を表示",
"description": "エディタに行番号を表示します"
},
"fontSize": {
"label": "フォントサイズ",
"description": "エディタのフォントサイズ(ピクセル)"
}
}
},
"mcpForm": {
"title": {
"add": "MCPサーバーを追加",
"edit": "MCPサーバーを編集"
},
"importMode": {
"form": "フォーム入力",
"json": "JSONインポート"
},
"scope": {
"label": "スコープ",
"userGlobal": "ユーザー(グローバル)",
"projectLocal": "プロジェクト(ローカル)",
"userDescription": "ユーザースコープ: すべてのプロジェクトで利用可能",
"projectDescription": "ローカルスコープ: 選択したプロジェクトでのみ利用可能",
"cannotChange": "既存のサーバーを編集する場合、スコープは変更できません"
},
"fields": {
"serverName": "サーバー名",
"transportType": "トランスポートの種類",
"command": "コマンド",
"arguments": "引数1行に1つ",
"jsonConfig": "JSON設定",
"url": "URL",
"envVars": "環境変数KEY=value、1行に1つ",
"headers": "ヘッダーKEY=value、1行に1つ",
"selectProject": "プロジェクトを選択..."
},
"placeholders": {
"serverName": "my-server"
},
"validation": {
"missingType": "必須フィールドがありません: type",
"stdioRequiresCommand": "stdioタイプにはcommandフィールドが必要です",
"httpRequiresUrl": "{{type}}タイプにはurlフィールドが必要です",
"invalidJson": "無効なJSON形式です",
"jsonHelp": "MCPサーバー設定をJSON形式で貼り付けてください。例:",
"jsonExampleStdio": "• stdio: {\"type\":\"stdio\",\"command\":\"npx\",\"args\":[\"@upstash/context7-mcp\"]}",
"jsonExampleHttp": "• http/sse: {\"type\":\"http\",\"url\":\"https://api.example.com/mcp\"}"
},
"configDetails": "設定の詳細({{configFile}}より)",
"projectPath": "パス: {{path}}",
"actions": {
"cancel": "キャンセル",
"saving": "保存中...",
"addServer": "サーバーを追加",
"updateServer": "サーバーを更新"
}
},
"saveStatus": {
"success": "設定を保存しました!",
"error": "設定の保存に失敗しました",
"saving": "保存中..."
},
"footerActions": {
"save": "設定を保存",
"cancel": "キャンセル"
},
"git": {
"title": "Git設定",
"description": "コミット用のGit IDを設定します。この設定は git config --global で適用されます",
"name": {
"label": "Git名前",
"help": "コミットに使用する名前"
},
"email": {
"label": "Gitメールアドレス",
"help": "コミットに使用するメールアドレス"
},
"actions": {
"save": "設定を保存",
"saving": "保存中..."
},
"status": {
"success": "保存しました"
}
},
"apiKeys": {
"title": "APIキー",
"description": "外部APIにアクセスするためのAPIキーを生成します。",
"newKey": {
"alertTitle": "⚠️ APIキーを保存してください",
"alertMessage": "このキーが表示されるのは今回限りです。安全な場所に保管してください。",
"iveSavedIt": "保存しました"
},
"form": {
"placeholder": "APIキーの名前例: 本番サーバー)",
"createButton": "作成",
"cancelButton": "キャンセル"
},
"newButton": "新しいAPIキー",
"empty": "APIキーはまだ作成されていません。",
"list": {
"created": "作成日:",
"lastUsed": "最終使用日:"
},
"confirmDelete": "このAPIキーを削除してもよろしいですか",
"status": {
"active": "有効",
"inactive": "無効"
},
"github": {
"title": "GitHubトークン",
"description": "外部APIからプライベートリポジトリをクローンするためのGitHubパーソナルアクセストークンを追加します。",
"descriptionAlt": "プライベートリポジトリをクローンするためのGitHubパーソナルアクセストークンを追加します。保存せずにAPIリクエストで直接トークンを渡すこともできます。",
"addButton": "トークンを追加",
"form": {
"namePlaceholder": "トークンの名前(例: 個人リポジトリ)",
"tokenPlaceholder": "GitHubパーソナルアクセストークンghp_...",
"descriptionPlaceholder": "説明(任意)",
"addButton": "トークンを追加",
"cancelButton": "キャンセル",
"howToCreate": "GitHubパーソナルアクセストークンの作成方法 →"
},
"empty": "GitHubトークンはまだ追加されていません。",
"added": "追加日:",
"confirmDelete": "このGitHubトークンを削除してもよろしいですか"
},
"apiDocsLink": "APIドキュメント",
"documentation": {
"title": "外部APIドキュメント",
"description": "外部APIを使用してアプリケーションからClaude/Cursorセッションを起動する方法を学びます。",
"viewLink": "APIドキュメントを見る →"
},
"loading": "読み込み中...",
"version": {
"updateAvailable": "アップデートあり: v{{version}}"
}
},
"tasks": {
"checking": "TaskMasterのインストールを確認しています...",
"notInstalled": {
"title": "TaskMaster AI CLIがインストールされていません",
"description": "タスク管理機能を使用するにはTaskMaster CLIが必要です。以下のコマンドでインストールしてください:",
"installCommand": "npm install -g task-master-ai",
"viewOnGitHub": "GitHubで見る",
"afterInstallation": "インストール後:",
"steps": {
"restart": "このアプリケーションを再起動してください",
"autoAvailable": "TaskMaster機能が自動的に利用可能になります",
"initCommand": "プロジェクトディレクトリで task-master init を実行してください"
}
},
"settings": {
"enableLabel": "TaskMaster統合を有効にする",
"enableDescription": "インターフェース全体でTaskMasterのタスク、バナー、サイドバーインジケータを表示します"
}
},
"agents": {
"authStatus": {
"checking": "確認中...",
"connected": "接続済み",
"notConnected": "未接続",
"disconnected": "切断",
"checkingAuth": "認証状態を確認しています...",
"loggedInAs": "{{email}}でログイン中",
"authenticatedUser": "認証済みユーザー"
},
"account": {
"claude": {
"description": "Anthropic Claude AIアシスタント"
},
"cursor": {
"description": "Cursor AI搭載コードエディタ"
},
"codex": {
"description": "OpenAI Codex AIアシスタント"
}
},
"connectionStatus": "接続状態",
"login": {
"title": "ログイン",
"reAuthenticate": "再認証",
"description": "{{agent}}アカウントにサインインしてAI機能を有効にします",
"reAuthDescription": "別のアカウントでサインインするか、認証情報を更新します",
"button": "ログイン",
"reLoginButton": "再ログイン"
},
"error": "エラー: {{error}}"
},
"permissions": {
"title": "権限設定",
"skipPermissions": {
"label": "権限プロンプトをスキップ(注意して使用)",
"claudeDescription": "--dangerously-skip-permissions フラグに相当",
"cursorDescription": "Cursor CLIの -f フラグに相当"
},
"allowedTools": {
"title": "許可されたツール",
"description": "権限の確認なしに自動的に許可されるツール",
"placeholder": "例: \"Bash(git log:*)\" または \"Write\"",
"quickAdd": "よく使うツールを追加:",
"empty": "許可されたツールはありません"
},
"blockedTools": {
"title": "ブロックされたツール",
"description": "権限の確認なしに自動的にブロックされるツール",
"placeholder": "例: \"Bash(rm:*)\"",
"empty": "ブロックされたツールはありません"
},
"allowedCommands": {
"title": "許可されたシェルコマンド",
"description": "権限の確認なしに自動的に許可されるシェルコマンド",
"placeholder": "例: \"Shell(ls)\" または \"Shell(git status)\"",
"quickAdd": "よく使うコマンドを追加:",
"empty": "許可されたコマンドはありません"
},
"blockedCommands": {
"title": "ブロックされたシェルコマンド",
"description": "自動的にブロックされるシェルコマンド",
"placeholder": "例: \"Shell(rm -rf)\" または \"Shell(sudo)\"",
"empty": "ブロックされたコマンドはありません"
},
"toolExamples": {
"title": "ツールパターンの例:",
"bashGitLog": "- すべてのgit logコマンドを許可",
"bashGitDiff": "- すべてのgit diffコマンドを許可",
"write": "- すべてのWriteツールの使用を許可",
"bashRm": "- すべてのrmコマンドをブロック危険"
},
"shellExamples": {
"title": "シェルコマンドの例:",
"ls": "- lsコマンドを許可",
"gitStatus": "- git statusを許可",
"npmInstall": "- npm installを許可",
"rmRf": "- 再帰的削除をブロック"
},
"codex": {
"permissionMode": "権限モード",
"description": "Codexがファイルの変更やコマンドの実行を処理する方法を制御します",
"modes": {
"default": {
"title": "デフォルト",
"description": "信頼されたコマンドls、cat、grep、git statusなどのみ自動実行。その他のコマンドはスキップ。ワークスペースへの書き込みは可能。"
},
"acceptEdits": {
"title": "編集を許可",
"description": "ワークスペース内ですべてのコマンドを自動実行。サンドボックス環境での完全自動モード。"
},
"bypassPermissions": {
"title": "権限をバイパス",
"description": "制限なしの完全なシステムアクセス。すべてのコマンドがディスクとネットワークへの完全なアクセスで自動実行されます。注意して使用してください。"
}
},
"technicalDetails": "技術的な詳細",
"technicalInfo": {
"default": "sandboxMode=workspace-write, approvalPolicy=untrusted。信頼されたコマンド: cat, cd, grep, head, ls, pwd, tail, git status/log/diff/show, find-execなしなど。",
"acceptEdits": "sandboxMode=workspace-write, approvalPolicy=never。すべてのコマンドがプロジェクトディレクトリ内で自動実行。",
"bypassPermissions": "sandboxMode=danger-full-access, approvalPolicy=never。完全なシステムアクセス。信頼された環境でのみ使用してください。",
"overrideNote": "チャットインターフェースのモードボタンを使用してセッションごとに上書きできます。"
}
},
"actions": {
"add": "追加"
}
},
"mcpServers": {
"title": "MCPサーバー",
"description": {
"claude": "Model Context Protocolサーバーは、Claudeに追加のツールやデータソースを提供します",
"cursor": "Model Context Protocolサーバーは、Cursorに追加のツールやデータソースを提供します",
"codex": "Model Context Protocolサーバーは、Codexに追加のツールやデータソースを提供します"
},
"addButton": "MCPサーバーを追加",
"empty": "MCPサーバーは設定されていません",
"serverType": "種類",
"scope": {
"local": "ローカル",
"user": "ユーザー"
},
"config": {
"command": "コマンド",
"url": "URL",
"args": "引数",
"environment": "環境変数"
},
"tools": {
"title": "ツール",
"count": "{{count}}:",
"more": "他{{count}}件"
},
"actions": {
"edit": "サーバーを編集",
"delete": "サーバーを削除"
},
"help": {
"title": "Codex MCPについて",
"description": "Codexはstdioベースのツールサーバーをサポートしています。追加のツールやリソースでCodexの機能を拡張するサーバーを追加できます。"
}
}
}

View File

@@ -0,0 +1,111 @@
{
"projects": {
"title": "プロジェクト",
"newProject": "新規プロジェクト",
"deleteProject": "プロジェクトを削除",
"renameProject": "プロジェクト名を変更",
"noProjects": "プロジェクトが見つかりません",
"loadingProjects": "プロジェクトを読み込んでいます...",
"searchPlaceholder": "プロジェクトを検索...",
"projectNamePlaceholder": "プロジェクト名",
"starred": "お気に入り",
"all": "すべて",
"untitledSession": "無題のセッション",
"newSession": "新しいセッション",
"codexSession": "Codexセッション",
"fetchingProjects": "Claudeのプロジェクトとセッションを取得しています",
"projects": "プロジェクト",
"noMatchingProjects": "一致するプロジェクトがありません",
"tryDifferentSearch": "検索語を変えてお試しください",
"runClaudeCli": "プロジェクトディレクトリでClaude CLIを実行して始めましょう"
},
"app": {
"title": "Claude Code UI",
"subtitle": "AIコーディングアシスタント"
},
"sessions": {
"title": "セッション",
"newSession": "新しいセッション",
"deleteSession": "セッションを削除",
"renameSession": "セッション名を変更",
"noSessions": "セッションはまだありません",
"loadingSessions": "セッションを読み込んでいます...",
"unnamed": "名称未設定",
"loading": "読み込み中...",
"showMore": "さらにセッションを表示"
},
"tooltips": {
"viewEnvironments": "環境を表示",
"hideSidebar": "サイドバーを隠す",
"createProject": "新しいプロジェクトを作成",
"refresh": "プロジェクトとセッションを更新 (Ctrl+R)",
"renameProject": "プロジェクト名を変更 (F2)",
"deleteProject": "空のプロジェクトを削除 (Delete)",
"addToFavorites": "お気に入りに追加",
"removeFromFavorites": "お気に入りから削除",
"editSessionName": "セッション名を手動で編集",
"deleteSession": "このセッションを完全に削除",
"save": "保存",
"cancel": "キャンセル"
},
"navigation": {
"chat": "チャット",
"files": "ファイル",
"git": "Git",
"terminal": "ターミナル",
"tasks": "タスク"
},
"actions": {
"refresh": "更新",
"settings": "設定",
"collapseAll": "すべて折りたたむ",
"expandAll": "すべて展開",
"cancel": "キャンセル",
"save": "保存",
"delete": "削除",
"rename": "名前の変更"
},
"status": {
"active": "アクティブ",
"inactive": "非アクティブ",
"thinking": "思考中...",
"error": "エラー",
"aborted": "中断",
"unknown": "不明"
},
"time": {
"justNow": "たった今",
"oneMinuteAgo": "1分前",
"minutesAgo": "{{count}}分前",
"oneHourAgo": "1時間前",
"hoursAgo": "{{count}}時間前",
"oneDayAgo": "1日前",
"daysAgo": "{{count}}日前"
},
"messages": {
"deleteConfirm": "本当に削除しますか?",
"renameSuccess": "名前を変更しました",
"deleteSuccess": "削除しました",
"errorOccurred": "エラーが発生しました",
"deleteSessionConfirm": "このセッションを削除してもよろしいですか?この操作は取り消せません。",
"deleteProjectConfirm": "この空のプロジェクトを削除してもよろしいですか?この操作は取り消せません。",
"enterProjectPath": "プロジェクトのパスを入力してください",
"deleteSessionFailed": "セッションの削除に失敗しました。もう一度お試しください。",
"deleteSessionError": "セッションの削除でエラーが発生しました。もう一度お試しください。",
"deleteProjectFailed": "プロジェクトの削除に失敗しました。もう一度お試しください。",
"deleteProjectError": "プロジェクトの削除でエラーが発生しました。もう一度お試しください。",
"createProjectFailed": "プロジェクトの作成に失敗しました。もう一度お試しください。",
"createProjectError": "プロジェクトの作成でエラーが発生しました。もう一度お試しください。"
},
"version": {
"updateAvailable": "アップデートあり"
},
"deleteConfirmation": {
"deleteProject": "プロジェクトを削除",
"deleteSession": "セッションを削除",
"confirmDelete": "本当に削除しますか?",
"sessionCount": "このプロジェクトには{{count}}件の会話があります。",
"allConversationsDeleted": "すべての会話が完全に削除されます。",
"cannotUndo": "この操作は取り消せません。"
}
}

View File

@@ -0,0 +1,142 @@
{
"notConfigured": {
"title": "TaskMaster AIが設定されていません",
"description": "TaskMasterは、AIを活用した支援により、複雑なプロジェクトを管理しやすいタスクに分解するのに役立ちます",
"whatIsTitle": "🎯 TaskMasterとは",
"features": {
"aiPowered": "AIを活用したタスク管理複雑なプロジェクトを管理しやすいサブタスクに分解",
"prdTemplates": "PRDテンプレートProduct Requirements Documentからタスクを生成",
"dependencyTracking": "依存関係の追跡:タスクの関係性と実行順序を理解",
"progressVisualization": "進捗の可視化:カンバンボードと詳細なタスク分析",
"cliIntegration": "CLI統合高度なワークフローのためにtaskmasterコマンドを使用"
},
"initializeButton": "TaskMaster AIを初期化"
},
"gettingStarted": {
"title": "TaskMasterを始める",
"subtitle": "TaskMasterが初期化されました次にすることは:",
"steps": {
"createPRD": {
"title": "Product Requirements Document (PRD) を作成",
"description": "プロジェクトのアイデアについて話し合い、構築したい内容を説明するPRDを作成します。",
"addButton": "PRDを追加",
"existingPRDs": "既存のPRD:"
},
"generateTasks": {
"title": "PRDからタスクを生成",
"description": "PRDができたら、AIアシスタントに解析を依頼してください。TaskMasterが自動的に実装の詳細を含む管理しやすいタスクに分解します。"
},
"analyzeTasks": {
"title": "タスクの分析と展開",
"description": "AIアシスタントにタスクの複雑さを分析してもらい、より簡単に実装できる詳細なサブタスクに展開します。"
},
"startBuilding": {
"title": "開発を始める",
"description": "AIアシスタントにタスクの作業を開始してもらい、ステータスを更新し、プロジェクトの進行に応じて新しいタスクを追加します。"
}
},
"tip": "💡 ヒントTaskMasterのAIを活用したタスク生成を最大限に活用するには、PRDから始めましょう"
},
"setupModal": {
"title": "TaskMasterのセットアップ",
"subtitle": "{{projectName}}のインタラクティブCLI",
"willStart": "TaskMasterの初期化が自動的に開始されます",
"completed": "TaskMasterのセットアップが完了しましたこのウィンドウを閉じることができます。",
"closeButton": "閉じる",
"closeContinueButton": "閉じて続ける"
},
"helpGuide": {
"title": "TaskMasterを始める",
"subtitle": "生産的なタスク管理のガイド",
"examples": {
"parsePRD": "💬 例:\n「Claude Task Masterで新しいプロジェクトを初期化しました。.taskmaster/docs/prd.txtにPRDがあります。解析して初期タスクを設定するのを手伝ってもらえますか」",
"expandTask": "💬 例:\n「タスク5は複雑そうです。サブタスクに分解してもらえますか」",
"addTask": "💬 例:\n「Cloudinaryを使用してユーザープロフィール画像のアップロードを実装する新しいタスクを追加してください。最適なアプローチを調査してください。」"
},
"moreExamples": "さらなる例と使用パターンを見る →",
"proTips": {
"title": "💡 プロのヒント",
"search": "検索バーを使用して特定のタスクをすばやく見つける",
"views": "ビュー切替を使用してカンバン、リスト、グリッドビューを切り替える",
"filters": "フィルターを使用して特定のタスクステータスや優先度に焦点を当てる",
"details": "任意のタスクをクリックして詳細情報を表示し、サブタスクを管理する"
},
"learnMore": {
"title": "📚 詳細を見る",
"description": "TaskMaster AIは開発者向けに構築された高度なタスク管理システムです。ドキュメント、例を入手し、プロジェクトに貢献できます。",
"githubButton": "GitHubで見る"
}
},
"search": {
"placeholder": "タスクを検索..."
},
"filters": {
"button": "フィルター",
"status": "ステータス",
"priority": "優先度",
"sortBy": "並び替え",
"allStatuses": "すべてのステータス",
"allPriorities": "すべての優先度",
"showing": "{{filtered}}件のタスクを表示中(全{{total}}件)",
"clearFilters": "フィルターをクリア"
},
"sort": {
"id": "ID",
"status": "ステータス",
"priority": "優先度",
"idAsc": "ID昇順",
"idDesc": "ID降順",
"titleAsc": "タイトルA-Z",
"titleDesc": "タイトルZ-A",
"statusAsc": "ステータス(保留中が先)",
"statusDesc": "ステータス(完了が先)",
"priorityAsc": "優先度(高が先)",
"priorityDesc": "優先度(低が先)"
},
"views": {
"kanban": "カンバンビュー",
"list": "リストビュー",
"grid": "グリッドビュー"
},
"kanban": {
"pending": "📋 やること",
"inProgress": "🚀 進行中",
"done": "✅ 完了",
"blocked": "🚫 ブロック中",
"deferred": "⏳ 延期",
"cancelled": "❌ キャンセル",
"noTasksYet": "まだタスクはありません",
"tasksWillAppear": "タスクはここに表示されます",
"moveTasksHere": "開始したらタスクをここに移動",
"completedTasksHere": "完了したタスクはここに表示されます",
"statusTasksHere": "このステータスのタスクはここに表示されます"
},
"buttons": {
"help": "TaskMaster入門ガイド",
"prds": "PRD",
"addPRD": "PRDを追加",
"addTask": "タスクを追加",
"createNewPRD": "新しいPRDを作成",
"prdsAvailable": "{{count}}件のPRDがあります"
},
"prd": {
"modified": "更新日: {{date}}"
},
"statuses": {
"pending": "保留中",
"in-progress": "進行中",
"done": "完了",
"blocked": "ブロック中",
"deferred": "延期",
"cancelled": "キャンセル"
},
"priorities": {
"high": "高",
"medium": "中",
"low": "低"
},
"noMatchingTasks": {
"title": "フィルターに一致するタスクがありません",
"description": "検索条件またはフィルター基準を調整してみてください。"
}
}