diff --git a/keep-notes/app/(auth)/reset-password/page.tsx b/keep-notes/app/(auth)/reset-password/page.tsx index cb838fe..fa7102a 100644 --- a/keep-notes/app/(auth)/reset-password/page.tsx +++ b/keep-notes/app/(auth)/reset-password/page.tsx @@ -8,10 +8,12 @@ import { resetPassword } from '@/app/actions/auth-reset' import { toast } from 'sonner' import { useSearchParams, useRouter } from 'next/navigation' import Link from 'next/link' +import { useLanguage } from '@/lib/i18n' function ResetPasswordForm() { const searchParams = useSearchParams() const router = useRouter() + const { t } = useLanguage() const [isSubmitting, setIsSubmitting] = useState(false) const token = searchParams.get('token') @@ -25,7 +27,7 @@ function ResetPasswordForm() { const confirm = formData.get('confirmPassword') as string if (password !== confirm) { - toast.error("Passwords don't match") + toast.error(t('resetPassword.passwordMismatch')) return } @@ -36,7 +38,7 @@ function ResetPasswordForm() { if (result.error) { toast.error(result.error) } else { - toast.success('Password reset successfully. You can now login.') + toast.success(t('resetPassword.success')) router.push('/login') } } @@ -45,12 +47,12 @@ function ResetPasswordForm() { return ( - Invalid Link - This password reset link is invalid or has expired. + {t('resetPassword.invalidLinkTitle')} + {t('resetPassword.invalidLinkDescription')} - + @@ -60,23 +62,23 @@ function ResetPasswordForm() { return ( - Reset Password - Enter your new password below. + {t('resetPassword.title')} + {t('resetPassword.description')}
- +
- +
@@ -85,9 +87,10 @@ function ResetPasswordForm() { } export default function ResetPasswordPage() { + const { t } = useLanguage() return (
- Loading...}> + {t('resetPassword.loading')}}>
diff --git a/keep-notes/app/(main)/admin/ai-test/ai-tester.tsx b/keep-notes/app/(main)/admin/ai-test/ai-tester.tsx index 9f78917..d78c132 100644 --- a/keep-notes/app/(main)/admin/ai-test/ai-tester.tsx +++ b/keep-notes/app/(main)/admin/ai-test/ai-tester.tsx @@ -6,6 +6,7 @@ import { Badge } from '@/components/ui/badge' import { useState, useEffect } from 'react' import { toast } from 'sonner' import { Loader2, CheckCircle2, XCircle, Clock, Zap, Info } from 'lucide-react' +import { useLanguage } from '@/lib/i18n' interface TestResult { success: boolean @@ -20,6 +21,7 @@ interface TestResult { } export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) { + const { t } = useLanguage() const [isLoading, setIsLoading] = useState(false) const [result, setResult] = useState(null) const [config, setConfig] = useState(null) @@ -34,7 +36,6 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) { const data = await response.json() setConfig(data) - // Set previous result if available if (data.previousTest) { setResult(data.previousTest[type] || null) } @@ -84,7 +85,7 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) { responseTime: endTime - startTime } setResult(errorResult) - toast.error(`❌ Test Error: ${error.message}`) + toast.error(t('admin.aiTest.testError', { error: error.message })) } finally { setIsLoading(false) } @@ -113,13 +114,13 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) { {/* Provider Info */}
- Provider: + {t('admin.aiTest.provider')} {providerInfo.provider.toUpperCase()}
- Model: + {t('admin.aiTest.model')} {providerInfo.model} @@ -136,12 +137,12 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) { {isLoading ? ( <> - Testing... + {t('admin.aiTest.testing')} ) : ( <> - Run Test + {t('admin.aiTest.runTest')} )} @@ -155,12 +156,12 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) { {result.success ? ( <> - Test Passed + {t('admin.aiTest.testPassed')} ) : ( <> - Test Failed + {t('admin.aiTest.testFailed')} )}
@@ -169,7 +170,7 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) { {result.responseTime && (
- Response time: {result.responseTime}ms + {t('admin.aiTest.responseTime', { time: result.responseTime })}
)} @@ -178,7 +179,7 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) {
- Generated Tags: + {t('admin.aiTest.generatedTags')}
{result.tags.map((tag, idx) => ( @@ -202,19 +203,19 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) {
- Embedding Dimensions: + {t('admin.aiTest.embeddingDimensions')}
{result.embeddingLength}
- vector dimensions + {t('admin.aiTest.vectorDimensions')}
{result.firstValues && result.firstValues.length > 0 && (
- First 5 values: + {t('admin.aiTest.first5Values')}
[{result.firstValues.slice(0, 5).map((v, i) => v.toFixed(4)).join(', ')}]
@@ -226,7 +227,7 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) { {/* Error Details */} {!result.success && result.error && (
-

Error:

+

{t('admin.aiTest.error')}

{result.error}

{result.details && (
@@ -249,7 +250,7 @@ export function AI_TESTER({ type }: { type: 'tags' | 'embeddings' }) {

- Testing {type === 'tags' ? 'tags generation' : 'embeddings'}... + {t('admin.aiTest.testing')} {type === 'tags' ? 'tags generation' : 'embeddings'}...

)} diff --git a/keep-notes/app/(main)/admin/ai/page.tsx b/keep-notes/app/(main)/admin/ai/page.tsx index 9746fa7..6d4b6a8 100644 --- a/keep-notes/app/(main)/admin/ai/page.tsx +++ b/keep-notes/app/(main)/admin/ai/page.tsx @@ -1,26 +1,48 @@ import { AdminMetrics } from '@/components/admin-metrics' import { Button } from '@/components/ui/button' import { Zap, Settings, Activity, TrendingUp } from 'lucide-react' +import Link from 'next/link' +import { getSystemConfig } from '@/lib/config' export default async function AdminAIPage() { + const config = await getSystemConfig() + + // Determine provider status based on config + const openaiKey = config.OPENAI_API_KEY + const ollamaUrl = config.OLLAMA_BASE_URL || config.OLLAMA_BASE_URL_TAGS || config.OLLAMA_BASE_URL_EMBEDDING + + const providers = [ + { + name: 'OpenAI', + status: openaiKey ? 'Connected' : 'Not Configured', + requests: 'N/A' // We don't track request counts yet + }, + { + name: 'Ollama', + status: ollamaUrl ? 'Available' : 'Not Configured', + requests: 'N/A' + }, + ] + // Mock AI metrics - in a real app, these would come from analytics + // TODO: Implement real analytics tracking const aiMetrics = [ { title: 'Total Requests', - value: '856', - trend: { value: 12, isPositive: true }, + value: '—', + trend: { value: 0, isPositive: true }, icon: , }, { title: 'Success Rate', - value: '98.5%', - trend: { value: 2, isPositive: true }, + value: '100%', + trend: { value: 0, isPositive: true }, icon: , }, { title: 'Avg Response Time', - value: '1.2s', - trend: { value: 5, isPositive: true }, + value: '—', + trend: { value: 0, isPositive: true }, icon: , }, { @@ -41,10 +63,12 @@ export default async function AdminAIPage() { Monitor and configure AI features

- + + +
@@ -83,10 +107,7 @@ export default async function AdminAIPage() { AI Provider Status
- {[ - { name: 'OpenAI', status: 'Connected', requests: '642' }, - { name: 'Ollama', status: 'Available', requests: '214' }, - ].map((provider) => ( + {providers.map((provider) => (
{provider.status} @@ -119,7 +139,7 @@ export default async function AdminAIPage() { Recent AI Requests

- Recent AI requests will be displayed here. + Recent AI requests will be displayed here. (Coming Soon)

diff --git a/keep-notes/app/(main)/admin/create-user-dialog.tsx b/keep-notes/app/(main)/admin/create-user-dialog.tsx index 028ca72..cf8d55b 100644 --- a/keep-notes/app/(main)/admin/create-user-dialog.tsx +++ b/keep-notes/app/(main)/admin/create-user-dialog.tsx @@ -15,50 +15,52 @@ import { Input } from '@/components/ui/input' import { Plus } from 'lucide-react' import { createUser } from '@/app/actions/admin' import { toast } from 'sonner' +import { useLanguage } from '@/lib/i18n' export function CreateUserDialog() { const [open, setOpen] = useState(false) + const { t } = useLanguage() return ( - Create User + {t('admin.users.createUser')} - Add a new user to the system. They will need to change their password upon first login if you implement that policy. + {t('admin.users.createUserDescription')}
{ const result = await createUser(formData) if (result?.error) { - toast.error('Failed to create user') + toast.error(t('admin.users.createFailed')) } else { - toast.success('User created successfully') + toast.success(t('admin.users.createSuccess')) setOpen(false) } }} className="grid gap-4 py-4" >
- +
- +
- +
- + } onChange={(e) => setTagsProvider(e.target.value as AIProvider)} className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2" > - - - + + +
- {/* Ollama Tags Config */} {tagsProvider === 'ollama' && (
- - + +
+ + +
- + -

Select an Ollama model installed on your system

+

+ {isLoadingTagsModels ? 'Fetching models...' : t('admin.ai.selectOllamaModel')} +

)} - {/* OpenAI Tags Config */} {tagsProvider === 'openai' && (
- + -

Your OpenAI API key from platform.openai.com

+

{t('admin.ai.openAIKeyDescription')}

- + -

gpt-4o-mini = Best value • gpt-4o = Best quality

+

gpt-4o-mini = {t('admin.ai.bestValue')} • gpt-4o = {t('admin.ai.bestQuality')}

)} - {/* Custom OpenAI Tags Config */} {tagsProvider === 'custom' && (
- +
- +
- + -

Common models for OpenAI-compatible APIs

+

{t('admin.ai.commonModelsDescription')}

)}
- {/* Embeddings Section */}

- 🔍 Embeddings Provider + 🔍 {t('admin.ai.embeddingsProvider')}

-

AI provider for semantic search embeddings. Recommended: OpenAI (best quality).

+

{t('admin.ai.embeddingsDescription')}

- {/* Ollama Embeddings Config */} {embeddingsProvider === 'ollama' && (
- - + +
+ + +
- + -

Select an embedding model installed on your system

+

+ {isLoadingEmbeddingsModels ? 'Fetching models...' : t('admin.ai.selectEmbeddingModel')} +

)} - {/* OpenAI Embeddings Config */} {embeddingsProvider === 'openai' && (
- + -

Your OpenAI API key from platform.openai.com

+

{t('admin.ai.openAIKeyDescription')}

- + -

text-embedding-3-small = Best value • text-embedding-3-large = Best quality

+

text-embedding-3-small = {t('admin.ai.bestValue')} • text-embedding-3-large = {t('admin.ai.bestQuality')}

)} - {/* Custom OpenAI Embeddings Config */} {embeddingsProvider === 'custom' && (
- +
- +
- + -

Common embedding models for OpenAI-compatible APIs

+

{t('admin.ai.commonEmbeddingModels')}

)}
- + @@ -435,34 +546,34 @@ export function AdminSettingsForm({ config }: { config: Record } - SMTP Configuration - Configure email server for password resets. + {t('admin.smtp.title')} + {t('admin.smtp.description')}
- +
- +
- +
- +
- +
@@ -476,7 +587,7 @@ export function AdminSettingsForm({ config }: { config: Record } htmlFor="SMTP_SECURE" className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" > - Force SSL/TLS (usually for port 465) + {t('admin.smtp.forceSSL')}
@@ -490,14 +601,14 @@ export function AdminSettingsForm({ config }: { config: Record } htmlFor="SMTP_IGNORE_CERT" className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 text-yellow-600" > - Ignore Certificate Errors (Self-hosted/Dev only) + {t('admin.smtp.ignoreCertErrors')}
- + diff --git a/keep-notes/app/(main)/admin/user-list.tsx b/keep-notes/app/(main)/admin/user-list.tsx index c297f07..da08669 100644 --- a/keep-notes/app/(main)/admin/user-list.tsx +++ b/keep-notes/app/(main)/admin/user-list.tsx @@ -6,17 +6,18 @@ import { deleteUser, updateUserRole } from '@/app/actions/admin' import { toast } from 'sonner' import { Trash2, Shield, ShieldOff } from 'lucide-react' import { format } from 'date-fns' +import { useLanguage } from '@/lib/i18n' export function UserList({ initialUsers }: { initialUsers: any[] }) { - - // Optimistic update could be implemented here, but standard is fine for admin + const { t } = useLanguage() + const handleDelete = async (id: string) => { - if (!confirm('Are you sure? This action cannot be undone.')) return + if (!confirm(t('admin.users.confirmDelete'))) return try { await deleteUser(id) - toast.success('User deleted') + toast.success(t('admin.users.deleteSuccess')) } catch (e) { - toast.error('Failed to delete') + toast.error(t('admin.users.deleteFailed')) } } @@ -24,9 +25,9 @@ export function UserList({ initialUsers }: { initialUsers: any[] }) { const newRole = user.role === 'ADMIN' ? 'USER' : 'ADMIN' try { await updateUserRole(user.id, newRole) - toast.success(`User role updated to ${newRole}`) + toast.success(t('admin.users.roleUpdateSuccess', { role: newRole })) } catch (e) { - toast.error('Failed to update role') + toast.error(t('admin.users.roleUpdateFailed')) } } @@ -35,21 +36,21 @@ export function UserList({ initialUsers }: { initialUsers: any[] }) { - - - - - + + + + + {initialUsers.map((user) => ( - + @@ -59,7 +60,7 @@ export function UserList({ initialUsers }: { initialUsers: any[] }) { variant="ghost" size="sm" onClick={() => handleRoleToggle(user)} - title={user.role === 'ADMIN' ? "Demote to User" : "Promote to Admin"} + title={user.role === 'ADMIN' ? t('admin.users.demote') : t('admin.users.promote')} > {user.role === 'ADMIN' ? : } diff --git a/keep-notes/app/(main)/page.tsx b/keep-notes/app/(main)/page.tsx index c295765..2aa5e5b 100644 --- a/keep-notes/app/(main)/page.tsx +++ b/keep-notes/app/(main)/page.tsx @@ -24,11 +24,13 @@ import { useNotebooks } from '@/context/notebooks-context' import { Folder, Briefcase, FileText, Zap, BarChart3, Globe, Sparkles, Book, Heart, Crown, Music, Building2, Plane, ChevronRight, Plus } from 'lucide-react' import { cn } from '@/lib/utils' import { LabelFilter } from '@/components/label-filter' +import { useLanguage } from '@/lib/i18n' export default function HomePage() { const searchParams = useSearchParams() const router = useRouter() + const { t } = useLanguage() // Force re-render when search params change (for filtering) const [notes, setNotes] = useState([]) const [pinnedNotes, setPinnedNotes] = useState([]) @@ -260,7 +262,7 @@ export default function HomePage() { // Helper for Breadcrumbs const Breadcrumbs = ({ notebookName }: { notebookName: string }) => (
- Notebooks + {t('nav.notebooks')} {notebookName}
@@ -325,7 +327,7 @@ export default function HomePage() {
-

Notes

+

{t('notes.title')}

{/* Actions Section */} @@ -342,15 +344,15 @@ export default function HomePage() { /> {/* AI Organization Button - Moved to Header */} - {isInbox && !isLoading && notes.length >= 5 && ( + {isInbox && !isLoading && notes.length >= 2 && ( )} @@ -359,7 +361,7 @@ export default function HomePage() { className="h-10 px-6 rounded-full bg-primary hover:bg-primary/90 text-primary-foreground font-medium shadow-sm gap-2 transition-all" > - Add Note + {t('notes.newNote')} @@ -378,7 +380,7 @@ export default function HomePage() { )} {isLoading ? ( -
Loading...
+
{t('general.loading')}
) : ( <> {/* Favorites Section - Pinned Notes */} @@ -408,7 +410,7 @@ export default function HomePage() { {/* Empty state when no notes */} {notes.filter(note => !note.isPinned).length === 0 && pinnedNotes.length === 0 && (
- No notes yet. Create your first note! + {t('notes.emptyState')}
)} diff --git a/keep-notes/app/(main)/settings/about/page.tsx b/keep-notes/app/(main)/settings/about/page.tsx index 63871fe..05f851c 100644 --- a/keep-notes/app/(main)/settings/about/page.tsx +++ b/keep-notes/app/(main)/settings/about/page.tsx @@ -1,127 +1,129 @@ 'use client' -import { SettingsNav, SettingsSection } from '@/components/settings' +import { SettingsSection } from '@/components/settings' import { Card, CardContent } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' +import { useLanguage } from '@/lib/i18n' export default function AboutSettingsPage() { + const { t } = useLanguage() const version = '1.0.0' const buildDate = '2026-01-17' return (
-

About

+

{t('about.title')}

- Information about the application + {t('about.description')}

📝} - description="A powerful note-taking application with AI-powered features" + description={t('about.appDescription')} >
- Version + {t('about.version')} {version}
- Build Date + {t('about.buildDate')} {buildDate}
- Platform - Web + {t('about.platform')} + {t('about.platformWeb')}
✨} - description="AI-powered capabilities" + description={t('about.features.description')} >
- AI-powered title suggestions + {t('about.features.titleSuggestions')}
- Semantic search with embeddings + {t('about.features.semanticSearch')}
- Paragraph reformulation + {t('about.features.paragraphReformulation')}
- Memory Echo daily insights + {t('about.features.memoryEcho')}
- Notebook organization + {t('about.features.notebookOrganization')}
- Drag & drop note management + {t('about.features.dragDrop')}
- Label system + {t('about.features.labelSystem')}
- Multiple AI providers (OpenAI, Ollama) + {t('about.features.multipleProviders')}
⚙️} - description="Built with modern technologies" + description={t('about.technology.description')} > -
Frontend: Next.js 16, React 19, TypeScript
-
Backend: Next.js API Routes, Server Actions
-
Database: SQLite (Prisma ORM)
-
Authentication: NextAuth 5
-
AI: Vercel AI SDK, OpenAI, Ollama
-
UI: Radix UI, Tailwind CSS, Lucide Icons
-
Testing: Playwright (E2E)
+
{t('about.technology.frontend')}: Next.js 16, React 19, TypeScript
+
{t('about.technology.backend')}: Next.js API Routes, Server Actions
+
{t('about.technology.database')}: SQLite (Prisma ORM)
+
{t('about.technology.authentication')}: NextAuth 5
+
{t('about.technology.ai')}: Vercel AI SDK, OpenAI, Ollama
+
{t('about.technology.ui')}: Radix UI, Tailwind CSS, Lucide Icons
+
{t('about.technology.testing')}: Playwright (E2E)
💬} - description="Get help and feedback" + description={t('about.support.description')} >
-

Documentation

+

{t('about.support.documentation')}

Check the documentation for detailed guides and tutorials.

-

Report Issues

+

{t('about.support.reportIssues')}

Found a bug? Report it in the issue tracker.

-

Feedback

+

{t('about.support.feedback')}

We value your feedback! Share your thoughts and suggestions.

diff --git a/keep-notes/app/(main)/settings/ai/page-new.tsx b/keep-notes/app/(main)/settings/ai/page-new.tsx index a75db71..e44276b 100644 --- a/keep-notes/app/(main)/settings/ai/page-new.tsx +++ b/keep-notes/app/(main)/settings/ai/page-new.tsx @@ -27,36 +27,33 @@ export default function AISettingsPage() { try { await updateAISettings({ [feature]: value }) } catch (error) { - console.error('Error updating setting:', error) - toast.error('Failed to save setting') + toast.error(t('aiSettings.error')) setSettings(settings) // Revert on error } } - const handleFrequencyChange = async (value: 'daily' | 'weekly' | 'custom') => { - setSettings(prev => ({ ...prev, memoryEchoFrequency: value })) + const handleFrequencyChange = async (value: string) => { + setSettings(prev => ({ ...prev, memoryEchoFrequency: value as any })) try { - await updateAISettings({ memoryEchoFrequency: value }) + await updateAISettings({ memoryEchoFrequency: value as any }) } catch (error) { - console.error('Error updating frequency:', error) - toast.error('Failed to save setting') + toast.error(t('aiSettings.error')) } } - const handleProviderChange = async (value: 'auto' | 'openai' | 'ollama') => { - setSettings(prev => ({ ...prev, aiProvider: value })) + const handleProviderChange = async (value: string) => { + setSettings(prev => ({ ...prev, aiProvider: value as any })) try { - await updateAISettings({ aiProvider: value }) + await updateAISettings({ aiProvider: value as any }) } catch (error) { - console.error('Error updating provider:', error) - toast.error('Failed to save setting') + toast.error(t('aiSettings.error')) } } const handleApiKeyChange = async (value: string) => { setApiKey(value) // TODO: Implement API key persistence - console.log('API Key:', value) + } return ( @@ -70,37 +67,37 @@ export default function AISettingsPage() { {/* Main Content */}
-

AI Settings

+

{t('aiSettings.title')}

- Configure AI-powered features and preferences + {t('aiSettings.description')}

{/* AI Provider */} 🤖} - description="Choose your preferred AI service provider" + description={t('aiSettings.providerDesc')} > ✨} - description="Enable or disable AI-powered features" + description={t('aiSettings.description')} > handleToggle('titleSuggestions', checked)} /> handleToggle('semanticSearch', checked)} /> handleToggle('paragraphRefactor', checked)} /> handleToggle('memoryEcho', checked)} /> {settings.memoryEcho && ( 🎭} - description="Test AI features without using real AI calls" + description={t('demoMode.description')} > handleToggle('demoMode', checked)} /> diff --git a/keep-notes/app/(main)/settings/appearance/appearance-form.tsx b/keep-notes/app/(main)/settings/appearance/appearance-form.tsx index ffcd809..3036514 100644 --- a/keep-notes/app/(main)/settings/appearance/appearance-form.tsx +++ b/keep-notes/app/(main)/settings/appearance/appearance-form.tsx @@ -3,9 +3,9 @@ import { useRouter } from 'next/navigation' import { useState } from 'react' import { SettingsSection, SettingSelect } from '@/components/settings' -// Import actions directly import { updateAISettings as updateAI } from '@/app/actions/ai-settings' import { updateUserSettings as updateUser } from '@/app/actions/user-settings' +import { useLanguage } from '@/lib/i18n' interface AppearanceSettingsFormProps { initialTheme: string @@ -16,6 +16,7 @@ export function AppearanceSettingsForm({ initialTheme, initialFontSize }: Appear const router = useRouter() const [theme, setTheme] = useState(initialTheme) const [fontSize, setFontSize] = useState(initialFontSize) + const { t } = useLanguage() const handleThemeChange = async (value: string) => { setTheme(value) @@ -57,46 +58,46 @@ export function AppearanceSettingsForm({ initialTheme, initialFontSize }: Appear return (
-

Appearance

+

{t('appearance.title')}

- Customize look and feel of application + {t('appearance.description')}

🎨} - description="Choose your preferred color scheme" + description={t('settings.themeLight') + ' / ' + t('settings.themeDark')} > 📝} - description="Adjust text size for better readability" + description={t('profile.fontSizeDescription')} > diff --git a/keep-notes/app/(main)/settings/appearance/page.tsx b/keep-notes/app/(main)/settings/appearance/page.tsx index 0718271..ce355d8 100644 --- a/keep-notes/app/(main)/settings/appearance/page.tsx +++ b/keep-notes/app/(main)/settings/appearance/page.tsx @@ -4,8 +4,10 @@ import { useState, useEffect } from 'react' import { SettingsNav, SettingsSection, SettingSelect } from '@/components/settings' import { updateAISettings, getAISettings } from '@/app/actions/ai-settings' import { updateUserSettings, getUserSettings } from '@/app/actions/user-settings' +import { useLanguage } from '@/lib/i18n' export default function AppearanceSettingsPage() { + const { t } = useLanguage() const [theme, setTheme] = useState('auto') const [fontSize, setFontSize] = useState('medium') @@ -63,45 +65,45 @@ export default function AppearanceSettingsPage() { return (
-

Appearance

+

{t('appearance.title')}

- Customize look and feel of application + {t('appearance.description')}

🎨} - description="Choose your preferred color scheme" + description={t('settings.themeLight') + ' / ' + t('settings.themeDark')} > 📝} - description="Adjust text size for better readability" + description={t('profile.fontSizeDescription')} > diff --git a/keep-notes/app/(main)/settings/data/page.tsx b/keep-notes/app/(main)/settings/data/page.tsx index 857a22d..011f4cc 100644 --- a/keep-notes/app/(main)/settings/data/page.tsx +++ b/keep-notes/app/(main)/settings/data/page.tsx @@ -1,16 +1,17 @@ 'use client' import { useState } from 'react' -import { SettingsNav, SettingsSection, SettingToggle, SettingInput } from '@/components/settings' +import { SettingsSection } from '@/components/settings' import { Button } from '@/components/ui/button' -import { Download, Upload, Trash2, Loader2, Check } from 'lucide-react' +import { Download, Upload, Trash2, Loader2 } from 'lucide-react' import { toast } from 'sonner' +import { useLanguage } from '@/lib/i18n' export default function DataSettingsPage() { + const { t } = useLanguage() const [isExporting, setIsExporting] = useState(false) const [isImporting, setIsImporting] = useState(false) const [isDeleting, setIsDeleting] = useState(false) - const [exportUrl, setExportUrl] = useState('') const handleExport = async () => { setIsExporting(true) @@ -26,11 +27,11 @@ export default function DataSettingsPage() { a.click() document.body.removeChild(a) window.URL.revokeObjectURL(url) - toast.success('Notes exported successfully') + toast.success(t('dataManagement.export.success')) } } catch (error) { console.error('Export error:', error) - toast.error('Failed to export notes') + toast.error(t('dataManagement.export.failed')) } finally { setIsExporting(false) } @@ -52,24 +53,22 @@ export default function DataSettingsPage() { if (response.ok) { const result = await response.json() - toast.success(`Imported ${result.count} notes`) - // Refresh the page to show imported notes + toast.success(t('dataManagement.import.success', { count: result.count })) window.location.reload() } else { throw new Error('Import failed') } } catch (error) { console.error('Import error:', error) - toast.error('Failed to import notes') + toast.error(t('dataManagement.import.failed')) } finally { setIsImporting(false) - // Reset input event.target.value = '' } } const handleDeleteAll = async () => { - if (!confirm('Are you sure you want to delete all notes? This action cannot be undone.')) { + if (!confirm(t('dataManagement.delete.confirm'))) { return } @@ -77,12 +76,12 @@ export default function DataSettingsPage() { try { const response = await fetch('/api/notes/delete-all', { method: 'POST' }) if (response.ok) { - toast.success('All notes deleted') + toast.success(t('dataManagement.delete.success')) window.location.reload() } } catch (error) { console.error('Delete error:', error) - toast.error('Failed to delete notes') + toast.error(t('dataManagement.delete.failed')) } finally { setIsDeleting(false) } @@ -91,22 +90,22 @@ export default function DataSettingsPage() { return (
-

Data Management

+

{t('dataManagement.title')}

- Export, import, or manage your data + {t('dataManagement.toolsDescription')}

💾} - description="Download your notes as a JSON file" + description={t('dataManagement.export.description')} >
-

Export All Notes

+

{t('dataManagement.export.title')}

- Download all your notes in JSON format + {t('dataManagement.export.description')}

📥} - description="Import notes from a JSON file" + description={t('dataManagement.import.description')} >
-

Import Notes

+

{t('dataManagement.import.title')}

- Upload a JSON file to import notes + {t('dataManagement.import.description')}

@@ -153,22 +152,22 @@ export default function DataSettingsPage() { ) : ( )} - {isImporting ? 'Importing...' : 'Import'} + {isImporting ? t('dataManagement.importing') : t('dataManagement.import.button')}
⚠️} - description="Permanently delete your data" + description={t('dataManagement.dangerZoneDescription')} >
-

Delete All Notes

+

{t('dataManagement.delete.title')}

- This action cannot be undone + {t('dataManagement.delete.description')}

diff --git a/keep-notes/app/(main)/settings/general/page.tsx b/keep-notes/app/(main)/settings/general/page.tsx index 69028ab..fd01e26 100644 --- a/keep-notes/app/(main)/settings/general/page.tsx +++ b/keep-notes/app/(main)/settings/general/page.tsx @@ -4,9 +4,10 @@ import { useState, useEffect } from 'react' import { SettingsNav, SettingsSection, SettingToggle, SettingSelect } from '@/components/settings' import { useLanguage } from '@/lib/i18n' import { updateAISettings, getAISettings } from '@/app/actions/ai-settings' +import { toast } from 'sonner' export default function GeneralSettingsPage() { - const { t } = useLanguage() + const { t, setLanguage: setContextLanguage } = useLanguage() const [language, setLanguage] = useState('auto') const [emailNotifications, setEmailNotifications] = useState(false) const [desktopNotifications, setDesktopNotifications] = useState(false) @@ -30,7 +31,22 @@ export default function GeneralSettingsPage() { const handleLanguageChange = async (value: string) => { setLanguage(value) + + // 1. Update database settings await updateAISettings({ preferredLanguage: value as any }) + + // 2. Update local storage and application state + if (value === 'auto') { + localStorage.removeItem('user-language') + toast.success("Language set to Auto") + } else { + localStorage.setItem('user-language', value) + setContextLanguage(value as any) + toast.success(t('profile.languageUpdateSuccess') || "Language updated") + } + + // 3. Force reload to ensure all components update (server components, metadata, etc.) + setTimeout(() => window.location.reload(), 500) } const handleEmailNotificationsChange = async (enabled: boolean) => { @@ -51,23 +67,23 @@ export default function GeneralSettingsPage() { return (
-

General Settings

+

{t('generalSettings.title')}

- Configure basic application preferences + {t('generalSettings.description')}

🌍} - description="Choose your preferred language and regional settings" + description={t('profile.languagePreferencesDescription')} > 🔔} - description="Manage how and when you receive notifications" + description={t('settings.notifications')} > 🔒} - description="Control your privacy settings" + description={t('settings.privacy')} > diff --git a/keep-notes/app/(main)/settings/page.tsx b/keep-notes/app/(main)/settings/page.tsx index 44a3754..c628060 100644 --- a/keep-notes/app/(main)/settings/page.tsx +++ b/keep-notes/app/(main)/settings/page.tsx @@ -81,9 +81,9 @@ export default function SettingsPage() {
-

Settings

+

{t('settings.title')}

- Configure your application settings + {t('settings.description')}

@@ -92,18 +92,18 @@ export default function SettingsPage() {
-

AI Settings

+

{t('aiSettings.title')}

- Configure AI features and provider + {t('aiSettings.description')}

-

Profile Settings

+

{t('profile.title')}

- Manage your account and preferences + {t('profile.description')}

@@ -111,17 +111,17 @@ export default function SettingsPage() { {/* AI Diagnostics */} 🔍} - description="Check your AI provider connection status" + description={t('diagnostics.description')} >
-

Configured Provider

+

{t('diagnostics.configuredProvider')}

{config?.provider || '...'}

-

API Status

+

{t('diagnostics.apiStatus')}

{status === 'success' && } {status === 'error' && } @@ -129,9 +129,9 @@ export default function SettingsPage() { status === 'error' ? 'text-red-600 dark:text-red-400' : 'text-gray-600' }`}> - {status === 'success' ? 'Operational' : - status === 'error' ? 'Error' : - 'Checking...'} + {status === 'success' ? t('diagnostics.operational') : + status === 'error' ? t('diagnostics.errorStatus') : + t('diagnostics.checking')}
@@ -139,7 +139,7 @@ export default function SettingsPage() { {result && (
-

Test Details:

+

{t('diagnostics.testDetails')}

-

Troubleshooting Tips:

+

{t('diagnostics.troubleshootingTitle')}

    -
  • Check that Ollama is running (ollama list)
  • -
  • Check URL (http://localhost:11434)
  • -
  • Verify model (e.g., granite4:latest) is downloaded
  • -
  • Check Next.js server terminal for more logs
  • +
  • {t('diagnostics.tip1')}
  • +
  • {t('diagnostics.tip2')}
  • +
  • {t('diagnostics.tip3')}
  • +
  • {t('diagnostics.tip4')}
)} @@ -164,45 +164,45 @@ export default function SettingsPage() {
{/* Maintenance */} 🔧} - description="Tools to maintain your database health" + description={t('settings.maintenanceDescription')} >

- Clean Orphan Tags + {t('settings.cleanTags')}

- Remove tags that are no longer used by any notes + {t('settings.cleanTagsDescription')}

- Semantic Indexing + {t('settings.semanticIndexing')}

- Generate vectors for all notes to enable intent-based search + {t('settings.semanticIndexingDescription')}

diff --git a/keep-notes/app/(main)/settings/profile/page-new.tsx b/keep-notes/app/(main)/settings/profile/page-new.tsx index dd4696a..f81e852 100644 --- a/keep-notes/app/(main)/settings/profile/page-new.tsx +++ b/keep-notes/app/(main)/settings/profile/page-new.tsx @@ -21,13 +21,13 @@ export default function ProfileSettingsPage() { const handleNameChange = async (value: string) => { setUser(prev => ({ ...prev, name: value })) // TODO: Implement profile update - console.log('Name:', value) + } const handleEmailChange = async (value: string) => { setUser(prev => ({ ...prev, email: value })) // TODO: Implement email update - console.log('Email:', value) + } const handleLanguageChange = async (value: string) => { @@ -36,7 +36,7 @@ export default function ProfileSettingsPage() { await updateAISettings({ preferredLanguage: value as any }) } catch (error) { console.error('Error updating language:', error) - toast.error('Failed to save language') + toast.error(t('aiSettings.error')) } } @@ -46,7 +46,7 @@ export default function ProfileSettingsPage() { await updateAISettings({ showRecentNotes: enabled }) } catch (error) { console.error('Error updating recent notes setting:', error) - toast.error('Failed to save setting') + toast.error(t('aiSettings.error')) } } @@ -61,48 +61,48 @@ export default function ProfileSettingsPage() { {/* Main Content */}
-

Profile

+

{t('profile.title')}

- Manage your account and personal information + {t('profile.description')}

{/* Profile Information */} 👤} - description="Update your personal details" + description={t('profile.description')} > {/* Preferences */} ⚙️} - description="Customize your experience" + description={t('profile.languagePreferencesDescription')} > @@ -135,16 +135,16 @@ export default function ProfileSettingsPage() {
-

AI Settings

+

{t('aiSettings.title')}

- Configure AI-powered features, provider selection, and preferences + {t('aiSettings.description')}

diff --git a/keep-notes/app/(main)/settings/profile/profile-form.tsx b/keep-notes/app/(main)/settings/profile/profile-form.tsx index 1b622c6..d96dcb7 100644 --- a/keep-notes/app/(main)/settings/profile/profile-form.tsx +++ b/keep-notes/app/(main)/settings/profile/profile-form.tsx @@ -7,40 +7,16 @@ import { Input } from '@/components/ui/input' import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card' import { Label } from '@/components/ui/label' import { Switch } from '@/components/ui/switch' -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@/components/ui/select' -import { updateProfile, changePassword, updateLanguage, updateFontSize, updateShowRecentNotes } from '@/app/actions/profile' + +import { updateProfile, changePassword, updateFontSize, updateShowRecentNotes } from '@/app/actions/profile' import { toast } from 'sonner' import { useLanguage } from '@/lib/i18n' -const LANGUAGES = [ - { value: 'auto', label: 'Auto-detect', flag: '🌐' }, - { value: 'en', label: 'English', flag: '🇬🇧' }, - { value: 'fr', label: 'Français', flag: '🇫🇷' }, - { value: 'es', label: 'Español', flag: '🇪🇸' }, - { value: 'de', label: 'Deutsch', flag: '🇩🇪' }, - { value: 'it', label: 'Italiano', flag: '🇮🇹' }, - { value: 'pt', label: 'Português', flag: '🇵🇹' }, - { value: 'ru', label: 'Русский', flag: '🇷🇺' }, - { value: 'zh', label: '中文', flag: '🇨🇳' }, - { value: 'ja', label: '日本語', flag: '🇯🇵' }, - { value: 'ko', label: '한국어', flag: '🇰🇷' }, - { value: 'ar', label: 'العربية', flag: '🇸🇦' }, - { value: 'hi', label: 'हिन्दी', flag: '🇮🇳' }, - { value: 'nl', label: 'Nederlands', flag: '🇳🇱' }, - { value: 'pl', label: 'Polski', flag: '🇵🇱' }, - { value: 'fa', label: 'فارسی (Persian)', flag: '🇮🇷' }, -] + export function ProfileForm({ user, userAISettings }: { user: any; userAISettings?: any }) { const router = useRouter() - const [selectedLanguage, setSelectedLanguage] = useState(userAISettings?.preferredLanguage || 'auto') - const [isUpdatingLanguage, setIsUpdatingLanguage] = useState(false) + const [fontSize, setFontSize] = useState(userAISettings?.fontSize || 'medium') const [isUpdatingFontSize, setIsUpdatingFontSize] = useState(false) const [showRecentNotes, setShowRecentNotes] = useState(userAISettings?.showRecentNotes ?? false) @@ -101,26 +77,7 @@ export function ProfileForm({ user, userAISettings }: { user: any; userAISetting applyFontSize(savedFontSize as string) }, []) - const handleLanguageChange = async (language: string) => { - setIsUpdatingLanguage(true) - try { - const result = await updateLanguage(language) - if (result?.error) { - toast.error(t('profile.languageUpdateFailed')) - } else { - setSelectedLanguage(language) - // Update localStorage and reload to apply new language - localStorage.setItem('user-language', language) - toast.success(t('profile.languageUpdateSuccess')) - // Reload page to apply new language - setTimeout(() => window.location.reload(), 500) - } - } catch (error) { - toast.error(t('profile.languageUpdateFailed')) - } finally { - setIsUpdatingLanguage(false) - } - } + const handleShowRecentNotesChange = async (enabled: boolean) => { setIsUpdatingRecentNotes(true) @@ -175,39 +132,7 @@ export function ProfileForm({ user, userAISettings }: { user: any; userAISetting - - - {t('profile.languagePreferences')} - {t('profile.languagePreferencesDescription')} - - -
- - -

- {t('profile.languageDescription')} -

-
-
-
+ diff --git a/keep-notes/app/(main)/support/page.tsx b/keep-notes/app/(main)/support/page.tsx index 17221f6..8f25ee9 100644 --- a/keep-notes/app/(main)/support/page.tsx +++ b/keep-notes/app/(main)/support/page.tsx @@ -1,75 +1,77 @@ +'use client' + import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; +import { useLanguage } from '@/lib/i18n'; export default function SupportPage() { + const { t } = useLanguage(); + return (

- Support Memento Development ☕ + {t('support.title')}

- Memento is 100% free and open-source. Your support helps keep it that way. + {t('support.description')}

- {/* Ko-fi Card */} - Buy me a coffee + {t('support.buyMeACoffee')}

- Make a one-time donation or become a monthly supporter. + {t('support.donationDescription')}

- No platform fees • Instant payouts • Secure + {t('support.kofiDescription')}

- {/* GitHub Sponsors Card */} 💚 - Sponsor on GitHub + {t('support.sponsorOnGithub')}

- Become a monthly sponsor and get recognition. + {t('support.sponsorDescription')}

- Recurring support • Public recognition • Developer-focused + {t('support.githubDescription')}

- {/* How Donations Are Used */} - How Your Support Helps + {t('support.howSupportHelps')}
-

💰 Direct Impact

+

💰 {t('support.directImpact')}

  • ☕ Keeps me fueled with coffee
  • 🐛 Covers hosting and server costs
  • @@ -79,7 +81,7 @@ export default function SupportPage() {
-

🎁 Sponsor Perks

+

🎁 {t('support.sponsorPerks')}

  • 🥉 $5/month - Bronze: Name in supporters list
  • 🥈 $15/month - Silver: Priority feature requests
  • @@ -91,30 +93,29 @@ export default function SupportPage() { - {/* Transparency */} - 💡 Transparency + 💡 {t('support.transparency')}

    - I believe in complete transparency. Here's how donations are used: + {t('support.transparencyDescription')}

    - Hosting & servers: + {t('support.hostingServers')} ~$20/month
    - Domain & SSL: + {t('support.domainSSL')} ~$15/year
    - AI API costs: + {t('support.aiApiCosts')} ~$30/month
    - Total expenses: + {t('support.totalExpenses')} ~$50/month
    @@ -125,28 +126,27 @@ export default function SupportPage() {
    - {/* Alternative Ways to Support */}
    -

    Other Ways to Support

    +

    {t('support.otherWaysTitle')}

    diff --git a/keep-notes/app/(main)/trash/page.tsx b/keep-notes/app/(main)/trash/page.tsx index b86f624..4e9a8a1 100644 --- a/keep-notes/app/(main)/trash/page.tsx +++ b/keep-notes/app/(main)/trash/page.tsx @@ -1,23 +1,28 @@ -import { ArchiveHeader } from '@/components/archive-header' import { Trash2 } from 'lucide-react' +import { useLanguage } from '@/lib/i18n' export const dynamic = 'force-dynamic' export default function TrashPage() { - // Currently, we don't have soft-delete implemented, so trash is always empty. - // This page exists to fix the 404 error and provide a placeholder. - return (
    -
    -
    - -
    -

    La corbeille est vide

    -

    - Les notes supprimées sont actuellement effacées définitivement. -

    -
    +
    ) } + +function TrashContent() { + const { t } = useLanguage() + + return ( +
    +
    + +
    +

    {t('trash.empty')}

    +

    + {t('trash.restore')} +

    +
    + ) +} diff --git a/keep-notes/app/actions/admin-settings.ts b/keep-notes/app/actions/admin-settings.ts index 7525d99..d3281ae 100644 --- a/keep-notes/app/actions/admin-settings.ts +++ b/keep-notes/app/actions/admin-settings.ts @@ -16,7 +16,7 @@ async function checkAdmin() { export async function testSMTP() { const session = await checkAdmin() const email = session.user?.email - + if (!email) throw new Error("No admin email found") const result = await sendEmail({ @@ -46,7 +46,7 @@ export async function updateSystemConfig(data: Record) { Object.entries(data).filter(([key, value]) => value !== '' && value !== null && value !== undefined) ) - console.log('Updating system config:', filteredData) + const operations = Object.entries(filteredData).map(([key, value]) => prisma.systemConfig.upsert({ diff --git a/keep-notes/app/actions/ai-settings.ts b/keep-notes/app/actions/ai-settings.ts index 1ab0cb1..2df12d2 100644 --- a/keep-notes/app/actions/ai-settings.ts +++ b/keep-notes/app/actions/ai-settings.ts @@ -2,7 +2,7 @@ import { auth } from '@/auth' import { prisma } from '@/lib/prisma' -import { revalidatePath } from 'next/cache' +import { revalidatePath, revalidateTag } from 'next/cache' export type UserAISettingsData = { titleSuggestions?: boolean @@ -25,9 +25,9 @@ export type UserAISettingsData = { * Update AI settings for the current user */ export async function updateAISettings(settings: UserAISettingsData) { - console.log('[updateAISettings] Started with:', JSON.stringify(settings, null, 2)) + const session = await auth() - console.log('[updateAISettings] Session User ID:', session?.user?.id) + if (!session?.user?.id) { console.error('[updateAISettings] Unauthorized: No session or user ID') @@ -44,10 +44,11 @@ export async function updateAISettings(settings: UserAISettingsData) { }, update: settings }) - console.log('[updateAISettings] Database upsert successful:', result) - revalidatePath('/settings/ai') - revalidatePath('/') + + revalidatePath('/settings/ai', 'page') + revalidatePath('/', 'layout') + revalidateTag('ai-settings') return { success: true } } catch (error) { @@ -57,8 +58,78 @@ export async function updateAISettings(settings: UserAISettingsData) { } /** - * Get AI settings for the current user + * Get AI settings for the current user (Cached) */ +import { unstable_cache } from 'next/cache' + +// Internal cached function to fetch settings from DB +const getCachedAISettings = unstable_cache( + async (userId: string) => { + try { + const settings = await prisma.userAISettings.findUnique({ + where: { userId } + }) + + if (!settings) { + return { + titleSuggestions: true, + semanticSearch: true, + paragraphRefactor: true, + memoryEcho: true, + memoryEchoFrequency: 'daily' as const, + aiProvider: 'auto' as const, + preferredLanguage: 'auto' as const, + demoMode: false, + showRecentNotes: false, + emailNotifications: false, + desktopNotifications: false, + anonymousAnalytics: false, + theme: 'light' as const, + fontSize: 'medium' as const + } + } + + return { + titleSuggestions: settings.titleSuggestions, + semanticSearch: settings.semanticSearch, + paragraphRefactor: settings.paragraphRefactor, + memoryEcho: settings.memoryEcho, + memoryEchoFrequency: (settings.memoryEchoFrequency || 'daily') as 'daily' | 'weekly' | 'custom', + aiProvider: (settings.aiProvider || 'auto') as 'auto' | 'openai' | 'ollama', + preferredLanguage: (settings.preferredLanguage || 'auto') as 'auto' | 'en' | 'fr' | 'es' | 'de' | 'fa' | 'it' | 'pt' | 'ru' | 'zh' | 'ja' | 'ko' | 'ar' | 'hi' | 'nl' | 'pl', + demoMode: settings.demoMode, + showRecentNotes: settings.showRecentNotes, + emailNotifications: settings.emailNotifications, + desktopNotifications: settings.desktopNotifications, + anonymousAnalytics: settings.anonymousAnalytics, + // theme: 'light' as const, // REMOVED: Should not be handled here or hardcoded + fontSize: (settings.fontSize || 'medium') as 'small' | 'medium' | 'large' + } + } catch (error) { + console.error('Error getting AI settings:', error) + // Return defaults on error + return { + titleSuggestions: true, + semanticSearch: true, + paragraphRefactor: true, + memoryEcho: true, + memoryEchoFrequency: 'daily' as const, + aiProvider: 'auto' as const, + preferredLanguage: 'auto' as const, + demoMode: false, + showRecentNotes: false, + emailNotifications: false, + desktopNotifications: false, + anonymousAnalytics: false, + theme: 'light' as const, + fontSize: 'medium' as const + } + } + }, + ['user-ai-settings'], + { tags: ['ai-settings'] } +) + export async function getAISettings(userId?: string) { let id = userId @@ -87,66 +158,7 @@ export async function getAISettings(userId?: string) { } } - try { - const settings = await prisma.userAISettings.findUnique({ - where: { userId: id } - }) - - if (!settings) { - return { - titleSuggestions: true, - semanticSearch: true, - paragraphRefactor: true, - memoryEcho: true, - memoryEchoFrequency: 'daily' as const, - aiProvider: 'auto' as const, - preferredLanguage: 'auto' as const, - demoMode: false, - showRecentNotes: false, - emailNotifications: false, - desktopNotifications: false, - anonymousAnalytics: false, - theme: 'light' as const, - fontSize: 'medium' as const - } - } - - return { - titleSuggestions: settings.titleSuggestions, - semanticSearch: settings.semanticSearch, - paragraphRefactor: settings.paragraphRefactor, - memoryEcho: settings.memoryEcho, - memoryEchoFrequency: (settings.memoryEchoFrequency || 'daily') as 'daily' | 'weekly' | 'custom', - aiProvider: (settings.aiProvider || 'auto') as 'auto' | 'openai' | 'ollama', - preferredLanguage: (settings.preferredLanguage || 'auto') as 'auto' | 'en' | 'fr' | 'es' | 'de' | 'fa' | 'it' | 'pt' | 'ru' | 'zh' | 'ja' | 'ko' | 'ar' | 'hi' | 'nl' | 'pl', - demoMode: settings.demoMode, - showRecentNotes: settings.showRecentNotes, - emailNotifications: settings.emailNotifications, - desktopNotifications: settings.desktopNotifications, - anonymousAnalytics: settings.anonymousAnalytics, - // theme: 'light' as const, // REMOVED: Should not be handled here or hardcoded - fontSize: (settings.fontSize || 'medium') as 'small' | 'medium' | 'large' - } - } catch (error) { - console.error('Error getting AI settings:', error) - // Return defaults on error - return { - titleSuggestions: true, - semanticSearch: true, - paragraphRefactor: true, - memoryEcho: true, - memoryEchoFrequency: 'daily' as const, - aiProvider: 'auto' as const, - preferredLanguage: 'auto' as const, - demoMode: false, - showRecentNotes: false, - emailNotifications: false, - desktopNotifications: false, - anonymousAnalytics: false, - theme: 'light' as const, - fontSize: 'medium' as const - } - } + return getCachedAISettings(id) } /** diff --git a/keep-notes/app/actions/notes.ts b/keep-notes/app/actions/notes.ts index 4386324..e5e1eb7 100644 --- a/keep-notes/app/actions/notes.ts +++ b/keep-notes/app/actions/notes.ts @@ -346,7 +346,7 @@ export async function createNote(data: { const autoLabelingConfidence = await getConfigNumber('AUTO_LABELING_CONFIDENCE_THRESHOLD', 70); if (autoLabelingEnabled) { - console.log('[AUTO-LABELING] Generating suggestions for new note in notebook:', data.notebookId); + const suggestions = await contextualAutoTagService.suggestLabels( data.content, data.notebookId, @@ -360,12 +360,12 @@ export async function createNote(data: { if (appliedLabels.length > 0) { labelsToUse = appliedLabels; - console.log(`[AUTO-LABELING] Applied ${appliedLabels.length} labels:`, appliedLabels); + } else { - console.log('[AUTO-LABELING] No suggestions met confidence threshold'); + } } else { - console.log('[AUTO-LABELING] Disabled in config'); + } } catch (error) { console.error('[AUTO-LABELING] Failed to suggest labels:', error); diff --git a/keep-notes/app/actions/ollama.ts b/keep-notes/app/actions/ollama.ts new file mode 100644 index 0000000..2dd164b --- /dev/null +++ b/keep-notes/app/actions/ollama.ts @@ -0,0 +1,57 @@ +'use server' + +interface OllamaModel { + name: string + modified_at: string + size: number + digest: string + details: { + format: string + family: string + families: string[] + parameter_size: string + quantization_level: string + } +} + +interface OllamaTagsResponse { + models: OllamaModel[] +} + +export async function getOllamaModels(baseUrl: string): Promise<{ success: boolean; models: string[]; error?: string }> { + if (!baseUrl) { + return { success: false, models: [], error: 'Base URL is required' } + } + + // Ensure URL doesn't end with slash + const cleanUrl = baseUrl.replace(/\/$/, '') + + try { + const response = await fetch(`${cleanUrl}/api/tags`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + // Set a reasonable timeout + signal: AbortSignal.timeout(5000) + }) + + if (!response.ok) { + throw new Error(`Ollama API returned ${response.status}: ${response.statusText}`) + } + + const data = await response.json() as OllamaTagsResponse + + // Extract model names + const modelNames = data.models?.map(m => m.name) || [] + + return { success: true, models: modelNames } + } catch (error: any) { + console.error('Failed to fetch Ollama models:', error) + return { + success: false, + models: [], + error: error.message || 'Failed to connect to Ollama' + } + } +} diff --git a/keep-notes/app/actions/user-settings.ts b/keep-notes/app/actions/user-settings.ts index d02eac7..7590714 100644 --- a/keep-notes/app/actions/user-settings.ts +++ b/keep-notes/app/actions/user-settings.ts @@ -2,7 +2,7 @@ import { auth } from '@/auth' import { prisma } from '@/lib/prisma' -import { revalidatePath } from 'next/cache' +import { revalidatePath, revalidateTag } from 'next/cache' export type UserSettingsData = { theme?: 'light' | 'dark' | 'auto' | 'sepia' | 'midnight' | 'blue' @@ -12,7 +12,7 @@ export type UserSettingsData = { * Update user settings (theme, etc.) */ export async function updateUserSettings(settings: UserSettingsData) { - console.log('[updateUserSettings] Started with:', settings) + const session = await auth() if (!session?.user?.id) { @@ -25,9 +25,10 @@ export async function updateUserSettings(settings: UserSettingsData) { where: { id: session.user.id }, data: settings }) - console.log('[updateUserSettings] Success:', result) + revalidatePath('/', 'layout') + revalidateTag('user-settings') return { success: true } } catch (error) { @@ -37,8 +38,33 @@ export async function updateUserSettings(settings: UserSettingsData) { } /** - * Get user settings for current user + * Get user settings for current user (Cached) */ +import { unstable_cache } from 'next/cache' + +// Internal cached function +const getCachedUserSettings = unstable_cache( + async (userId: string) => { + try { + const user = await prisma.user.findUnique({ + where: { id: userId }, + select: { theme: true } + }) + + return { + theme: (user?.theme || 'light') as 'light' | 'dark' | 'auto' | 'sepia' | 'midnight' | 'blue' + } + } catch (error) { + console.error('Error getting user settings:', error) + return { + theme: 'light' as const + } + } + }, + ['user-settings'], + { tags: ['user-settings'] } +) + export async function getUserSettings(userId?: string) { let id = userId @@ -53,19 +79,5 @@ export async function getUserSettings(userId?: string) { } } - try { - const user = await prisma.user.findUnique({ - where: { id }, - select: { theme: true } - }) - - return { - theme: (user?.theme || 'light') as 'light' | 'dark' | 'auto' | 'sepia' | 'midnight' | 'blue' - } - } catch (error) { - console.error('Error getting user settings:', error) - return { - theme: 'light' as const - } - } + return getCachedUserSettings(id) } diff --git a/keep-notes/app/api/ai/auto-labels/route.ts b/keep-notes/app/api/ai/auto-labels/route.ts index bed96dc..7deba00 100644 --- a/keep-notes/app/api/ai/auto-labels/route.ts +++ b/keep-notes/app/api/ai/auto-labels/route.ts @@ -17,7 +17,7 @@ export async function POST(request: NextRequest) { } const body = await request.json() - const { notebookId } = body + const { notebookId, language = 'en' } = body if (!notebookId || typeof notebookId !== 'string') { return NextResponse.json( @@ -45,7 +45,8 @@ export async function POST(request: NextRequest) { // Get label suggestions const suggestions = await autoLabelCreationService.suggestLabels( notebookId, - session.user.id + session.user.id, + language ) if (!suggestions) { diff --git a/keep-notes/app/api/ai/batch-organize/route.ts b/keep-notes/app/api/ai/batch-organize/route.ts index 8ff2eb2..0b8118a 100644 --- a/keep-notes/app/api/ai/batch-organize/route.ts +++ b/keep-notes/app/api/ai/batch-organize/route.ts @@ -16,9 +16,25 @@ export async function POST(request: NextRequest) { ) } + // Get language from request headers or body + let language = 'en' + try { + const body = await request.json() + if (body.language) { + language = body.language + } + } catch (e) { + // If no body or invalid json, check headers + const acceptLanguage = request.headers.get('accept-language') + if (acceptLanguage) { + language = acceptLanguage.split(',')[0].split('-')[0] + } + } + // Create organization plan const plan = await batchOrganizationService.createOrganizationPlan( - session.user.id + session.user.id, + language ) return NextResponse.json({ diff --git a/keep-notes/app/api/ai/notebook-summary/route.ts b/keep-notes/app/api/ai/notebook-summary/route.ts index df31849..e4229f7 100644 --- a/keep-notes/app/api/ai/notebook-summary/route.ts +++ b/keep-notes/app/api/ai/notebook-summary/route.ts @@ -17,7 +17,7 @@ export async function POST(request: NextRequest) { } const body = await request.json() - const { notebookId } = body + const { notebookId, language = 'en' } = body if (!notebookId || typeof notebookId !== 'string') { return NextResponse.json( @@ -45,7 +45,8 @@ export async function POST(request: NextRequest) { // Generate summary const summary = await notebookSummaryService.generateSummary( notebookId, - session.user.id + session.user.id, + language ) if (!summary) { diff --git a/keep-notes/app/api/ai/suggest-notebook/route.ts b/keep-notes/app/api/ai/suggest-notebook/route.ts index 3ff89d8..3f67382 100644 --- a/keep-notes/app/api/ai/suggest-notebook/route.ts +++ b/keep-notes/app/api/ai/suggest-notebook/route.ts @@ -10,7 +10,7 @@ export async function POST(req: NextRequest) { } const body = await req.json() - const { noteContent } = body + const { noteContent, language = 'en' } = body if (!noteContent || typeof noteContent !== 'string') { return NextResponse.json({ error: 'noteContent is required' }, { status: 400 }) @@ -29,7 +29,8 @@ export async function POST(req: NextRequest) { // Get suggestion from AI service const suggestedNotebook = await notebookSuggestionService.suggestNotebook( noteContent, - session.user.id + session.user.id, + language ) return NextResponse.json({ diff --git a/keep-notes/app/api/ai/tags/route.ts b/keep-notes/app/api/ai/tags/route.ts index fc83464..a03d403 100644 --- a/keep-notes/app/api/ai/tags/route.ts +++ b/keep-notes/app/api/ai/tags/route.ts @@ -8,6 +8,7 @@ import { z } from 'zod'; const requestSchema = z.object({ content: z.string().min(1, "Le contenu ne peut pas être vide"), notebookId: z.string().optional(), + language: z.string().default('en'), }); export async function POST(req: NextRequest) { @@ -18,14 +19,15 @@ export async function POST(req: NextRequest) { } const body = await req.json(); - const { content, notebookId } = requestSchema.parse(body); + const { content, notebookId, language } = requestSchema.parse(body); // If notebookId is provided, use contextual suggestions (IA2) if (notebookId) { const suggestions = await contextualAutoTagService.suggestLabels( content, notebookId, - session.user.id + session.user.id, + language ); // Convert label → tag to match TagSuggestion interface @@ -37,7 +39,7 @@ export async function POST(req: NextRequest) { ...(s.isNewLabel !== undefined && { isNewLabel: s.isNewLabel }) })); - return NextResponse.json({ tags: convertedTags }); + return NextResponse.json({ tags: convertedTags }); } // Otherwise, use legacy auto-tagging (generates new tags) diff --git a/keep-notes/app/layout.tsx b/keep-notes/app/layout.tsx index ddbd5d2..f482264 100644 --- a/keep-notes/app/layout.tsx +++ b/keep-notes/app/layout.tsx @@ -27,7 +27,7 @@ export const viewport: Viewport = { themeColor: "#f59e0b", }; -export const dynamic = "force-dynamic"; + import { getAISettings } from "@/app/actions/ai-settings"; import { getUserSettings } from "@/app/actions/user-settings"; @@ -59,8 +59,7 @@ export default async function RootLayout({ getUserSettings(userId) ]) - console.log('[RootLayout] Auth user:', userId) - console.log('[RootLayout] Server fetched user settings:', userSettings) + return ( diff --git a/keep-notes/components/ai/ai-settings-panel.tsx b/keep-notes/components/ai/ai-settings-panel.tsx index 182df5e..3d74228 100644 --- a/keep-notes/components/ai/ai-settings-panel.tsx +++ b/keep-notes/components/ai/ai-settings-panel.tsx @@ -127,7 +127,7 @@ export function AISettingsPanel({ initialSettings }: AISettingsPanelProps) { handleToggle('titleSuggestions', checked)} /> @@ -141,7 +141,7 @@ export function AISettingsPanel({ initialSettings }: AISettingsPanelProps) { handleToggle('paragraphRefactor', checked)} /> @@ -159,7 +159,7 @@ export function AISettingsPanel({ initialSettings }: AISettingsPanelProps) { {t('aiSettings.frequency')}

    - How often to analyze note connections + {t('aiSettings.frequencyDesc')}

    - Choose your preferred AI provider + {t('aiSettings.providerDesc')}

    - Ollama when available, OpenAI fallback + {t('aiSettings.providerAutoDesc')}

@@ -218,7 +218,7 @@ export function AISettingsPanel({ initialSettings }: AISettingsPanelProps) { {t('aiSettings.providerOllama')}

- 100% private, runs locally on your machine + {t('aiSettings.providerOllamaDesc')}

@@ -230,7 +230,7 @@ export function AISettingsPanel({ initialSettings }: AISettingsPanelProps) { {t('aiSettings.providerOpenAI')}

- Most accurate, requires API key + {t('aiSettings.providerOpenAIDesc')}

diff --git a/keep-notes/components/auto-label-suggestion-dialog.tsx b/keep-notes/components/auto-label-suggestion-dialog.tsx index 442cae0..a658387 100644 --- a/keep-notes/components/auto-label-suggestion-dialog.tsx +++ b/keep-notes/components/auto-label-suggestion-dialog.tsx @@ -55,7 +55,10 @@ export function AutoLabelSuggestionDialog({ method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', - body: JSON.stringify({ notebookId }), + body: JSON.stringify({ + notebookId, + language: document.documentElement.lang || 'en', + }), }) const data = await response.json() @@ -68,7 +71,7 @@ export function AutoLabelSuggestionDialog({ } else { // No suggestions is not an error - just close the dialog if (data.message) { - } + } onOpenChange(false) } } catch (error) { @@ -113,7 +116,7 @@ export function AutoLabelSuggestionDialog({ if (data.success) { toast.success( t('ai.autoLabels.created', { count: data.data.createdCount }) || - `${data.data.createdCount} labels created successfully` + `${data.data.createdCount} labels created successfully` ) onLabelsCreated() onOpenChange(false) diff --git a/keep-notes/components/batch-organization-dialog.tsx b/keep-notes/components/batch-organization-dialog.tsx index 61c04be..348f720 100644 --- a/keep-notes/components/batch-organization-dialog.tsx +++ b/keep-notes/components/batch-organization-dialog.tsx @@ -38,7 +38,11 @@ export function BatchOrganizationDialog({ try { const response = await fetch('/api/ai/batch-organize', { method: 'POST', + headers: { 'Content-Type': 'application/json' }, credentials: 'include', + body: JSON.stringify({ + language: document.documentElement.lang || 'en' + }), }) const data = await response.json() @@ -125,7 +129,7 @@ export function BatchOrganizationDialog({ if (data.success) { toast.success( t('ai.batchOrganization.success', { count: data.data.movedCount }) || - `${data.data.movedCount} notes moved successfully` + `${data.data.movedCount} notes moved successfully` ) onNotesMoved() onOpenChange(false) @@ -306,7 +310,7 @@ export function BatchOrganizationDialog({ ) : ( <> - {t('ai.batchOrganization.apply')} + {t('ai.batchOrganization.apply', { count: selectedNotes.size })} )} diff --git a/keep-notes/components/demo-mode-toggle.tsx b/keep-notes/components/demo-mode-toggle.tsx index f0b14ff..635bbc7 100644 --- a/keep-notes/components/demo-mode-toggle.tsx +++ b/keep-notes/components/demo-mode-toggle.tsx @@ -21,13 +21,13 @@ export function DemoModeToggle({ demoMode, onToggle }: DemoModeToggleProps) { try { await onToggle(checked) if (checked) { - toast.success('🧪 Demo Mode activated! Memory Echo will now work instantly.') + toast.success(t('demoMode.activated')) } else { - toast.success('Demo Mode disabled. Normal parameters restored.') + toast.success(t('demoMode.deactivated')) } } catch (error) { console.error('Error toggling demo mode:', error) - toast.error('Failed to toggle demo mode') + toast.error(t('demoMode.toggleFailed')) } finally { setIsPending(false) } @@ -53,14 +53,11 @@ export function DemoModeToggle({ demoMode, onToggle }: DemoModeToggleProps) {
- 🧪 Demo Mode + 🧪 {t('demoMode.title')} {demoMode && } - {demoMode - ? 'Test Memory Echo instantly with relaxed parameters' - : 'Enable instant testing of Memory Echo feature' - } + {t('demoMode.description')}
@@ -77,31 +74,25 @@ export function DemoModeToggle({ demoMode, onToggle }: DemoModeToggleProps) {

- ⚡ Demo parameters active: + {t('demoMode.parametersActive')}

- - 50% similarity threshold (normally 75%) - + {t('demoMode.similarityThreshold')}
- - 0-day delay between notes (normally 7 days) - + {t('demoMode.delayBetweenNotes')}
- - Unlimited insights (no frequency limits) - + {t('demoMode.unlimitedInsights')}

- 💡 Create 2+ similar notes and see Memory Echo in action! + 💡 {t('demoMode.createNotesTip')}

)} diff --git a/keep-notes/components/favorites-section.tsx b/keep-notes/components/favorites-section.tsx index e3f68ca..41998c2 100644 --- a/keep-notes/components/favorites-section.tsx +++ b/keep-notes/components/favorites-section.tsx @@ -53,7 +53,7 @@ export function FavoritesSection({ pinnedNotes, onEdit, isLoading }: FavoritesSe
📌

- Pinned Notes + {t('notes.pinnedNotes')} ({pinnedNotes.length}) diff --git a/keep-notes/components/ghost-tags.tsx b/keep-notes/components/ghost-tags.tsx index 5f5a0e6..2c8d778 100644 --- a/keep-notes/components/ghost-tags.tsx +++ b/keep-notes/components/ghost-tags.tsx @@ -77,7 +77,7 @@ export function GhostTags({ suggestions, addedTags, isAnalyzing, onSelectTag, on onSelectTag(suggestion.tag); }} className={cn("flex items-center px-3 py-1 text-xs font-medium", colorClasses.text)} - title={isNewLabel ? "Créer ce nouveau label et l'ajouter" : t('ai.clickToAddTag')} + title={isNewLabel ? t('ai.autoLabels.createNewLabel') : t('ai.clickToAddTag')} > {isNewLabel && } {!isNewLabel && } diff --git a/keep-notes/components/header.tsx b/keep-notes/components/header.tsx index d9e35bf..b718611 100644 --- a/keep-notes/components/header.tsx +++ b/keep-notes/components/header.tsx @@ -355,7 +355,7 @@ export function Header({ router.push('/admin')} className="cursor-pointer"> - Admin + {t('nav.adminDashboard')} signOut()} className="cursor-pointer text-red-600 focus:text-red-600"> diff --git a/keep-notes/components/memory-echo-notification.tsx b/keep-notes/components/memory-echo-notification.tsx index 69d4632..ee1ceee 100644 --- a/keep-notes/components/memory-echo-notification.tsx +++ b/keep-notes/components/memory-echo-notification.tsx @@ -1,6 +1,7 @@ 'use client' import { useState, useEffect } from 'react' +import { useLanguage } from '@/lib/i18n/LanguageProvider' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' @@ -33,6 +34,7 @@ interface MemoryEchoNotificationProps { } export function MemoryEchoNotification({ onOpenNote }: MemoryEchoNotificationProps) { + const { t } = useLanguage() const [insight, setInsight] = useState(null) const [isLoading, setIsLoading] = useState(false) const [isDismissed, setIsDismissed] = useState(false) @@ -137,9 +139,9 @@ export function MemoryEchoNotification({ onOpenNote }: MemoryEchoNotificationPro

-

💡 Memory Echo Discovery

+

{t('memoryEcho.title')}

- These notes are connected by {similarityPercentage}% similarity + {t('connection.similarityInfo', { similarity: similarityPercentage })}

@@ -179,7 +181,7 @@ export function MemoryEchoNotification({ onOpenNote }: MemoryEchoNotificationPro

{insight.note1.content}

-

Click to view note →

+

{t('memoryEcho.clickToView')}

{/* Note 2 */} @@ -198,37 +200,35 @@ export function MemoryEchoNotification({ onOpenNote }: MemoryEchoNotificationPro

{insight.note2.content}

-

Click to view note →

+

{t('memoryEcho.clickToView')}

{/* Feedback Section */}

- Is this connection helpful? + {t('connection.isHelpful')}

@@ -248,11 +248,11 @@ export function MemoryEchoNotification({ onOpenNote }: MemoryEchoNotificationPro
- 💡 I noticed something... + {t('memoryEcho.title')} - Proactive connections between your notes + {t('memoryEcho.description')}
@@ -298,7 +298,7 @@ export function MemoryEchoNotification({ onOpenNote }: MemoryEchoNotificationPro className="flex-1 bg-amber-600 hover:bg-amber-700 text-white" onClick={handleView} > - View Connection + {t('memoryEcho.viewConnection')}
@@ -307,7 +307,7 @@ export function MemoryEchoNotification({ onOpenNote }: MemoryEchoNotificationPro size="icon" className="h-8 w-8 text-green-600 hover:text-green-700 hover:bg-green-50 dark:hover:bg-green-950/20" onClick={() => handleFeedback('thumbs_up')} - title="Helpful" + title={t('memoryEcho.helpful')} > @@ -316,7 +316,7 @@ export function MemoryEchoNotification({ onOpenNote }: MemoryEchoNotificationPro size="icon" className="h-8 w-8 text-red-600 hover:text-red-700 hover:bg-red-50 dark:hover:bg-red-950/20" onClick={() => handleFeedback('thumbs_down')} - title="Not Helpful" + title={t('memoryEcho.notHelpful')} > @@ -328,7 +328,7 @@ export function MemoryEchoNotification({ onOpenNote }: MemoryEchoNotificationPro className="w-full text-center text-xs text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 py-1" onClick={handleDismiss} > - Dismiss for now + {t('memoryEcho.dismiss')} diff --git a/keep-notes/components/note-editor.tsx b/keep-notes/components/note-editor.tsx index 44f0c81..4df82bf 100644 --- a/keep-notes/components/note-editor.tsx +++ b/keep-notes/components/note-editor.tsx @@ -1122,7 +1122,7 @@ export function NoteEditor({ note, readOnly = false, onClose }: NoteEditorProps) } } - toast.success('Notes fusionnées avec succès !') + toast.success(t('toast.notesFusionSuccess')) triggerRefresh() onClose() }} diff --git a/keep-notes/components/notebook-suggestion-toast.tsx b/keep-notes/components/notebook-suggestion-toast.tsx index b0ddd11..5f03578 100644 --- a/keep-notes/components/notebook-suggestion-toast.tsx +++ b/keep-notes/components/notebook-suggestion-toast.tsx @@ -57,7 +57,10 @@ export function NotebookSuggestionToast({ const response = await fetch('/api/ai/suggest-notebook', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ noteContent }) + body: JSON.stringify({ + noteContent, + language: document.documentElement.lang || 'en', + }) }) const data = await response.json() diff --git a/keep-notes/components/notebook-summary-dialog.tsx b/keep-notes/components/notebook-summary-dialog.tsx index 0462826..46d3b4f 100644 --- a/keep-notes/components/notebook-summary-dialog.tsx +++ b/keep-notes/components/notebook-summary-dialog.tsx @@ -52,7 +52,10 @@ export function NotebookSummaryDialog({ method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', - body: JSON.stringify({ notebookId }), + body: JSON.stringify({ + notebookId, + language: document.documentElement.lang || 'en', + }), }) const data = await response.json() @@ -82,6 +85,10 @@ export function NotebookSummaryDialog({ return ( + + {t('notebook.generating')} + {t('notebook.generatingDescription') || 'Please wait...'} +

diff --git a/keep-notes/components/recent-notes-section.tsx b/keep-notes/components/recent-notes-section.tsx index 665bf10..22d7c33 100644 --- a/keep-notes/components/recent-notes-section.tsx +++ b/keep-notes/components/recent-notes-section.tsx @@ -1,7 +1,7 @@ 'use client' import { Note } from '@/lib/types' -import { Clock, FileText, Tag } from 'lucide-react' +import { Clock } from 'lucide-react' import { cn } from '@/lib/utils' import { useLanguage } from '@/lib/i18n' @@ -11,27 +11,24 @@ interface RecentNotesSectionProps { } export function RecentNotesSection({ recentNotes, onEdit }: RecentNotesSectionProps) { - const { language } = useLanguage() + const { t } = useLanguage() - // Show only the 3 most recent notes const topThree = recentNotes.slice(0, 3) if (topThree.length === 0) return null return (

- {/* Minimalist header - matching your app style */}
- {language === 'fr' ? 'Récent' : 'Recent'} + {t('notes.recent')} · {topThree.length}
- {/* Compact 3-card row */}
{topThree.map((note, index) => ( void }) { - const { language } = useLanguage() - // Use contentUpdatedAt - only reflects actual content changes, not property changes (size, color, etc.) - const timeAgo = getCompactTime(note.contentUpdatedAt || note.updatedAt, language) + const { t } = useLanguage() + const timeAgo = getCompactTime(note.contentUpdatedAt || note.updatedAt, t) const isFirstNote = index === 0 return ( @@ -69,7 +64,6 @@ function CompactCard({ isFirstNote && "ring-2 ring-primary/20" )} > - {/* Subtle left accent - colored based on recency */}
- {/* Content with left padding for accent line */}
- {/* Title */}

- {note.title || (language === 'fr' ? 'Sans titre' : 'Untitled')} + {note.title || t('notes.untitled')}

- {/* Preview - 2 lines max */}

{note.content?.substring(0, 80) || ''} {note.content && note.content.length > 80 && '...'}

- {/* Footer with time and indicators */}
- {/* Time - left */} {timeAgo} - {/* Indicators - right */}
- {/* Notebook indicator */} {note.notebookId && ( -
+
)} - {/* Labels indicator */} {note.labels && note.labels.length > 0 && ( -
+
)}
- {/* Hover indicator - top right */}
) } -// Compact time display - matching your app's style -// NOTE: Ensure dates are properly parsed from database (may come as strings) -function getCompactTime(date: Date | string, language: string): string { +function getCompactTime(date: Date | string, t: (key: string, params?: Record) => string): string { const now = new Date() const then = date instanceof Date ? date : new Date(date) - // Validate date if (isNaN(then.getTime())) { console.warn('Invalid date provided to getCompactTime:', date) - return language === 'fr' ? 'date invalide' : 'invalid date' + return t('common.error') } const seconds = Math.floor((now.getTime() - then.getTime()) / 1000) const minutes = Math.floor(seconds / 60) const hours = Math.floor(minutes / 60) - if (language === 'fr') { - if (seconds < 60) return 'à l\'instant' - if (minutes < 60) return `il y a ${minutes}m` - if (hours < 24) return `il y a ${hours}h` - const days = Math.floor(hours / 24) - return `il y a ${days}j` - } else { - if (seconds < 60) return 'just now' - if (minutes < 60) return `${minutes}m ago` - if (hours < 24) return `${hours}h ago` - const days = Math.floor(hours / 24) - return `${days}d ago` - } + if (seconds < 60) return t('time.justNow') + if (minutes < 60) return t('time.minutesAgo', { count: minutes }) + if (hours < 24) return t('time.hoursAgo', { count: hours }) + const days = Math.floor(hours / 24) + return t('time.daysAgo', { count: days }) } diff --git a/keep-notes/components/reminder-dialog.tsx b/keep-notes/components/reminder-dialog.tsx index f957528..11693ee 100644 --- a/keep-notes/components/reminder-dialog.tsx +++ b/keep-notes/components/reminder-dialog.tsx @@ -1,7 +1,10 @@ +'use client' + import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { useState, useEffect } from "react" +import { useLanguage } from '@/lib/i18n' interface ReminderDialogProps { open: boolean @@ -18,6 +21,7 @@ export function ReminderDialog({ onSave, onRemove }: ReminderDialogProps) { + const { t } = useLanguage() const [reminderDate, setReminderDate] = useState('') const [reminderTime, setReminderTime] = useState('') @@ -51,7 +55,6 @@ export function ReminderDialog({ { - // Prevent dialog from closing when interacting with Sonner toasts const target = event.target as HTMLElement; const isSonnerElement = @@ -75,12 +78,12 @@ export function ReminderDialog({ }} > - Set Reminder + {t('reminder.setReminder')}
{currentReminder && ( )}
diff --git a/keep-notes/components/settings/SettingInput.tsx b/keep-notes/components/settings/SettingInput.tsx index b4e54ad..ec305ae 100644 --- a/keep-notes/components/settings/SettingInput.tsx +++ b/keep-notes/components/settings/SettingInput.tsx @@ -5,6 +5,7 @@ import { Label } from '@/components/ui/label' import { Loader2, Check } from 'lucide-react' import { cn } from '@/lib/utils' import { toast } from 'sonner' +import { useLanguage } from '@/lib/i18n' interface SettingInputProps { label: string @@ -25,6 +26,7 @@ export function SettingInput({ placeholder, disabled }: SettingInputProps) { + const { t } = useLanguage() const [isLoading, setIsLoading] = useState(false) const [isSaved, setIsSaved] = useState(false) @@ -35,15 +37,12 @@ export function SettingInput({ try { await onChange(newValue) setIsSaved(true) - toast.success('Setting saved') + toast.success(t('toast.saved')) - // Clear saved indicator after 2 seconds setTimeout(() => setIsSaved(false), 2000) } catch (err) { console.error('Error updating setting:', err) - toast.error('Failed to save setting', { - description: 'Please try again' - }) + toast.error(t('toast.saveFailed')) } finally { setIsLoading(false) } diff --git a/keep-notes/components/settings/SettingSelect.tsx b/keep-notes/components/settings/SettingSelect.tsx index 33ac3a5..5817425 100644 --- a/keep-notes/components/settings/SettingSelect.tsx +++ b/keep-notes/components/settings/SettingSelect.tsx @@ -5,6 +5,7 @@ import { Label } from '@/components/ui/label' import { Loader2 } from 'lucide-react' import { cn } from '@/lib/utils' import { toast } from 'sonner' +import { useLanguage } from '@/lib/i18n' interface SelectOption { value: string @@ -29,6 +30,7 @@ export function SettingSelect({ onChange, disabled }: SettingSelectProps) { + const { t } = useLanguage() const [isLoading, setIsLoading] = useState(false) const handleChange = async (newValue: string) => { @@ -36,14 +38,10 @@ export function SettingSelect({ try { await onChange(newValue) - toast.success('Setting saved', { - description: `${label} has been updated` - }) + toast.success(t('toast.saved')) } catch (err) { console.error('Error updating setting:', err) - toast.error('Failed to save setting', { - description: 'Please try again' - }) + toast.error(t('toast.saveFailed')) } finally { setIsLoading(false) } diff --git a/keep-notes/components/settings/SettingToggle.tsx b/keep-notes/components/settings/SettingToggle.tsx index 9be3854..1bf6e32 100644 --- a/keep-notes/components/settings/SettingToggle.tsx +++ b/keep-notes/components/settings/SettingToggle.tsx @@ -6,6 +6,7 @@ import { Label } from '@/components/ui/label' import { Loader2, Check, X } from 'lucide-react' import { cn } from '@/lib/utils' import { toast } from 'sonner' +import { useLanguage } from '@/lib/i18n' interface SettingToggleProps { label: string @@ -22,6 +23,7 @@ export function SettingToggle({ onChange, disabled }: SettingToggleProps) { + const { t } = useLanguage() const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(false) @@ -31,15 +33,11 @@ export function SettingToggle({ try { await onChange(newChecked) - toast.success('Setting saved', { - description: `${label} has been ${newChecked ? 'enabled' : 'disabled'}` - }) + toast.success(t('toast.saved')) } catch (err) { console.error('Error updating setting:', err) setError(true) - toast.error('Failed to save setting', { - description: 'Please try again' - }) + toast.error(t('toast.saveFailed')) } finally { setIsLoading(false) } diff --git a/keep-notes/components/settings/SettingsNav.tsx b/keep-notes/components/settings/SettingsNav.tsx index b6f6ff0..1421d43 100644 --- a/keep-notes/components/settings/SettingsNav.tsx +++ b/keep-notes/components/settings/SettingsNav.tsx @@ -4,6 +4,7 @@ import Link from 'next/link' import { usePathname } from 'next/navigation' import { Settings, Sparkles, Palette, User, Database, Info, Check } from 'lucide-react' import { cn } from '@/lib/utils' +import { useLanguage } from '@/lib/i18n' interface SettingsSection { id: string @@ -18,41 +19,42 @@ interface SettingsNavProps { export function SettingsNav({ className }: SettingsNavProps) { const pathname = usePathname() + const { t } = useLanguage() const sections: SettingsSection[] = [ { id: 'general', - label: 'General', + label: t('generalSettings.title'), icon: , href: '/settings/general' }, { id: 'ai', - label: 'AI', + label: t('aiSettings.title'), icon: , href: '/settings/ai' }, { id: 'appearance', - label: 'Appearance', + label: t('appearance.title'), icon: , href: '/settings/appearance' }, { id: 'profile', - label: 'Profile', + label: t('profile.title'), icon: , href: '/settings/profile' }, { id: 'data', - label: 'Data', + label: t('dataManagement.title'), icon: , href: '/settings/data' }, { id: 'about', - label: 'About', + label: t('about.title'), icon: , href: '/settings/about' } diff --git a/keep-notes/components/sidebar.tsx b/keep-notes/components/sidebar.tsx index 9b4344b..8a06ffe 100644 --- a/keep-notes/components/sidebar.tsx +++ b/keep-notes/components/sidebar.tsx @@ -109,11 +109,11 @@ export function Sidebar({ className, user }: { className?: string, user?: any }) {/* Footer / Copyright / Terms */}
- Confidentialité + {t('footer.privacy')} - Conditions + {t('footer.terms')}
-

Open Source Clone

+

{t('footer.openSource')}

) diff --git a/keep-notes/components/user-nav.tsx b/keep-notes/components/user-nav.tsx index bfe443e..5555439 100644 --- a/keep-notes/components/user-nav.tsx +++ b/keep-notes/components/user-nav.tsx @@ -14,10 +14,12 @@ import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' import { useSession, signOut } from 'next-auth/react' import { useRouter } from 'next/navigation' import { LogOut, Settings, User, Shield } from 'lucide-react' +import { useLanguage } from '@/lib/i18n' export function UserNav({ user }: { user?: any }) { const { data: session } = useSession() const router = useRouter() + const { t } = useLanguage() const currentUser = user || session?.user @@ -51,23 +53,23 @@ export function UserNav({ user }: { user?: any }) { router.push('/settings/profile')}> - Profile + {t('nav.profile')} {userRole === 'ADMIN' && ( router.push('/admin')}> - Admin Dashboard + {t('nav.adminDashboard')} )} router.push('/settings')}> - Diagnostics + {t('nav.diagnostics')} signOut({ callbackUrl: '/login' })}> - Log out + {t('nav.logout')} diff --git a/keep-notes/hooks/use-auto-tagging.ts b/keep-notes/hooks/use-auto-tagging.ts index 50f59d5..7f350d5 100644 --- a/keep-notes/hooks/use-auto-tagging.ts +++ b/keep-notes/hooks/use-auto-tagging.ts @@ -41,7 +41,8 @@ export function useAutoTagging({ content, notebookId, enabled = true }: UseAutoT headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ content: contentToAnalyze, - notebookId: notebookId || undefined, // Pass notebookId for contextual suggestions (IA2) + notebookId: notebookId || undefined, + language: document.documentElement.lang || 'en', }), }); diff --git a/keep-notes/lib/ai/services/auto-label-creation.service.ts b/keep-notes/lib/ai/services/auto-label-creation.service.ts index aed9160..53177d8 100644 --- a/keep-notes/lib/ai/services/auto-label-creation.service.ts +++ b/keep-notes/lib/ai/services/auto-label-creation.service.ts @@ -28,7 +28,7 @@ export class AutoLabelCreationService { * @param userId - User ID (for authorization) * @returns Suggested labels or null if not enough notes/no patterns found */ - async suggestLabels(notebookId: string, userId: string): Promise { + async suggestLabels(notebookId: string, userId: string, language: string = 'en'): Promise { // 1. Get notebook with existing labels const notebook = await prisma.notebook.findFirst({ where: { @@ -84,7 +84,7 @@ export class AutoLabelCreationService { } // 2. Use AI to detect recurring themes - const suggestions = await this.detectRecurringThemes(notes, notebook) + const suggestions = await this.detectRecurringThemes(notes, notebook, language) return suggestions } @@ -94,13 +94,14 @@ export class AutoLabelCreationService { */ private async detectRecurringThemes( notes: any[], - notebook: any + notebook: any, + language: string ): Promise { const existingLabelNames = new Set( notebook.labels.map((l: any) => l.name.toLowerCase()) ) - const prompt = this.buildPrompt(notes, existingLabelNames) + const prompt = this.buildPrompt(notes, existingLabelNames, language) try { const config = await getSystemConfig() @@ -128,9 +129,9 @@ export class AutoLabelCreationService { } /** - * Build prompt for AI (always in French - interface language) + * Build prompt for AI (localized) */ - private buildPrompt(notes: any[], existingLabelNames: Set): string { + private buildPrompt(notes: any[], existingLabelNames: Set, language: string = 'en'): string { const notesSummary = notes .map((note, index) => { const title = note.title || 'Sans titre' @@ -141,7 +142,8 @@ export class AutoLabelCreationService { const existingLabels = Array.from(existingLabelNames).join(', ') - return ` + const instructions: Record = { + fr: ` Tu es un assistant qui détecte les thèmes récurrents dans des notes pour suggérer de nouvelles étiquettes. CARNET ANALYSÉ : @@ -182,7 +184,178 @@ Exemples de bonnes étiquettes : - "marie", "jean", "équipe" (personnes) Ta réponse (JSON seulement) : +`.trim(), + en: ` +You are an assistant that detects recurring themes in notes to suggest new labels. + +ANALYZED NOTEBOOK: +${notes.length} notes + +EXISTING LABELS (do not suggest these): +${existingLabels || 'None'} + +NOTEBOOK NOTES: +${notesSummary} + +TASK: +Analyze the notes and detect recurring themes (keywords, subjects, places, people). +A theme must appear in at least 5 different notes to be suggested. + +RESPONSE FORMAT (JSON): +{ + "labels": [ + { + "nom": "label_name", + "note_indices": [0, 5, 12, 23, 45], + "confiance": 0.85 + } + ] +} + +RULES: +- Label name must be short (max 1-2 words) +- A theme must appear in 5+ notes to be suggested +- Confidence must be > 0.60 +- Do not suggest labels that already exist +- Prioritize places, people, clear categories +- Maximum 5 suggestions + +Examples of good labels: +- "tokyo", "kyoto", "osaka" (places) +- "hotels", "restaurants", "flights" (categories) +- "mary", "john", "team" (people) + +Your response (JSON only): +`.trim(), + fa: ` +شما یک دستیار هستید که تم‌های تکرارشونده در یادداشت‌ها را برای پیشنهاد برچسب‌های جدید شناسایی می‌کنید. + +دفترچه‌ تحلیل شده: +${notes.length} یادداشت + +برچسب‌های موجود (این‌ها را پیشنهاد ندهید): +${existingLabels || 'هیچ'} + +یادداشت‌های دفترچه: +${notesSummary} + +وظیفه: +یادداشت‌ها را تحلیل کنید و تم‌های تکرارشونده (کلمات کلیدی، موضوعات، مکان‌ها، افراد) را شناسایی کنید. +یک تم باید حداقل در ۵ یادداشت مختلف ظاهر شود تا پیشنهاد داده شود. + +فرمت پاسخ (JSON): +{ + "labels": [ + { + "nom": "نام_برچسب", + "note_indices": [0, 5, 12, 23, 45], + "confiance": 0.85 + } + ] +} + +قوانین: +- نام برچسب باید کوتاه باشد (حداکثر ۱-۲ کلمه) +- یک تم باید در ۵+ یادداشت ظاهر شود تا پیشنهاد داده شود +- اطمینان باید > 0.60 باشد +- برچسب‌هایی که قبلاً وجود دارند را پیشنهاد ندهید +- اولویت با مکان‌ها، افراد، دسته‌بندی‌های واضح است +- حداکثر ۵ پیشنهاد + +مثال‌های برچسب خوب: +- "توکیو"، "کیوتو"، "اوزاکا" (مکان‌ها) +- "هتل‌ها"، "رستوران‌ها"، "پروازها" (دسته‌بندی‌ها) +- "مریم"، "علی"، "تیم" (افراد) + +پاسخ شما (فقط JSON): +`.trim(), + es: ` +Eres un asistente que detecta temas recurrentes en notas para sugerir nuevas etiquetas. + +CUADERNO ANALIZADO: +${notes.length} notas + +ETIQUETAS EXISTENTES (no sugerir estas): +${existingLabels || 'Ninguna'} + +NOTAS DEL CUADERNO: +${notesSummary} + +TAREA: +Analiza las notas y detecta temas recurrentes (palabras clave, temas, lugares, personas). +Un tema debe aparecer en al menos 5 notas diferentes para ser sugerido. + +FORMATO DE RESPUESTA (JSON): +{ + "labels": [ + { + "nom": "nombre_etiqueta", + "note_indices": [0, 5, 12, 23, 45], + "confiance": 0.85 + } + ] +} + +REGLAS: +- El nombre de la etiqueta debe ser corto (máx 1-2 palabras) +- Un tema debe aparecer en 5+ notas para ser sugerido +- La confianza debe ser > 0.60 +- No sugieras etiquetas que ya existen +- Prioriza lugares, personas, categorías claras +- Máximo 5 sugerencias + +Ejemplos de buenas etiquetas: +- "tokio", "kyoto", "osaka" (lugares) +- "hoteles", "restaurantes", "vuelos" (categorías) +- "maría", "juan", "equipo" (personas) + +Tu respuesta (solo JSON): +`.trim(), + de: ` +Du bist ein Assistent, der wiederkehrende Themen in Notizen erkennt, um neue Labels vorzuschlagen. + +ANALYSIERTES NOTIZBUCH: +${notes.length} Notizen + +VORHANDENE LABELS (schlage diese nicht vor): +${existingLabels || 'Keine'} + +NOTIZBUCH-NOTIZEN: +${notesSummary} + +AUFGABE: +Analysiere die Notizen und erkenne wiederkehrende Themen (Schlüsselwörter, Themen, Orte, Personen). +Ein Thema muss in mindestens 5 verschiedenen Notizen erscheinen, um vorgeschlagen zu werden. + +ANTWORTFORMAT (JSON): +{ + "labels": [ + { + "nom": "label_name", + "note_indices": [0, 5, 12, 23, 45], + "confiance": 0.85 + } + ] +} + +REGELN: +- Der Labelname muss kurz sein (max 1-2 Wörter) +- Ein Thema muss in 5+ Notizen erscheinen, um vorgeschlagen zu werden +- Konfidenz muss > 0.60 sein +- Schlage keine Labels vor, die bereits existieren +- Priorisiere Orte, Personen, klare Kategorien +- Maximal 5 Vorschläge + +Beispiele für gute Labels: +- "tokio", "kyoto", "osaka" (Orte) +- "hotels", "restaurants", "flüge" (Kategorien) +- "maria", "johannes", "team" (Personen) + +Deine Antwort (nur JSON): `.trim() + } + + return instructions[language] || instructions['en'] || instructions['fr'] } /** diff --git a/keep-notes/lib/ai/services/batch-organization.service.ts b/keep-notes/lib/ai/services/batch-organization.service.ts index e89e6a9..4139d90 100644 --- a/keep-notes/lib/ai/services/batch-organization.service.ts +++ b/keep-notes/lib/ai/services/batch-organization.service.ts @@ -36,9 +36,10 @@ export class BatchOrganizationService { /** * Analyze all notes in "Notes générales" and create an organization plan * @param userId - User ID + * @param language - User's preferred language (default: 'en') * @returns Organization plan with notebook assignments */ - async createOrganizationPlan(userId: string): Promise { + async createOrganizationPlan(userId: string, language: string = 'en'): Promise { // 1. Get all notes without notebook (Inbox/Notes générales) const notesWithoutNotebook = await prisma.note.findMany({ where: { @@ -86,7 +87,7 @@ export class BatchOrganizationService { } // 3. Call AI to create organization plan - const plan = await this.aiOrganizeNotes(notesWithoutNotebook, notebooks) + const plan = await this.aiOrganizeNotes(notesWithoutNotebook, notebooks, language) return plan } @@ -96,9 +97,10 @@ export class BatchOrganizationService { */ private async aiOrganizeNotes( notes: NoteForOrganization[], - notebooks: any[] + notebooks: any[], + language: string ): Promise { - const prompt = this.buildPrompt(notes, notebooks) + const prompt = this.buildPrompt(notes, notebooks, language) try { const config = await getSystemConfig() @@ -121,9 +123,9 @@ export class BatchOrganizationService { } /** - * Build prompt for AI (always in French - interface language) + * Build prompt for AI (localized) */ - private buildPrompt(notes: NoteForOrganization[], notebooks: any[]): string { + private buildPrompt(notes: NoteForOrganization[], notebooks: any[], language: string = 'en'): string { const notebookList = notebooks .map(nb => { const labels = nb.labels.map((l: any) => l.name).join(', ') @@ -140,7 +142,9 @@ export class BatchOrganizationService { }) .join('\n') - return ` + // System instructions based on language + const instructions: Record = { + fr: ` Tu es un assistant qui organise des notes en les regroupant par thématique dans des carnets. CARNETS DISPONIBLES : @@ -175,7 +179,7 @@ Pour chaque carnet, liste les notes qui lui appartiennent : { "index": 0, "confiance": 0.95, - "raison": "Courte explication" + "raison": "Courte explication en français" } ] } @@ -186,9 +190,684 @@ RÈGLES : - Seules les notes avec confiance > 0.60 doivent être assignées - Si une note est trop générique, ne l'assigne pas - Sois précis dans tes regroupements thématiques +- Ta réponse doit être uniquement un JSON valide +`.trim(), + en: ` +You are an assistant that organizes notes by grouping them into notebooks based on their theme. -Ta réponse (JSON seulement) : +AVAILABLE NOTEBOOKS: +${notebookList} + +NOTES TO ORGANIZE (Inbox): +${notesList} + +TASK: +Analyze each note and suggest the MOST appropriate notebook. +Consider: +1. The subject/theme of the note (MOST IMPORTANT) +2. Existing labels in each notebook +3. Thematic consistency between notes in the same notebook + +CLASSIFICATION GUIDE: +- SPORT/EXERCISE/SHOPPING/GROCERIES → Personal Notebook +- HOBBIES/PASSIONS/OUTINGS → Personal Notebook +- HEALTH/FITNESS/DOCTOR → Personal Notebook or Health +- FAMILY/FRIENDS → Personal Notebook +- WORK/MEETINGS/PROJECTS/CLIENTS → Work Notebook +- CODING/TECH/DEVELOPMENT → Work Notebook or Code +- FINANCE/BILLS/BANKING → Personal Notebook or Finance + +RESPONSE FORMAT (JSON): +For each notebook, list the notes that belong to it: +{ + "carnets": [ + { + "nom": "Notebook Name", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "Short explanation in English" + } + ] + } + ] +} + +RULES: +- Only assign notes with confidence > 0.60 +- If a note is too generic, do not assign it +- Be precise in your thematic groupings +- Your response must be valid JSON only +`.trim(), + es: ` +Eres un asistente que organiza notas agrupándolas por temática en cuadernos. + +CUADERNOS DISPONIBLES: +${notebookList} + +NOTAS A ORGANIZAR (Bandeja de entrada): +${notesList} + +TAREA: +Analiza cada nota y sugiere el cuaderno MÁS apropiado. +Considera: +1. El tema/asunto de la nota (LO MÁS IMPORTANTE) +2. Etiquetas existentes en cada cuaderno +3. Coherencia temática entre notas del mismo cuaderno + +GUÍA DE CLASIFICACIÓN: +- DEPORTE/EJERCICIO/COMPRAS → Cuaderno Personal +- HOBBIES/PASIONES/SALIDAS → Cuaderno Personal +- SALUD/FITNESS/DOCTOR → Cuaderno Personal o Salud +- FAMILIA/AMIGOS → Cuaderno Personal +- TRABAJO/REUNIONES/PROYECTOS → Cuaderno Trabajo +- CODING/TECH/DESARROLLO → Cuaderno Trabajo o Código +- FINANZAS/FACTURAS/BANCO → Cuaderno Personal o Finanzas + +FORMATO DE RESPUESTA (JSON): +Para cada cuaderno, lista las notas que le pertenecen: +{ + "carnets": [ + { + "nom": "Nombre del cuaderno", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "Breve explicación en español" + } + ] + } + ] +} + +REGLAS: +- Solo asigna notas con confianza > 0.60 +- Si una nota es demasiado genérica, no la asignes +- Sé preciso en tus agrupaciones temáticas +- Tu respuesta debe ser únicamente un JSON válido +`.trim(), + de: ` +Du bist ein Assistent, der Notizen organisiert, indem er sie thematisch in Notizbücher gruppiert. + +VERFÜGBARE NOTIZBÜCHER: +${notebookList} + +ZU ORGANISIERENDE NOTIZEN (Eingang): +${notesList} + +AUFGABE: +Analysiere jede Notiz und schlage das AM BESTEN geeignete Notizbuch vor. +Berücksichtige: +1. Das Thema/den Inhalt der Notiz (AM WICHTIGSTEN) +2. Vorhandene Labels in jedem Notizbuch +3. Thematische Konsistenz zwischen Notizen im selben Notizbuch + +KLASSIFIZIERUNGSLEITFADEN: +- SPORT/ÜBUNG/EINKAUFEN → Persönliches Notizbuch +- HOBBYS/LEIDENSCHAFTEN → Persönliches Notizbuch +- GESUNDHEIT/FITNESS/ARZT → Persönliches Notizbuch oder Gesundheit +- FAMILIE/FREUNDE → Persönliches Notizbuch +- ARBEIT/MEETINGS/PROJEKTE → Arbeitsnotizbuch +- CODING/TECH/ENTWICKLUNG → Arbeitsnotizbuch oder Code +- FINANZEN/RECHNUNGEN/BANK → Persönliches Notizbuch oder Finanzen + +ANTWORTFORMAT (JSON): +Für jedes Notizbuch, liste die zugehörigen Notizen auf: +{ + "carnets": [ + { + "nom": "Name des Notizbuchs", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "Kurze Erklärung auf Deutsch" + } + ] + } + ] +} + +REGELN: +- Ordne nur Notizen mit Konfidenz > 0.60 +- Wenn eine Notiz zu allgemein ist, ordne sie nicht zu +- Sei präzise in deinen thematischen Gruppierungen +- Deine Antwort muss ein gültiges JSON sein +`.trim(), + it: ` +Sei un assistente che organizza le note raggruppandole per tema nei taccuini. + +TACCUINI DISPONIBILI: +${notebookList} + +NOTE DA ORGANIZZARE (In arrivo): +${notesList} + +COMPITO: +Analizza ogni nota e suggerisci il taccuino PIÙ appropriato. +Considera: +1. L'argomento/tema della nota (PIÙ IMPORTANTE) +2. Etichette esistenti in ogni taccuino +3. Coerenza tematica tra le note dello stesso taccuino + +GUIDA ALLA CLASSIFICAZIONE: +- SPORT/ESERCIZIO/SHOPPING → Taccuino Personale +- HOBBY/PASSIONI/USCITE → Taccuino Personale +- SALUTE/FITNESS/DOTTORE → Taccuino Personale o Salute +- FAMIGLIA/AMIGOS → Taccuino Personale +- LAVORO/RIUNIONI/PROGETTI → Taccuino Lavoro +- CODING/TECH/SVILUPPO → Taccuino Lavoro o Codice +- FINANZA/BILLS/BANCA → Taccuino Personale o Finanza + +FORMATO RISPOSTA (JSON): +Per ogni taccuino, elenca le note che appartengono ad esso: +{ + "carnets": [ + { + "nom": "Nome del taccuino", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "Breve spiegazione in italiano" + } + ] + } + ] +} + +REGOLE: +- Assegna solo note con confidenza > 0.60 +- Se una nota è troppo generica, non assegnarla +- Sii preciso nei tuoi raggruppamenti tematici +- La tua risposta deve essere solo un JSON valido +`.trim(), + pt: ` +Você é um assistente que organiza notas agrupando-as por tema em cadernos. + +CADERNOS DISPONÍVEIS: +${notebookList} + +NOTAS A ORGANIZAR (Caixa de entrada): +${notesList} + +TAREFA: +Analise cada nota e sugira o caderno MAIS apropriado. +Considere: +1. O assunto/tema da nota (MAIS IMPORTANTE) +2. Etiquetas existentes em cada caderno +3. Coerência temática entre notas do mesmo caderno + +GUIA DE CLASSIFICAÇÃO: +- ESPORTE/EXERCÍCIO/COMPRAS → Caderno Pessoal +- HOBBIES/PAIXÕES/SAÍDAS → Caderno Pessoal +- SAÚDE/FITNESS/MÉDICO → Caderno Pessoal ou Saúde +- FAMÍLIA/AMIGOS → Caderno Pessoal +- TRABALHO/REUNIÕES/PROJETOS → Caderno Trabalho +- CODING/TECH/DESENVOLVIMENTO → Caderno Trabalho ou Código +- FINANÇAS/CONTAS/BANCO → Caderno Pessoal ou Finanças + +FORMATO DE RESPOSTA (JSON): +Para cada caderno, liste as notas que pertencem a ele: +{ + "carnets": [ + { + "nom": "Nome do caderno", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "Breve explicação em português" + } + ] + } + ] +} + +REGRAS: +- Apenas atribua notas com confiança > 0.60 +- Se uma nota for muito genérica, não a atribua +- Seja preciso em seus agrupamentos temáticos +- Sua resposta deve ser apenas um JSON válido +`.trim(), + nl: ` +Je bent een assistent die notities organiseert door ze thematisch in notitieboekjes te groeperen. + +BESCHIKBARE NOTITIEBOEKJES: +${notebookList} + +TE ORGANISEREN NOTITIES (Inbox): +${notesList} + +TAAK: +Analyseer elke notitie en stel het MEEST geschikte notitieboek voor. +Overweeg: +1. Het onderwerp/thema van de notitie (BELANGRIJKST) +2. Bestaande labels in elk notitieboekje +3. Thematische consistentie tussen notities in hetzelfde notitieboekje + +CLASSIFICATIEGIDS: +- SPORT/OEFENING/WINKELEN → Persoonlijk Notitieboek +- HOBBIES/PASSIES/UITJES → Persoonlijk Notitieboek +- GEZONDHEID/FITNESS/DOKTER → Persoonlijk Notitieboek of Gezondheid +- FAMILIE/VRIENDEN → Persoonlijk Notitieboek +- WERK/VERGADERINGEN/PROJECTEN → Werk Notitieboek +- CODING/TECH/ONTWIKKELING → Werk Notitieboek of Code +- FINANCIËN/REKENINGEN/BANK → Persoonlijk Notitieboek of Financiën + +ANTWOORDFORMAAT (JSON): +Voor elk notitieboekje, lijst de notities op die erbij horen: +{ + "carnets": [ + { + "nom": "Naam van het notitieboekje", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "Korte uitleg in het Nederlands" + } + ] + } + ] +} + +REGELS: +- Wijs alleen notities toe met vertrouwen > 0.60 +- Als een notitie te generiek is, wijs deze dan niet toe +- Wees nauwkeurig in je thematische groeperingen +- Je antwoord moet alleen een geldige JSON zijn +`.trim(), + pl: ` +Jesteś asystentem, który organizuje notatki, grupując je tematycznie w notatnikach. + +DOSTĘPNE NOTATNIKI: +${notebookList} + +NOTATKI DO ZORGANIZOWANIA (Skrzynka odbiorcza): +${notesList} + +ZADANIE: +Przeanalizuj każdą notatkę i zasugeruj NAJBARDZIEJ odpowiedni notatnik. +Rozważ: +1. Temat/treść notatki (NAJWAŻNIEJSZE) +2. Istniejące etykiety w każdym notatniku +3. Spójność tematyczna między notatkami w tym samym notatniku + +PRZEWODNIK KLASYFIKACJI: +- SPORT/ĆWICZENIA/ZAKUPY → Notatnik Osobisty +- HOBBY/PASJE/WYJŚCIA → Notatnik Osobisty +- ZDROWIE/FITNESS/LEKARZ → Notatnik Osobisty lub Zdrowie +- RODZINA/PRZYJACIELE → Notatnik Osobisty +- PRACA/SPOTKANIA/PROJEKTY → Notatnik Praca +- KODOWANIE/TECH/ROZWÓJ → Notatnik Praca lub Kod +- FINANSE/RACHUNKI/BANK → Notatnik Osobisty lub Finanse + +FORMAT ODPOWIEDZI (JSON): +Dla każdego notatnika wymień należące do niego notatki: +{ + "carnets": [ + { + "nom": "Nazwa notatnika", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "Krótkie wyjaśnienie po polsku" + } + ] + } + ] +} + +ZASADY: +- Przypisuj tylko notatki z pewnością > 0.60 +- Jeśli notatka jest zbyt ogólna, nie przypisuj jej +- Bądź precyzyjny w swoich grupach tematycznych +- Twoja odpowiedź musi być tylko prawidłowym JSON +`.trim(), + ru: ` +Вы помощник, который организует заметки, группируя их по темам в блокноты. + +ДОСТУПНЫЕ БЛОКНОТЫ: +${notebookList} + +ЗАМЕТКИ ДЛЯ ОРГАНИЗАЦИИ (Входящие): +${notesList} + +ЗАДАЧА: +Проанализируйте каждую заметку и предложите САМЫЙ подходящий блокнот. +Учитывайте: +1. Тему/предмет заметки (САМОЕ ВАЖНОЕ) +2. Существующие метки в каждом блокноте +3. Тематическую согласованность между заметками в одном блокноте + +РУКОВОДСТВО ПО КЛАССИФИКАЦИИ: +- СПОРТ/УПРАЖНЕНИЯ/ПОКУПКИ → Личный блокнот +- ХОББИ/УВЛЕЧЕНИЯ/ВЫХОДЫ → Личный блокнот +- ЗДОРОВЬЕ/ФИТНЕС/ВРАЧ → Личный блокнот или Здоровье +- СЕМЬЯ/ДРУЗЬЯ → Личный блокнот +- РАБОТА/СОВЕЩАНИЯ/ПРОЕКТЫ → Рабочий блокнот +- КОДИНГ/ТЕХНОЛОГИИ/РАЗРАБОТКА → Рабочий блокнот или Код +- ФИНАНСЫ/СЧЕТА/БАНК → Личный блокнот или Финансы + +ФОРМАТ ОТВЕТА (JSON): +Для каждого блокнота перечислите заметки, которые к нему относятся: +{ + "carnets": [ + { + "nom": "Название блокнота", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "Краткое объяснение на русском" + } + ] + } + ] +} + +ПРАВИЛА: +- Назначайте только заметки с уверенностью > 0.60 +- Если заметка слишком общая, не назначайте ее +- Будьте точны в своих тематических группировках +- Ваш ответ должен быть только валидным JSON +`.trim(), + ja: ` +あなたは、テーマごとにノートを分類してノートブックに整理するアシスタントです。 + +利用可能なノートブック: +${notebookList} + +整理するノート (受信トレイ): +${notesList} + +タスク: +各ノートを分析し、最も適切なノートブックを提案してください。 +考慮事項: +1. ノートの主題/テーマ (最も重要) +2. 各ノートブックの既存のラベル +3. 同じノートブック内のノート間のテーマの一貫性 + +分類ガイド: +- スポーツ/運動/買い物 → 個人用ノートブック +- 趣味/情熱/外出 → 個人用ノートブック +- 健康/フィットネス/医師 → 個人用ノートブックまたは健康 +- 家族/友人 → 個人用ノートブック +- 仕事/会議/プロジェクト → 仕事用ノートブック +- コーディング/技術/開発 → 仕事用ノートブックまたはコード +- 金融/請求書/銀行 → 個人用ノートブックまたは金融 + +回答形式 (JSON): +各ノートブックについて、それに属するノートをリストアップしてください: +{ + "carnets": [ + { + "nom": "ノートブック名", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "日本語での短い説明" + } + ] + } + ] +} + +ルール: +- 信頼度が 0.60 を超えるノートのみを割り当ててください +- ノートが一般的すぎる場合は、割り当てないでください +- テーマ別のグループ化において正確であってください +- 回答は有効な JSON のみにしてください +`.trim(), + ko: ` +당신은 주제별로 노트를 분류하여 노트북으로 정리하는 도우미입니다. + +사용 가능한 노트북: +${notebookList} + +정리할 노트 (받은 편지함): +${notesList} + +작업: +각 노트를 분석하고 가장 적절한 노트북을 제안하십시오. +고려 사항: +1. 노트의 주제/테마 (가장 중요) +2. 각 노트북의 기존 라벨 +3. 동일한 노트북 내 노트 간의 주제별 일관성 + +분류 가이드: +- 스포츠/운동/쇼핑 → 개인 노트북 +- 취미/열정/외출 → 개인 노트북 +- 건강/피트니스/의사 → 개인 노트북 또는 건강 +- 가족/친구 → 개인 노트북 +- 업무/회의/프로젝트 → 업무 노트북 +- 코딩/기술/개발 → 업무 노트북 또는 코드 +- 금융/청구서/은행 → 개인 노트북 또는 금융 + +응답 형식 (JSON): +각 노트북에 대해 속한 노트를 나열하십시오: +{ + "carnets": [ + { + "nom": "노트북 이름", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "한국어로 된 짧은 설명" + } + ] + } + ] +} + +규칙: +- 신뢰도가 0.60을 초과하는 노트만 할당하십시오 +- 노트가 너무 일반적인 경우 할당하지 마십시오 +- 주제별 그룹화에서 정확해야 합니다 +- 응답은 유효한 JSON이어야 합니다 +`.trim(), + zh: ` +你是一个助手,负责通过按主题将笔记分组到笔记本中来整理笔记。 + +可用笔记本: +${notebookList} + +待整理笔记(收件箱): +${notesList} + +任务: +分析每个笔记并建议最合适的笔记本。 +考虑: +1. 笔记的主题/题材(最重要) +2. 每个笔记本中的现有标签 +3. 同一笔记本中笔记之间的主题一致性 + +分类指南: +- 运动/锻炼/购物 → 个人笔记本 +- 爱好/激情/郊游 → 个人笔记本 +- 健康/健身/医生 → 个人笔记本或健康 +- 家庭/朋友 → 个人笔记本 +- 工作/会议/项目 → 工作笔记本 +- 编码/技术/开发 → 工作笔记本或代码 +- 金融/账单/银行 → 个人笔记本或金融 + +响应格式 (JSON): +对于每个笔记本,列出属于它的笔记: +{ + "carnets": [ + { + "nom": "笔记本名称", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "中文简短说明" + } + ] + } + ] +} + +规则: +- 仅分配置信度 > 0.60 的笔记 +- 如果笔记太普通,请勿分配 +- 在主题分组中要精确 +- 您的响应必须仅为有效的 JSON +`.trim(), + ar: ` +أنت مساعد يقوم بتنظيم الملاحظات عن طريق تجميعها حسب الموضوع في دفاتر ملاحظات. + +دفاتر الملاحظات المتاحة: +${notebookList} + +ملاحظات للتنظيم (صندوق الوارد): +${notesList} + +المهمة: +حلل كل ملاحظة واقترح دفتر الملاحظات الأكثر ملاءمة. +اعتبار: +1. موضوع/مادة الملاحظة (الأهم) +2. التسميات الموجودة في كل دفتر ملاحظات +3. الاتساق الموضوعي بين الملاحظات في نفس دفتر الملاحظات + +دليل التصنيف: +- الرياضة/التمرين/التسوق → دفتر ملاحظات شخصي +- الهوايات/الشغف/النزهات → دفتر ملاحظات شخصي +- الصحة/اللياقة البدنية/الطبيب → دفتر ملاحظات شخصي أو صحة +- العائلة/الأصدقاء → دفتر ملاحظات شخصي +- العمل/الاجتماعات/المشاريع → دفتر ملاحظات العمل +- البرمجة/التقنية/التطوير → دفتر ملاحظات العمل أو الكود +- المالية/الفواتير/البنك → دفتر ملاحظات شخصي أو مالية + +تنسيق الاستجابة (JSON): +لكل دفتر ملاحظات، ضع قائمة بالملاحظات التي تنتمي إليه: +{ + "carnets": [ + { + "nom": "اسم دفتر الملاحظات", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "شرح قصير باللغة العربية" + } + ] + } + ] +} + +القواعد: +- عيّن فقط الملاحظات ذات الثقة > 0.60 +- إذا كانت الملاحظة عامة جدًا، فلا تقم بتعيينها +- كن دقيقًا في مجموعاتك الموضوعية +- يجب أن تكون إجابتك بتنسيق JSON صالح فقط +`.trim(), + hi: ` +आप एक सहायक हैं जो नोटों को विषय के आधार पर नोटबुक में समूहित करके व्यवस्थित करते हैं। + +उपलब्ध नोटबुक: +${notebookList} + +व्यवस्थित करने के लिए नोट्स (इनबॉक्स): +${notesList} + +कार्य: +प्रत्येक नोट का विश्लेषण करें और सबसे उपयुक्त नोटबुक का सुझाव दें। +विचार करें: +1. नोट का विषय/थीम (सबसे महत्वपूर्ण) +2. प्रत्येक नोटबुक में मौजूदा लेबल +3. एक ही नोटबुक में नोटों के बीच विषयगत स्थिरता + +वर्गीकरण गाइड: +- खेल/व्यायाम/खरीदारी → व्यक्तिगत नोटबुक +- शौक/जुनून/बाहर जाना → व्यक्तिगत नोटबुक +- स्वास्थ्य/फिटनेस/डॉक्टर → व्यक्तिगत नोटबुक या स्वास्थ्य +- परिवार/मित्र → व्यक्तिगत नोटबुक +- कार्य/बैठकें/परियोजनाएं → कार्य नोटबुक +- कोडिंग/तकनीक/विकास → कार्य नोटबुक या कोड +- वित्त/बिल/बैंक → व्यक्तिगत नोटबुक या वित्त + +प्रतिक्रिया प्रारूप (JSON): +प्रत्येक नोटबुक के लिए, उन नोटों को सूचीबद्ध करें जो उससे संबंधित हैं: +{ + "carnets": [ + { + "nom": "नोटबुक का नाम", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "हिंदी में संक्षिप्त स्पष्टीकरण" + } + ] + } + ] +} + +नियम: +- केवल > 0.60 आत्मविश्वास वाले नोट्स असाइन करें +- यदि कोई नोट बहुत सामान्य है, तो उसे असाइन न करें +- अपने विषयगत समूहों में सटीक रहें +- आपकी प्रतिक्रिया केवल वैध JSON होनी चाहिए +`.trim(), + fa: ` +شما دستیاری هستید که یادداشت‌ها را با گروه‌بندی موضوعی در دفترچه‌ها سازماندهی می‌کنید. + +دفترچه‌های موجود: +${notebookList} + +یادداشت‌های برای سازماندهی (صندوق ورودی): +${notesList} + +وظیفه: +هر یادداشت را تحلیل کنید و مناسب‌ترین دفترچه را پیشنهاد دهید. +در نظر بگیرید: +1. موضوع/تم یادداشت (مهم‌ترین) +2. برچسب‌های موجود در هر دفترچه +3. سازگاری موضوعی بین یادداشت‌ها در همان دفترچه + +راهنمای طبقه‌بندی: +- ورزش/تمرین/خرید → دفترچه شخصی +- سرگرمی‌ها/علایق/گردش → دفترچه شخصی +- سلامت/تناسب اندام/پزشک → دفترچه شخصی یا سلامت +- خانواده/دوستان → دفترچه شخصی +- کار/جلسات/پروژه‌ها → دفترچه کار +- کدنویسی/تکنولوژی/توسعه → دفترچه کار یا کد +- مالی/قبض‌ها/بانک → دفترچه شخصی یا مالی + +فرمت پاسخ (JSON): +برای هر دفترچه، یادداشت‌هایی که به آن تعلق دارند را لیست کنید: +{ + "carnets": [ + { + "nom": "نام دفترچه", + "notes": [ + { + "index": 0, + "confiance": 0.95, + "raison": "توضیح کوتاه به فارسی" + } + ] + } + ] +} + +قوانین: +- فقط یادداشت‌های با اطمینان > 0.60 را اختصاص دهید +- اگر یادداشتی خیلی کلی است، آن را اختصاص ندهید +- در گروه‌بندی‌های موضوعی خود دقیق باشید +- پاسخ شما باید فقط یک JSON معتبر باشد `.trim() + } + + // Return instruction for requested language, fallback to English + return instructions[language] || instructions['en'] || instructions['fr'] } /** diff --git a/keep-notes/lib/ai/services/contextual-auto-tag.service.ts b/keep-notes/lib/ai/services/contextual-auto-tag.service.ts index 7569fe4..e4ed5ff 100644 --- a/keep-notes/lib/ai/services/contextual-auto-tag.service.ts +++ b/keep-notes/lib/ai/services/contextual-auto-tag.service.ts @@ -26,7 +26,8 @@ export class ContextualAutoTagService { async suggestLabels( noteContent: string, notebookId: string | null, - userId: string + userId: string, + language: string = 'en' ): Promise { // If no notebook, return empty (no context) if (!notebookId) { @@ -54,11 +55,11 @@ export class ContextualAutoTagService { // CASE 1: Notebook has existing labels → suggest from them (IA2) if (notebook.labels.length > 0) { - return await this.suggestFromExistingLabels(noteContent, notebook) + return await this.suggestFromExistingLabels(noteContent, notebook, language) } // CASE 2: Notebook has NO labels → suggest NEW labels to create - return await this.suggestNewLabels(noteContent, notebook) + return await this.suggestNewLabels(noteContent, notebook, language) } /** @@ -66,12 +67,13 @@ export class ContextualAutoTagService { */ private async suggestFromExistingLabels( noteContent: string, - notebook: any + notebook: any, + language: string ): Promise { const availableLabels = notebook.labels.map((l: any) => l.name) // Build prompt with available labels - const prompt = this.buildPrompt(noteContent, notebook.name, availableLabels) + const prompt = this.buildPrompt(noteContent, notebook.name, availableLabels, language) try { const config = await getSystemConfig() @@ -151,10 +153,11 @@ export class ContextualAutoTagService { */ private async suggestNewLabels( noteContent: string, - notebook: any + notebook: any, + language: string ): Promise { // Build prompt to suggest NEW labels based on content - const prompt = this.buildNewLabelsPrompt(noteContent, notebook.name) + const prompt = this.buildNewLabelsPrompt(noteContent, notebook.name, language) try { const config = await getSystemConfig() @@ -229,12 +232,13 @@ export class ContextualAutoTagService { } /** - * Build the AI prompt for contextual label suggestion + * Build the AI prompt for contextual label suggestion (localized) */ - private buildPrompt(noteContent: string, notebookName: string, availableLabels: string[]): string { + private buildPrompt(noteContent: string, notebookName: string, availableLabels: string[], language: string = 'en'): string { const labelList = availableLabels.map(l => `- ${l}`).join('\n') - return ` + const instructions: Record = { + fr: ` Tu es un assistant qui suggère les labels les plus appropriés pour une note. CONTENU DE LA NOTE : @@ -267,14 +271,154 @@ FORMAT DE RÉPONSE (JSON uniquement) : } Ta réponse : +`.trim(), + en: ` +You are an assistant that suggests the most appropriate labels for a note. + +NOTE CONTENT: +${noteContent.substring(0, 1000)} + +CURRENT NOTEBOOK: +${notebookName} + +AVAILABLE LABELS IN THIS NOTEBOOK: +${labelList} + +TASK: +Analyze the note content and suggest the MOST appropriate labels from the available labels above. +Consider: +1. Label relevance to content +2. Number of labels (maximum 3 suggestions) +3. Confidence (minimum threshold: 0.6) + +RULES: +- Suggest ONLY labels that are in the available labels list +- Return maximum 3 suggestions +- Each suggestion must have confidence > 0.6 +- If no label is relevant, return an empty array + +RESPONSE FORMAT (JSON only): +{ + "suggestions": [ + { "label": "label_name", "confidence": 0.85, "reasoning": "Why this label is relevant" } + ] +} + +Your response: +`.trim(), + fa: ` +شما یک دستیار هستید که مناسب‌ترین برچسب‌ها را برای یک یادداشت پیشنهاد می‌دهید. + +محتوای یادداشت: +${noteContent.substring(0, 1000)} + +دفترچه فعلی: +${notebookName} + +برچسب‌های موجود در این دفترچه: +${labelList} + +وظیفه: +محتوای یادداشت را تحلیل کنید و مناسب‌ترین برچسب‌ها را از لیست برچسب‌های موجود در بالا پیشنهاد دهید. +در نظر بگیرید: +1. ارتباط برچسب با محتوا +2. تعداد برچسب‌ها (حداکثر ۳ پیشنهاد) +3. اطمینان (حداقل آستانه: 0.6) + +قوانین: +- فقط برچسب‌هایی را پیشنهاد دهید که در لیست برچسب‌های موجود هستند +- حداکثر ۳ پیشنهاد برگردانید +- هر پیشنهاد باید دارای اطمینان > 0.6 باشد +- اگر هیچ برچسبی مرتبط نیست، یک اینرایه خالی برگردانید + +فرمت پاسخ (فقط JSON): +{ + "suggestions": [ + { "label": "نام_برچسب", "confidence": 0.85, "reasoning": "چرا این برچسب مرتبط است" } + ] +} + +پاسخ شما: +`.trim(), + es: ` +Eres un asistente que sugiere las etiquetas más apropiadas para una nota. + +CONTENIDO DE LA NOTA: +${noteContent.substring(0, 1000)} + +CUADERNO ACTUAL: +${notebookName} + +ETIQUETAS DISPONIBLES EN ESTE CUADERNO: +${labelList} + +TAREA: +Analiza el contenido de la nota y sugiere las etiquetas MÁS apropiadas de las etiquetas disponibles arriba. +Considera: +1. Relevancia de la etiqueta para el contenido +2. Número de etiquetas (máximo 3 sugerencias) +3. Confianza (umbral mínimo: 0.6) + +REGLAS: +- Sugiere SOLO etiquetas que estén en la lista de etiquetas disponibles +- Devuelve máximo 3 sugerencias +- Cada sugerencia debe tener confianza > 0.6 +- Si ninguna etiqueta es relevante, devuelve un array vacío + +FORMATO DE RESPUESTA (solo JSON): +{ + "suggestions": [ + { "label": "nombre_etiqueta", "confidence": 0.85, "reasoning": "Por qué esta etiqueta es relevante" } + ] +} + +Tu respuesta: +`.trim(), + de: ` +Du bist ein Assistent, der die passendsten Labels für eine Notiz vorschlägt. + +NOTIZINHALT: +${noteContent.substring(0, 1000)} + +AKTUELLES NOTIZBUCH: +${notebookName} + +VERFÜGBARE LABELS IN DIESEM NOTIZBUCH: +${labelList} + +AUFGABE: +Analysiere den Notizinhalt und schlage die AM BESTEN geeigneten Labels aus den oben verfügbaren Labels vor. +Berücksichtige: +1. Relevanz des Labels für den Inhalt +2. Anzahl der Labels (maximal 3 Vorschläge) +3. Konfidenz (Mindestschwellenwert: 0.6) + +REGELN: +- Schlage NUR Labels vor, die in der Liste der verfügbaren Labels sind +- Gib maximal 3 Vorschläge zurück +- Jeder Vorschlag muss eine Konfidenz > 0.6 haben +- Wenn kein Label relevant ist, gib ein leeres Array zurück + +ANTWORTFORMAT (nur JSON): +{ + "suggestions": [ + { "label": "label_name", "confidence": 0.85, "reasoning": "Warum dieses Label relevant ist" } + ] +} + +Deine Antwort: `.trim() + } + + return instructions[language] || instructions['en'] || instructions['fr'] } /** - * Build the AI prompt for NEW label suggestions (when notebook is empty) + * Build the AI prompt for NEW label suggestions (when notebook is empty) (localized) */ - private buildNewLabelsPrompt(noteContent: string, notebookName: string): string { - return ` + private buildNewLabelsPrompt(noteContent: string, notebookName: string, language: string = 'en'): string { + const instructions: Record = { + fr: ` Tu es un assistant qui suggère de nouveaux labels pour organiser une note. CONTENU DE LA NOTE : @@ -306,7 +450,141 @@ FORMAT DE RÉPONSE (JSON brut, sans markdown) : {"suggestions":[{"label":"nom_du_label","confidence":0.85,"reasoning":"Pourquoi ce label est pertinent"}]} Ta réponse (JSON brut uniquement) : +`.trim(), + en: ` +You are an assistant that suggests new labels to organize a note. + +NOTE CONTENT: +${noteContent.substring(0, 1000)} + +CURRENT NOTEBOOK: +${notebookName} + +CONTEXT: +This notebook has no labels yet. You must suggest the FIRST appropriate labels for this note. + +TASK: +Analyze the note content and suggest 1-3 labels that would be relevant to organize this note. +Consider: +1. Topics or themes covered +2. Content type (idea, task, reference, etc.) +3. Context of the notebook "${notebookName}" + +RULES: +- Labels must be SHORT (max 1-2 words) +- Labels must be lowercase +- Avoid accents if possible +- Return maximum 3 suggestions +- Each suggestion must have confidence > 0.6 + +IMPORTANT: Respond ONLY with valid JSON, without text before or after. No markdown, no code blocks. + +RESPONSE FORMAT (raw JSON, no markdown): +{"suggestions":[{"label":"label_name","confidence":0.85,"reasoning":"Why this label is relevant"}]} + +Your response (raw JSON only): +`.trim(), + fa: ` +شما یک دستیار هستید که برچسب‌های جدیدی برای سازماندهی یک یادداشت پیشنهاد می‌دهید. + +محتوای یادداشت: +${noteContent.substring(0, 1000)} + +دفترچه فعلی: +${notebookName} + +زمینه: +این دفترچه هنوز هیچ برچسبی ندارد. شما باید اولین برچسب‌های مناسب را برای این یادداشت پیشنهاد دهید. + +وظیفه: +محتوای یادداشت را تحلیل کنید و ۱-۳ برچسب پیشنهاد دهید که برای سازماندهی این یادداشت مرتبط باشند. +در نظر بگیرید: +1. موضوعات یا تم‌های پوشش داده شده +2. نوع محتوا (ایده، وظیفه، مرجع و غیره) +3. زمینه دفترچه "${notebookName}" + +قوانین: +- برچسب‌ها باید کوتاه باشند (حداکثر ۱-۲ کلمه) +- برچسب‌ها باید با حروف کوچک باشند +- حداکثر ۳ پیشنهاد برگردانید +- هر پیشنهاد باید دارای اطمینان > 0.6 باشد + +مهم: فقط با یک JSON معتبر پاسخ دهید، بدون متن قبل یا بعد. بدون مارک‌داون، بدون بلوک کد. + +فرمت پاسخ (JSON خام، بدون مارک‌داون): +{"suggestions":[{"label":"نام_برچسب","confidence":0.85,"reasoning":"چرا این برچسب مرتبط است"}]} + +پاسخ شما (فقط JSON خام): +`.trim(), + es: ` +Eres un asistente que sugiere nuevas etiquetas para organizar una nota. + +CONTENIDO DE LA NOTA: +${noteContent.substring(0, 1000)} + +CUADERNO ACTUAL: +${notebookName} + +CONTEXTO: +Este cuaderno aún no tiene etiquetas. Debes sugerir las PRIMERAS etiquetas apropiadas para esta nota. + +TAREA: +Analiza el contenido de la nota y sugiere 1-3 etiquetas que serían relevantes para organizar esta nota. +Considera: +1. Temas o tópicos cubiertos +2. Tipo de contenido (idea, tarea, referencia, etc.) +3. Contexto del cuaderno "${notebookName}" + +REGLAS: +- Las etiquetas deben ser CORTAS (máx 1-2 palabras) +- Las etiquetas deben estar en minúsculas +- Evita acentos si es posible +- Devuelve máximo 3 sugerencias +- Cada sugerencia debe tener confianza > 0.6 + +IMPORTANTE: Responde SOLO con JSON válido, sin texto antes o después. Sin markdown, sin bloques de código. + +FORMATO DE RESPUESTA (JSON crudo, sin markdown): +{"suggestions":[{"label":"nombre_etiqueta","confidence":0.85,"reasoning":"Por qué esta etiqueta es relevante"}]} + +Tu respuesta (solo JSON crudo): +`.trim(), + de: ` +Du bist ein Assistent, der neue Labels vorschlägt, um eine Notiz zu organisieren. + +NOTIZINHALT: +${noteContent.substring(0, 1000)} + +AKTUELLES NOTIZBUCH: +${notebookName} + +KONTEXT: +Dieses Notizbuch hat noch keine Labels. Du musst die ERSTEN passenden Labels für diese Notiz vorschlagen. + +AUFGABE: +Analysiere den Notizinhalt und schlage 1-3 Labels vor, die relevant wären, um diese Notiz zu organisieren. +Berücksichtige: +1. Abgedeckte Themen oder Bereiche +2. Inhaltstyp (Idee, Aufgabe, Referenz, usw.) +3. Kontext des Notizbuchs "${notebookName}" + +REGELN: +- Labels müssen KURZ sein (max 1-2 Wörter) +- Labels müssen kleingeschrieben sein +- Vermeide Akzente wenn möglich +- Gib maximal 3 Vorschläge zurück +- Jeder Vorschlag muss eine Konfidenz > 0.6 haben + +WICHTIG: Antworte NUR mit gültigem JSON, ohne Text davor oder danach. Kein Markdown, keine Code-Blöcke. + +ANTWORTFORMAT (rohes JSON, kein Markdown): +{"suggestions":[{"label":"label_name","confidence":0.85,"reasoning":"Warum dieses Label relevant ist"}]} + +Deine Antwort (nur rohes JSON): `.trim() + } + + return instructions[language] || instructions['en'] || instructions['fr'] } } diff --git a/keep-notes/lib/ai/services/notebook-suggestion.service.ts b/keep-notes/lib/ai/services/notebook-suggestion.service.ts index 3deb24d..bc5724a 100644 --- a/keep-notes/lib/ai/services/notebook-suggestion.service.ts +++ b/keep-notes/lib/ai/services/notebook-suggestion.service.ts @@ -10,7 +10,7 @@ export class NotebookSuggestionService { * @param userId - User ID (for fetching user's notebooks) * @returns Suggested notebook or null (if no good match) */ - async suggestNotebook(noteContent: string, userId: string): Promise { + async suggestNotebook(noteContent: string, userId: string, language: string = 'en'): Promise { // 1. Get all notebooks for this user const notebooks = await prisma.notebook.findMany({ where: { userId }, @@ -28,7 +28,7 @@ export class NotebookSuggestionService { } // 2. Build prompt for AI (always in French - interface language) - const prompt = this.buildPrompt(noteContent, notebooks) + const prompt = this.buildPrompt(noteContent, notebooks, language) // 3. Call AI try { @@ -57,9 +57,9 @@ export class NotebookSuggestionService { } /** - * Build the AI prompt for notebook suggestion (always in French - interface language) + * Build the AI prompt for notebook suggestion (localized) */ - private buildPrompt(noteContent: string, notebooks: any[]): string { + private buildPrompt(noteContent: string, notebooks: any[], language: string = 'en'): string { const notebookList = notebooks .map(nb => { const labels = nb.labels.map((l: any) => l.name).join(', ') @@ -68,7 +68,8 @@ export class NotebookSuggestionService { }) .join('\n') - return ` + const instructions: Record = { + fr: ` Tu es un assistant qui suggère à quel carnet une note devrait appartenir. CONTENU DE LA NOTE : @@ -107,7 +108,148 @@ Exemples : - "Achat d'une chemise et d'un jean" → carnet "Personnel" Ta suggestion : +`.trim(), + en: ` +You are an assistant that suggests which notebook a note should belong to. + +NOTE CONTENT: +${noteContent.substring(0, 500)} + +AVAILABLE NOTEBOOKS: +${notebookList} + +TASK: +Analyze the note content (regardless of language) and suggest the MOST appropriate notebook for this note. +Consider: +1. The subject/theme of the note (MOST IMPORTANT) +2. Existing labels in each notebook +3. The number of notes (prefer notebooks with related content) + +CLASSIFICATION GUIDE: +- SPORT/EXERCISE/SHOPPING/GROCERIES → Personal Notebook +- HOBBIES/PASSIONS/OUTINGS → Personal Notebook +- HEALTH/FITNESS/DOCTOR → Personal Notebook or Health +- FAMILY/FRIENDS → Personal Notebook +- WORK/MEETINGS/PROJECTS/CLIENTS → Work Notebook +- CODING/TECH/DEVELOPMENT → Work Notebook or Code +- FINANCE/BILLS/BANKING → Personal Notebook or Finance + +RULES: +- Return ONLY the notebook name, EXACTLY as listed above (case insensitive) +- If no good match exists, return "NONE" +- If the note is too generic/vague, return "NONE" +- Do not include explanations or extra text + +Examples: +- "Meeting with John about project planning" → notebook "Work" +- "Grocery list or buying clothes" → notebook "Personal" +- "Python script for data analysis" → notebook "Code" +- "Gym session or fitness" → notebook "Personal" + +Your suggestion: +`.trim(), + fa: ` +شما یک دستیار هستید که پیشنهاد می‌دهد یک یادداشت به کدام دفترچه تعلق داشته باشد. + +محتوای یادداشت: +${noteContent.substring(0, 500)} + +دفترچه‌های موجود: +${notebookList} + +وظیفه: +محتوای یادداشت را تحلیل کنید (صرف نظر از زبان) و مناسب‌ترین دفترچه را برای این یادداشت پیشنهاد دهید. +در نظر بگیرید: +1. موضوع/تم یادداشت (مهم‌ترین) +2. برچسب‌های موجود در هر دفترچه +3. تعداد یادداشت‌ها (دفترچه‌های با محتوای مرتبط را ترجیح دهید) + +راهنمای طبقه‌بندی: +- ورزش/تمرین/خرید → دفترچه شخصی +- سرگرمی‌ها/علایق/گردش → دفترچه شخصی +- سلامت/تناسب اندام/پزشک → دفترچه شخصی یا سلامت +- خانواده/دوستان → دفترچه شخصی +- کار/جلسات/پروژه‌ها/مشتریان → دفترچه کار +- کدنویسی/تکنولوژی/توسعه → دفترچه کار یا کد +- مالی/قبض‌ها/بانک → دفترچه شخصی یا مالی + +قوانین: +- فقط نام دفترچه را برگردانید، دقیقاً همانطور که در بالا ذکر شده است (بدون حساسیت به حروف بزرگ و کوچک) +- اگر تطابق خوبی وجود ندارد، "NONE" را برگردانید +- اگر یادداشت خیلی کلی/مبهم است، "NONE" را برگردانید +- توضیحات یا متن اضافی را شامل نکنید + +پیشناد شما: +`.trim(), + es: ` +Eres un asistente que sugiere a qué cuaderno debería pertenecer una nota. + +CONTENIDO DE LA NOTA: +${noteContent.substring(0, 500)} + +CUADERNOS DISPONIBLES: +${notebookList} + +TAREA: +Analiza el contenido de la nota (independientemente del idioma) y sugiere el cuaderno MÁS apropiado para esta nota. +Considera: +1. El tema/asunto de la nota (LO MÁS IMPORTANTE) +2. Etiquetas existentes en cada cuaderno +3. El número de notas (prefiere cuadernos con contenido relacionado) + +GUÍA DE CLASIFICACIÓN: +- DEPORTE/EJERCICIO/COMPRAS → Cuaderno Personal +- HOBBIES/PASIONES/SALIDAS → Cuaderno Personal +- SALUD/FITNESS/DOCTOR → Cuaderno Personal o Salud +- FAMILIA/AMIGOS → Cuaderno Personal +- TRABAJO/REUNIONES/PROYECTOS → Cuaderno Trabajo +- CODING/TECH/DESARROLLO → Cuaderno Trabajo o Código +- FINANZAS/FACTURAS/BANCO → Cuaderno Personal o Finanzas + +REGLAS: +- Devuelve SOLO el nombre del cuaderno, EXACTAMENTE como se lista arriba (insensible a mayúsculas/minúsculas) +- Si no existe una buena coincidencia, devuelve "NONE" +- Si la nota es demasiado genérica/vaga, devuelve "NONE" +- No incluyas explicaciones o texto extra + +Tu sugerencia: +`.trim(), + de: ` +Du bist ein Assistent, der vorschlägt, zu welchem Notizbuch eine Notiz gehören sollte. + +NOTIZINHALT: +${noteContent.substring(0, 500)} + +VERFÜGBARE NOTIZBÜCHER: +${notebookList} + +AUFGABE: +Analysiere den Notizinhalt (unabhängig von der Sprache) und schlage das AM BESTEN geeignete Notizbuch für diese Notiz vor. +Berücksichtige: +1. Das Thema/den Inhalt der Notiz (AM WICHTIGSTEN) +2. Vorhandene Labels in jedem Notizbuch +3. Die Anzahl der Notizen (bevorzuge Notizbücher mit verwandtem Inhalt) + +KLASSIFIZIERUNGSLEITFADEN: +- SPORT/ÜBUNG/EINKAUFEN → Persönliches Notizbuch +- HOBBYS/LEIDENSCHAFTEN → Persönliches Notizbuch +- GESUNDHEIT/FITNESS/ARZT → Persönliches Notizbuch oder Gesundheit +- FAMILIE/FREUNDE → Persönliches Notizbuch +- ARBEIT/MEETINGS/PROJEKTE → Arbeitsnotizbuch +- CODING/TECH/ENTWICKLUNG → Arbeitsnotizbuch oder Code +- FINANZEN/RECHNUNGEN/BANK → Persönliches Notizbuch oder Finanzen + +REGELN: +- Gib NUR den Namen des Notizbuchs zurück, GENAU wie oben aufgeführt (Groß-/Kleinschreibung egal) +- Wenn keine gute Übereinstimmung existiert, gib "NONE" zurück +- Wenn die Notiz zu allgemein/vage ist, gib "NONE" zurück +- Füge keine Erklärungen oder zusätzlichen Text hinzu + +Dein Vorschlag: `.trim() + } + + return instructions[language] || instructions['en'] || instructions['fr'] } /** @@ -118,14 +260,15 @@ Ta suggestion : */ async suggestNotebooksBatch( noteContents: string[], - userId: string + userId: string, + language: string = 'en' ): Promise> { const results = new Map() // For efficiency, we could batch this into a single AI call // For now, process sequentially (could be parallelized) for (let i = 0; i < noteContents.length; i++) { - const suggestion = await this.suggestNotebook(noteContents[i], userId) + const suggestion = await this.suggestNotebook(noteContents[i], userId, language) results.set(i, suggestion) } diff --git a/keep-notes/lib/ai/services/notebook-summary.service.ts b/keep-notes/lib/ai/services/notebook-summary.service.ts index fbe6003..d2a37ce 100644 --- a/keep-notes/lib/ai/services/notebook-summary.service.ts +++ b/keep-notes/lib/ai/services/notebook-summary.service.ts @@ -26,7 +26,7 @@ export class NotebookSummaryService { * @param userId - User ID (for authorization) * @returns Notebook summary or null */ - async generateSummary(notebookId: string, userId: string): Promise { + async generateSummary(notebookId: string, userId: string, language: string = 'en'): Promise { // 1. Get notebook with notes and labels const notebook = await prisma.notebook.findFirst({ where: { @@ -79,7 +79,7 @@ export class NotebookSummaryService { } // 2. Generate summary using AI - const summary = await this.generateAISummary(notes, notebook) + const summary = await this.generateAISummary(notes, notebook, language) // 3. Get labels used in this notebook const labelsUsed = Array.from( @@ -107,7 +107,7 @@ export class NotebookSummaryService { /** * Use AI to generate notebook summary */ - private async generateAISummary(notes: any[], notebook: any): Promise { + private async generateAISummary(notes: any[], notebook: any, language: string): Promise { // Build notes summary for AI const notesSummary = notes .map((note, index) => { @@ -122,7 +122,7 @@ ${content}...` }) .join('\n\n') - const prompt = this.buildPrompt(notesSummary, notebook.name) + const prompt = this.buildPrompt(notesSummary, notebook.name, language) try { const config = await getSystemConfig() @@ -136,10 +136,11 @@ ${content}...` } /** - * Build prompt for AI (always in French - interface language) + * Build prompt for AI (localized) */ - private buildPrompt(notesSummary: string, notebookName: string): string { - return ` + private buildPrompt(notesSummary: string, notebookName: string, language: string = 'en'): string { + const instructions: Record = { + fr: ` Tu es un assistant qui génère des synthèses structurées de carnets de notes. CARNET: ${notebookName} @@ -181,9 +182,197 @@ RÈGLES: - Identifie les vraies tendances, ne pas inventer d'informations - Si une section n'est pas pertinente, utilise "N/A" ou omets-la - Ton: professionnel mais accessible +- TA RÉPONSE DOIT ÊTRE EN FRANÇAIS Ta réponse : +`.trim(), + en: ` +You are an assistant that generates structured summaries of notebooks. + +NOTEBOOK: ${notebookName} + +NOTEBOOK NOTES: +${notesSummary} + +TASK: +Generate a structured and organized summary of this notebook by analyzing all notes. + +RESPONSE FORMAT (Markdown with emojis): + +# 📊 Summary of Notebook ${notebookName} + +## 🌍 Main Themes +• Identify 3-5 recurring themes or topics covered + +## 📝 Statistics +• Total number of notes analyzed +• Main content categories + +## 📅 Temporal Elements +• Important dates or periods mentioned +• Planned vs past events + +## ⚠️ Action Items / Attention Points +• Tasks or actions identified in notes +• Important reminders or deadlines +• Items requiring special attention + +## 💡 Key Insights +• Summary of most important information +• Observed trends or patterns +• Connections between different notes + +RULES: +- Use Markdown format with emojis as in the example +- Be concise and organize information clearly +- Identify real trends, do not invent information +- If a section is not relevant, use "N/A" or omit it +- Tone: professional but accessible +- YOUR RESPONSE MUST BE IN ENGLISH + +Your response: +`.trim(), + fa: ` +شما یک دستیار هستید که خلاصه‌های ساختاریافته از دفترچه‌های یادداشت تولید می‌کنید. + +دفترچه: ${notebookName} + +یادداشت‌های دفترچه: +${notesSummary} + +وظیفه: +یک خلاصه ساختاریافته و منظم از این دفترچه با تحلیل تمام یادداشت‌ها تولید کنید. + +فرمت پاسخ (مارک‌داون با ایموجی): + +# 📊 خلاصه دفترچه ${notebookName} + +## 🌍 موضوعات اصلی +• ۳-۵ موضوع تکرارشونده یا مبحث پوشش داده شده را شناسایی کنید + +## 📝 آمار +• تعداد کل یادداشت‌های تحلیل شده +• دسته‌بندی‌های اصلی محتوا + +## 📅 عناصر زمانی +• تاریخ‌ها یا دوره‌های مهم ذکر شده +• رویدادهای برنامه‌ریزی شده در مقابل گذشته + +## ⚠️ موارد اقدام / نقاط توجه +• وظایف یا اقدامات شناسایی شده در یادداشت‌ها +• یادآوری‌ها یا مهلت‌های مهم +• مواردی که نیاز به توجه ویژه دارند + +## 💡 بینش‌های کلیدی +• خلاصه مهم‌ترین اطلاعات +• روندها یا الگوهای مشاهده شده +• ارتباطات بین یادداشت‌های مختلف + +قوانین: +- از فرمت مارک‌داون با ایموجی مانند مثال استفاده کنید +- مختصر باشید و اطلاعات را به وضوح سازماندهی کنید +- روندهای واقعی را شناسایی کنید، اطلاعات اختراع نکنید +- اگر بخش مرتبط نیست، از "N/A" استفاده کنید یا آن را حذف کنید +- لحن: حرفه‌ای اما قابل دسترس +- پاسخ شما باید به زبان فارسی باشد + +پاسخ شما: +`.trim(), + es: ` +Eres un asistente que genera resúmenes estructurados de cuadernos de notas. + +CUADERNO: ${notebookName} + +NOTAS DEL CUADERNO: +${notesSummary} + +TAREA: +Genera un resumen estructurado y organizado de este cuaderno analizando todas las notas. + +FORMATO DE RESPUESTA (Markdown con emojis): + +# 📊 Resumen del Cuaderno ${notebookName} + +## 🌍 Temas Principales +• Identifica 3-5 temas recurrentes o tópicos cubiertos + +## 📝 Estadísticas +• Número total de notas analizadas +• Categorías principales de contenido + +## 📅 Elementos Temporales +• Fechas o periodos importantes mencionados +• Eventos planificados vs pasados + +## ⚠️ Puntos de Atención / Acciones Requeridas +• Tareas o acciones identificadas en las notas +• Recordatorios o plazos importantes +• Elementos que requieren atención especial + +## 💡 Insights Clave +• Resumen de la información más importante +• Tendencias o patrones observados +• Conexiones entre las diferentes notas + +REGLAS: +- Usa formato Markdown con emojis como en el ejemplo +- Sé conciso y organiza la información claramente +- Identifica tendencias reales, no inventes información +- Si una sección no es relevante, usa "N/A" u omítela +- Tono: profesional pero accesible +- TU RESPUESTA DEBE SER EN ESPAÑOL + +Tu respuesta: +`.trim(), + de: ` +Du bist ein Assistent, der strukturierte Zusammenfassungen von Notizbüchern erstellt. + +NOTIZBUCH: ${notebookName} + +NOTIZBUCH-NOTIZEN: +${notesSummary} + +AUFGABE: +Erstelle eine strukturierte und organisierte Zusammenfassung dieses Notizbuchs, indem du alle Notizen analysierst. + +ANTWORTFORMAT (Markdown mit Emojis): + +# 📊 Zusammenfassung des Notizbuchs ${notebookName} + +## 🌍 Hauptthemen +• Identifiziere 3-5 wiederkehrende Themen + +## 📝 Statistiken +• Gesamtzahl der analysierten Notizen +• Hauptinhaltkategorien + +## 📅 Zeitliche Elemente +• Wichtige erwähnte Daten oder Zeiträume +• Geplante vs. vergangene Ereignisse + +## ⚠️ Handlungspunkte / Aufmerksamkeitspunkte +• In Notizen identifizierte Aufgaben oder Aktionen +• Wichtige Erinnerungen oder Fristen +• Elemente, die besondere Aufmerksamkeit erfordern + +## 💡 Wichtige Erkenntnisse +• Zusammenfassung der wichtigsten Informationen +• Beobachtete Trends oder Muster +• Verbindungen zwischen verschiedenen Notizen + +REGELN: +- Verwende Markdown-Format mit Emojis wie im Beispiel +- Sei prägnant und organisiere Informationen klar +- Identifiziere echte Trends, erfinde keine Informationen +- Wenn ein Abschnitt nicht relevant ist, verwende "N/A" oder lass ihn weg +- Ton: professionell aber zugänglich +- DEINE ANTWORT MUSS AUF DEUTSCH SEIN + +Deine Antwort: `.trim() + } + + return instructions[language] || instructions['en'] || instructions['fr'] } } diff --git a/keep-notes/lib/i18n/load-translations.ts b/keep-notes/lib/i18n/load-translations.ts index 497fabf..069f051 100644 --- a/keep-notes/lib/i18n/load-translations.ts +++ b/keep-notes/lib/i18n/load-translations.ts @@ -24,6 +24,15 @@ export interface Translations { createAccount: string rememberMe: string orContinueWith: string + checkYourEmail: string + resetEmailSent: string + returnToLogin: string + forgotPasswordTitle: string + forgotPasswordDescription: string + sending: string + sendResetLink: string + backToLogin: string + signOut: string } sidebar: { notes: string @@ -65,6 +74,8 @@ export interface Translations { invalidDateTime: string reminderMustBeFuture: string reminderSet: string + reminderPastError: string + reminderRemoved: string addImage: string addLink: string linkAdded: string @@ -92,6 +103,34 @@ export interface Translations { noNotes: string noNotesFound: string createFirstNote: string + size: string + small: string + medium: string + large: string + shareWithCollaborators: string + view: string + edit: string + readOnly: string + preview: string + noContent: string + takeNote: string + takeNoteMarkdown: string + addItem: string + sharedReadOnly: string + makeCopy: string + saving: string + copySuccess: string + copyFailed: string + copy: string + markdownOn: string + markdownOff: string + undo: string + redo: string + } + pagination: { + previous: string + pageInfo: string + next: string } labels: { title: string @@ -110,9 +149,19 @@ export interface Translations { labelName: string labelColor: string manageLabels: string + manageLabelsDescription: string + selectedLabels: string + allLabels: string clearAll: string filterByLabel: string tagAdded: string + showLess: string + showMore: string + editLabels: string + editLabelsDescription: string + noLabelsFound: string + loading: string + notebookRequired: string } search: { placeholder: string @@ -133,6 +182,27 @@ export interface Translations { canEdit: string canView: string shareNote: string + shareWithCollaborators: string + addCollaboratorDescription: string + viewerDescription: string + emailAddress: string + enterEmailAddress: string + invite: string + peopleWithAccess: string + noCollaborators: string + noCollaboratorsViewer: string + pendingInvite: string + pending: string + remove: string + unnamedUser: string + done: string + willBeAdded: string + alreadyInList: string + nowHasAccess: string + accessRevoked: string + errorLoading: string + failedToAdd: string + failedToRemove: string } ai: { analyzing: string @@ -143,6 +213,64 @@ export interface Translations { poweredByAI: string languageDetected: string processing: string + tagAdded: string + titleGenerating: string + titleGenerateWithAI: string + titleGenerationMinWords: string + titleGenerationError: string + titlesGenerated: string + titleGenerationFailed: string + titleApplied: string + reformulationNoText: string + reformulationSelectionTooShort: string + reformulationMinWords: string + reformulationMaxWords: string + reformulationError: string + reformulationFailed: string + reformulationApplied: string + transformMarkdown: string + transforming: string + transformSuccess: string + transformError: string + assistant: string + generating: string + generateTitles: string + reformulateText: string + reformulating: string + clarify: string + shorten: string + improveStyle: string + reformulationComparison: string + original: string + reformulated: string + } + batchOrganization: { + error: string + noNotesSelected: string + title: string + description: string + analyzing: string + notesToOrganize: string + selected: string + noNotebooks: string + noSuggestions: string + confidence: string + unorganized: string + applying: string + apply: string + } + autoLabels: { + error: string + noLabelsSelected: string + created: string + analyzing: string + title: string + description: string + note: string + notes: string + typeContent: string + createNewLabel: string + new: string } titleSuggestions: { available: string @@ -169,6 +297,71 @@ export interface Translations { description: string dailyInsight: string insightReady: string + viewConnection: string + helpful: string + notHelpful: string + dismiss: string + thanksFeedback: string + thanksFeedbackImproving: string + connections: string + connection: string + connectionsBadge: string + fused: string + overlay: { + title: string + searchPlaceholder: string + sortBy: string + sortSimilarity: string + sortRecent: string + sortOldest: string + viewAll: string + loading: string + noConnections: string + } + comparison: { + title: string + similarityInfo: string + highSimilarityInsight: string + untitled: string + clickToView: string + helpfulQuestion: string + helpful: string + notHelpful: string + } + editorSection: { + title: string + loading: string + view: string + compare: string + merge: string + compareAll: string + mergeAll: string + } + fusion: { + title: string + mergeNotes: string + notesToMerge: string + optionalPrompt: string + promptPlaceholder: string + generateFusion: string + generating: string + previewTitle: string + edit: string + modify: string + finishEditing: string + optionsTitle: string + archiveOriginals: string + keepAllTags: string + useLatestTitle: string + createBacklinks: string + cancel: string + confirmFusion: string + success: string + error: string + generateError: string + noContentReturned: string + unknownDate: string + } } nav: { home: string @@ -181,6 +374,29 @@ export interface Translations { aiSettings: string logout: string login: string + adminDashboard: string + diagnostics: string + trash: string + support: string + reminders: string + userManagement: string + accountSettings: string + manageAISettings: string + configureAI: string + supportDevelopment: string + supportDescription: string + buyMeACoffee: string + donationDescription: string + donateOnKofi: string + donationNote: string + sponsorOnGithub: string + sponsorDescription: string + workspace: string + quickAccess: string + myLibrary: string + favorites: string + recent: string + proPlan: string } settings: { title: string @@ -230,6 +446,21 @@ export interface Translations { profileError: string accountSettings: string manageAISettings: string + displaySettings: string + displaySettingsDescription: string + fontSize: string + selectFontSize: string + fontSizeSmall: string + fontSizeMedium: string + fontSizeLarge: string + fontSizeExtraLarge: string + fontSizeDescription: string + fontSizeUpdateSuccess: string + fontSizeUpdateFailed: string + showRecentNotes: string + showRecentNotesDescription: string + recentNotesUpdateSuccess: string + recentNotesUpdateFailed: string } aiSettings: { title: string @@ -287,6 +518,25 @@ export interface Translations { save: string cancel: string } + notebook: { + create: string + createNew: string + createDescription: string + name: string + selectIcon: string + selectColor: string + cancel: string + creating: string + edit: string + editDescription: string + delete: string + deleteWarning: string + deleteConfirm: string + summary: string + summaryDescription: string + generating: string + summaryError: string + } notebookSuggestion: { title: string description: string @@ -296,6 +546,354 @@ export interface Translations { moveToNotebook: string generalNotes: string } + admin: { + title: string + userManagement: string + aiTesting: string + settings: string + security: { + title: string + description: string + allowPublicRegistration: string + allowPublicRegistrationDescription: string + updateSuccess: string + updateFailed: string + } + ai: { + title: string + description: string + tagsGenerationProvider: string + tagsGenerationDescription: string + embeddingsProvider: string + embeddingsDescription: string + provider: string + baseUrl: string + model: string + apiKey: string + selectOllamaModel: string + openAIKeyDescription: string + modelRecommendations: string + commonModelsDescription: string + selectEmbeddingModel: string + commonEmbeddingModels: string + saving: string + saveSettings: string + openTestPanel: string + updateSuccess: string + updateFailed: string + providerTagsRequired: string + providerEmbeddingRequired: string + } + smtp: { + title: string + description: string + host: string + port: string + username: string + password: string + fromEmail: string + forceSSL: string + ignoreCertErrors: string + saveSettings: string + sending: string + testEmail: string + updateSuccess: string + updateFailed: string + testSuccess: string + testFailed: string + } + users: { + createUser: string + addUser: string + createUserDescription: string + name: string + email: string + password: string + role: string + createSuccess: string + createFailed: string + deleteSuccess: string + deleteFailed: string + roleUpdateSuccess: string + roleUpdateFailed: string + table: { + name: string + email: string + role: string + createdAt: string + actions: string + } + } + aiTest: { + title: string + description: string + tagsTestTitle: string + tagsTestDescription: string + embeddingsTestTitle: string + embeddingsTestDescription: string + howItWorksTitle: string + provider: string + model: string + testing: string + runTest: string + testPassed: string + testFailed: string + responseTime: string + generatedTags: string + embeddingDimensions: string + vectorDimensions: string + first5Values: string + error: string + testError: string + tipTitle: string + tipDescription: string + } + } + about: { + title: string + description: string + appName: string + appDescription: string + version: string + buildDate: string + platform: string + platformWeb: string + features: { + title: string + description: string + titleSuggestions: string + semanticSearch: string + paragraphReformulation: string + memoryEcho: string + notebookOrganization: string + dragDrop: string + labelSystem: string + multipleProviders: string + } + technology: { + title: string + description: string + frontend: string + backend: string + database: string + authentication: string + ai: string + ui: string + testing: string + } + support: { + title: string + description: string + documentation: string + reportIssues: string + feedback: string + } + } + support: { + title: string + description: string + buyMeACoffee: string + donationDescription: string + donateOnKofi: string + kofiDescription: string + sponsorOnGithub: string + sponsorDescription: string + githubDescription: string + howSupportHelps: string + directImpact: string + sponsorPerks: string + transparency: string + transparencyDescription: string + hostingServers: string + domainSSL: string + aiApiCosts: string + totalExpenses: string + otherWaysTitle: string + starGithub: string + reportBug: string + contributeCode: string + shareTwitter: string + } + demoMode: { + title: string + activated: string + deactivated: string + toggleFailed: string + description: string + parametersActive: string + similarityThreshold: string + delayBetweenNotes: string + unlimitedInsights: string + createNotesTip: string + } + resetPassword: { + title: string + description: string + invalidLinkTitle: string + invalidLinkDescription: string + requestNewLink: string + newPassword: string + confirmNewPassword: string + resetting: string + resetPassword: string + passwordMismatch: string + success: string + loading: string + } + dataManagement: { + title: string + toolsDescription: string + export: { + title: string + description: string + button: string + success: string + failed: string + } + import: { + title: string + description: string + button: string + success: string + failed: string + } + delete: { + title: string + description: string + button: string + confirm: string + success: string + failed: string + } + indexing: { + title: string + description: string + button: string + success: string + failed: string + } + cleanup: { + title: string + description: string + button: string + failed: string + } + } + appearance: { + title: string + description: string + } + generalSettings: { + title: string + description: string + } + toast: { + saved: string + saveFailed: string + operationSuccess: string + operationFailed: string + openingConnection: string + openConnectionFailed: string + thanksFeedback: string + thanksFeedbackImproving: string + feedbackFailed: string + notesFusionSuccess: string + } + testPages: { + titleSuggestions: { + title: string + contentLabel: string + placeholder: string + wordCount: string + status: string + analyzing: string + idle: string + error: string + suggestions: string + noSuggestions: string + } + } + trash: { + title: string + empty: string + restore: string + deletePermanently: string + } + footer: { + privacy: string + terms: string + openSource: string + } + connection: { + similarityInfo: string + clickToView: string + isHelpful: string + helpful: string + notHelpful: string + memoryEchoDiscovery: string + } + diagnostics: { + title: string + configuredProvider: string + apiStatus: string + testDetails: string + troubleshootingTitle: string + tip1: string + tip2: string + tip3: string + tip4: string + } + batch: { + organizeWithAI: string + organize: string + } + common: { + unknown: string + notAvailable: string + loading: string + error: string + success: string + confirm: string + cancel: string + close: string + save: string + delete: string + edit: string + add: string + remove: string + search: string + noResults: string + required: string + optional: string + } + time: { + justNow: string + minutesAgo: string + hoursAgo: string + daysAgo: string + yesterday: string + today: string + tomorrow: string + } + favorites: { + title: string + toggleSection: string + noFavorites: string + pinToFavorite: string + } + notebooks: { + create: string + allNotebooks: string + noNotebooks: string + createFirst: string + } + ui: { + close: string + open: string + expand: string + collapse: string + } + [key: string]: any } /** @@ -304,12 +902,11 @@ export interface Translations { export async function loadTranslations(language: SupportedLanguage): Promise { try { const translations = await import(`@/locales/${language}.json`) - return translations.default as Translations + return translations.default as unknown as Translations } catch (error) { console.error(`Failed to load translations for ${language}:`, error) - // Fallback to English const enTranslations = await import(`@/locales/en.json`) - return enTranslations.default as Translations + return enTranslations.default as unknown as Translations } } diff --git a/keep-notes/locales/ar.json b/keep-notes/locales/ar.json index c410c2e..592e24b 100644 --- a/keep-notes/locales/ar.json +++ b/keep-notes/locales/ar.json @@ -1,553 +1,993 @@ { - "auth": { - "signIn": "تسجيل الدخول", - "signUp": "إنشاء حساب", - "email": "البريد الإلكتروني", - "password": "كلمة المرور", - "name": "الاسم", - "emailPlaceholder": "أدخل عنوان بريدك الإلكتروني", - "passwordPlaceholder": "أدخل كلمة المرور", - "namePlaceholder": "أدخل اسمك", - "passwordMinChars": "أدخل كلمة المرور (6 أحرف على الأقل)", - "resetPassword": "إعادة تعيين كلمة المرور", - "resetPasswordInstructions": "أدخل بريدك الإلكتروني لإعادة تعيين كلمة المرور", - "forgotPassword": "هل نسيت كلمة المرور؟", - "noAccount": "ليس لديك حساب؟", - "hasAccount": "لديك حساب بالفعل؟", - "signInToAccount": "سجل الدخول إلى حسابك", - "createAccount": "أنشئ حسابك", - "rememberMe": "تذكرني", - "orContinueWith": "أو المتابعة مع", - "checkYourEmail": "تحقق من بريدك الإلكتروني", - "resetEmailSent": "أرسلنا رابط إعادة تعيين كلمة المرور إلى عنوان بريدك الإلكتروني إذا كان موجوداً في نظامنا.", - "returnToLogin": "العودة إلى تسجيل الدخول", - "forgotPasswordTitle": "نسيان كلمة المرور", - "forgotPasswordDescription": "أدخل عنوان بريدك الإلكتروني وسنرسل لك رابطاً لإعادة تعيين كلمة المرور.", - "sending": "جاري الإرسال...", - "sendResetLink": "إرسال رابط إعادة التعيين", - "backToLogin": "العودة إلى تسجيل الدخول" - }, - "notes": { - "title": "الملاحظات", - "newNote": "ملاحظة جديدة", - "untitled": "بدون عنوان", - "placeholder": "اكتب ملاحظة...", - "markdownPlaceholder": "اكتب ملاحظة... (Markdown مدعوم)", - "titlePlaceholder": "العنوان", - "listItem": "عنصر قائمة", - "addListItem": "+ عنصر قائمة", - "newChecklist": "قائمة تحقق جديدة", - "add": "إضافة", - "adding": "جاري الإضافة...", - "close": "إغلاق", - "confirmDelete": "هل أنت متأكد أنك تريد حذف هذه الملاحظة؟", - "confirmLeaveShare": "هل أنت متأكد أنك تريد مغادرة هذه الملاحظة المشتركة؟", - "sharedBy": "شاركها", - "leaveShare": "مغادرة", - "delete": "حذف", - "archive": "أرشفة", - "unarchive": "إلغاء الأرشفة", - "pin": "تثبيت", - "unpin": "إلغاء التثبيت", - "color": "اللون", - "changeColor": "تغيير اللون", - "setReminder": "تعيين تذكير", - "setReminderButton": "تعيين تذكير", - "date": "التاريخ", - "time": "الوقت", - "reminderDateTimeRequired": "الرجاء إدخال التاريخ والوقت", - "invalidDateTime": "تاريخ أو وقت غير صالح", - "reminderMustBeFuture": "يجب أن يكون التذكير في المستقبل", - "reminderSet": "تم تعيين التذكير في {datetime}", - "reminderPastError": "يجب أن يكون التذكير في المستقبل", - "reminderRemoved": "تم إزالة التذكير", - "addImage": "إضافة صورة", - "addLink": "إضافة رابط", - "linkAdded": "تمت إضافة الرابط", - "linkMetadataFailed": "تعذر جلب بيانات التعريف الخاصة بالرابط", - "linkAddFailed": "فشل في إضافة الرابط", - "invalidFileType": "نوع ملف غير صالح: {fileName}. يُسمح فقط بـ JPEG و PNG و GIF و WebP.", - "fileTooLarge": "الملف كبير جداً: {fileName}. الحد الأقصى للحجم هو {maxSize}.", - "uploadFailed": "فشل في رفع {filename}", - "contentOrMediaRequired": "الرجاء إدخال بعض المحتوى أو إضافة رابط/صورة", - "itemOrMediaRequired": "الرجاء إضافة عنصر واحد على الأقل أو وسائط", - "noteCreated": "تم إنشاء الملاحظة بنجاح", - "noteCreateFailed": "فشل في إنشاء الملاحظة", - "aiAssistant": "مساعد الذكاء الاصطناعي", - "changeSize": "تغيير الحجم", - "backgroundOptions": "خيارات الخلفية", - "moreOptions": "المزيد من الخيارات", - "remindMe": "ذكرني", - "markdownMode": "Markdown", - "addCollaborators": "إضافة متعاونين", - "duplicate": "نسخ", - "share": "مشاركة", - "showCollaborators": "إظهار المتعاونين", - "pinned": "مثبتة", - "others": "أخرى", - "noNotes": "لا توجد ملاحظات", - "noNotesFound": "لم يتم العثور على ملاحظات", - "createFirstNote": "أنشئ ملاحظتك الأولى", - "size": "الحجم", - "small": "صغير", - "medium": "متوسط", - "large": "كبير", - "shareWithCollaborators": "المشاركة مع المتعاونين", - "view": "عرض الملاحظة", - "edit": "تعديل الملاحظة", - "readOnly": "قراءة فقط", - "preview": "معاينة", - "noContent": "لا يوجد محتوى", - "takeNote": "اكتب ملاحظة...", - "takeNoteMarkdown": "اكتب ملاحظة... (Markdown مدعوم)", - "addItem": "إضافة عنصر", - "sharedReadOnly": "هذه الملاحظة مشتركة معك في وضع القراءة فقط", - "makeCopy": "إنشاء نسخة", - "saving": "جاري الحفظ...", - "copySuccess": "تم نسخ الملاحظة بنجاح!", - "copyFailed": "فشل في نسخ الملاحظة", - "copy": "نسخ", - "markdownOn": "Markdown مفعّل", - "markdownOff": "Markdown معطّل", - "undo": "تراجع (Ctrl+Z)", - "redo": "إعادة (Ctrl+Y)" - }, - "pagination": { - "previous": "←", - "pageInfo": "صفحة {currentPage} من {totalPages}", - "next": "→" - }, - "ai": { - "analyzing": "الذكاء الاصطناعي يحلل...", - "clickToAddTag": "انقر لإضافة هذا الوسم", - "ignoreSuggestion": "تجاهل هذا الاقتراح", - "generatingTitles": "جاري إنشاء العناوين...", - "generateTitlesTooltip": "إنشاء عناوين بالذكاء الاصطناعي", - "poweredByAI": "مدعوم بالذكاء الاصطناعي", - "languageDetected": "تم اكتشاف اللغة", - "processing": "جاري المعالجة...", - "tagAdded": "تمت إضافة الوسم \"{tag}\"", - "titleGenerating": "جاري الإنشاء...", - "titleGenerateWithAI": "إنشاء عناوين بالذكاء الاصطناعي", - "titleGenerationMinWords": "يجب أن يحتوي المحتوى على 10 كلمات على الأقل لإنشاء العناوين (الحالي: {count} كلمات)", - "titleGenerationError": "خطأ في إنشاء العناوين", - "titlesGenerated": "💡 تم إنشاء {count} عنوان!", - "titleGenerationFailed": "فشل في إنشاء العناوين", - "titleApplied": "تم تطبيق العنوان!", - "reformulationNoText": "الرجاء تحديد النص أو إضافة محتوى", - "reformulationSelectionTooShort": "التحديد قصير جداً، سيتم استخدام المحتوى الكامل", - "reformulationMinWords": "يجب أن يحتوي النص على 10 كلمات على الأقل (الحالي: {count} كلمات)", - "reformulationMaxWords": "يجب أن يحتوي النص على 500 كلمة كحد أقصى", - "reformulationError": "خطأ أثناء إعادة الصياغة", - "reformulationFailed": "فشل في إعادة صياغة النص", - "reformulationApplied": "تم تطبيق النص المعاد صياغته!", - "transformMarkdown": "التحويل إلى Markdown", - "transforming": "جاري التحويل...", - "transformSuccess": "تم تحويل النص إلى Markdown بنجاح!", - "transformError": "خطأ أثناء التحويل", - "assistant": "مساعد الذكاء الاصطناعي", - "generating": "جاري الإنشاء...", - "generateTitles": "إنشاء عناوين", - "reformulateText": "إعادة صياغة النص", - "reformulating": "جاري إعادة الصياغة...", - "clarify": "توضيح", - "shorten": "اختصار", - "improveStyle": "تحسين الأسلوب", - "reformulationComparison": "مقارنة إعادة الصياغة", - "original": "الأصلي", - "reformulated": "معاد صياغته", - "batchOrganization": { - "error": "فشل في إنشاء خطة التنظيم", - "noNotesSelected": "لم يتم تحديد ملاحظات", - "title": "التنظيم بالذكاء الاصطناعي", - "description": "س يقوم الذكاء الاصطناعي بتحليل ملاحظاتك ويقترح تنظيمها في دفاتر.", - "analyzing": "جاري تحليل الملاحظات...", - "notesToOrganize": "{count} ملاحظة للتنظيم", - "selected": "{count} محددة", - "noNotebooks": "لا توجد دفاتر متاحة. أنشئ أولاً دفاتر لتنظيم ملاحظاتك.", - "noSuggestions": "لم يتمكن الذكاء الاصطناعي من إيجاد طريقة جيدة لتنظيم هذه الملاحظات.", - "confidence": "ثقة", - "unorganized": "{count} ملاحظة لم يتم تصنيفها وستبقى في الملاحظات العامة.", - "applying": "جاري التطبيق...", - "apply": "تطبيق ({count})" + "about": { + "appDescription": "تطبيق ملاحظات قوي مع ميزات مدعومة بالذكاء الاصطناعي", + "appName": "Keep Notes", + "buildDate": "تاريخ البناء", + "description": "معلومات حول التطبيق", + "features": { + "description": "قدرات مدعومة بالذكاء الاصطناعي", + "dragDrop": "إدارة الملاحظات بالسحب والإفلات", + "labelSystem": "نظام التسميات", + "memoryEcho": "رؤى Memory Echo اليومية", + "multipleProviders": "مزودو ذكاء اصطناعي متعددون (OpenAI، Ollama)", + "notebookOrganization": "تنظيم الدفاتر", + "paragraphReformulation": "إعادة صياغة الفقرات", + "semanticSearch": "بحث دلالي مع التضمينات", + "title": "الميزات", + "titleSuggestions": "اقتراحات عناوين مدعومة بالذكاء الاصطناعي" }, - "autoLabels": { - "error": "فشل في جلب اقتراحات الوسوم", - "noLabelsSelected": "لم يتم تحديد وسم", - "created": "تم إنشاء {count} وسم بنجاح", - "analyzing": "جاري تحليل الملاحظات...", - "title": "اقتراحات وسم جديدة", - "description": "لقد اكتشفت موضوعات متكررة في \"{notebookName}\" ({totalNotes} ملاحظة). إنشاء وسم لها؟", - "note": "ملاحظة", - "notes": "ملاحظات", - "typeContent": "اكتب المحتوى للحصول على اقتراحات الوسوم...", - "createNewLabel": "إنشاء هذا الوسم الجديد وإضافته", - "new": "(جديد)" + "platform": "المنصة", + "platformWeb": "الويب", + "support": { + "description": "احصل على المساعدة وقدم الملاحظات", + "documentation": "التوثيق", + "feedback": "الملاحظات", + "reportIssues": "الإبلاغ عن المشاكل", + "title": "الدعم" + }, + "technology": { + "ai": "الذكاء الاصطناعي", + "authentication": "المصادقة", + "backend": "الواجهة الخلفية", + "database": "قاعدة البيانات", + "description": "مبني بتقنيات حديثة", + "frontend": "الواجهة الأمامية", + "testing": "الاختبار", + "title": "مجموعة التقنيات", + "ui": "واجهة المستخدم" + }, + "title": "حول", + "version": "الإصدار" + }, + "admin": { + "ai": { + "apiKey": "مفتاح API", + "baseUrl": "عنوان URL الأساسي", + "commonEmbeddingModels": "نماذج التضمين الشائعة لواجهات API المتوافقة مع OpenAI", + "commonModelsDescription": "النماذج الشائعة لواجهات API المتوافقة مع OpenAI", + "description": "تكوين مزودي الذكاء الاصطناعي للوسوم التلقائية والبحث الدلالي. استخدم مزودين مختلفين للحصول على أفضل أداء.", + "embeddingsDescription": "مزود الذكاء الاصطناعي لتضمينات البحث الدلالي. موصى به: OpenAI (أفضل جودة).", + "embeddingsProvider": "مزود التضمينات", + "model": "النموذج", + "modelRecommendations": "gpt-4o-mini = أفضل قيمة • gpt-4o = أفضل جودة", + "openAIKeyDescription": "مفتاح OpenAI API الخاص بك من platform.openai.com", + "openTestPanel": "فتح لوحة اختبار الذكاء الاصطناعي", + "provider": "المزود", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING مطلوب", + "providerTagsRequired": "AI_PROVIDER_TAGS مطلوب", + "saveSettings": "حفظ إعدادات الذكاء الاصطناعي", + "saving": "جاري الحفظ...", + "selectEmbeddingModel": "اختر نموذج التضمين المثبت على نظامك", + "selectOllamaModel": "اختر نموذج Ollama المثبت على نظامك", + "tagsGenerationDescription": "مزود الذكاء الاصطناعي لاقتراحات الوسوم التلقائية. موصى به: Ollama (مجاني، محلي).", + "tagsGenerationProvider": "مزود توليد الوسوم", + "title": "تكوين الذكاء الاصطناعي", + "updateFailed": "فشل تحديث إعدادات الذكاء الاصطناعي", + "updateSuccess": "تم تحديث إعدادات الذكاء الاصطناعي بنجاح" + }, + "aiTest": { + "description": "اختبر مزودي الذكاء الاصطناعي لتوليد الوسوم وتضمينات البحث الدلالي", + "embeddingDimensions": "أبعاد التضمين:", + "embeddingsTestDescription": "اختبر مزود الذكاء الاصطناعي المسؤول عن تضمينات البحث الدلالي", + "embeddingsTestTitle": "اختبار التضمينات", + "error": "خطأ:", + "first5Values": "أول 5 قيم:", + "generatedTags": "الوسوم المولدة:", + "howItWorksTitle": "كيف يعمل الاختبار", + "model": "النموذج:", + "provider": "المزود:", + "responseTime": "وقت الاستجابة: {time} مللي ثانية", + "runTest": "تشغيل الاختبار", + "tagsTestDescription": "اختبر مزود الذكاء الاصطناعي المسؤول عن اقتراحات الوسوم التلقائية", + "tagsTestTitle": "اختبار توليد الوسوم", + "testError": "خطأ في الاختبار: {error}", + "testFailed": "فشل الاختبار", + "testPassed": "نجح الاختبار", + "testing": "جاري الاختبار...", + "tipDescription": "استخدم لوحة اختبار الذكاء الاصطناعي لتشخيص مشاكل التكوين قبل الاختبار.", + "tipTitle": "نصيحة:", + "title": "اختبار مزود الذكاء الاصطناعي", + "vectorDimensions": "أبعاد المتجه" + }, + "aiTesting": "اختبار الذكاء الاصطناعي", + "security": { + "allowPublicRegistration": "السماح بالتسجيل العام", + "allowPublicRegistrationDescription": "إذا تم تعطيله، يمكن للمشرف فقط إضافة مستخدمين جدد عبر صفحة إدارة المستخدمين.", + "description": "إدارة التحكم في الوصول وسياسات التسجيل.", + "title": "إعدادات الأمان", + "updateFailed": "فشل تحديث إعدادات الأمان", + "updateSuccess": "تم تحديث إعدادات الأمان" + }, + "settings": "إعدادات المشرف", + "smtp": { + "description": "تكوين خادم البريد الإلكتروني لإعادة تعيين كلمة المرور.", + "forceSSL": "فرض SSL/TLS (عادة للمنفذ 465)", + "fromEmail": "من البريد الإلكتروني", + "host": "المضيف", + "ignoreCertErrors": "تجاهل أخطاء الشهادة (للمضيف الذاتي/التطوير فقط)", + "password": "كلمة المرور", + "port": "المنفذ", + "saveSettings": "حفظ إعدادات SMTP", + "sending": "جاري الإرسال...", + "testEmail": "بريد إلكتروني تجريبي", + "testFailed": "فشل: {error}", + "testSuccess": "تم إرسال البريد الإلكتروني التجريبي بنجاح!", + "title": "تكوين SMTP", + "updateFailed": "فشل تحديث إعدادات SMTP", + "updateSuccess": "تم تحديث إعدادات SMTP", + "username": "اسم المستخدم" + }, + "title": "لوحة تحكم المشرف", + "userManagement": "إدارة المستخدمين", + "users": { + "addUser": "إضافة مستخدم", + "confirmDelete": "Are you sure? This action cannot be undone.", + "createFailed": "فشل إنشاء المستخدم", + "createSuccess": "تم إنشاء المستخدم بنجاح", + "createUser": "إنشاء مستخدم", + "createUserDescription": "إضافة مستخدم جديد إلى النظام.", + "deleteFailed": "فشل الحذف", + "deleteSuccess": "تم حذف المستخدم", + "demote": "تخفيض", + "email": "البريد الإلكتروني", + "name": "الاسم", + "password": "كلمة المرور", + "promote": "ترقية", + "role": "الدور", + "roleUpdateFailed": "فشل تحديث الدور", + "roleUpdateSuccess": "تم تحديث دور المستخدم إلى {role}", + "roles": { + "admin": "مشرف", + "user": "مستخدم" + }, + "table": { + "actions": "الإجراءات", + "createdAt": "تاريخ الإنشاء", + "email": "البريد الإلكتروني", + "name": "الاسم", + "role": "الدور" + } } }, - "memoryEcho.fusion": { - "generateError": "فشل في إنشاء الاندماج", - "noContentReturned": "لم يتم إرجاع محتوى اندماج من API", - "unknownDate": "تاريخ غير معروف" - }, - "labels": { - "title": "التسميات", - "filter": "تصفية حسب التسمية", - "manage": "إدارة التسميات", - "manageTooltip": "إدارة التسميات", - "changeColor": "تغيير اللون", - "changeColorTooltip": "تغيير اللون", - "delete": "حذف", - "deleteTooltip": "حذف التسمية", - "confirmDelete": "هل أنت متأكد أنك تريد حذف هذه التسمية؟", - "newLabelPlaceholder": "إنشاء تسمية جديدة", - "namePlaceholder": "أدخل اسم التسمية", - "addLabel": "إضافة تسمية", - "createLabel": "إنشاء تسمية", - "labelName": "اسم التسمية", - "labelColor": "لون التسمية", - "manageLabels": "إدارة التسميات", - "manageLabelsDescription": "أضف أو أزل التسميات لهذه الملاحظة. انقر على تسمية لتغيير لونها.", - "selectedLabels": "التسميات المحددة", - "allLabels": "جميع التسميات", - "clearAll": "مسح الكل", - "filterByLabel": "تصفية حسب التسمية", - "tagAdded": "تمت إضافة الوسم \"{tag}\"", - "showLess": "عرض أقل", - "showMore": "عرض المزيد", - "editLabels": "تعديل التسميات", - "editLabelsDescription": "إنشاء أو تحرير ألوان أو حذف التسميات.", - "noLabelsFound": "لم يتم العثور على تسميات.", - "loading": "جاري التحميل...", - "notebookRequired": "⚠️ التسميات متاحة فقط في الدفاتر. انقل هذه الملاحظة إلى دفتر أولاً." - }, - "search": { - "placeholder": "بحث", - "searchPlaceholder": "ابحث في ملاحظاتك...", - "semanticInProgress": "البحث الدلالي جارٍ...", - "semanticTooltip": "البحث الدلالي بالذكاء الاصطناعي", - "searching": "جاري البحث...", - "noResults": "لم يتم العثور على نتائج", - "resultsFound": "تم العثور على {count} ملاحظة", - "exactMatch": "تطابق تام", - "related": "ذات صلة" - }, - "collaboration": { - "emailPlaceholder": "أدخل عنوان البريد الإلكتروني", - "addCollaborator": "إضافة متعاون", - "removeCollaborator": "إزالة متعاون", - "owner": "المالك", - "canEdit": "يمكنه التعديل", - "canView": "يمكنه العرض", - "shareNote": "مشاركة الملاحظة", - "shareWithCollaborators": "المشاركة مع المتعاونين", - "addCollaboratorDescription": "أضف أشخاصاً للتعاون في هذه الملاحظة من خلال عنوان البريد الإلكتروني.", - "viewerDescription": "لديك حق الوصول إلى هذه الملاحظة. المالك فقط يمكنه إدارة المتعاونين.", - "emailAddress": "عنوان البريد الإلكتروني", - "enterEmailAddress": "أدخل عنوان البريد الإلكتروني", - "invite": "دعوة", - "peopleWithAccess": "الأشخاص الذين لديهم حق الوصول", - "noCollaborators": "لا يوجد متعاونون حتى الآن. أضف شخصاً في الأعلى!", - "noCollaboratorsViewer": "لا يوجد متعاونون حتى الآن.", - "pendingInvite": "دعوة معلقة", - "pending": "معلق", - "remove": "إزالة", - "unnamedUser": "مستخدم بدون اسم", - "done": "تم", - "willBeAdded": "سيتم إضافة {email} كمتعاون عند إنشاء الملاحظة", - "alreadyInList": "هذا البريد الإلكتروني موجود بالفعل في القائمة", - "nowHasAccess": "{name} لديه الآن حق الوصول إلى هذه الملاحظة", - "accessRevoked": "تم إلغاء حق الوصول", - "errorLoading": "خطأ في تحميل المتعاونين", - "failedToAdd": "فشل في إضافة متعاون", - "failedToRemove": "فشل في إزالة متعاون" - }, "ai": { "analyzing": "الذكاء الاصطناعي يحلل...", + "assistant": "مساعد الذكاء الاصطناعي", + "autoLabels": { + "analyzing": "تحليل ملاحظاتك لاقتراحات التصنيفات...", + "create": "إنشاء", + "createNewLabel": "Create this new label and add it", + "created": "{count} labels created successfully", + "creating": "إنشاء التصنيفات...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(جديد)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "اقتراحات التصنيفات", + "typeContent": "Type content to get label suggestions..." + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Failed to apply organization plan", + "applying": "Applying...", + "description": "سيقوم الذكاء الاصطناعي بتحليل ملاحظاتك واقتراح تنظيمها في دفاتر.", + "error": "Failed to create organization plan", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "No notes selected", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Select all notes in {notebook}", + "selectNote": "Select note: {title}", + "success": "{count} notes moved successfully", + "title": "Organize with AI" + }, + "clarify": "توضيح", "clickToAddTag": "انقر لإضافة هذا الوسم", - "ignoreSuggestion": "تجاهل هذا الاقتراح", - "generatingTitles": "جاري إنشاء العناوين...", + "generateTitles": "إنشاء عناوين", "generateTitlesTooltip": "إنشاء عناوين بالذكاء الاصطناعي", - "poweredByAI": "مدعوم بالذكاء الاصطناعي", + "generating": "جاري الإنشاء...", + "generatingTitles": "جاري إنشاء العناوين...", + "ignoreSuggestion": "تجاهل هذا الاقتراح", + "improveStyle": "تحسين الأسلوب", "languageDetected": "تم اكتشاف اللغة", + "notebookSummary": { + "regenerate": "إعادة إنشاء الملخص", + "regenerating": "إعادة إنشاء الملخص..." + }, + "original": "الأصلي", + "poweredByAI": "مدعوم بالذكاء الاصطناعي", "processing": "جاري المعالجة...", - "tagAdded": "تمت إضافة الوسم \"{tag}\"", - "titleGenerating": "جاري الإنشاء...", - "titleGenerateWithAI": "إنشاء عناوين بالذكاء الاصطناعي", - "titleGenerationMinWords": "يجب أن يحتوي المحتوى على 10 كلمات على الأقل لإنشاء العناوين (الحالي: {count} كلمات)", - "titleGenerationError": "خطأ في إنشاء العناوين", - "titlesGenerated": "💡 تم إنشاء {count} عنوان!", - "titleGenerationFailed": "فشل في إنشاء العناوين", - "titleApplied": "تم تطبيق العنوان!", - "reformulationNoText": "الرجاء تحديد النص أو إضافة محتوى", - "reformulationSelectionTooShort": "التحديد قصير جداً، سيتم استخدام المحتوى الكامل", - "reformulationMinWords": "يجب أن يحتوي النص على 10 كلمات على الأقل (الحالي: {count} كلمات)", - "reformulationMaxWords": "يجب أن يحتوي النص على 500 كلمة كحد أقصى", + "reformulateText": "إعادة صياغة النص", + "reformulated": "معاد صياغته", + "reformulating": "جاري إعادة الصياغة...", + "reformulationApplied": "تم تطبيق النص المعاد صياغته!", + "reformulationComparison": "مقارنة إعادة الصياغة", "reformulationError": "خطأ أثناء إعادة الصياغة", "reformulationFailed": "فشل في إعادة صياغة النص", - "reformulationApplied": "تم تطبيق النص المعاد صياغته!", - "transformMarkdown": "التحويل إلى Markdown", - "transforming": "جاري التحويل...", - "transformSuccess": "تم تحويل النص إلى Markdown بنجاح!", - "transformError": "خطأ أثناء التحويل", - "assistant": "مساعد الذكاء الاصطناعي", - "generating": "جاري الإنشاء...", - "generateTitles": "إنشاء عناوين", - "reformulateText": "إعادة صياغة النص", - "reformulating": "جاري إعادة الصياغة...", - "clarify": "توضيح", + "reformulationMaxWords": "يجب أن يحتوي النص على 500 كلمة كحد أقصى", + "reformulationMinWords": "يجب أن يحتوي النص على 10 كلمات على الأقل (الحالي: {count} كلمات)", + "reformulationNoText": "الرجاء تحديد النص أو إضافة محتوى", + "reformulationSelectionTooShort": "التحديد قصير جداً، سيتم استخدام المحتوى الكامل", "shorten": "اختصار", - "improveStyle": "تحسين الأسلوب", - "reformulationComparison": "مقارنة إعادة الصياغة", - "original": "الأصلي", - "reformulated": "معاد صياغته" + "tagAdded": "تمت إضافة الوسم \"{tag}\"", + "titleApplied": "تم تطبيق العنوان!", + "titleGenerateWithAI": "إنشاء عناوين بالذكاء الاصطناعي", + "titleGenerating": "جاري الإنشاء...", + "titleGenerationError": "خطأ في إنشاء العناوين", + "titleGenerationFailed": "فشل في إنشاء العناوين", + "titleGenerationMinWords": "يجب أن يحتوي المحتوى على 10 كلمات على الأقل لإنشاء العناوين (الحالي: {count} كلمات)", + "titlesGenerated": "💡 تم إنشاء {count} عنوان!", + "transformError": "خطأ أثناء التحويل", + "transformMarkdown": "التحويل إلى Markdown", + "transformSuccess": "تم تحويل النص إلى Markdown بنجاح!", + "transforming": "جاري التحويل..." }, - "titleSuggestions": { - "available": "اقتراحات العنوان", - "title": "اقتراحات الذكاء الاصطناعي", - "generating": "جاري الإنشاء...", - "selectTitle": "اختر عنواناً", - "dismiss": "تجاهل" + "aiSettings": { + "description": "تكوين ميزاتك وتفضيلاتك المدعومة بالذكاء الاصطناعي", + "error": "فشل في تحديث الإعداد", + "features": "ميزات الذكاء الاصطناعي", + "frequency": "التكرار", + "frequencyDaily": "يومي", + "frequencyWeekly": "أسبوعي", + "provider": "مزود الذكاء الاصطناعي", + "providerAuto": "تلقائي (موصى به)", + "providerOllama": "Ollama (محلي)", + "providerOpenAI": "OpenAI (سحابة)", + "saved": "تم تحديث الإعداد", + "saving": "جاري الحفظ...", + "title": "إعدادات الذكاء الاصطناعي", + "titleSuggestionsDesc": "اقتراح عناوين للملاحظات بدون عنوان بعد 50+ كلمة", + "paragraphRefactorDesc": "خيارات تحسين النص بالذكاء الاصطناعي", + "frequencyDesc": "عدد مرات تحليل روابط الملاحظات", + "providerDesc": "اختر مزود الذكاء الاصطناعي المفضل", + "providerAutoDesc": "Ollama عند توفره، OpenAI كبديل", + "providerOllamaDesc": "خصوصية 100%، يعمل محليًا", + "providerOpenAIDesc": "الأكثر دقة، يتطلب مفتاح API" + }, + "appearance": { + "description": "تخصيص مظهر التطبيق", + "title": "المظهر" + }, + "auth": { + "backToLogin": "العودة إلى تسجيل الدخول", + "checkYourEmail": "تحقق من بريدك الإلكتروني", + "createAccount": "أنشئ حسابك", + "email": "البريد الإلكتروني", + "emailPlaceholder": "أدخل عنوان بريدك الإلكتروني", + "forgotPassword": "هل نسيت كلمة المرور؟", + "forgotPasswordDescription": "أدخل عنوان بريدك الإلكتروني وسنرسل لك رابطاً لإعادة تعيين كلمة المرور.", + "forgotPasswordTitle": "نسيان كلمة المرور", + "hasAccount": "لديك حساب بالفعل؟", + "name": "الاسم", + "namePlaceholder": "أدخل اسمك", + "noAccount": "ليس لديك حساب؟", + "orContinueWith": "أو المتابعة مع", + "password": "كلمة المرور", + "passwordMinChars": "أدخل كلمة المرور (6 أحرف على الأقل)", + "passwordPlaceholder": "أدخل كلمة المرور", + "rememberMe": "تذكرني", + "resetEmailSent": "أرسلنا رابط إعادة تعيين كلمة المرور إلى عنوان بريدك الإلكتروني إذا كان موجوداً في نظامنا.", + "resetPassword": "إعادة تعيين كلمة المرور", + "resetPasswordInstructions": "أدخل بريدك الإلكتروني لإعادة تعيين كلمة المرور", + "returnToLogin": "العودة إلى تسجيل الدخول", + "sendResetLink": "إرسال رابط إعادة التعيين", + "sending": "جاري الإرسال...", + "signIn": "تسجيل الدخول", + "signInToAccount": "سجل الدخول إلى حسابك", + "signOut": "Sign out", + "signUp": "إنشاء حساب" + }, + "autoLabels": { + "analyzing": "جاري تحليل الملاحظات...", + "createNewLabel": "إنشاء هذا الوسم الجديد وإضافته", + "created": "تم إنشاء {count} وسم بنجاح", + "description": "لقد اكتشفت موضوعات متكررة في \"{notebookName}\" ({totalNotes} ملاحظة). إنشاء وسم لها؟", + "error": "فشل في جلب اقتراحات الوسوم", + "new": "(جديد)", + "noLabelsSelected": "لم يتم تحديد وسم", + "note": "ملاحظة", + "notes": "ملاحظات", + "title": "اقتراحات وسم جديدة", + "typeContent": "اكتب المحتوى للحصول على اقتراحات الوسوم...", + "typeForSuggestions": "اكتب للحصول على اقتراحات..." + }, + "batch": { + "organize": "تنظيم", + "organizeWithAI": "تنظيم بالذكاء الاصطناعي" + }, + "batchOrganization": { + "analyzing": "جاري تحليل الملاحظات...", + "apply": "تطبيق ({count})", + "applyFailed": "فشل تطبيق التنظيم", + "applying": "جاري التطبيق...", + "confidence": "ثقة", + "description": "س يقوم الذكاء الاصطناعي بتحليل ملاحظاتك ويقترح تنظيمها في دفاتر.", + "error": "فشل في إنشاء خطة التنظيم", + "noNotebooks": "لا توجد دفاتر متاحة. أنشئ أولاً دفاتر لتنظيم ملاحظاتك.", + "noNotesSelected": "لم يتم تحديد ملاحظات", + "noSuggestions": "لم يتمكن الذكاء الاصطناعي من إيجاد طريقة جيدة لتنظيم هذه الملاحظات.", + "notesToOrganize": "{count} ملاحظة للتنظيم", + "selectAllIn": "تحديد الكل", + "selectNote": "اختر ملاحظة", + "selected": "{count} محددة", + "success": "نجح التنظيم", + "title": "التنظيم بالذكاء الاصطناعي", + "unorganized": "{count} ملاحظة لم يتم تصنيفها وستبقى في الملاحظات العامة." + }, + "collaboration": { + "accessRevoked": "Access has been revoked", + "addCollaborator": "Add collaborator", + "addCollaboratorDescription": "Add people to collaborate on this note by their email address.", + "alreadyInList": "This email is already in the list", + "canEdit": "Can edit", + "canView": "Can view", + "done": "Done", + "emailAddress": "Email address", + "emailPlaceholder": "Enter email address", + "enterEmailAddress": "Enter email address", + "errorLoading": "Error loading collaborators", + "failedToAdd": "Failed to add collaborator", + "failedToRemove": "Failed to remove collaborator", + "invite": "Invite", + "noCollaborators": "No collaborators yet. Add someone above!", + "noCollaboratorsViewer": "No collaborators yet.", + "nowHasAccess": "{name} now has access to this note", + "owner": "Owner", + "pending": "Pending", + "pendingInvite": "Pending Invite", + "peopleWithAccess": "People with access", + "remove": "Remove", + "removeCollaborator": "Remove collaborator", + "shareNote": "Share note", + "shareWithCollaborators": "Share with collaborators", + "unnamedUser": "Unnamed User", + "viewerDescription": "You have access to this note. Only the owner can manage collaborators.", + "willBeAdded": "{email} will be added as collaborator when note is created" + }, + "colors": { + "blue": "أزرق", + "default": "الافتراضي", + "gray": "رمادي", + "green": "أخضر", + "orange": "برتقالي", + "pink": "وردي", + "purple": "بنفسجي", + "red": "أحمر", + "yellow": "أصفر" + }, + "common": { + "add": "إضافة", + "cancel": "إلغاء", + "close": "إغلاق", + "confirm": "تأكيد", + "delete": "حذف", + "edit": "تعديل", + "error": "خطأ", + "loading": "جاري التحميل...", + "noResults": "لا توجد نتائج", + "notAvailable": "غير متاح", + "optional": "اختياري", + "remove": "إزالة", + "required": "مطلوب", + "save": "حفظ", + "search": "بحث", + "success": "نجاح", + "unknown": "غير معروف" + }, + "connection": { + "clickToView": "انقر لعرض الملاحظة", + "helpful": "مفيد", + "isHelpful": "هل هذا الاتصال مفيد؟", + "memoryEchoDiscovery": "اكتشاف Memory Echo", + "notHelpful": "غير مفيد", + "similarityInfo": "هذه الملاحظات متصلة بنسبة تشابه {similarity}%" + }, + "dataManagement": { + "cleanup": { + "button": "تنظيف", + "description": "إزالة التسميات والاتصالات التي تشير إلى ملاحظات محذوفة.", + "failed": "حدث خطأ أثناء التنظيف", + "title": "تنظيف البيانات اليتيمة" + }, + "cleanupComplete": "اكتمل التنظيف", + "cleanupError": "خطأ في التنظيف", + "dangerZone": "المنطقة الخطرة", + "dangerZoneDescription": "هذه العمليات لا يمكن التراجع عنها، يرجى الحذر", + "delete": { + "button": "حذف جميع الملاحظات", + "confirm": "هل أنت متأكد؟ سيؤدي هذا إلى حذف جميع ملاحظاتك نهائياً.", + "description": "حذف جميع ملاحظاتك نهائياً. لا يمكن التراجع عن هذا الإجراء.", + "failed": "فشل حذف الملاحظات", + "success": "تم حذف جميع الملاحظات", + "title": "حذف جميع الملاحظات" + }, + "deleting": "جاري الحذف...", + "export": { + "button": "تصدير الملاحظات", + "description": "قم بتنزيل جميع ملاحظاتك كملف JSON. يتضمن جميع المحتوى والتسميات والبيانات الوصفية.", + "failed": "فشل تصدير الملاحظات", + "success": "تم تصدير الملاحظات بنجاح", + "title": "تصدير جميع الملاحظات" + }, + "exporting": "جاري التصدير...", + "import": { + "button": "استيراد الملاحظات", + "description": "قم بتحميل ملف JSON لاستيراد الملاحظات. سيتم إضافتها إلى ملاحظاتك الحالية دون استبدالها.", + "failed": "فشل استيراد الملاحظات", + "success": "تم استيراد {count} ملاحظة", + "title": "استيراد الملاحظات" + }, + "importing": "جاري الاستيراد...", + "indexing": { + "button": "إعادة بناء الفهرس", + "description": "إعادة توليد التضمينات لجميع الملاحظات لتحسين البحث الدلالي.", + "failed": "حدث خطأ أثناء الفهرسة", + "success": "اكتملت الفهرسة: تمت معالجة {count} ملاحظة", + "title": "إعادة بناء فهرس البحث" + }, + "indexingComplete": "اكتملت الفهرسة", + "indexingError": "خطأ في الفهرسة", + "title": "إدارة البيانات", + "toolsDescription": "أدوات للحفاظ على صحة قاعدة البيانات" + }, + "demoMode": { + "activated": "تم تفعيل الوضع التجريبي! سيعمل Memory Echo الآن فوراً.", + "createNotesTip": "أنشئ ملاحظتين متشابهتين أو أكثر وشاهد Memory Echo أثناء العمل!", + "deactivated": "تم تعطيل الوضع التجريبي. تم استعادة المعلمات العادية.", + "delayBetweenNotes": "تأخير 0 يوم بين الملاحظات (عادة 7 أيام)", + "description": "تسريع Memory Echo للاختبار. تظهر الاتصالات فوراً.", + "parametersActive": "معلمات العرض النشطة:", + "similarityThreshold": "50% عتبة التشابه (عادة 75%)", + "title": "الوضع التجريبي", + "toggleFailed": "فشل في تبديل الوضع التجريبي", + "unlimitedInsights": "رؤى غير محدودة (بدون حدود للتكرار)" + }, + "diagnostics": { + "apiStatus": "حالة API", + "checking": "Checking...", + "configuredProvider": "المزود المكوّن", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "تفاصيل الاختبار:", + "tip1": "تأكد من تشغيل Ollama (ollama serve)", + "tip2": "تحقق من تثبيت النموذج (ollama pull llama3)", + "tip3": "تحقق من مفتاح OpenAI API الخاص بك", + "tip4": "تحقق من اتصال الشبكة", + "title": "التشخيص", + "troubleshootingTitle": "نصائح استكشاف الأخطاء:" + }, + "favorites": { + "noFavorites": "لا توجد مفضلات", + "pinToFavorite": "تثبيت في المفضلة", + "title": "المفضلة", + "toggleSection": "تبديل قسم المفضلة" + }, + "footer": { + "openSource": "نسخة مفتوحة المصدر", + "privacy": "الخصوصية", + "terms": "الشروط" + }, + "general": { + "add": "إضافة", + "apply": "تطبيق", + "back": "رجوع", + "cancel": "إلغاء", + "clean": "Clean", + "clear": "مسح", + "close": "إغلاق", + "confirm": "تأكيد", + "edit": "تعديل", + "error": "حدث خطأ", + "indexAll": "Index All", + "loading": "جاري التحميل...", + "next": "التالي", + "operationFailed": "فشلت العملية", + "operationSuccess": "نجحت العملية", + "preview": "معاينة", + "previous": "السابق", + "reset": "إعادة تعيين", + "save": "حفظ", + "select": "اختيار", + "submit": "إرسال", + "testConnection": "Test Connection", + "tryAgain": "الرجاء المحاولة مرة أخرى" + }, + "generalSettings": { + "description": "إعدادات التطبيق العامة", + "title": "الإعدادات العامة" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} labels", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "No labels", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "انقر لعرض الملاحظة", + "comparison": { + "clickToView": "انقر لعرض الملاحظة", + "helpful": "مفيد", + "helpfulQuestion": "هل هذه المقارنة مفيدة؟", + "highSimilarityInsight": "هذه الملاحظات تعالج نفس الموضوع مع درجة عالية من التشابه. يمكن دمجها أو توحيدها.", + "notHelpful": "غير مفيد", + "similarityInfo": "هذه الملاحظات متصلة بنسبة تشابه {similarity}%", + "title": "💡 مقارنة الملاحظات", + "untitled": "بدون عنوان" + }, + "connection": "اتصال", + "connections": "الاتصالات", + "connectionsBadge": "{count} اتصال", + "dailyInsight": "رؤية يومية من ملاحظاتك", + "description": "اتصالات استباقية بين ملاحظاتك", + "dismiss": "تجاهل مؤقتاً", + "editorSection": { + "close": "إغلاق", + "compare": "مقارنة", + "compareAll": "مقارنة الكل", + "loading": "جاري التحميل...", + "merge": "دمج", + "mergeAll": "دمج الكل", + "title": "⚡ الملاحظات المتصلة ({count})", + "view": "عرض" + }, + "fused": "مدمج", + "fusion": { + "archiveOriginals": "أرشفة الملاحظات الأصلية", + "cancel": "إلغاء", + "confirmFusion": "تأكيد الدمج", + "createBacklinks": "إنشاء رابط خلفي للملاحظات الأصلية", + "edit": "تعديل", + "error": "فشل في دمج الملاحظات", + "finishEditing": "إنهاء التعديل", + "generateError": "Failed to generate fusion", + "generateFusion": "إنشاء الدمج", + "generating": "جاري الإنشاء...", + "keepAllTags": "الاحتفاظ بجميع الوسوم", + "mergeNotes": "دمج {count} ملاحظة", + "modify": "تعديل", + "noContentReturned": "No fusion content returned from API", + "notesToMerge": "📝 الملاحظات للدمج", + "optionalPrompt": "💬 مطالبة الدمج (اختياري)", + "optionsTitle": "خيارات الدمج", + "previewTitle": "📝 معاينة الملاحظة المدمجة", + "promptPlaceholder": "تعليمات اختيارية للذكاء الاصطناعي (مثال: 'الحفاظ على الأسلوب الرسمي للملاحظة 1')...", + "success": "تم دمج الملاحظات بنجاح!", + "title": "🔗 الدمج الذكي", + "unknownDate": "Unknown date", + "useLatestTitle": "استخدام أحدث ملاحظة كعنوان" + }, + "helpful": "مفيد", + "insightReady": "رؤيتك جاهزة!", + "notHelpful": "غير مفيد", + "overlay": { + "error": "خطأ في تحميل الاتصالات", + "loading": "جاري التحميل...", + "noConnections": "لم يتم العثور على اتصالات", + "searchPlaceholder": "البحث عن الاتصالات...", + "sortBy": "ترتيب حسب:", + "sortOldest": "الأقدم", + "sortRecent": "الأحدث", + "sortSimilarity": "التشابه", + "title": "الملاحظات المتصلة", + "viewAll": "عرض الكل جنباً إلى جنب" + }, + "thanksFeedback": "شكراً على ملاحظاتك!", + "thanksFeedbackImproving": "شكراً! سنستخدم هذا للتحسين.", + "title": "لاحظت شيئاً ما...", + "viewConnection": "عرض الاتصال" + }, + "nav": { + "accountSettings": "إعدادات الحساب", + "adminDashboard": "لوحة تحكم المشرف", + "aiSettings": "إعدادات الذكاء الاصطناعي", + "archive": "الأرشيف", + "buyMeACoffee": "اشترِ لي قهوة", + "configureAI": "قم بتكوين ميزاتك المدعومة بالذكاء الاصطناعي والموفر والتفضيلات", + "diagnostics": "التشخيص", + "donateOnKofi": "التبرع على Ko-fi", + "donationDescription": "قم بعمل تبرع لمرة واحدة أو أصبح داعماً شهرياً.", + "donationNote": "بدون رسوم منصة • مدفوعات فورية • آمن", + "favorites": "المفضلة", + "generalNotes": "الملاحظات العامة", + "home": "الرئيسية", + "login": "تسجيل الدخول", + "logout": "تسجيل الخروج", + "manageAISettings": "إدارة إعدادات الذكاء الاصطناعي", + "myLibrary": "مكتبتي", + "notebooks": "الدفاتر", + "notes": "الملاحظات", + "proPlan": "خطة احترافية", + "profile": "الملف الشخصي", + "quickAccess": "الوصول السريع", + "recent": "الحديثة", + "reminders": "التذكيرات", + "settings": "الإعدادات", + "sponsorDescription": "كن راعياً شهرياً واحصل على التقدير.", + "sponsorOnGithub": "الرعاية على GitHub", + "support": "دعم Memento ☕", + "supportDescription": "Memento مجاني ومفتوح المصدر بنسبة 100%. يدعمك يساعد في الحفاظ على ذلك.", + "supportDevelopment": "دعم تطوير Memento ☕", + "trash": "المهملات", + "userManagement": "إدارة المستخدمين", + "workspace": "مساحة العمل" + }, + "notebook": { + "cancel": "إلغاء", + "create": "إنشاء دفتر", + "createDescription": "ابدأ مجموعة جديدة لتنظيم ملاحظاتك وأفكارك ومشاريعك بكفاءة.", + "createNew": "إنشاء دفتر جديد", + "creating": "جاري الإنشاء...", + "delete": "حذف الدفتر", + "deleteConfirm": "حذف", + "deleteWarning": "هل أنت متأكد أنك تريد حذف هذا الدفتر؟ سيتم نقل الملاحظات إلى الملاحظات العامة.", + "edit": "تحرير الدفتر", + "editDescription": "تغيير اسم الدفتر وأيقونته ولونه.", + "generating": "جاري إنشاء الملخص...", + "labels": "التسميات", + "name": "اسم الدفتر", + "noLabels": "لا توجد تسميات", + "selectColor": "اللون", + "selectIcon": "الأيقونة", + "summary": "ملخص الدفتر", + "summaryDescription": "إنشاء ملخص مدعوم بالذكاء الاصطناعي لجميع الملاحظات في هذا الدفتر.", + "summaryError": "خطأ في إنشاء الملخص" + }, + "notebookSuggestion": { + "description": "يبدو أن هذه الملاحظة تنتمي إلى هذا الدفتر", + "dismiss": "تجاهل", + "dismissIn": "تجاهل (يغلق خلال {timeLeft}ثانية)", + "generalNotes": "الملاحظات العامة", + "move": "نقل", + "moveToNotebook": "النقل إلى الدفتر", + "title": "النقل إلى {icon} {name}؟" + }, + "notebooks": { + "allNotebooks": "جميع الدفاتر", + "create": "إنشاء دفتر", + "createFirst": "إنشاء أول دفتر", + "noNotebooks": "لا توجد دفاتر" + }, + "notes": { + "add": "إضافة", + "addCollaborators": "إضافة متعاونين", + "addImage": "إضافة صورة", + "addItem": "إضافة عنصر", + "addLink": "إضافة رابط", + "addListItem": "+ عنصر قائمة", + "addNote": "إضافة ملاحظة", + "adding": "جاري الإضافة...", + "aiAssistant": "مساعد الذكاء الاصطناعي", + "archive": "أرشفة", + "backgroundOptions": "خيارات الخلفية", + "changeColor": "تغيير اللون", + "changeSize": "تغيير الحجم", + "clarifyFailed": "فشل التوضيح", + "close": "إغلاق", + "color": "اللون", + "confirmDelete": "هل أنت متأكد أنك تريد حذف هذه الملاحظة؟", + "confirmLeaveShare": "هل أنت متأكد أنك تريد مغادرة هذه الملاحظة المشتركة؟", + "contentOrMediaRequired": "الرجاء إدخال بعض المحتوى أو إضافة رابط/صورة", + "copy": "نسخ", + "copyFailed": "فشل في نسخ الملاحظة", + "copySuccess": "تم نسخ الملاحظة بنجاح!", + "createFirstNote": "أنشئ ملاحظتك الأولى", + "date": "التاريخ", + "delete": "حذف", + "dragToReorder": "اسحب لإعادة الترتيب", + "duplicate": "نسخ", + "edit": "تعديل الملاحظة", + "emptyState": "لا توجد ملاحظات", + "fileTooLarge": "الملف كبير جداً: {fileName}. الحد الأقصى للحجم هو {maxSize}.", + "improveFailed": "فشل التحسين", + "inNotebook": "في الدفتر", + "invalidDateTime": "تاريخ أو وقت غير صالح", + "invalidFileType": "نوع ملف غير صالح: {fileName}. يُسمح فقط بـ JPEG و PNG و GIF و WebP.", + "itemOrMediaRequired": "الرجاء إضافة عنصر واحد على الأقل أو وسائط", + "large": "كبير", + "leaveShare": "مغادرة", + "linkAddFailed": "فشل في إضافة الرابط", + "linkAdded": "تمت إضافة الرابط", + "linkMetadataFailed": "تعذر جلب بيانات التعريف الخاصة بالرابط", + "listItem": "عنصر قائمة", + "makeCopy": "إنشاء نسخة", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown معطّل", + "markdownOn": "Markdown مفعّل", + "markdownPlaceholder": "اكتب ملاحظة... (Markdown مدعوم)", + "medium": "متوسط", + "more": "المزيد", + "moreOptions": "المزيد من الخيارات", + "moveFailed": "فشل النقل", + "newChecklist": "قائمة تحقق جديدة", + "newNote": "ملاحظة جديدة", + "noContent": "لا يوجد محتوى", + "noNotes": "لا توجد ملاحظات", + "noNotesFound": "لم يتم العثور على ملاحظات", + "noteCreateFailed": "فشل في إنشاء الملاحظة", + "noteCreated": "تم إنشاء الملاحظة بنجاح", + "others": "أخرى", + "pin": "تثبيت", + "pinned": "مثبتة", + "pinnedNotes": "الملاحظات المثبتة", + "placeholder": "اكتب ملاحظة...", + "preview": "معاينة", + "readOnly": "قراءة فقط", + "recent": "الحديثة", + "redo": "إعادة (Ctrl+Y)", + "redoShortcut": "إعادة (Ctrl+Y)", + "remindMe": "ذكرني", + "reminderDateTimeRequired": "الرجاء إدخال التاريخ والوقت", + "reminderMustBeFuture": "يجب أن يكون التذكير في المستقبل", + "reminderPastError": "يجب أن يكون التذكير في المستقبل", + "reminderRemoved": "تم إزالة التذكير", + "reminderSet": "تم تعيين التذكير في {datetime}", + "remove": "إزالة", + "saving": "جاري الحفظ...", + "setReminder": "تعيين تذكير", + "setReminderButton": "تعيين تذكير", + "share": "مشاركة", + "shareWithCollaborators": "المشاركة مع المتعاونين", + "sharedBy": "شاركها", + "sharedReadOnly": "هذه الملاحظة مشتركة معك في وضع القراءة فقط", + "shortenFailed": "فشل الاختصار", + "showCollaborators": "إظهار المتعاونين", + "size": "الحجم", + "small": "صغير", + "takeNote": "اكتب ملاحظة...", + "takeNoteMarkdown": "اكتب ملاحظة... (Markdown مدعوم)", + "time": "الوقت", + "title": "الملاحظات", + "titlePlaceholder": "العنوان", + "transformFailed": "فشل التحويل", + "unarchive": "إلغاء الأرشفة", + "undo": "تراجع (Ctrl+Z)", + "undoShortcut": "تراجع (Ctrl+Z)", + "unpin": "إلغاء التثبيت", + "unpinned": "غير مثبت", + "untitled": "بدون عنوان", + "uploadFailed": "فشل في رفع {filename}", + "view": "عرض الملاحظة" + }, + "pagination": { + "next": "→", + "pageInfo": "صفحة {currentPage} من {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "غير رسمي", + "expand": "توسيع", + "formal": "رسمي", + "improve": "تحسين", + "shorten": "اختصار", + "title": "تحسين النص" + }, + "profile": { + "accountSettings": "إعدادات الحساب", + "autoDetect": "الكشف التلقائي", + "changePassword": "تغيير كلمة المرور", + "changePasswordDescription": "تحديث كلمة المرور. ستحتاج إلى كلمة المرور الحالية.", + "confirmPassword": "تأكيد كلمة المرور", + "currentPassword": "كلمة المرور الحالية", + "description": "تحديث معلوماتك الشخصية", + "displayName": "اسم العرض", + "displaySettings": "إعدادات العرض", + "displaySettingsDescription": "قم بتخصيص المظهر وحجم الخط.", + "email": "البريد الإلكتروني", + "fontSize": "حجم الخط", + "fontSizeDescription": "قم بضبط حجم الخط لتحسين القراءة. ينطبق هذا على جميع النصوص في الواجهة.", + "fontSizeExtraLarge": "كبير جداً", + "fontSizeLarge": "كبير", + "fontSizeMedium": "متوسط", + "fontSizeSmall": "صغير", + "fontSizeUpdateFailed": "فشل في تحديث حجم الخط", + "fontSizeUpdateSuccess": "تم تحديث حجم الخط بنجاح", + "languageDescription": "سيتم استخدام هذه اللغة لميزات الذكاء الاصطناعي وتحليل المحتوى ونص الواجهة.", + "languagePreferences": "تفضيلات اللغة", + "languagePreferencesDescription": "اختر لغتك المفضلة لميزات الذكاء الاصطناعي والواجهة.", + "languageUpdateFailed": "فشل في تحديث اللغة", + "languageUpdateSuccess": "تم تحديث اللغة بنجاح", + "manageAISettings": "إدارة إعدادات الذكاء الاصطناعي", + "newPassword": "كلمة المرور الجديدة", + "passwordChangeFailed": "فشل في تغيير كلمة المرور", + "passwordChangeSuccess": "تم تغيير كلمة المرور بنجاح", + "passwordError": "خطأ في تحديث كلمة المرور", + "passwordUpdated": "تم تحديث كلمة المرور", + "preferredLanguage": "اللغة المفضلة", + "profileError": "خطأ في تحديث الملف الشخصي", + "profileUpdated": "تم تحديث الملف الشخصي", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "اختر حجم الخط", + "selectLanguage": "اختر لغة", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "الملف الشخصي", + "updateFailed": "فشل في تحديث الملف الشخصي", + "updatePassword": "تحديث كلمة المرور", + "updateSuccess": "تم تحديث الملف الشخصي" + }, + "reminder": { + "cancel": "إلغاء", + "reminderDate": "تاريخ التذكير", + "reminderTime": "وقت التذكير", + "removeReminder": "إزالة التذكير", + "save": "تعيين التذكير", + "setReminder": "تعيين تذكير", + "title": "التذكير" + }, + "resetPassword": { + "confirmNewPassword": "تأكيد كلمة المرور الجديدة", + "description": "أدخل كلمة المرور الجديدة أدناه.", + "invalidLinkDescription": "رابط إعادة تعيين كلمة المرور هذا غير صالح أو منتهي الصلاحية.", + "invalidLinkTitle": "رابط غير صالح", + "loading": "جاري التحميل...", + "newPassword": "كلمة المرور الجديدة", + "passwordMismatch": "كلمات المرور غير متطابقة", + "requestNewLink": "طلب رابط جديد", + "resetPassword": "إعادة تعيين كلمة المرور", + "resetting": "جاري إعادة التعيين...", + "success": "تم إعادة تعيين كلمة المرور بنجاح. يمكنك الآن تسجيل الدخول.", + "title": "إعادة تعيين كلمة المرور" + }, + "search": { + "exactMatch": "Exact match", + "noResults": "No results found", + "placeholder": "Search", + "related": "Related", + "resultsFound": "{count} notes found", + "searchPlaceholder": "Search your notes...", + "searching": "Searching...", + "semanticInProgress": "AI search in progress...", + "semanticTooltip": "AI semantic search" }, "semanticSearch": { "exactMatch": "تطابق تام", "related": "ذات صلة", "searching": "جاري البحث..." }, - "paragraphRefactor": { - "title": "تحسين النص", - "shorten": "اختصار", - "expand": "توسيع", - "improve": "تحسين", - "formal": "رسمي", - "casual": "غير رسمي" - }, - "memoryEcho": { - "title": "لاحظت شيئاً ما...", - "description": "اتصالات استباقية بين ملاحظاتك", - "dailyInsight": "رؤية يومية من ملاحظاتك", - "insightReady": "رؤيتك جاهزة!", - "viewConnection": "عرض الاتصال", - "helpful": "مفيد", - "notHelpful": "غير مفيد", - "dismiss": "تجاهل مؤقتاً", - "thanksFeedback": "شكراً على ملاحظاتك!", - "thanksFeedbackImproving": "شكراً! سنستخدم هذا للتحسين.", - "connections": "الاتصالات", - "connection": "اتصال", - "connectionsBadge": "{count} اتصال", - "fused": "مدمج", - "overlay": { - "title": "الملاحظات المتصلة", - "searchPlaceholder": "البحث عن الاتصالات...", - "sortBy": "ترتيب حسب:", - "sortSimilarity": "التشابه", - "sortRecent": "الأحدث", - "sortOldest": "الأقدم", - "viewAll": "عرض الكل جنباً إلى جنب", - "loading": "جاري التحميل...", - "noConnections": "لم يتم العثور على اتصالات" - }, - "comparison": { - "title": "💡 مقارنة الملاحظات", - "similarityInfo": "هذه الملاحظات متصلة بنسبة تشابه {similarity}%", - "highSimilarityInsight": "هذه الملاحظات تعالج نفس الموضوع مع درجة عالية من التشابه. يمكن دمجها أو توحيدها.", - "untitled": "بدون عنوان", - "clickToView": "انقر لعرض الملاحظة", - "helpfulQuestion": "هل هذه المقارنة مفيدة؟", - "helpful": "مفيد", - "notHelpful": "غير مفيد" - }, - "editorSection": { - "title": "⚡ الملاحظات المتصلة ({count})", - "loading": "جاري التحميل...", - "view": "عرض", - "compare": "مقارنة", - "merge": "دمج", - "compareAll": "مقارنة الكل", - "mergeAll": "دمج الكل" - }, - "fusion": { - "title": "🔗 الدمج الذكي", - "mergeNotes": "دمج {count} ملاحظة", - "notesToMerge": "📝 الملاحظات للدمج", - "optionalPrompt": "💬 مطالبة الدمج (اختياري)", - "promptPlaceholder": "تعليمات اختيارية للذكاء الاصطناعي (مثال: 'الحفاظ على الأسلوب الرسمي للملاحظة 1')...", - "generateFusion": "إنشاء الدمج", - "generating": "جاري الإنشاء...", - "previewTitle": "📝 معاينة الملاحظة المدمجة", - "edit": "تعديل", - "modify": "تعديل", - "finishEditing": "إنهاء التعديل", - "optionsTitle": "خيارات الدمج", - "archiveOriginals": "أرشفة الملاحظات الأصلية", - "keepAllTags": "الاحتفاظ بجميع الوسوم", - "useLatestTitle": "استخدام أحدث ملاحظة كعنوان", - "createBacklinks": "إنشاء رابط خلفي للملاحظات الأصلية", - "cancel": "إلغاء", - "confirmFusion": "تأكيد الدمج", - "success": "تم دمج الملاحظات بنجاح!", - "error": "فشل في دمج الملاحظات" - } - }, - "nav": { - "home": "الرئيسية", - "notes": "الملاحظات", - "notebooks": "الدفاتر", - "generalNotes": "الملاحظات العامة", - "archive": "الأرشيف", - "settings": "الإعدادات", - "profile": "الملف الشخصي", - "aiSettings": "إعدادات الذكاء الاصطناعي", - "logout": "تسجيل الخروج", - "login": "تسجيل الدخول", - "adminDashboard": "لوحة تحكم المشرف", - "diagnostics": "التشخيص", - "trash": "المهملات", - "support": "دعم Memento ☕", - "reminders": "التذكيرات", - "userManagement": "إدارة المستخدمين", - "accountSettings": "إعدادات الحساب", - "manageAISettings": "إدارة إعدادات الذكاء الاصطناعي", - "configureAI": "قم بتكوين ميزاتك المدعومة بالذكاء الاصطناعي والموفر والتفضيلات", - "supportDevelopment": "دعم تطوير Memento ☕", - "supportDescription": "Memento مجاني ومفتوح المصدر بنسبة 100%. يدعمك يساعد في الحفاظ على ذلك.", - "buyMeACoffee": "اشترِ لي قهوة", - "donationDescription": "قم بعمل تبرع لمرة واحدة أو أصبح داعماً شهرياً.", - "donateOnKofi": "التبرع على Ko-fi", - "donationNote": "بدون رسوم منصة • مدفوعات فورية • آمن", - "sponsorOnGithub": "الرعاية على GitHub", - "sponsorDescription": "كن راعياً شهرياً واحصل على التقدير.", - "workspace": "مساحة العمل", - "quickAccess": "الوصول السريع", - "myLibrary": "مكتبتي", - "favorites": "المفضلة", - "recent": "الحديثة", - "proPlan": "خطة احترافية" - }, "settings": { - "title": "الإعدادات", - "description": "إدارة إعداداتك وتفضيلاتك", + "about": "حول", "account": "الحساب", "appearance": "المظهر", - "theme": "المظهر", - "themeLight": "فاتح", - "themeDark": "داكن", - "themeSystem": "النظام", - "notifications": "الإشعارات", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "إدارة إعداداتك وتفضيلاتك", "language": "اللغة", - "selectLanguage": "اختيار اللغة", + "languageAuto": "الكشف التلقائي", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "الإشعارات", "privacy": "الخصوصية", + "profile": "الملف الشخصي", + "searchNoResults": "لم يتم العثور على إعدادات مطابقة", "security": "الأمان", - "about": "حول", - "version": "الإصدار", + "selectLanguage": "اختيار اللغة", + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "خطأ في حفظ الإعدادات", "settingsSaved": "تم حفظ الإعدادات", - "settingsError": "خطأ في حفظ الإعدادات" + "theme": "المظهر", + "themeDark": "داكن", + "themeLight": "فاتح", + "themeSystem": "النظام", + "title": "الإعدادات", + "version": "الإصدار" }, - "profile": { - "title": "الملف الشخصي", - "description": "تحديث معلوماتك الشخصية", - "displayName": "اسم العرض", - "email": "البريد الإلكتروني", - "changePassword": "تغيير كلمة المرور", - "changePasswordDescription": "تحديث كلمة المرور. ستحتاج إلى كلمة المرور الحالية.", - "currentPassword": "كلمة المرور الحالية", - "newPassword": "كلمة المرور الجديدة", - "confirmPassword": "تأكيد كلمة المرور", - "updatePassword": "تحديث كلمة المرور", - "passwordChangeSuccess": "تم تغيير كلمة المرور بنجاح", - "passwordChangeFailed": "فشل في تغيير كلمة المرور", - "passwordUpdated": "تم تحديث كلمة المرور", - "passwordError": "خطأ في تحديث كلمة المرور", - "languagePreferences": "تفضيلات اللغة", - "languagePreferencesDescription": "اختر لغتك المفضلة لميزات الذكاء الاصطناعي والواجهة.", - "preferredLanguage": "اللغة المفضلة", - "selectLanguage": "اختر لغة", - "languageDescription": "سيتم استخدام هذه اللغة لميزات الذكاء الاصطناعي وتحليل المحتوى ونص الواجهة.", - "autoDetect": "الكشف التلقائي", - "updateSuccess": "تم تحديث الملف الشخصي", - "updateFailed": "فشل في تحديث الملف الشخصي", - "languageUpdateSuccess": "تم تحديث اللغة بنجاح", - "languageUpdateFailed": "فشل في تحديث اللغة", - "profileUpdated": "تم تحديث الملف الشخصي", - "profileError": "خطأ في تحديث الملف الشخصي", - "accountSettings": "إعدادات الحساب", - "manageAISettings": "إدارة إعدادات الذكاء الاصطناعي", - "displaySettings": "إعدادات العرض", - "displaySettingsDescription": "قم بتخصيص المظهر وحجم الخط.", - "fontSize": "حجم الخط", - "selectFontSize": "اختر حجم الخط", - "fontSizeSmall": "صغير", - "fontSizeMedium": "متوسط", - "fontSizeLarge": "كبير", - "fontSizeExtraLarge": "كبير جداً", - "fontSizeDescription": "قم بضبط حجم الخط لتحسين القراءة. ينطبق هذا على جميع النصوص في الواجهة.", - "fontSizeUpdateSuccess": "تم تحديث حجم الخط بنجاح", - "fontSizeUpdateFailed": "فشل في تحديث حجم الخط" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" }, - "aiSettings": { - "title": "إعدادات الذكاء الاصطناعي", - "description": "تكوين ميزاتك وتفضيلاتك المدعومة بالذكاء الاصطناعي", - "features": "ميزات الذكاء الاصطناعي", - "provider": "مزود الذكاء الاصطناعي", - "providerAuto": "تلقائي (موصى به)", - "providerOllama": "Ollama (محلي)", - "providerOpenAI": "OpenAI (سحابة)", - "frequency": "التكرار", - "frequencyDaily": "يومي", - "frequencyWeekly": "أسبوعي", - "saving": "جاري الحفظ...", - "saved": "تم تحديث الإعداد", - "error": "فشل في تحديث الإعداد" + "support": { + "aiApiCosts": "تكاليف AI API:", + "buyMeACoffee": "اشترِ لي قهوة", + "contributeCode": "المساهمة بالكود", + "description": "Memento مجاني ومفتوح المصدر بنسبة 100%. دعمك يساعد في الحفاظ على ذلك.", + "directImpact": "تأثير مباشر", + "domainSSL": "النطاق و SSL:", + "donateOnKofi": "التبرع على Ko-fi", + "donationDescription": "قم بعمل تبرع لمرة واحدة أو أصبح داعماً شهرياً.", + "githubDescription": "دعم متكرر • تقدير علني • موجه للمطورين", + "hostingServers": "الاستضافة والخوادم:", + "howSupportHelps": "كيف يساعد دعمك", + "kofiDescription": "بدون رسوم منصة • مدفوعات فورية • آمن", + "otherWaysTitle": "طرق أخرى للدعم", + "reportBug": "الإبلاغ عن خطأ", + "shareTwitter": "المشاركة على تويتر", + "sponsorDescription": "كن راعياً شهرياً واحصل على التقدير.", + "sponsorOnGithub": "الرعاية على GitHub", + "sponsorPerks": "مزايا الرعاة", + "starGithub": "أضف نجمة على GitHub", + "title": "دعم تطوير Memento", + "totalExpenses": "إجمالي النفقات:", + "transparency": "الشفافية", + "transparencyDescription": "أؤمن بالشفافية الكاملة. إليك كيفية استخدام التبرعات:" }, - "general": { - "loading": "جاري التحميل...", - "save": "حفظ", - "cancel": "إلغاء", - "add": "إضافة", - "edit": "تعديل", - "confirm": "تأكيد", - "close": "إغلاق", - "back": "رجوع", - "next": "التالي", - "previous": "السابق", - "submit": "إرسال", - "reset": "إعادة تعيين", - "apply": "تطبيق", - "clear": "مسح", - "select": "اختيار", - "tryAgain": "الرجاء المحاولة مرة أخرى", - "error": "حدث خطأ", - "operationSuccess": "نجحت العملية", - "operationFailed": "فشلت العملية" + "testPages": { + "titleSuggestions": { + "analyzing": "جاري التحليل...", + "contentLabel": "المحتوى (يحتاج 50 كلمة أو أكثر):", + "error": "خطأ:", + "idle": "خامل", + "noSuggestions": "لا توجد اقتراحات بعد. اكتب 50 كلمة أو أكثر وانتظر ثانيتين.", + "placeholder": "اكتب 50 كلمة على الأقل هنا...", + "status": "الحالة:", + "suggestions": "الاقتراحات ({count}):", + "title": "اختبار اقتراحات العناوين", + "wordCount": "عدد الكلمات:" + } }, - "colors": { - "default": "الافتراضي", - "red": "أحمر", - "blue": "أزرق", - "green": "أخضر", - "yellow": "أصفر", - "purple": "بنفسجي", - "pink": "وردي", - "orange": "برتقالي", - "gray": "رمادي" + "time": { + "daysAgo": "منذ {count} يوم", + "hoursAgo": "منذ {count} ساعة", + "justNow": "الآن", + "minutesAgo": "منذ {count} دقيقة", + "today": "اليوم", + "tomorrow": "غداً", + "yesterday": "أمس" }, - "reminder": { - "title": "التذكير", - "setReminder": "تعيين تذكير", - "removeReminder": "إزالة التذكير", - "reminderDate": "تاريخ التذكير", - "reminderTime": "وقت التذكير", - "save": "تعيين التذكير", - "cancel": "إلغاء" - }, - "notebookSuggestion": { - "title": "النقل إلى {icon} {name}؟", - "description": "يبدو أن هذه الملاحظة تنتمي إلى هذا الدفتر", - "move": "نقل", + "titleSuggestions": { + "available": "اقتراحات العنوان", "dismiss": "تجاهل", - "dismissIn": "تجاهل (يغلق خلال {timeLeft}ثانية)", - "moveToNotebook": "النقل إلى الدفتر", - "generalNotes": "الملاحظات العامة" + "generating": "جاري الإنشاء...", + "selectTitle": "اختر عنواناً", + "title": "اقتراحات الذكاء الاصطناعي" + }, + "toast": { + "feedbackFailed": "فشل إرسال الملاحظات", + "notesFusionSuccess": "تم دمج الملاحظات بنجاح!", + "openConnectionFailed": "فشل فتح الاتصال", + "openingConnection": "جاري فتح الاتصال...", + "operationFailed": "فشلت العملية", + "operationSuccess": "نجحت العملية", + "saveFailed": "فشل حفظ الإعداد", + "saved": "تم حفظ الإعداد", + "thanksFeedback": "شكراً لملاحظاتك!", + "thanksFeedbackImproving": "شكراً! سنستخدم هذا للتحسين." + }, + "trash": { + "deletePermanently": "حذف نهائياً", + "empty": "المهملات فارغة", + "restore": "استعادة", + "title": "المهملات" + }, + "ui": { + "close": "إغلاق", + "collapse": "طي", + "expand": "توسيع", + "open": "فتح" } } diff --git a/keep-notes/locales/de.json b/keep-notes/locales/de.json index 972fd1a..621f733 100644 --- a/keep-notes/locales/de.json +++ b/keep-notes/locales/de.json @@ -1,511 +1,993 @@ { - "auth": { - "signIn": "Anmelden", - "signUp": "Registrieren", - "email": "E-Mail", - "password": "Passwort", - "name": "Name", - "emailPlaceholder": "Geben Sie Ihre E-Mail-Adresse ein", - "passwordPlaceholder": "Geben Sie Ihr Passwort ein", - "namePlaceholder": "Geben Sie Ihren Namen ein", - "passwordMinChars": "Passwort eingeben (min. 6 Zeichen)", - "resetPassword": "Passwort zurücksetzen", - "resetPasswordInstructions": "Geben Sie Ihre E-Mail ein, um Ihr Passwort zurückzusetzen", - "forgotPassword": "Passwort vergessen?", - "noAccount": "Haben Sie kein Konto?", - "hasAccount": "Haben Sie bereits ein Konto?", - "signInToAccount": "Melden Sie sich in Ihrem Konto an", - "createAccount": "Erstellen Sie Ihr Konto", - "rememberMe": "Angemeldet bleiben", - "orContinueWith": "Oder fortfahren mit", - "checkYourEmail": "Überprüfen Sie Ihre E-Mail", - "resetEmailSent": "Wir haben einen Link zum Zurücksetzen des Passworts an Ihre E-Mail-Adresse gesendet, wenn sie in unserem System existiert.", - "returnToLogin": "Zurück zur Anmeldung", - "forgotPasswordTitle": "Passwort vergessen", - "forgotPasswordDescription": "Geben Sie Ihre E-Mail-Adresse ein und wir senden Ihnen einen Link zum Zurücksetzen Ihres Passworts.", - "sending": "Wird gesendet...", - "sendResetLink": "Link zum Zurücksetzen senden", - "backToLogin": "Zurück zur Anmeldung" + "about": { + "appDescription": "Eine leistungsstarke Notiz-Anwendung mit KI-gestützten Funktionen", + "appName": "Keep Notes", + "buildDate": "Build-Datum", + "description": "Informationen über die Anwendung", + "features": { + "description": "KI-gestützte Fähigkeiten", + "dragDrop": "Drag & Drop Notizverwaltung", + "labelSystem": "Label-System", + "memoryEcho": "Memory Echo tägliche Einblicke", + "multipleProviders": "Mehrere KI-Anbieter (OpenAI, Ollama)", + "notebookOrganization": "Notizbuch-Organisation", + "paragraphReformulation": "Absatz-Reformulierung", + "semanticSearch": "Semantische Suche mit Embeddings", + "title": "Funktionen", + "titleSuggestions": "KI-gestützte Titelvorschläge" + }, + "platform": "Plattform", + "platformWeb": "Web", + "support": { + "description": "Hilfe und Feedback erhalten", + "documentation": "Dokumentation", + "feedback": "Feedback", + "reportIssues": "Probleme melden", + "title": "Support" + }, + "technology": { + "ai": "KI", + "authentication": "Authentifizierung", + "backend": "Backend", + "database": "Datenbank", + "description": "Mit modernen Technologien erstellt", + "frontend": "Frontend", + "testing": "Tests", + "title": "Technologie-Stack", + "ui": "UI" + }, + "title": "Über", + "version": "Version" }, - "notes": { - "title": "Notizen", - "newNote": "Neue Notiz", - "untitled": "Unbenannt", - "placeholder": "Notiz machen...", - "markdownPlaceholder": "Notiz machen... (Markdown unterstützt)", - "titlePlaceholder": "Titel", - "listItem": "Listenelement", - "addListItem": "+ Listenelement", - "newChecklist": "Neue Checkliste", - "add": "Hinzufügen", - "adding": "Wird hinzugefügt...", - "close": "Schließen", - "confirmDelete": "Möchten Sie diese Notiz wirklich löschen?", - "confirmLeaveShare": "Möchten Sie diese geteilte Notiz wirklich verlassen?", - "sharedBy": "Geteilt von", - "leaveShare": "Verlassen", - "delete": "Löschen", - "archive": "Archivieren", - "unarchive": "Aus Archiv entfernen", - "pin": "Anheften", - "unpin": "Loslösen", - "color": "Farbe", - "changeColor": "Farbe ändern", - "setReminder": "Erinnerung festlegen", - "setReminderButton": "Erinnerung festlegen", - "date": "Datum", - "time": "Uhrzeit", - "reminderDateTimeRequired": "Bitte Datum und Uhrzeit eingeben", - "invalidDateTime": "Ungültiges Datum oder Uhrzeit", - "reminderMustBeFuture": "Die Erinnerung muss in der Zukunft liegen", - "reminderSet": "Erinnerung festgelegt für {datetime}", - "reminderPastError": "Die Erinnerung muss in der Zukunft liegen", - "reminderRemoved": "Erinnerung entfernt", - "addImage": "Bild hinzufügen", - "addLink": "Link hinzufügen", - "linkAdded": "Link hinzugefügt", - "linkMetadataFailed": "Link-Metadaten konnten nicht abgerufen werden", - "linkAddFailed": "Link konnte nicht hinzugefügt werden", - "invalidFileType": "Ungültiger Dateityp: {fileName}. Nur JPEG, PNG, GIF und WebP sind zulässig.", - "fileTooLarge": "Datei zu groß: {fileName}. Maximale Größe ist {maxSize}.", - "uploadFailed": "Upload fehlgeschlagen für {filename}", - "contentOrMediaRequired": "Bitte geben Sie Inhalte ein oder fügen Sie einen Link/Bild hinzu", - "itemOrMediaRequired": "Bitte fügen Sie mindestens ein Element oder Medium hinzu", - "noteCreated": "Notiz erfolgreich erstellt", - "noteCreateFailed": "Fehler beim Erstellen der Notiz", - "aiAssistant": "KI-Assistent", - "changeSize": "Größe ändern", - "backgroundOptions": "Hintergrundoptionen", - "moreOptions": "Weitere Optionen", - "remindMe": "Mich erinnern", - "markdownMode": "Markdown", - "addCollaborators": "Mitarbeiter hinzufügen", - "duplicate": "Duplizieren", - "share": "Teilen", - "showCollaborators": "Mitarbeiter anzeigen", - "pinned": "Angeheftet", - "others": "Andere", - "noNotes": "Keine Notizen", - "noNotesFound": "Keine Notizen gefunden", - "createFirstNote": "Erstellen Sie Ihre erste Notiz", - "size": "Größe", - "small": "Klein", - "medium": "Mittel", - "large": "Groß", - "shareWithCollaborators": "Mit Mitarbeitern teilen", - "view": "Notiz anzeigen", - "edit": "Notiz bearbeiten", - "readOnly": "Schreibgeschützt", - "preview": "Vorschau", - "noContent": "Kein Inhalt", - "takeNote": "Notiz machen...", - "takeNoteMarkdown": "Notiz machen... (Markdown unterstützt)", - "addItem": "Element hinzufügen", - "sharedReadOnly": "Diese Notiz ist mit Ihnen im schreibgeschützten Modus geteilt", - "makeCopy": "Kopie erstellen", - "saving": "Wird gespeichert...", - "copySuccess": "Notiz erfolgreich kopiert!", - "copyFailed": "Fehler beim Kopieren der Notiz", - "copy": "Kopieren", - "markdownOn": "Markdown EIN", - "markdownOff": "Markdown AUS", - "undo": "Rückgängig (Strg+Z)", - "redo": "Wiederholen (Strg+Y)" - }, - "pagination": { - "previous": "←", - "pageInfo": "Seite {currentPage} / {totalPages}", - "next": "→" - }, - "labels": { - "title": "Labels", - "filter": "Nach Label filtern", - "manage": "Labels verwalten", - "manageTooltip": "Labels verwalten", - "changeColor": "Farbe ändern", - "changeColorTooltip": "Farbe ändern", - "delete": "Löschen", - "deleteTooltip": "Label löschen", - "confirmDelete": "Möchten Sie dieses Label wirklich löschen?", - "newLabelPlaceholder": "Neues Label erstellen", - "namePlaceholder": "Labelname eingeben", - "addLabel": "Label hinzufügen", - "createLabel": "Label erstellen", - "labelName": "Labelname", - "labelColor": "Labelfarbe", - "manageLabels": "Labels verwalten", - "manageLabelsDescription": "Fügen Sie Labels für diese Notiz hinzu oder entfernen Sie diese. Klicken Sie auf ein Label, um seine Farbe zu ändern.", - "selectedLabels": "Ausgewählte Labels", - "allLabels": "Alle Labels", - "clearAll": "Alle löschen", - "filterByLabel": "Nach Label filtern", - "tagAdded": "Tag \"{tag}\" hinzugefügt", - "showLess": "Weniger anzeigen", - "showMore": "Mehr anzeigen", - "editLabels": "Labels bearbeiten", - "editLabelsDescription": "Erstellen, bearbeiten Sie Farben oder löschen Sie Labels.", - "noLabelsFound": "Keine Labels gefunden.", - "loading": "Wird geladen...", - "notebookRequired": "⚠️ Labels sind nur in Notizbüchern verfügbar. Verschieben Sie diese Notiz zuerst in ein Notizbuch." - }, - "search": { - "placeholder": "Suchen", - "searchPlaceholder": "Durchsuchen Sie Ihre Notizen...", - "semanticInProgress": "KI-Suche läuft...", - "semanticTooltip": "Semantische KI-Suche", - "searching": "Wird gesucht...", - "noResults": "Keine Ergebnisse gefunden", - "resultsFound": "{count} Notizen gefunden", - "exactMatch": "Exakte Übereinstimmung", - "related": "Verwandt" - }, - "collaboration": { - "emailPlaceholder": "E-Mail-Adresse eingeben", - "addCollaborator": "Mitarbeiter hinzufügen", - "removeCollaborator": "Mitarbeiter entfernen", - "owner": "Besitzer", - "canEdit": "Kann bearbeiten", - "canView": "Kann anzeigen", - "shareNote": "Notiz teilen", - "shareWithCollaborators": "Mit Mitarbeitern teilen", - "addCollaboratorDescription": "Fügen Sie Personen per E-Mail-Adresse hinzu, um an dieser Notiz zu arbeiten.", - "viewerDescription": "Sie haben Zugriff auf diese Notiz. Nur der Besitzer kann Mitarbeiter verwalten.", - "emailAddress": "E-Mail-Adresse", - "enterEmailAddress": "E-Mail-Adresse eingeben", - "invite": "Einladen", - "peopleWithAccess": "Personen mit Zugriff", - "noCollaborators": "Noch keine Mitarbeiter. Fügen Sie jemanden oben hinzu!", - "noCollaboratorsViewer": "Noch keine Mitarbeiter.", - "pendingInvite": "Ausstehende Einladung", - "pending": "Ausstehend", - "remove": "Entfernen", - "unnamedUser": "Unbenannter Benutzer", - "done": "Fertig", - "willBeAdded": "{email} wird als Mitarbeiter hinzugefügt, wenn die Notiz erstellt wird", - "alreadyInList": "Diese E-Mail ist bereits in der Liste", - "nowHasAccess": "{name} hat jetzt Zugriff auf diese Notiz", - "accessRevoked": "Der Zugriff wurde widerrufen", - "errorLoading": "Fehler beim Laden der Mitarbeiter", - "failedToAdd": "Fehler beim Hinzufügen des Mitarbeiters", - "failedToRemove": "Fehler beim Entfernen des Mitarbeiters" + "admin": { + "ai": { + "apiKey": "API-Schlüssel", + "baseUrl": "Basis-URL", + "commonEmbeddingModels": "Gängige Embedding-Modelle für OpenAI-kompatible APIs", + "commonModelsDescription": "Gängige Modelle für OpenAI-kompatible APIs", + "description": "KI-Anbieter für automatisches Tagging und semantische Suche konfigurieren. Verwenden Sie verschiedene Anbieter für optimale Leistung.", + "embeddingsDescription": "KI-Anbieter für semantische Such-Embeddings. Empfohlen: OpenAI (beste Qualität).", + "embeddingsProvider": "Embeddings-Anbieter", + "model": "Modell", + "modelRecommendations": "gpt-4o-mini = Bester Wert • gpt-4o = Beste Qualität", + "openAIKeyDescription": "Ihr OpenAI-API-Schlüssel von platform.openai.com", + "openTestPanel": "KI-Test-Panel öffnen", + "provider": "Anbieter", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING ist erforderlich", + "providerTagsRequired": "AI_PROVIDER_TAGS ist erforderlich", + "saveSettings": "KI-Einstellungen speichern", + "saving": "Speichern...", + "selectEmbeddingModel": "Wählen Sie ein auf Ihrem System installiertes Embedding-Modell", + "selectOllamaModel": "Wählen Sie ein auf Ihrem System installiertes Ollama-Modell", + "tagsGenerationDescription": "KI-Anbieter für automatische Tag-Vorschläge. Empfohlen: Ollama (kostenlos, lokal).", + "tagsGenerationProvider": "Tags-Generierungsanbieter", + "title": "KI-Konfiguration", + "updateFailed": "Fehler beim Aktualisieren der KI-Einstellungen", + "updateSuccess": "KI-Einstellungen erfolgreich aktualisiert" + }, + "aiTest": { + "description": "Testen Sie Ihre KI-Anbieter für Tag-Generierung und semantische Such-Embeddings", + "embeddingDimensions": "Embedding-Dimensionen:", + "embeddingsTestDescription": "Testen Sie den KI-Anbieter, der für semantische Such-Embeddings verantwortlich ist", + "embeddingsTestTitle": "Embeddings-Test", + "error": "Fehler:", + "first5Values": "Erste 5 Werte:", + "generatedTags": "Generierte Tags:", + "howItWorksTitle": "Wie Tests funktionieren", + "model": "Modell:", + "provider": "Anbieter:", + "responseTime": "Antwortzeit: {time}ms", + "runTest": "Test ausführen", + "tagsTestDescription": "Testen Sie den KI-Anbieter, der für automatische Tag-Vorschläge verantwortlich ist", + "tagsTestTitle": "Tags-Generierungs-Test", + "testError": "Testfehler: {error}", + "testFailed": "Test fehlgeschlagen", + "testPassed": "Test bestanden", + "testing": "Testen...", + "tipDescription": "Verwenden Sie das KI-Test-Panel, um Konfigurationsprobleme vor dem Testen zu diagnostizieren.", + "tipTitle": "Tipp:", + "title": "KI-Anbieter-Tests", + "vectorDimensions": "Vektor-Dimensionen" + }, + "aiTesting": "KI-Tests", + "security": { + "allowPublicRegistration": "Öffentliche Registrierung zulassen", + "allowPublicRegistrationDescription": "Wenn deaktiviert, können neue Benutzer nur von einem Administrator über die Benutzerverwaltungsseite hinzugefügt werden.", + "description": "Zugriffskontrolle und Registrierungsrichtlinien verwalten.", + "title": "Sicherheitseinstellungen", + "updateFailed": "Fehler beim Aktualisieren der Sicherheitseinstellungen", + "updateSuccess": "Sicherheitseinstellungen aktualisiert" + }, + "settings": "Admin-Einstellungen", + "smtp": { + "description": "E-Mail-Server für Passwortzurücksetzungen konfigurieren.", + "forceSSL": "SSL/TLS erzwingen (normalerweise für Port 465)", + "fromEmail": "Von E-Mail", + "host": "Host", + "ignoreCertErrors": "Zertifikatsfehler ignorieren (Nur Self-hosted/Entwicklung)", + "password": "Passwort", + "port": "Port", + "saveSettings": "SMTP-Einstellungen speichern", + "sending": "Senden...", + "testEmail": "Test-E-Mail", + "testFailed": "Fehler: {error}", + "testSuccess": "Test-E-Mail erfolgreich gesendet!", + "title": "SMTP-Konfiguration", + "updateFailed": "Fehler beim Aktualisieren der SMTP-Einstellungen", + "updateSuccess": "SMTP-Einstellungen aktualisiert", + "username": "Benutzername" + }, + "title": "Admin-Dashboard", + "userManagement": "Benutzerverwaltung", + "users": { + "addUser": "Benutzer hinzufügen", + "confirmDelete": "Möchten Sie diesen Benutzer wirklich löschen?", + "createFailed": "Fehler beim Erstellen des Benutzers", + "createSuccess": "Benutzer erfolgreich erstellt", + "createUser": "Benutzer erstellen", + "createUserDescription": "Einen neuen Benutzer zum System hinzufügen.", + "deleteFailed": "Fehler beim Löschen", + "deleteSuccess": "Benutzer gelöscht", + "demote": "Zurückstufen", + "email": "E-Mail", + "name": "Name", + "password": "Passwort", + "promote": "Befördern", + "role": "Rolle", + "roleUpdateFailed": "Fehler beim Aktualisieren der Rolle", + "roleUpdateSuccess": "Benutzerrolle zu {role} aktualisiert", + "roles": { + "admin": "Administrator", + "user": "Benutzer" + }, + "table": { + "actions": "Aktionen", + "createdAt": "Erstellt am", + "email": "E-Mail", + "name": "Name", + "role": "Rolle" + } + } }, "ai": { "analyzing": "KI analysiert...", + "assistant": "KI-Assistent", + "autoLabels": { + "analyzing": "Analysiere Ihre Notizen für Etikettenvorschläge...", + "create": "Erstellen", + "createNewLabel": "Create this new label and add it", + "created": "{count} labels created successfully", + "creating": "Erstelle Etiketten...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(neu)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "Etikettenvorschläge", + "typeContent": "Type content to get label suggestions..." + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Failed to apply organization plan", + "applying": "Applying...", + "description": "Die KI analysiert Ihre Notizen und schlägt vor, sie in Notizbüchern zu organisieren.", + "error": "Failed to create organization plan", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "No notes selected", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Select all notes in {notebook}", + "selectNote": "Select note: {title}", + "success": "{count} notes moved successfully", + "title": "Organize with AI" + }, + "clarify": "Klarstellen", "clickToAddTag": "Klicken Sie, um diesen Tag hinzuzufügen", - "ignoreSuggestion": "Diesen Vorschlag ignorieren", - "generatingTitles": "Titel werden generiert...", + "generateTitles": "Titel generieren", "generateTitlesTooltip": "Titel mit KI generieren", - "poweredByAI": "Powered by KI", + "generating": "Wird generiert...", + "generatingTitles": "Titel werden generiert...", + "ignoreSuggestion": "Diesen Vorschlag ignorieren", + "improveStyle": "Stil verbessern", "languageDetected": "Sprache erkannt", + "notebookSummary": { + "regenerate": "Zusammenfassung neu generieren", + "regenerating": "Generiere Zusammenfassung neu..." + }, + "original": "Original", + "poweredByAI": "Powered by KI", "processing": "Verarbeitung läuft...", - "tagAdded": "Tag \"{tag}\" hinzugefügt", - "titleGenerating": "Wird generiert...", - "titleGenerateWithAI": "Titel mit KI generieren", - "titleGenerationMinWords": "Der Inhalt muss mindestens 10 Wörter haben, um Titel zu generieren (aktuell: {count} Wörter)", - "titleGenerationError": "Fehler beim Generieren der Titel", - "titlesGenerated": "💡 {count} Titel generiert!", - "titleGenerationFailed": "Fehler beim Generieren der Titel", - "titleApplied": "Titel angewendet!", - "reformulationNoText": "Bitte Text auswählen oder Inhalt hinzufügen", - "reformulationSelectionTooShort": "Auswahl zu kurz, vollständiger Inhalt wird verwendet", - "reformulationMinWords": "Der Text muss mindestens 10 Wörter haben (aktuell: {count} Wörter)", - "reformulationMaxWords": "Der Text darf maximal 500 Wörter haben", + "reformulateText": "Text reformulieren", + "reformulated": "Reformuliert", + "reformulating": "Wird reformuliert...", + "reformulationApplied": "Reformulierter Text angewendet!", + "reformulationComparison": "Reformulierungsvergleich", "reformulationError": "Fehler bei der Reformulierung", "reformulationFailed": "Fehler beim Reformulieren des Textes", - "reformulationApplied": "Reformulierter Text angewendet!", - "transformMarkdown": "In Markdown umwandeln", - "transforming": "Wird umgewandelt...", - "transformSuccess": "Text erfolgreich in Markdown umgewandelt!", - "transformError": "Fehler bei der Umwandlung", - "assistant": "KI-Assistent", - "generating": "Wird generiert...", - "generateTitles": "Titel generieren", - "reformulateText": "Text reformulieren", - "reformulating": "Wird reformuliert...", - "clarify": "Klarstellen", + "reformulationMaxWords": "Der Text darf maximal 500 Wörter haben", + "reformulationMinWords": "Der Text muss mindestens 10 Wörter haben (aktuell: {count} Wörter)", + "reformulationNoText": "Bitte Text auswählen oder Inhalt hinzufügen", + "reformulationSelectionTooShort": "Auswahl zu kurz, vollständiger Inhalt wird verwendet", "shorten": "Kürzen", - "improveStyle": "Stil verbessern", - "reformulationComparison": "Reformulierungsvergleich", - "original": "Original", - "reformulated": "Reformuliert" + "tagAdded": "Tag \"{tag}\" hinzugefügt", + "titleApplied": "Titel angewendet!", + "titleGenerateWithAI": "Titel mit KI generieren", + "titleGenerating": "Wird generiert...", + "titleGenerationError": "Fehler beim Generieren der Titel", + "titleGenerationFailed": "Fehler beim Generieren der Titel", + "titleGenerationMinWords": "Der Inhalt muss mindestens 10 Wörter haben, um Titel zu generieren (aktuell: {count} Wörter)", + "titlesGenerated": "💡 {count} Titel generiert!", + "transformError": "Fehler bei der Umwandlung", + "transformMarkdown": "In Markdown umwandeln", + "transformSuccess": "Text erfolgreich in Markdown umgewandelt!", + "transforming": "Wird umgewandelt..." }, - "batchOrganization": { - "error": "Fehler beim Erstellen des Organisationsplans", - "noNotesSelected": "Keine Notizen ausgewählt", - "title": "Mit KI organisieren", - "description": "Die KI wird Ihre Notizen analysieren und Vorschläge zur Organisation in Notizbüchern machen.", - "analyzing": "Notizen werden analysiert...", - "notesToOrganize": "{count} Notizen zu organisieren", - "selected": "{count} ausgewählt", - "noNotebooks": "Keine Notizbücher verfügbar. Erstellen Sie zuerst Notizbücher, um Ihre Notizen zu organisieren.", - "noSuggestions": "Die KI konnte keine gute Möglichkeit zur Organisation dieser Notizen finden.", - "confidence": "Vertrauen", - "unorganized": "{count} Notizen konnten nicht kategorisiert werden und verbleiben in Allgemeinen Notizen.", - "applying": "Wird angewendet...", - "apply": "Anwenden ({count})" + "aiSettings": { + "description": "Konfigurieren Sie Ihre KI-gesteuerten Funktionen und Präferenzen", + "error": "Fehler beim Aktualisieren der Einstellung", + "features": "KI-Funktionen", + "frequency": "Häufigkeit", + "frequencyDaily": "Täglich", + "frequencyWeekly": "Wöchentlich", + "provider": "KI-Anbieter", + "providerAuto": "Auto (Empfohlen)", + "providerOllama": "Ollama (Lokal)", + "providerOpenAI": "OpenAI (Cloud)", + "saved": "Einstellung aktualisiert", + "saving": "Wird gespeichert...", + "title": "KI-Einstellungen", + "titleSuggestionsDesc": "Titel für unbenannte Notizen nach 50+ Wörtern vorschlagen", + "paragraphRefactorDesc": "KI-gestützte Textverbesserungsoptionen", + "frequencyDesc": "Wie oft Notizverbindungen analysiert werden", + "providerDesc": "Wählen Sie Ihren bevorzugten KI-Anbieter", + "providerAutoDesc": "Ollama wenn verfügbar, sonst OpenAI", + "providerOllamaDesc": "100% privat, läuft lokal auf Ihrem Gerät", + "providerOpenAIDesc": "Am genauesten, erfordert API-Schlüssel" + }, + "appearance": { + "description": "Anpassen, wie die App aussieht", + "title": "Erscheinungsbild" + }, + "auth": { + "backToLogin": "Zurück zur Anmeldung", + "checkYourEmail": "Überprüfen Sie Ihre E-Mail", + "createAccount": "Erstellen Sie Ihr Konto", + "email": "E-Mail", + "emailPlaceholder": "Geben Sie Ihre E-Mail-Adresse ein", + "forgotPassword": "Passwort vergessen?", + "forgotPasswordDescription": "Geben Sie Ihre E-Mail-Adresse ein und wir senden Ihnen einen Link zum Zurücksetzen Ihres Passworts.", + "forgotPasswordTitle": "Passwort vergessen", + "hasAccount": "Haben Sie bereits ein Konto?", + "name": "Name", + "namePlaceholder": "Geben Sie Ihren Namen ein", + "noAccount": "Haben Sie kein Konto?", + "orContinueWith": "Oder fortfahren mit", + "password": "Passwort", + "passwordMinChars": "Passwort eingeben (min. 6 Zeichen)", + "passwordPlaceholder": "Geben Sie Ihr Passwort ein", + "rememberMe": "Angemeldet bleiben", + "resetEmailSent": "Wir haben einen Link zum Zurücksetzen des Passworts an Ihre E-Mail-Adresse gesendet, wenn sie in unserem System existiert.", + "resetPassword": "Passwort zurücksetzen", + "resetPasswordInstructions": "Geben Sie Ihre E-Mail ein, um Ihr Passwort zurückzusetzen", + "returnToLogin": "Zurück zur Anmeldung", + "sendResetLink": "Link zum Zurücksetzen senden", + "sending": "Wird gesendet...", + "signIn": "Anmelden", + "signInToAccount": "Melden Sie sich in Ihrem Konto an", + "signOut": "Sign out", + "signUp": "Registrieren" }, "autoLabels": { - "error": "Fehler beim Abrufen von Label-Vorschlägen", - "noLabelsSelected": "Keine Labels ausgewählt", - "created": "{count} Labels erfolgreich erstellt", "analyzing": "Notizen werden analysiert...", - "title": "Neue Label-Vorschläge", + "createNewLabel": "Dieses neue Label erstellen und hinzufügen", + "created": "{count} Labels erfolgreich erstellt", "description": "Ich habe wiederkehrende Themen in \"{notebookName}\" ({totalNotes} Notizen) erkannt. Labels dafür erstellen?", + "error": "Fehler beim Abrufen von Label-Vorschlägen", + "new": "(neu)", + "noLabelsSelected": "Keine Labels ausgewählt", "note": "Notiz", "notes": "Notizen", + "title": "Neue Label-Vorschläge", "typeContent": "Geben Sie Inhalt ein, um Label-Vorschläge zu erhalten...", - "createNewLabel": "Dieses neue Label erstellen und hinzufügen", - "new": "(neu)" + "typeForSuggestions": "Tippen für Vorschläge..." }, - "titleSuggestions": { - "available": "Titelvorschläge", - "title": "KI-Vorschläge", - "generating": "Wird generiert...", - "selectTitle": "Titel auswählen", - "dismiss": "Schließen" + "batch": { + "organize": "Organisieren", + "organizeWithAI": "Mit KI organisieren" + }, + "batchOrganization": { + "analyzing": "Notizen werden analysiert...", + "apply": "Anwenden ({count})", + "applyFailed": "Anwenden fehlgeschlagen", + "applying": "Wird angewendet...", + "confidence": "Vertrauen", + "description": "Die KI wird Ihre Notizen analysieren und Vorschläge zur Organisation in Notizbüchern machen.", + "error": "Fehler beim Erstellen des Organisationsplans", + "noNotebooks": "Keine Notizbücher verfügbar. Erstellen Sie zuerst Notizbücher, um Ihre Notizen zu organisieren.", + "noNotesSelected": "Keine Notizen ausgewählt", + "noSuggestions": "Die KI konnte keine gute Möglichkeit zur Organisation dieser Notizen finden.", + "notesToOrganize": "{count} Notizen zu organisieren", + "selectAllIn": "Alle in {name} auswählen", + "selectNote": "Notiz auswählen", + "selected": "{count} ausgewählt", + "success": "Organisation erfolgreich angewendet", + "title": "Mit KI organisieren", + "unorganized": "{count} Notizen konnten nicht kategorisiert werden und verbleiben in Allgemeinen Notizen." + }, + "collaboration": { + "accessRevoked": "Der Zugriff wurde widerrufen", + "addCollaborator": "Mitarbeiter hinzufügen", + "addCollaboratorDescription": "Fügen Sie Personen per E-Mail-Adresse hinzu, um an dieser Notiz zu arbeiten.", + "alreadyInList": "Diese E-Mail ist bereits in der Liste", + "canEdit": "Kann bearbeiten", + "canView": "Kann anzeigen", + "done": "Fertig", + "emailAddress": "E-Mail-Adresse", + "emailPlaceholder": "E-Mail-Adresse eingeben", + "enterEmailAddress": "E-Mail-Adresse eingeben", + "errorLoading": "Fehler beim Laden der Mitarbeiter", + "failedToAdd": "Fehler beim Hinzufügen des Mitarbeiters", + "failedToRemove": "Fehler beim Entfernen des Mitarbeiters", + "invite": "Einladen", + "noCollaborators": "Noch keine Mitarbeiter. Fügen Sie jemanden oben hinzu!", + "noCollaboratorsViewer": "Noch keine Mitarbeiter.", + "nowHasAccess": "{name} hat jetzt Zugriff auf diese Notiz", + "owner": "Besitzer", + "pending": "Ausstehend", + "pendingInvite": "Ausstehende Einladung", + "peopleWithAccess": "Personen mit Zugriff", + "remove": "Entfernen", + "removeCollaborator": "Mitarbeiter entfernen", + "shareNote": "Notiz teilen", + "shareWithCollaborators": "Mit Mitarbeitern teilen", + "unnamedUser": "Unbenannter Benutzer", + "viewerDescription": "Sie haben Zugriff auf diese Notiz. Nur der Besitzer kann Mitarbeiter verwalten.", + "willBeAdded": "{email} wird als Mitarbeiter hinzugefügt, wenn die Notiz erstellt wird" + }, + "colors": { + "blue": "Blau", + "default": "Standard", + "gray": "Grau", + "green": "Grün", + "orange": "Orange", + "pink": "Rosa", + "purple": "Lila", + "red": "Rot", + "yellow": "Gelb" + }, + "common": { + "add": "Hinzufügen", + "cancel": "Abbrechen", + "close": "Schließen", + "confirm": "Bestätigen", + "delete": "Löschen", + "edit": "Bearbeiten", + "error": "Fehler", + "loading": "Wird geladen...", + "noResults": "Keine Ergebnisse", + "notAvailable": "Nicht verfügbar", + "optional": "Optional", + "remove": "Entfernen", + "required": "Erforderlich", + "save": "Speichern", + "search": "Suchen", + "success": "Erfolg", + "unknown": "Unbekannt" + }, + "connection": { + "clickToView": "Klicken Sie, um die Notiz anzuzeigen", + "helpful": "Hilfreich", + "isHelpful": "Ist diese Verbindung hilfreich?", + "memoryEchoDiscovery": "Memory Echo Entdeckung", + "notHelpful": "Nicht hilfreich", + "similarityInfo": "Diese Notizen sind durch {similarity}% Ähnlichkeit verbunden" + }, + "dataManagement": { + "cleanup": { + "button": "Bereinigen", + "description": "Labels und Verbindungen entfernen, die auf gelöschte Notizen verweisen.", + "failed": "Fehler während der Bereinigung", + "title": "Verwaiste Daten bereinigen" + }, + "cleanupComplete": "Bereinigung abgeschlossen", + "cleanupError": "Fehler bei der Bereinigung", + "dangerZone": "Gefahrenbereich", + "dangerZoneDescription": "Diese Aktionen sind irreversibel. Bitte seien Sie vorsichtig.", + "delete": { + "button": "Alle Notizen löschen", + "confirm": "Sind Sie sicher? Dies löscht dauerhaft alle Ihre Notizen.", + "description": "Dauerhaft alle Ihre Notizen löschen. Diese Aktion kann nicht rückgängig gemacht werden.", + "failed": "Fehler beim Löschen der Notizen", + "success": "Alle Notizen gelöscht", + "title": "Alle Notizen löschen" + }, + "deleting": "Wird gelöscht...", + "export": { + "button": "Notizen exportieren", + "description": "Laden Sie alle Ihre Notizen als JSON-Datei herunter. Dies umfasst alle Inhalte, Labels und Metadaten.", + "failed": "Fehler beim Exportieren der Notizen", + "success": "Notizen erfolgreich exportiert", + "title": "Alle Notizen exportieren" + }, + "exporting": "Wird exportiert...", + "import": { + "button": "Notizen importieren", + "description": "Laden Sie eine JSON-Datei hoch, um Notizen zu importieren. Diese werden zu Ihren vorhandenen Notizen hinzugefügt, nicht ersetzt.", + "failed": "Fehler beim Importieren der Notizen", + "success": "{count} Notizen importiert", + "title": "Notizen importieren" + }, + "importing": "Wird importiert...", + "indexing": { + "button": "Index neu erstellen", + "description": "Embeddings für alle Notizen neu generieren, um die semantische Suche zu verbessern.", + "failed": "Fehler während der Indizierung", + "success": "Indizierung abgeschlossen: {count} Notizen verarbeitet", + "title": "Suchindex neu erstellen" + }, + "indexingComplete": "Indizierung abgeschlossen", + "indexingError": "Fehler bei der Indizierung", + "title": "Datenverwaltung", + "toolsDescription": "Werkzeuge zur Pflege Ihrer Datenbankgesundheit" + }, + "demoMode": { + "activated": "Demo-Modus aktiviert! Memory Echo funktioniert jetzt sofort.", + "createNotesTip": "Erstellen Sie 2+ ähnliche Notizen und sehen Sie Memory Echo in Aktion!", + "deactivated": "Demo-Modus deaktiviert. Normale Parameter wiederhergestellt.", + "delayBetweenNotes": "0 Tage Verzögerung zwischen Notizen (normalerweise 7 Tage)", + "description": "Beschleunigt Memory Echo zum Testen. Verbindungen erscheinen sofort.", + "parametersActive": "Demo-Parameter aktiv:", + "similarityThreshold": "50% Ähnlichkeitsschwelle (normalerweise 75%)", + "title": "Demo-Modus", + "toggleFailed": "Fehler beim Umschalten des Demo-Modus", + "unlimitedInsights": "Unbegrenzte Einblicke (keine Häufigkeitsbeschränkungen)" + }, + "diagnostics": { + "apiStatus": "API-Status", + "checking": "Checking...", + "configuredProvider": "Konfigurierter Anbieter", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "Test-Details:", + "tip1": "Stellen Sie sicher, dass Ollama läuft (ollama serve)", + "tip2": "Prüfen Sie, dass das Modell installiert ist (ollama pull llama3)", + "tip3": "Überprüfen Sie Ihren API-Schlüssel für OpenAI", + "tip4": "Prüfen Sie die Netzwerkverbindung", + "title": "Diagnose", + "troubleshootingTitle": "Fehlerbehebungstipps:" + }, + "favorites": { + "noFavorites": "Keine Favoriten", + "pinToFavorite": "Als Favorit anheften", + "title": "Favoriten", + "toggleSection": "Bereich umschalten" + }, + "footer": { + "openSource": "Open Source Klon", + "privacy": "Datenschutz", + "terms": "Nutzungsbedingungen" + }, + "general": { + "add": "Hinzufügen", + "apply": "Anwenden", + "back": "Zurück", + "cancel": "Abbrechen", + "clean": "Clean", + "clear": "Löschen", + "close": "Schließen", + "confirm": "Bestätigen", + "edit": "Bearbeiten", + "error": "Ein Fehler ist aufgetreten", + "indexAll": "Index All", + "loading": "Wird geladen...", + "next": "Weiter", + "operationFailed": "Operation fehlgeschlagen", + "operationSuccess": "Operation erfolgreich", + "preview": "Vorschau", + "previous": "Zurück", + "reset": "Zurücksetzen", + "save": "Speichern", + "select": "Auswählen", + "submit": "Absenden", + "testConnection": "Test Connection", + "tryAgain": "Bitte versuchen Sie es erneut" + }, + "generalSettings": { + "description": "Allgemeine Anwendungseinstellungen", + "title": "Allgemeine Einstellungen" + }, + "labels": { + "addLabel": "Label hinzufügen", + "allLabels": "Alle Labels", + "changeColor": "Farbe ändern", + "changeColorTooltip": "Farbe ändern", + "clearAll": "Alle löschen", + "confirmDelete": "Möchten Sie dieses Label wirklich löschen?", + "count": "{count} Labels", + "createLabel": "Label erstellen", + "delete": "Löschen", + "deleteTooltip": "Label löschen", + "editLabels": "Labels bearbeiten", + "editLabelsDescription": "Erstellen, bearbeiten Sie Farben oder löschen Sie Labels.", + "filter": "Nach Label filtern", + "filterByLabel": "Nach Label filtern", + "labelColor": "Labelfarbe", + "labelName": "Labelname", + "loading": "Wird geladen...", + "manage": "Labels verwalten", + "manageLabels": "Labels verwalten", + "manageLabelsDescription": "Fügen Sie Labels für diese Notiz hinzu oder entfernen Sie diese. Klicken Sie auf ein Label, um seine Farbe zu ändern.", + "manageTooltip": "Labels verwalten", + "namePlaceholder": "Labelname eingeben", + "newLabelPlaceholder": "Neues Label erstellen", + "noLabels": "Keine Labels", + "noLabelsFound": "Keine Labels gefunden.", + "notebookRequired": "⚠️ Labels sind nur in Notizbüchern verfügbar. Verschieben Sie diese Notiz zuerst in ein Notizbuch.", + "selectedLabels": "Ausgewählte Labels", + "showLess": "Weniger anzeigen", + "showMore": "Mehr anzeigen", + "tagAdded": "Tag \"{tag}\" hinzugefügt", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "Klicken zum Anzeigen", + "comparison": { + "clickToView": "Klicken Sie, um die Notiz anzuzeigen", + "helpful": "Hilfreich", + "helpfulQuestion": "Ist dieser Vergleich hilfreich?", + "highSimilarityInsight": "Diese Notizen behandeln das gleiche Thema mit einem hohen Ähnlichkeitsgrad. Sie könnten zusammengeführt oder konsolidiert werden.", + "notHelpful": "Nicht hilfreich", + "similarityInfo": "Diese Notizen sind zu {similarity}% ähnlich", + "title": "💡 Notizvergleich", + "untitled": "Unbenannt" + }, + "connection": "Verbindung", + "connections": "Verbindungen", + "connectionsBadge": "{count} Verbindung{plural}", + "dailyInsight": "Tägliche Einblicke aus Ihren Notizen", + "description": "Proaktive Verbindungen zwischen Ihren Notizen", + "dismiss": "Vorzeitig schließen", + "editorSection": { + "close": "Schließen", + "compare": "Vergleichen", + "compareAll": "Alle vergleichen", + "loading": "Wird geladen...", + "merge": "Zusammenführen", + "mergeAll": "Alle zusammenführen", + "title": "⚡ Verbundene Notizen ({count})", + "view": "Anzeigen" + }, + "fused": "Fusioniert", + "fusion": { + "archiveOriginals": "Originale Notizen archivieren", + "cancel": "Abbrechen", + "confirmFusion": "Fusion bestätigen", + "createBacklinks": "Backlink zu ursprünglichen Notizen erstellen", + "edit": "Bearbeiten", + "error": "Fehler beim Zusammenführen der Notizen", + "finishEditing": "Bearbeitung beenden", + "generateError": "Fehler beim Generieren der Fusion", + "generateFusion": "Fusion generieren", + "generating": "Wird generiert...", + "keepAllTags": "Alle Tags behalten", + "mergeNotes": "{count} Notiz(en) zusammenführen", + "modify": "Ändern", + "noContentReturned": "Kein Fusion-Inhalt von der API zurückgegeben", + "notesToMerge": "📝 Zu zusammenführende Notizen", + "optionalPrompt": "💬 Fusion-Prompt (optional)", + "optionsTitle": "Fusionsoptionen", + "previewTitle": "📝 Vorschau der zusammengeführten Notiz", + "promptPlaceholder": "Optionale Anweisungen für die KI (z. B. 'Den formalen Stil von Notiz 1 beibehalten')...", + "success": "Notizen erfolgreich zusammengeführt!", + "title": "🔗 Intelligente Fusion", + "unknownDate": "Unbekanntes Datum", + "useLatestTitle": "Neueste Notiz als Titel verwenden" + }, + "helpful": "Hilfreich", + "insightReady": "Ihr Einblick ist bereit!", + "notHelpful": "Nicht hilfreich", + "overlay": { + "error": "Fehler beim Laden der Verbindungen", + "loading": "Wird geladen...", + "noConnections": "Keine Verbindungen gefunden", + "searchPlaceholder": "Verbindungen suchen...", + "sortBy": "Sortieren nach:", + "sortOldest": "Älteste", + "sortRecent": "Neueste", + "sortSimilarity": "Ähnlichkeit", + "title": "Verbundene Notizen", + "viewAll": "Alle nebeneinander anzeigen" + }, + "thanksFeedback": "Danke für Ihr Feedback!", + "thanksFeedbackImproving": "Danke! Wir werden dies zur Verbesserung nutzen.", + "title": "Ich habe etwas bemerkt...", + "viewConnection": "Verbindung anzeigen" + }, + "nav": { + "accountSettings": "Kontoeinstellungen", + "adminDashboard": "Admin-Dashboard", + "aiSettings": "KI-Einstellungen", + "archive": "Archiv", + "buyMeACoffee": "Lad mir einen Kaffee", + "configureAI": "Konfigurieren Sie Ihre KI-gesteuerten Funktionen, Provider und Präferenzen", + "diagnostics": "Diagnose", + "donateOnKofi": "Auf Ko-fi spenden", + "donationDescription": "Machen Sie eine einmalige Spende oder werden Sie monatlicher Unterstützer.", + "donationNote": "Keine Plattformgebühren • Sofortige Auszahlungen • Sicher", + "favorites": "Favoriten", + "generalNotes": "Allgemeine Notizen", + "home": "Startseite", + "login": "Anmelden", + "logout": "Abmelden", + "manageAISettings": "KI-Einstellungen verwalten", + "myLibrary": "Meine Bibliothek", + "notebooks": "Notizbücher", + "notes": "Notizen", + "proPlan": "Pro Plan", + "profile": "Profil", + "quickAccess": "Schnellzugriff", + "recent": "Aktuell", + "reminders": "Erinnerungen", + "settings": "Einstellungen", + "sponsorDescription": "Werden Sie monatlicher Sponsor und erhalten Sie Anerkennung.", + "sponsorOnGithub": "Auf GitHub sponsoren", + "support": "Memento unterstützen ☕", + "supportDescription": "Memento ist zu 100% kostenlos und Open Source. Ihre Unterstützung hilft, es so zu halten.", + "supportDevelopment": "Memento-Entwicklung unterstützen ☕", + "trash": "Papierkorb", + "userManagement": "Benutzerverwaltung", + "workspace": "Arbeitsbereich" + }, + "notebook": { + "cancel": "Abbrechen", + "create": "Notizbuch erstellen", + "createDescription": "Starten Sie eine neue Sammlung, um Ihre Notizen, Ideen und Projekte effizient zu organisieren.", + "createNew": "Neues Notizbuch erstellen", + "creating": "Erstellen...", + "delete": "Notizbuch löschen", + "deleteConfirm": "Löschen", + "deleteWarning": "Möchten Sie dieses Notizbuch wirklich löschen? Notizen werden in Allgemeine Notizen verschoben.", + "edit": "Notizbuch bearbeiten", + "editDescription": "Ändern Sie den Namen, das Symbol und die Farbe Ihres Notizbuchs.", + "generating": "Zusammenfassung wird generiert...", + "labels": "Labels", + "name": "Notizbuch-Name", + "noLabels": "Keine Labels", + "selectColor": "Farbe", + "selectIcon": "Symbol", + "summary": "Notizbuch-Zusammenfassung", + "summaryDescription": "Generieren Sie eine KI-gestützte Zusammenfassung aller Notizen in diesem Notizbuch.", + "summaryError": "Fehler beim Generieren der Zusammenfassung" + }, + "notebookSuggestion": { + "description": "Diese Notiz scheint zu diesem Notizbuch zu gehören", + "dismiss": "Schließen", + "dismissIn": "Schließen (schließt in {timeLeft}s)", + "generalNotes": "Allgemeine Notizen", + "move": "Verschieben", + "moveToNotebook": "In Notizbuch verschieben", + "title": "Nach {icon} {name} verschieben?" + }, + "notebooks": { + "allNotebooks": "Alle Notizbücher", + "create": "Notizbuch erstellen", + "createFirst": "Erstellen Sie Ihr erstes Notizbuch", + "noNotebooks": "Keine Notizbücher" + }, + "notes": { + "add": "Hinzufügen", + "addCollaborators": "Mitarbeiter hinzufügen", + "addImage": "Bild hinzufügen", + "addItem": "Element hinzufügen", + "addLink": "Link hinzufügen", + "addListItem": "+ Listenelement", + "addNote": "Notiz hinzufügen", + "adding": "Wird hinzugefügt...", + "aiAssistant": "KI-Assistent", + "archive": "Archivieren", + "backgroundOptions": "Hintergrundoptionen", + "changeColor": "Farbe ändern", + "changeSize": "Größe ändern", + "clarifyFailed": "Klarstellung fehlgeschlagen", + "close": "Schließen", + "color": "Farbe", + "confirmDelete": "Möchten Sie diese Notiz wirklich löschen?", + "confirmLeaveShare": "Möchten Sie diese geteilte Notiz wirklich verlassen?", + "contentOrMediaRequired": "Bitte geben Sie Inhalte ein oder fügen Sie einen Link/Bild hinzu", + "copy": "Kopieren", + "copyFailed": "Fehler beim Kopieren der Notiz", + "copySuccess": "Notiz erfolgreich kopiert!", + "createFirstNote": "Erstellen Sie Ihre erste Notiz", + "date": "Datum", + "delete": "Löschen", + "dragToReorder": "Ziehen zum Neuanordnen", + "duplicate": "Duplizieren", + "edit": "Notiz bearbeiten", + "emptyState": "Keine Notizen vorhanden", + "fileTooLarge": "Datei zu groß: {fileName}. Maximale Größe ist {maxSize}.", + "improveFailed": "Verbesserung fehlgeschlagen", + "inNotebook": "In Notizbuch", + "invalidDateTime": "Ungültiges Datum oder Uhrzeit", + "invalidFileType": "Ungültiger Dateityp: {fileName}. Nur JPEG, PNG, GIF und WebP sind zulässig.", + "itemOrMediaRequired": "Bitte fügen Sie mindestens ein Element oder Medium hinzu", + "large": "Groß", + "leaveShare": "Verlassen", + "linkAddFailed": "Link konnte nicht hinzugefügt werden", + "linkAdded": "Link hinzugefügt", + "linkMetadataFailed": "Link-Metadaten konnten nicht abgerufen werden", + "listItem": "Listenelement", + "makeCopy": "Kopie erstellen", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown AUS", + "markdownOn": "Markdown EIN", + "markdownPlaceholder": "Notiz machen... (Markdown unterstützt)", + "medium": "Mittel", + "more": "Mehr", + "moreOptions": "Weitere Optionen", + "moveFailed": "Verschieben fehlgeschlagen", + "newChecklist": "Neue Checkliste", + "newNote": "Neue Notiz", + "noContent": "Kein Inhalt", + "noNotes": "Keine Notizen", + "noNotesFound": "Keine Notizen gefunden", + "noteCreateFailed": "Fehler beim Erstellen der Notiz", + "noteCreated": "Notiz erfolgreich erstellt", + "others": "Andere", + "pin": "Anheften", + "pinned": "Angeheftet", + "pinnedNotes": "Angeheftete Notizen", + "placeholder": "Notiz machen...", + "preview": "Vorschau", + "readOnly": "Schreibgeschützt", + "recent": "Aktuell", + "redo": "Wiederholen (Strg+Y)", + "redoShortcut": "Wiederholen (Strg+Y)", + "remindMe": "Mich erinnern", + "reminderDateTimeRequired": "Bitte Datum und Uhrzeit eingeben", + "reminderMustBeFuture": "Die Erinnerung muss in der Zukunft liegen", + "reminderPastError": "Die Erinnerung muss in der Zukunft liegen", + "reminderRemoved": "Erinnerung entfernt", + "reminderSet": "Erinnerung festgelegt für {datetime}", + "remove": "Entfernen", + "saving": "Wird gespeichert...", + "setReminder": "Erinnerung festlegen", + "setReminderButton": "Erinnerung festlegen", + "share": "Teilen", + "shareWithCollaborators": "Mit Mitarbeitern teilen", + "sharedBy": "Geteilt von", + "sharedReadOnly": "Diese Notiz ist mit Ihnen im schreibgeschützten Modus geteilt", + "shortenFailed": "Kürzen fehlgeschlagen", + "showCollaborators": "Mitarbeiter anzeigen", + "size": "Größe", + "small": "Klein", + "takeNote": "Notiz machen...", + "takeNoteMarkdown": "Notiz machen... (Markdown unterstützt)", + "time": "Uhrzeit", + "title": "Notizen", + "titlePlaceholder": "Titel", + "transformFailed": "Umwandlung fehlgeschlagen", + "unarchive": "Aus Archiv entfernen", + "undo": "Rückgängig (Strg+Z)", + "undoShortcut": "Rückgängig (Strg+Z)", + "unpin": "Loslösen", + "unpinned": "Nicht angepinnt", + "untitled": "Unbenannt", + "uploadFailed": "Upload fehlgeschlagen für {filename}", + "view": "Notiz anzeigen" + }, + "pagination": { + "next": "→", + "pageInfo": "Seite {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "Locker", + "expand": "Erweitern", + "formal": "Formell", + "improve": "Verbessern", + "shorten": "Kürzen", + "title": "Textverbesserung" + }, + "profile": { + "accountSettings": "Kontoeinstellungen", + "autoDetect": "Automatische Erkennung", + "changePassword": "Passwort ändern", + "changePasswordDescription": "Aktualisieren Sie Ihr Passwort. Sie benötigen Ihr aktuelles Passwort.", + "confirmPassword": "Passwort bestätigen", + "currentPassword": "Aktuelles Passwort", + "description": "Aktualisieren Sie Ihre persönlichen Informationen", + "displayName": "Anzeigename", + "displaySettings": "Anzeigeeinstellungen", + "displaySettingsDescription": "Passen Sie die Darstellung und Schriftgröße an.", + "email": "E-Mail", + "fontSize": "Schriftgröße", + "fontSizeDescription": "Passen Sie die Schriftgröße für bessere Lesbarkeit an. Dies gilt für alle Texte in der Oberfläche.", + "fontSizeExtraLarge": "Extra groß", + "fontSizeLarge": "Groß", + "fontSizeMedium": "Mittel", + "fontSizeSmall": "Klein", + "fontSizeUpdateFailed": "Fehler beim Aktualisieren der Schriftgröße", + "fontSizeUpdateSuccess": "Schriftgröße erfolgreich aktualisiert", + "languageDescription": "Diese Sprache wird für KI-gesteuerte Funktionen, Inhaltsanalyse und Oberflächentext verwendet.", + "languagePreferences": "Spracheinstellungen", + "languagePreferencesDescription": "Wählen Sie Ihre bevorzugte Sprache für KI-Funktionen und die Oberfläche.", + "languageUpdateFailed": "Fehler beim Aktualisieren der Sprache", + "languageUpdateSuccess": "Sprache erfolgreich aktualisiert", + "manageAISettings": "KI-Einstellungen verwalten", + "newPassword": "Neues Passwort", + "passwordChangeFailed": "Fehler beim Ändern des Passworts", + "passwordChangeSuccess": "Passwort erfolgreich geändert", + "passwordError": "Fehler beim Aktualisieren des Passworts", + "passwordUpdated": "Passwort aktualisiert", + "preferredLanguage": "Bevorzugte Sprache", + "profileError": "Fehler beim Aktualisieren des Profils", + "profileUpdated": "Profil aktualisiert", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "Schriftgröße auswählen", + "selectLanguage": "Sprache auswählen", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "Profil", + "updateFailed": "Fehler beim Aktualisieren des Profils", + "updatePassword": "Passwort aktualisieren", + "updateSuccess": "Profil aktualisiert" + }, + "reminder": { + "cancel": "Abbrechen", + "reminderDate": "Erinnerungsdatum", + "reminderTime": "Erinnerungszeit", + "removeReminder": "Erinnerung entfernen", + "save": "Erinnerung festlegen", + "setReminder": "Erinnerung festlegen", + "title": "Erinnerung" + }, + "resetPassword": { + "confirmNewPassword": "Neues Passwort bestätigen", + "description": "Geben Sie unten Ihr neues Passwort ein.", + "invalidLinkDescription": "Dieser Link zum Zurücksetzen des Passworts ist ungültig oder abgelaufen.", + "invalidLinkTitle": "Ungültiger Link", + "loading": "Wird geladen...", + "newPassword": "Neues Passwort", + "passwordMismatch": "Passwörter stimmen nicht überein", + "requestNewLink": "Neuen Link anfordern", + "resetPassword": "Passwort zurücksetzen", + "resetting": "Zurücksetzen...", + "success": "Passwort erfolgreich zurückgesetzt. Sie können sich jetzt anmelden.", + "title": "Passwort zurücksetzen" + }, + "search": { + "exactMatch": "Exakte Übereinstimmung", + "noResults": "Keine Ergebnisse gefunden", + "placeholder": "Suchen", + "related": "Verwandt", + "resultsFound": "{count} Notizen gefunden", + "searchPlaceholder": "Durchsuchen Sie Ihre Notizen...", + "searching": "Wird gesucht...", + "semanticInProgress": "KI-Suche läuft...", + "semanticTooltip": "Semantische KI-Suche" }, "semanticSearch": { "exactMatch": "Exakte Übereinstimmung", "related": "Verwandt", "searching": "Wird gesucht..." }, - "paragraphRefactor": { - "title": "Textverbesserung", - "shorten": "Kürzen", - "expand": "Erweitern", - "improve": "Verbessern", - "formal": "Formell", - "casual": "Locker" - }, - "memoryEcho": { - "title": "Ich habe etwas bemerkt...", - "description": "Proaktive Verbindungen zwischen Ihren Notizen", - "dailyInsight": "Tägliche Einblicke aus Ihren Notizen", - "insightReady": "Ihr Einblick ist bereit!", - "viewConnection": "Verbindung anzeigen", - "helpful": "Hilfreich", - "notHelpful": "Nicht hilfreich", - "dismiss": "Vorzeitig schließen", - "thanksFeedback": "Danke für Ihr Feedback!", - "thanksFeedbackImproving": "Danke! Wir werden dies zur Verbesserung nutzen.", - "connections": "Verbindungen", - "connection": "Verbindung", - "connectionsBadge": "{count} Verbindung{plural}", - "fused": "Fusioniert", - "overlay": { - "title": "Verbundene Notizen", - "searchPlaceholder": "Verbindungen suchen...", - "sortBy": "Sortieren nach:", - "sortSimilarity": "Ähnlichkeit", - "sortRecent": "Neueste", - "sortOldest": "Älteste", - "viewAll": "Alle nebeneinander anzeigen", - "loading": "Wird geladen...", - "noConnections": "Keine Verbindungen gefunden" - }, - "comparison": { - "title": "💡 Notizvergleich", - "similarityInfo": "Diese Notizen sind zu {similarity}% ähnlich", - "highSimilarityInsight": "Diese Notizen behandeln das gleiche Thema mit einem hohen Ähnlichkeitsgrad. Sie könnten zusammengeführt oder konsolidiert werden.", - "untitled": "Unbenannt", - "clickToView": "Klicken Sie, um die Notiz anzuzeigen", - "helpfulQuestion": "Ist dieser Vergleich hilfreich?", - "helpful": "Hilfreich", - "notHelpful": "Nicht hilfreich" - }, - "editorSection": { - "title": "⚡ Verbundene Notizen ({count})", - "loading": "Wird geladen...", - "view": "Anzeigen", - "compare": "Vergleichen", - "merge": "Zusammenführen", - "compareAll": "Alle vergleichen", - "mergeAll": "Alle zusammenführen" - }, - "fusion": { - "title": "🔗 Intelligente Fusion", - "mergeNotes": "{count} Notiz(en) zusammenführen", - "notesToMerge": "📝 Zu zusammenführende Notizen", - "optionalPrompt": "💬 Fusion-Prompt (optional)", - "promptPlaceholder": "Optionale Anweisungen für die KI (z. B. 'Den formalen Stil von Notiz 1 beibehalten')...", - "generateFusion": "Fusion generieren", - "generating": "Wird generiert...", - "previewTitle": "📝 Vorschau der zusammengeführten Notiz", - "edit": "Bearbeiten", - "modify": "Ändern", - "finishEditing": "Bearbeitung beenden", - "optionsTitle": "Fusionsoptionen", - "archiveOriginals": "Originale Notizen archivieren", - "keepAllTags": "Alle Tags behalten", - "useLatestTitle": "Neueste Notiz als Titel verwenden", - "createBacklinks": "Backlink zu ursprünglichen Notizen erstellen", - "cancel": "Abbrechen", - "confirmFusion": "Fusion bestätigen", - "success": "Notizen erfolgreich zusammengeführt!", - "error": "Fehler beim Zusammenführen der Notizen", - "generateError": "Fehler beim Generieren der Fusion", - "noContentReturned": "Kein Fusion-Inhalt von der API zurückgegeben", - "unknownDate": "Unbekanntes Datum" - } - }, - "nav": { - "home": "Startseite", - "notes": "Notizen", - "notebooks": "Notizbücher", - "generalNotes": "Allgemeine Notizen", - "archive": "Archiv", - "settings": "Einstellungen", - "profile": "Profil", - "aiSettings": "KI-Einstellungen", - "logout": "Abmelden", - "login": "Anmelden", - "adminDashboard": "Admin-Dashboard", - "diagnostics": "Diagnose", - "trash": "Papierkorb", - "support": "Memento unterstützen ☕", - "reminders": "Erinnerungen", - "userManagement": "Benutzerverwaltung", - "accountSettings": "Kontoeinstellungen", - "manageAISettings": "KI-Einstellungen verwalten", - "configureAI": "Konfigurieren Sie Ihre KI-gesteuerten Funktionen, Provider und Präferenzen", - "supportDevelopment": "Memento-Entwicklung unterstützen ☕", - "supportDescription": "Memento ist zu 100% kostenlos und Open Source. Ihre Unterstützung hilft, es so zu halten.", - "buyMeACoffee": "Lad mir einen Kaffee", - "donationDescription": "Machen Sie eine einmalige Spende oder werden Sie monatlicher Unterstützer.", - "donateOnKofi": "Auf Ko-fi spenden", - "donationNote": "Keine Plattformgebühren • Sofortige Auszahlungen • Sicher", - "sponsorOnGithub": "Auf GitHub sponsoren", - "sponsorDescription": "Werden Sie monatlicher Sponsor und erhalten Sie Anerkennung.", - "workspace": "Arbeitsbereich", - "quickAccess": "Schnellzugriff", - "myLibrary": "Meine Bibliothek", - "favorites": "Favoriten", - "recent": "Aktuell", - "proPlan": "Pro Plan" - }, "settings": { - "title": "Einstellungen", - "description": "Verwalten Sie Ihre Einstellungen und Präferenzen", + "about": "Über", "account": "Konto", "appearance": "Darstellung", - "theme": "Design", - "themeLight": "Hell", - "themeDark": "Dunkel", - "themeSystem": "System", - "notifications": "Benachrichtigungen", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "Verwalten Sie Ihre Einstellungen und Präferenzen", "language": "Sprache", - "selectLanguage": "Sprache auswählen", + "languageAuto": "Automatisch", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "Benachrichtigungen", "privacy": "Datenschutz", + "profile": "Profil", + "searchNoResults": "Keine Ergebnisse gefunden", "security": "Sicherheit", - "about": "Über", - "version": "Version", - "settingsSaved": "Einstellungen gespeichert", - "settingsError": "Fehler beim Speichern der Einstellungen" - }, - "profile": { - "title": "Profil", - "description": "Aktualisieren Sie Ihre persönlichen Informationen", - "displayName": "Anzeigename", - "email": "E-Mail", - "changePassword": "Passwort ändern", - "changePasswordDescription": "Aktualisieren Sie Ihr Passwort. Sie benötigen Ihr aktuelles Passwort.", - "currentPassword": "Aktuelles Passwort", - "newPassword": "Neues Passwort", - "confirmPassword": "Passwort bestätigen", - "updatePassword": "Passwort aktualisieren", - "passwordChangeSuccess": "Passwort erfolgreich geändert", - "passwordChangeFailed": "Fehler beim Ändern des Passworts", - "passwordUpdated": "Passwort aktualisiert", - "passwordError": "Fehler beim Aktualisieren des Passworts", - "languagePreferences": "Spracheinstellungen", - "languagePreferencesDescription": "Wählen Sie Ihre bevorzugte Sprache für KI-Funktionen und die Oberfläche.", - "preferredLanguage": "Bevorzugte Sprache", "selectLanguage": "Sprache auswählen", - "languageDescription": "Diese Sprache wird für KI-gesteuerte Funktionen, Inhaltsanalyse und Oberflächentext verwendet.", - "autoDetect": "Automatische Erkennung", - "updateSuccess": "Profil aktualisiert", - "updateFailed": "Fehler beim Aktualisieren des Profils", - "languageUpdateSuccess": "Sprache erfolgreich aktualisiert", - "languageUpdateFailed": "Fehler beim Aktualisieren der Sprache", - "profileUpdated": "Profil aktualisiert", - "profileError": "Fehler beim Aktualisieren des Profils", - "accountSettings": "Kontoeinstellungen", - "manageAISettings": "KI-Einstellungen verwalten", - "displaySettings": "Anzeigeeinstellungen", - "displaySettingsDescription": "Passen Sie die Darstellung und Schriftgröße an.", - "fontSize": "Schriftgröße", - "selectFontSize": "Schriftgröße auswählen", - "fontSizeSmall": "Klein", - "fontSizeMedium": "Mittel", - "fontSizeLarge": "Groß", - "fontSizeExtraLarge": "Extra groß", - "fontSizeDescription": "Passen Sie die Schriftgröße für bessere Lesbarkeit an. Dies gilt für alle Texte in der Oberfläche.", - "fontSizeUpdateSuccess": "Schriftgröße erfolgreich aktualisiert", - "fontSizeUpdateFailed": "Fehler beim Aktualisieren der Schriftgröße" + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "Fehler beim Speichern der Einstellungen", + "settingsSaved": "Einstellungen gespeichert", + "theme": "Design", + "themeDark": "Dunkel", + "themeLight": "Hell", + "themeSystem": "System", + "title": "Einstellungen", + "version": "Version" }, - "aiSettings": { - "title": "KI-Einstellungen", - "description": "Konfigurieren Sie Ihre KI-gesteuerten Funktionen und Präferenzen", - "features": "KI-Funktionen", - "provider": "KI-Anbieter", - "providerAuto": "Auto (Empfohlen)", - "providerOllama": "Ollama (Lokal)", - "providerOpenAI": "OpenAI (Cloud)", - "frequency": "Häufigkeit", - "frequencyDaily": "Täglich", - "frequencyWeekly": "Wöchentlich", - "saving": "Wird gespeichert...", - "saved": "Einstellung aktualisiert", - "error": "Fehler beim Aktualisieren der Einstellung" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" }, - "general": { - "loading": "Wird geladen...", - "save": "Speichern", - "cancel": "Abbrechen", - "add": "Hinzufügen", - "edit": "Bearbeiten", - "confirm": "Bestätigen", - "close": "Schließen", - "back": "Zurück", - "next": "Weiter", - "previous": "Zurück", - "submit": "Absenden", - "reset": "Zurücksetzen", - "apply": "Anwenden", - "clear": "Löschen", - "select": "Auswählen", - "tryAgain": "Bitte versuchen Sie es erneut", - "error": "Ein Fehler ist aufgetreten", - "operationSuccess": "Operation erfolgreich", - "operationFailed": "Operation fehlgeschlagen" + "support": { + "aiApiCosts": "KI-API-Kosten:", + "buyMeACoffee": "Lad mir einen Kaffee ein", + "contributeCode": "Code beitragen", + "description": "Memento ist zu 100% kostenlos und Open Source. Ihre Unterstützung hilft, es so zu halten.", + "directImpact": "Direkte Auswirkung", + "domainSSL": "Domain & SSL:", + "donateOnKofi": "Auf Ko-fi spenden", + "donationDescription": "Machen Sie eine einmalige Spende oder werden Sie monatlicher Unterstützer.", + "githubDescription": "Wiederkehrende Unterstützung • Öffentliche Anerkennung • Entwickler-fokussiert", + "hostingServers": "Hosting & Server:", + "howSupportHelps": "Wie Ihre Unterstützung hilft", + "kofiDescription": "Keine Plattformgebühren • Sofortige Auszahlungen • Sicher", + "otherWaysTitle": "Andere Möglichkeiten zu unterstützen", + "reportBug": "Einen Bug melden", + "shareTwitter": "Auf Twitter teilen", + "sponsorDescription": "Werden Sie monatlicher Sponsor und erhalten Sie Anerkennung.", + "sponsorOnGithub": "Auf GitHub sponsoren", + "sponsorPerks": "Sponsor-Vorteile", + "starGithub": "Auf GitHub markieren", + "title": "Memento-Entwicklung unterstützen", + "totalExpenses": "Gesamtausgaben:", + "transparency": "Transparenz", + "transparencyDescription": "Ich glaube an vollständige Transparenz. So werden Spenden verwendet:" }, - "colors": { - "default": "Standard", - "red": "Rot", - "blue": "Blau", - "green": "Grün", - "yellow": "Gelb", - "purple": "Lila", - "pink": "Rosa", - "orange": "Orange", - "gray": "Grau" + "testPages": { + "titleSuggestions": { + "analyzing": "Analysieren...", + "contentLabel": "Inhalt (mehr als 50 Wörter erforderlich):", + "error": "Fehler:", + "idle": "Inaktiv", + "noSuggestions": "Noch keine Vorschläge. Schreiben Sie 50+ Wörter und warten Sie 2 Sekunden.", + "placeholder": "Schreiben Sie hier mindestens 50 Wörter...", + "status": "Status:", + "suggestions": "Vorschläge ({count}):", + "title": "Titelvorschläge testen", + "wordCount": "Wortanzahl:" + } }, - "reminder": { - "title": "Erinnerung", - "setReminder": "Erinnerung festlegen", - "removeReminder": "Erinnerung entfernen", - "reminderDate": "Erinnerungsdatum", - "reminderTime": "Erinnerungszeit", - "save": "Erinnerung festlegen", - "cancel": "Abbrechen" + "time": { + "daysAgo": "vor {count} Tag(en)", + "hoursAgo": "vor {count} Stunde(n)", + "justNow": "Gerade eben", + "minutesAgo": "vor {count} Minute(n)", + "today": "Heute", + "tomorrow": "Morgen", + "yesterday": "Gestern" }, - "notebookSuggestion": { - "title": "Nach {icon} {name} verschieben?", - "description": "Diese Notiz scheint zu diesem Notizbuch zu gehören", - "move": "Verschieben", + "titleSuggestions": { + "available": "Titelvorschläge", "dismiss": "Schließen", - "dismissIn": "Schließen (schließt in {timeLeft}s)", - "moveToNotebook": "In Notizbuch verschieben", - "generalNotes": "Allgemeine Notizen" + "generating": "Wird generiert...", + "selectTitle": "Titel auswählen", + "title": "KI-Vorschläge" + }, + "toast": { + "feedbackFailed": "Fehler beim Senden des Feedbacks", + "notesFusionSuccess": "Notizen erfolgreich zusammengeführt!", + "openConnectionFailed": "Fehler beim Öffnen der Verbindung", + "openingConnection": "Verbindung wird geöffnet...", + "operationFailed": "Operation fehlgeschlagen", + "operationSuccess": "Operation erfolgreich", + "saveFailed": "Fehler beim Speichern der Einstellung", + "saved": "Einstellung gespeichert", + "thanksFeedback": "Danke für Ihr Feedback!", + "thanksFeedbackImproving": "Danke! Wir werden dies zur Verbesserung nutzen." + }, + "trash": { + "deletePermanently": "Dauerhaft löschen", + "empty": "Der Papierkorb ist leer", + "restore": "Wiederherstellen", + "title": "Papierkorb" + }, + "ui": { + "close": "Schließen", + "collapse": "Zusammenklappen", + "expand": "Erweitern", + "open": "Öffnen" } } diff --git a/keep-notes/locales/en.json b/keep-notes/locales/en.json index 10a4980..3cb3bd4 100644 --- a/keep-notes/locales/en.json +++ b/keep-notes/locales/en.json @@ -25,7 +25,8 @@ "forgotPasswordDescription": "Enter your email address and we'll send you a link to reset your password.", "sending": "Sending...", "sendResetLink": "Send Reset Link", - "backToLogin": "Back to login" + "backToLogin": "Back to login", + "signOut": "Sign out" }, "sidebar": { "notes": "Notes", @@ -118,7 +119,24 @@ "markdownOn": "Markdown ON", "markdownOff": "Markdown OFF", "undo": "Undo (Ctrl+Z)", - "redo": "Redo (Ctrl+Y)" + "redo": "Redo (Ctrl+Y)", + "pinnedNotes": "Pinned Notes", + "recent": "Recent", + "addNote": "Add Note", + "remove": "Remove", + "dragToReorder": "Drag to reorder", + "more": "More options", + "emptyState": "No notes yet. Create your first note!", + "inNotebook": "In notebook", + "moveFailed": "Failed to move note. Please try again.", + "clarifyFailed": "Failed to clarify text", + "shortenFailed": "Failed to shorten text", + "improveFailed": "Failed to improve text", + "transformFailed": "Failed to transform text", + "markdown": "Markdown", + "unpinned": "Unpinned", + "redoShortcut": "Redo (Ctrl+Y)", + "undoShortcut": "Undo (Ctrl+Z)" }, "pagination": { "previous": "←", @@ -154,7 +172,9 @@ "editLabelsDescription": "Create, edit colors, or delete labels.", "noLabelsFound": "No labels found.", "loading": "Loading...", - "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first." + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "count": "{count} labels", + "noLabels": "No labels" }, "search": { "placeholder": "Search", @@ -235,7 +255,41 @@ "improveStyle": "Improve style", "reformulationComparison": "Reformulation Comparison", "original": "Original", - "reformulated": "Reformulated" + "reformulated": "Reformulated", + "autoLabels": { + "error": "Failed to fetch label suggestions", + "noLabelsSelected": "No labels selected", + "created": "{count} labels created successfully", + "analyzing": "Analyzing your notes...", + "title": "New Label Suggestions", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "note": "note", + "notes": "notes", + "typeContent": "Type content to get label suggestions...", + "createNewLabel": "Create this new label and add it", + "new": "(new)", + "create": "Create", + "creating": "Creating labels..." + }, + "batchOrganization": { + "title": "Organize with AI", + "description": "AI will analyze your notes and suggest organizing them into notebooks.", + "analyzing": "Analyzing your notes...", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noSuggestions": "AI could not find a good way to organize these notes.", + "apply": "Apply", + "applying": "Applying...", + "success": "{count} notes moved successfully", + "error": "Failed to create organization plan", + "noNotesSelected": "No notes selected", + "applyFailed": "Failed to apply organization plan", + "selectAllIn": "Select all notes in {notebook}", + "selectNote": "Select note: {title}" + }, + "notebookSummary": { + "regenerate": "Regenerate Summary", + "regenerating": "Regenerating summary..." + } }, "batchOrganization": { "error": "Failed to create organization plan", @@ -300,6 +354,7 @@ "connection": "connection", "connectionsBadge": "{count} connection{plural}", "fused": "Fused", + "clickToView": "Click to view note →", "overlay": { "title": "Connected Notes", "searchPlaceholder": "Search connections...", @@ -309,7 +364,8 @@ "sortOldest": "Oldest", "viewAll": "View all side by side", "loading": "Loading...", - "noConnections": "No connections found" + "noConnections": "No connections found", + "error": "Failed to load connections" }, "comparison": { "title": "💡 Note Comparison", @@ -328,7 +384,8 @@ "compare": "Compare", "merge": "Merge", "compareAll": "Compare all", - "mergeAll": "Merge all" + "mergeAll": "Merge all", + "close": "Close" }, "fusion": { "title": "🔗 Intelligent Fusion", @@ -408,7 +465,16 @@ "about": "About", "version": "Version", "settingsSaved": "Settings saved", - "settingsError": "Error saving settings" + "settingsError": "Error saving settings", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "profile": "Profile", + "searchNoResults": "No settings found", + "languageAuto": "Language set to Auto" }, "profile": { "title": "Profile", @@ -468,7 +534,14 @@ "frequencyWeekly": "Weekly", "saving": "Saving...", "saved": "Setting updated", - "error": "Failed to update setting" + "error": "Failed to update setting", + "titleSuggestionsDesc": "Suggest titles for untitled notes after 50+ words", + "paragraphRefactorDesc": "AI-powered text improvement options", + "frequencyDesc": "How often to analyze note connections", + "providerDesc": "Choose your preferred AI provider", + "providerAutoDesc": "Ollama when available, OpenAI fallback", + "providerOllamaDesc": "100% private, runs locally on your machine", + "providerOpenAIDesc": "Most accurate, requires API key" }, "general": { "loading": "Loading...", @@ -489,7 +562,11 @@ "tryAgain": "Please try again", "error": "An error occurred", "operationSuccess": "Operation successful", - "operationFailed": "Operation failed" + "operationFailed": "Operation failed", + "testConnection": "Test Connection", + "clean": "Clean", + "indexAll": "Index All", + "preview": "Preview" }, "colors": { "default": "Default", @@ -528,7 +605,9 @@ "summary": "Notebook Summary", "summaryDescription": "Generate an AI-powered summary of all notes in this notebook.", "generating": "Generating summary...", - "summaryError": "Error generating summary" + "summaryError": "Error generating summary", + "labels": "Labels:", + "noLabels": "No labels" }, "notebookSuggestion": { "title": "Move to {icon} {name}?", @@ -538,5 +617,378 @@ "dismissIn": "Dismiss (closes in {timeLeft}s)", "moveToNotebook": "Move to notebook", "generalNotes": "General Notes" + }, + "admin": { + "title": "Admin Dashboard", + "userManagement": "User Management", + "aiTesting": "AI Testing", + "settings": "Admin Settings", + "security": { + "title": "Security Settings", + "description": "Manage access control and registration policies.", + "allowPublicRegistration": "Allow Public Registration", + "allowPublicRegistrationDescription": "If disabled, new users can only be added by an Administrator via the User Management page.", + "updateSuccess": "Security Settings updated", + "updateFailed": "Failed to update security settings" + }, + "ai": { + "title": "AI Configuration", + "description": "Configure AI providers for auto-tagging and semantic search. Use different providers for optimal performance.", + "tagsGenerationProvider": "Tags Generation Provider", + "tagsGenerationDescription": "AI provider for automatic tag suggestions. Recommended: Ollama (free, local).", + "embeddingsProvider": "Embeddings Provider", + "embeddingsDescription": "AI provider for semantic search embeddings. Recommended: OpenAI (best quality).", + "provider": "Provider", + "baseUrl": "Base URL", + "model": "Model", + "apiKey": "API Key", + "selectOllamaModel": "Select an Ollama model installed on your system", + "openAIKeyDescription": "Your OpenAI API key from platform.openai.com", + "modelRecommendations": "gpt-4o-mini = Best value • gpt-4o = Best quality", + "commonModelsDescription": "Common models for OpenAI-compatible APIs", + "selectEmbeddingModel": "Select an embedding model installed on your system", + "commonEmbeddingModels": "Common embedding models for OpenAI-compatible APIs", + "saving": "Saving...", + "saveSettings": "Save AI Settings", + "openTestPanel": "Open AI Test Panel", + "updateSuccess": "AI Settings updated successfully", + "updateFailed": "Failed to update AI settings", + "providerTagsRequired": "AI_PROVIDER_TAGS is required", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING is required", + "providerOllamaOption": "🦙 Ollama (Local & Free)", + "providerOpenAIOption": "🤖 OpenAI (GPT-5, GPT-4)", + "providerCustomOption": "🔧 Custom OpenAI-Compatible", + "bestValue": "Best value", + "bestQuality": "Best quality", + "saved": "(Saved)" + }, + "smtp": { + "title": "SMTP Configuration", + "description": "Configure email server for password resets.", + "host": "Host", + "port": "Port", + "username": "Username", + "password": "Password", + "fromEmail": "From Email", + "forceSSL": "Force SSL/TLS (usually for port 465)", + "ignoreCertErrors": "Ignore Certificate Errors (Self-hosted/Dev only)", + "saveSettings": "Save SMTP Settings", + "sending": "Sending...", + "testEmail": "Test Email", + "updateSuccess": "SMTP Settings updated", + "updateFailed": "Failed to update SMTP settings", + "testSuccess": "Test email sent successfully!", + "testFailed": "Failed: {error}" + }, + "users": { + "createUser": "Create User", + "addUser": "Add User", + "createUserDescription": "Add a new user to the system.", + "name": "Name", + "email": "Email", + "password": "Password", + "role": "Role", + "createSuccess": "User created successfully", + "createFailed": "Failed to create user", + "deleteSuccess": "User deleted", + "deleteFailed": "Failed to delete", + "roleUpdateSuccess": "User role updated to {role}", + "roleUpdateFailed": "Failed to update role", + "demote": "Demote to User", + "promote": "Promote to Admin", + "confirmDelete": "Are you sure? This action cannot be undone.", + "table": { + "name": "Name", + "email": "Email", + "role": "Role", + "createdAt": "Created At", + "actions": "Actions" + }, + "roles": { + "user": "User", + "admin": "Admin" + } + }, + "aiTest": { + "title": "AI Provider Testing", + "description": "Test your AI providers for tag generation and semantic search embeddings", + "tagsTestTitle": "Tags Generation Test", + "tagsTestDescription": "Test the AI provider responsible for automatic tag suggestions", + "embeddingsTestTitle": "Embeddings Test", + "embeddingsTestDescription": "Test the AI provider responsible for semantic search embeddings", + "howItWorksTitle": "How Testing Works", + "provider": "Provider:", + "model": "Model:", + "testing": "Testing...", + "runTest": "Run Test", + "testPassed": "Test Passed", + "testFailed": "Test Failed", + "responseTime": "Response time: {time}ms", + "generatedTags": "Generated Tags:", + "embeddingDimensions": "Embedding Dimensions:", + "vectorDimensions": "vector dimensions", + "first5Values": "First 5 values:", + "error": "Error:", + "testError": "Test Error: {error}", + "tipTitle": "Tip:", + "tipDescription": "Use the AI Test Panel to diagnose configuration issues before testing." + } + }, + "about": { + "title": "About", + "description": "Information about the application", + "appName": "Keep Notes", + "appDescription": "A powerful note-taking application with AI-powered features", + "version": "Version", + "buildDate": "Build Date", + "platform": "Platform", + "platformWeb": "Web", + "features": { + "title": "Features", + "description": "AI-powered capabilities", + "titleSuggestions": "AI-powered title suggestions", + "semanticSearch": "Semantic search with embeddings", + "paragraphReformulation": "Paragraph reformulation", + "memoryEcho": "Memory Echo daily insights", + "notebookOrganization": "Notebook organization", + "dragDrop": "Drag & drop note management", + "labelSystem": "Label system", + "multipleProviders": "Multiple AI providers (OpenAI, Ollama)" + }, + "technology": { + "title": "Technology Stack", + "description": "Built with modern technologies", + "frontend": "Frontend", + "backend": "Backend", + "database": "Database", + "authentication": "Authentication", + "ai": "AI", + "ui": "UI", + "testing": "Testing" + }, + "support": { + "title": "Support", + "description": "Get help and feedback", + "documentation": "Documentation", + "reportIssues": "Report Issues", + "feedback": "Feedback" + } + }, + "support": { + "title": "Support Memento Development", + "description": "Memento is 100% free and open-source. Your support helps keep it that way.", + "buyMeACoffee": "Buy me a coffee", + "donationDescription": "Make a one-time donation or become a monthly supporter.", + "donateOnKofi": "Donate on Ko-fi", + "kofiDescription": "No platform fees • Instant payouts • Secure", + "sponsorOnGithub": "Sponsor on GitHub", + "sponsorDescription": "Become a monthly sponsor and get recognition.", + "githubDescription": "Recurring support • Public recognition • Developer-focused", + "howSupportHelps": "How Your Support Helps", + "directImpact": "Direct Impact", + "sponsorPerks": "Sponsor Perks", + "transparency": "Transparency", + "transparencyDescription": "I believe in complete transparency. Here's how donations are used:", + "hostingServers": "Hosting & servers:", + "domainSSL": "Domain & SSL:", + "aiApiCosts": "AI API costs:", + "totalExpenses": "Total expenses:", + "otherWaysTitle": "Other Ways to Support", + "starGithub": "Star on GitHub", + "reportBug": "Report a bug", + "contributeCode": "Contribute code", + "shareTwitter": "Share on Twitter" + }, + "demoMode": { + "title": "Demo Mode", + "activated": "Demo Mode activated! Memory Echo will now work instantly.", + "deactivated": "Demo Mode disabled. Normal parameters restored.", + "toggleFailed": "Failed to toggle demo mode", + "description": "Speeds up Memory Echo for testing. Connections appear instantly.", + "parametersActive": "Demo parameters active:", + "similarityThreshold": "50% similarity threshold (normally 75%)", + "delayBetweenNotes": "0-day delay between notes (normally 7 days)", + "unlimitedInsights": "Unlimited insights (no frequency limits)", + "createNotesTip": "Create 2+ similar notes and see Memory Echo in action!" + }, + "resetPassword": { + "title": "Reset Password", + "description": "Enter your new password below.", + "invalidLinkTitle": "Invalid Link", + "invalidLinkDescription": "This password reset link is invalid or has expired.", + "requestNewLink": "Request new link", + "newPassword": "New Password", + "confirmNewPassword": "Confirm New Password", + "resetting": "Resetting...", + "resetPassword": "Reset Password", + "passwordMismatch": "Passwords don't match", + "success": "Password reset successfully. You can now login.", + "loading": "Loading..." + }, + "dataManagement": { + "title": "Data Management", + "toolsDescription": "Tools to maintain your database health", + "exporting": "Exporting...", + "importing": "Importing...", + "deleting": "Deleting...", + "dangerZone": "Danger Zone", + "dangerZoneDescription": "Permanently delete your data", + "indexingComplete": "Indexing complete: {count} notes processed", + "indexingError": "Error during indexing", + "cleanupComplete": "Cleanup complete: {created} created, {deleted} removed", + "cleanupError": "Error during cleanup", + "export": { + "title": "Export All Notes", + "description": "Download all your notes as a JSON file. This includes all content, labels, and metadata.", + "button": "Export Notes", + "success": "Notes exported successfully", + "failed": "Failed to export notes" + }, + "import": { + "title": "Import Notes", + "description": "Upload a JSON file to import notes. This will add to your existing notes, not replace them.", + "button": "Import Notes", + "success": "Imported {count} notes", + "failed": "Failed to import notes" + }, + "delete": { + "title": "Delete All Notes", + "description": "Permanently delete all your notes. This action cannot be undone.", + "button": "Delete All Notes", + "confirm": "Are you sure? This will permanently delete all your notes.", + "success": "All notes deleted", + "failed": "Failed to delete notes" + }, + "indexing": { + "title": "Rebuild Search Index", + "description": "Regenerate embeddings for all notes to improve semantic search.", + "button": "Rebuild Index", + "success": "Indexing complete: {count} notes processed", + "failed": "Error during indexing" + }, + "cleanup": { + "title": "Cleanup Orphaned Data", + "description": "Remove labels and connections that reference deleted notes.", + "button": "Cleanup", + "failed": "Error during cleanup" + } + }, + "appearance": { + "title": "Appearance", + "description": "Customize how the app looks" + }, + "generalSettings": { + "title": "General Settings", + "description": "General application settings" + }, + "toast": { + "saved": "Setting saved", + "saveFailed": "Failed to save setting", + "operationSuccess": "Operation successful", + "operationFailed": "Operation failed", + "openingConnection": "Opening connection...", + "openConnectionFailed": "Failed to open connection", + "thanksFeedback": "Thanks for your feedback!", + "thanksFeedbackImproving": "Thanks! We'll use this to improve.", + "feedbackFailed": "Failed to submit feedback", + "notesFusionSuccess": "Notes merged successfully!" + }, + "testPages": { + "titleSuggestions": { + "title": "Test Title Suggestions", + "contentLabel": "Content (need 50+ words):", + "placeholder": "Type at least 50 words here...", + "wordCount": "Word count:", + "status": "Status:", + "analyzing": "Analyzing...", + "idle": "Idle", + "error": "Error:", + "suggestions": "Suggestions ({count}):", + "noSuggestions": "No suggestions yet. Type 50+ words and wait 2 seconds." + } + }, + "trash": { + "title": "Trash", + "empty": "The trash is empty", + "restore": "Restore", + "deletePermanently": "Delete Permanently" + }, + "footer": { + "privacy": "Privacy", + "terms": "Terms", + "openSource": "Open Source Clone" + }, + "connection": { + "similarityInfo": "These notes are connected by {similarity}% similarity", + "clickToView": "Click to view note", + "isHelpful": "Is this connection helpful?", + "helpful": "Helpful", + "notHelpful": "Not Helpful", + "memoryEchoDiscovery": "Memory Echo Discovery" + }, + "diagnostics": { + "title": "Diagnostics", + "description": "Check your AI provider connection status", + "configuredProvider": "Configured Provider", + "apiStatus": "API Status", + "operational": "Operational", + "errorStatus": "Error", + "checking": "Checking...", + "testDetails": "Test Details:", + "troubleshootingTitle": "Troubleshooting Tips:", + "tip1": "Make sure Ollama is running (ollama serve)", + "tip2": "Check that the model is installed (ollama pull llama3)", + "tip3": "Verify your API key for OpenAI", + "tip4": "Check network connectivity" + }, + "batch": { + "organizeWithAI": "Organize with AI", + "organize": "Organize" + }, + "common": { + "unknown": "Unknown", + "notAvailable": "N/A", + "loading": "Loading...", + "error": "Error", + "success": "Success", + "confirm": "Confirm", + "cancel": "Cancel", + "close": "Close", + "save": "Save", + "delete": "Delete", + "edit": "Edit", + "add": "Add", + "remove": "Remove", + "search": "Search", + "noResults": "No results", + "required": "Required", + "optional": "Optional" + }, + "time": { + "justNow": "just now", + "minutesAgo": "{count}m ago", + "hoursAgo": "{count}h ago", + "daysAgo": "{count}d ago", + "yesterday": "Yesterday", + "today": "Today", + "tomorrow": "Tomorrow" + }, + "favorites": { + "title": "Favorites", + "toggleSection": "Toggle pinned notes section", + "noFavorites": "No pinned notes yet", + "pinToFavorite": "Pin a note to add it to favorites" + }, + "notebooks": { + "create": "Create notebook", + "allNotebooks": "All Notebooks", + "noNotebooks": "No notebooks yet", + "createFirst": "Create your first notebook" + }, + "ui": { + "close": "Close", + "open": "Open", + "expand": "Expand", + "collapse": "Collapse" } } \ No newline at end of file diff --git a/keep-notes/locales/es.json b/keep-notes/locales/es.json index ee2f4b7..8f47c78 100644 --- a/keep-notes/locales/es.json +++ b/keep-notes/locales/es.json @@ -1,530 +1,989 @@ { - "auth": { - "signIn": "Iniciar sesión", - "signUp": "Registrarse", - "email": "Correo electrónico", - "password": "Contraseña", - "name": "Nombre", - "emailPlaceholder": "Ingrese su correo electrónico", - "passwordPlaceholder": "Ingrese su contraseña", - "namePlaceholder": "Ingrese su nombre", - "passwordMinChars": "Ingrese contraseña (mínimo 6 caracteres)", - "resetPassword": "Restablecer contraseña", - "resetPasswordInstructions": "Ingrese su correo para restablecer su contraseña", - "forgotPassword": "¿Olvidaste tu contraseña?", - "noAccount": "¿No tienes una cuenta?", - "hasAccount": "¿Ya tienes una cuenta?", - "signInToAccount": "Inicia sesión en tu cuenta", - "createAccount": "Crea tu cuenta", - "rememberMe": "Recordarme", - "orContinueWith": "O continuar con", - "checkYourEmail": "Revisa tu correo", - "resetEmailSent": "Hemos enviado un enlace de restablecimiento de contraseña a tu correo si existe en nuestro sistema.", - "returnToLogin": "Volver al inicio de sesión", - "forgotPasswordTitle": "Contraseña olvidada", - "forgotPasswordDescription": "Ingresa tu correo electrónico y te enviaremos un enlace para restablecer tu contraseña.", - "sending": "Enviando...", - "sendResetLink": "Enviar enlace de restablecimiento", - "backToLogin": "Volver al inicio de sesión" + "about": { + "appDescription": "Una poderosa aplicación de notas con funciones impulsadas por IA", + "appName": "Keep Notes", + "buildDate": "Fecha de compilación", + "description": "Información sobre la aplicación", + "features": { + "description": "Capacidades impulsadas por IA", + "dragDrop": "Gestión de notas con arrastrar y soltar", + "labelSystem": "Sistema de etiquetas", + "memoryEcho": "Insights diarios de Memory Echo", + "multipleProviders": "Múltiples proveedores de IA (OpenAI, Ollama)", + "notebookOrganization": "Organización por cuadernos", + "paragraphReformulation": "Reformulación de párrafos", + "semanticSearch": "Búsqueda semántica con embeddings", + "title": "Funciones", + "titleSuggestions": "Sugerencias de título con IA" + }, + "platform": "Plataforma", + "platformWeb": "Web", + "support": { + "description": "Obtén ayuda y comentarios", + "documentation": "Documentación", + "feedback": "Comentarios", + "reportIssues": "Reportar problemas", + "title": "Soporte" + }, + "technology": { + "ai": "IA", + "authentication": "Autenticación", + "backend": "Backend", + "database": "Base de datos", + "description": "Construido con tecnologías modernas", + "frontend": "Frontend", + "testing": "Pruebas", + "title": "Stack tecnológico", + "ui": "UI" + }, + "title": "Acerca de", + "version": "Versión" }, - "notes": { - "title": "Notas", - "newNote": "Nueva nota", - "untitled": "Sin título", - "placeholder": "Toma una nota...", - "markdownPlaceholder": "Toma una nota... (Markdown compatible)", - "titlePlaceholder": "Título", - "listItem": "Elemento de lista", - "addListItem": "+ Elemento de lista", - "newChecklist": "Nueva lista de verificación", - "add": "Agregar", - "adding": "Agregando...", - "close": "Cerrar", - "confirmDelete": "¿Estás seguro de que quieres eliminar esta nota?", - "confirmLeaveShare": "¿Estás seguro de que quieres abandonar esta nota compartida?", - "sharedBy": "Compartido por", - "leaveShare": "Abandonar", - "delete": "Eliminar", - "archive": "Archivar", - "unarchive": "Desarchivar", - "pin": "Fijar", - "unpin": "Desfijar", - "color": "Color", - "changeColor": "Cambiar color", - "setReminder": "Configurar recordatorio", - "setReminderButton": "Configurar recordatorio", - "date": "Fecha", - "time": "Hora", - "reminderDateTimeRequired": "Por favor ingresa fecha y hora", - "invalidDateTime": "Fecha u hora inválida", - "reminderMustBeFuture": "El recordatorio debe ser en el futuro", - "reminderSet": "Recordatorio configurado para {datetime}", - "reminderPastError": "El recordatorio debe ser en el futuro", - "reminderRemoved": "Recordatorio eliminado", - "addImage": "Agregar imagen", - "addLink": "Agregar enlace", - "linkAdded": "Enlace agregado", - "linkMetadataFailed": "No se pudieron obtener los metadatos del enlace", - "linkAddFailed": "Error al agregar el enlace", - "invalidFileType": "Tipo de archivo inválido: {fileName}. Solo se permiten JPEG, PNG, GIF y WebP.", - "fileTooLarge": "Archivo demasiado grande: {fileName}. El tamaño máximo es {maxSize}.", - "uploadFailed": "Error al cargar {filename}", - "contentOrMediaRequired": "Por favor ingresa algún contenido o agrega un enlace/imagen", - "itemOrMediaRequired": "Por favor agrega al menos un elemento o medio", - "noteCreated": "Nota creada exitosamente", - "noteCreateFailed": "Error al crear la nota", - "aiAssistant": "Asistente IA", - "changeSize": "Cambiar tamaño", - "backgroundOptions": "Opciones de fondo", - "moreOptions": "Más opciones", - "remindMe": "Recordarme", - "markdownMode": "Markdown", - "addCollaborators": "Agregar colaboradores", - "duplicate": "Duplicar", - "share": "Compartir", - "showCollaborators": "Mostrar colaboradores", - "pinned": "Fijadas", - "others": "Otros", - "noNotes": "Sin notas", - "noNotesFound": "No se encontraron notas", - "createFirstNote": "Crea tu primera nota", - "size": "Tamaño", - "small": "Pequeño", - "medium": "Mediano", - "large": "Grande", - "shareWithCollaborators": "Compartir con colaboradores", - "view": "Ver nota", - "edit": "Editar nota", - "readOnly": "Solo lectura", - "preview": "Vista previa", - "noContent": "Sin contenido", - "takeNote": "Toma una nota...", - "takeNoteMarkdown": "Toma una nota... (Markdown compatible)", - "addItem": "Agregar elemento", - "sharedReadOnly": "Esta nota está compartida contigo en modo solo lectura", - "makeCopy": "Hacer una copia", - "saving": "Guardando...", - "copySuccess": "¡Nota copiada exitosamente!", - "copyFailed": "Error al copiar la nota", - "copy": "Copiar", - "markdownOn": "Markdown ACTIVADO", - "markdownOff": "Markdown DESACTIVADO", - "undo": "Deshacer (Ctrl+Z)", - "redo": "Rehacer (Ctrl+Y)" - }, - "pagination": { - "previous": "←", - "pageInfo": "Página {currentPage} / {totalPages}", - "next": "→" - }, - "labels": { - "title": "Etiquetas", - "filter": "Filtrar por etiqueta", - "manage": "Administrar etiquetas", - "manageTooltip": "Administrar etiquetas", - "changeColor": "Cambiar color", - "changeColorTooltip": "Cambiar color", - "delete": "Eliminar", - "deleteTooltip": "Eliminar etiqueta", - "confirmDelete": "¿Estás seguro de que quieres eliminar esta etiqueta?", - "newLabelPlaceholder": "Crear nueva etiqueta", - "namePlaceholder": "Ingresa el nombre de la etiqueta", - "addLabel": "Agregar etiqueta", - "createLabel": "Crear etiqueta", - "labelName": "Nombre de etiqueta", - "labelColor": "Color de etiqueta", - "manageLabels": "Administrar etiquetas", - "manageLabelsDescription": "Agrega o elimina etiquetas para esta nota. Haz clic en una etiqueta para cambiar su color.", - "selectedLabels": "Etiquetas seleccionadas", - "allLabels": "Todas las etiquetas", - "clearAll": "Limpiar todo", - "filterByLabel": "Filtrar por etiqueta", - "tagAdded": "Etiqueta \"{tag}\" agregada", - "showLess": "Mostrar menos", - "showMore": "Mostrar más", - "editLabels": "Editar etiquetas", - "editLabelsDescription": "Crea, edita colores o elimina etiquetas.", - "noLabelsFound": "No se encontraron etiquetas.", - "loading": "Cargando...", - "notebookRequired": "⚠️ Las etiquetas solo están disponibles en cuadernos. Mueve esta nota a un cuaderno primero." - }, - "search": { - "placeholder": "Buscar", - "searchPlaceholder": "Busca en tus notas...", - "semanticInProgress": "Búsqueda semántica en curso...", - "semanticTooltip": "Búsqueda semántica con IA", - "searching": "Buscando...", - "noResults": "No se encontraron resultados", - "resultsFound": "{count} notas encontradas", - "exactMatch": "Coincidencia exacta", - "related": "Relacionado" - }, - "collaboration": { - "emailPlaceholder": "Ingresa dirección de correo", - "addCollaborator": "Agregar colaborador", - "removeCollaborator": "Eliminar colaborador", - "owner": "Propietario", - "canEdit": "Puede editar", - "canView": "Puede ver", - "shareNote": "Compartir nota", - "shareWithCollaborators": "Compartir con colaboradores", - "addCollaboratorDescription": "Agrega personas para colaborar en esta nota mediante su correo electrónico.", - "viewerDescription": "Tienes acceso a esta nota. Solo el propietario puede administrar los colaboradores.", - "emailAddress": "Dirección de correo", - "enterEmailAddress": "Ingresa dirección de correo", - "invite": "Invitar", - "peopleWithAccess": "Personas con acceso", - "noCollaborators": "Aún no hay colaboradores. ¡Agrega a alguien arriba!", - "noCollaboratorsViewer": "Aún no hay colaboradores.", - "pendingInvite": "Invitación pendiente", - "pending": "Pendiente", - "remove": "Eliminar", - "unnamedUser": "Usuario sin nombre", - "done": "Hecho", - "willBeAdded": "{email} será agregado como colaborador cuando se cree la nota", - "alreadyInList": "Este correo ya está en la lista", - "nowHasAccess": "{name} ahora tiene acceso a esta nota", - "accessRevoked": "El acceso ha sido revocado", - "errorLoading": "Error al cargar colaboradores", - "failedToAdd": "Error al agregar colaborador", - "failedToRemove": "Error al eliminar colaborador" + "admin": { + "ai": { + "apiKey": "Clave API", + "baseUrl": "URL base", + "commonEmbeddingModels": "Modelos de embedding comunes para APIs compatibles con OpenAI", + "commonModelsDescription": "Modelos comunes para APIs compatibles con OpenAI", + "description": "Configurar proveedores de IA para etiquetado automático y búsqueda semántica. Use diferentes proveedores para un rendimiento óptimo.", + "embeddingsDescription": "Proveedor de IA para embeddings de búsqueda semántica. Recomendado: OpenAI (mejor calidad).", + "embeddingsProvider": "Proveedor de embeddings", + "model": "Modelo", + "modelRecommendations": "gpt-4o-mini = Mejor valor • gpt-4o = Mejor calidad", + "openAIKeyDescription": "Tu clave API de OpenAI desde platform.openai.com", + "openTestPanel": "Abrir panel de pruebas de IA", + "provider": "Proveedor", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING es requerido", + "providerTagsRequired": "AI_PROVIDER_TAGS es requerido", + "saveSettings": "Guardar configuración de IA", + "saving": "Guardando...", + "selectEmbeddingModel": "Seleccionar un modelo de embedding instalado en tu sistema", + "selectOllamaModel": "Seleccionar un modelo Ollama instalado en tu sistema", + "tagsGenerationDescription": "Proveedor de IA para sugerencias automáticas de etiquetas. Recomendado: Ollama (gratis, local).", + "tagsGenerationProvider": "Proveedor de generación de etiquetas", + "title": "Configuración de IA", + "updateFailed": "Error al actualizar la configuración de IA", + "updateSuccess": "Configuración de IA actualizada correctamente" + }, + "aiTest": { + "description": "Prueba tus proveedores de IA para generación de etiquetas y embeddings de búsqueda semántica", + "embeddingDimensions": "Dimensiones del embedding:", + "embeddingsTestDescription": "Probar el proveedor de IA responsable de los embeddings de búsqueda semántica", + "embeddingsTestTitle": "Prueba de embeddings", + "error": "Error:", + "first5Values": "Primeros 5 valores:", + "generatedTags": "Etiquetas generadas:", + "howItWorksTitle": "Cómo funcionan las pruebas", + "model": "Modelo:", + "provider": "Proveedor:", + "responseTime": "Tiempo de respuesta: {time}ms", + "runTest": "Ejecutar prueba", + "tagsTestDescription": "Probar el proveedor de IA responsable de las sugerencias automáticas de etiquetas", + "tagsTestTitle": "Prueba de generación de etiquetas", + "testError": "Error de prueba: {error}", + "testFailed": "Prueba fallida", + "testPassed": "Prueba superada", + "testing": "Probando...", + "tipDescription": "Usa el panel de pruebas de IA para diagnosticar problemas de configuración antes de probar.", + "tipTitle": "Consejo:", + "title": "Pruebas de proveedor de IA", + "vectorDimensions": "dimensiones del vector" + }, + "aiTesting": "Pruebas de IA", + "security": { + "allowPublicRegistration": "Permitir registro público", + "allowPublicRegistrationDescription": "Si está desactivado, los nuevos usuarios solo pueden ser agregados por un administrador a través de la página de gestión de usuarios.", + "description": "Gestionar el control de acceso y las políticas de registro.", + "title": "Configuración de seguridad", + "updateFailed": "Error al actualizar la configuración de seguridad", + "updateSuccess": "Configuración de seguridad actualizada" + }, + "settings": "Configuración de administrador", + "smtp": { + "description": "Configurar el servidor de correo para restablecimiento de contraseñas.", + "forceSSL": "Forzar SSL/TLS (generalmente para puerto 465)", + "fromEmail": "Correo remitente", + "host": "Host", + "ignoreCertErrors": "Ignorar errores de certificado (Solo autoalojado/Desarrollo)", + "password": "Contraseña", + "port": "Puerto", + "saveSettings": "Guardar configuración SMTP", + "sending": "Enviando...", + "testEmail": "Correo de prueba", + "testFailed": "Error: {error}", + "testSuccess": "¡Correo de prueba enviado correctamente!", + "title": "Configuración SMTP", + "updateFailed": "Error al actualizar la configuración SMTP", + "updateSuccess": "Configuración SMTP actualizada", + "username": "Usuario" + }, + "title": "Panel de administración", + "userManagement": "Gestión de usuarios", + "users": { + "addUser": "Agregar usuario", + "confirmDelete": "¿Estás seguro de que quieres eliminar este usuario?", + "createFailed": "Error al crear usuario", + "createSuccess": "Usuario creado correctamente", + "createUser": "Crear usuario", + "createUserDescription": "Agregar un nuevo usuario al sistema.", + "deleteFailed": "Error al eliminar", + "deleteSuccess": "Usuario eliminado", + "demote": "Degradar", + "email": "Correo electrónico", + "name": "Nombre", + "password": "Contraseña", + "promote": "Promover", + "role": "Rol", + "roleUpdateFailed": "Error al actualizar rol", + "roleUpdateSuccess": "Rol de usuario actualizado a {role}", + "roles": { + "admin": "Administrador", + "user": "Usuario" + }, + "table": { + "actions": "Acciones", + "createdAt": "Creado", + "email": "Correo electrónico", + "name": "Nombre", + "role": "Rol" + } + } }, "ai": { "analyzing": "IA analizando...", + "assistant": "Asistente IA", + "autoLabels": { + "analyzing": "Analizando tus notas para sugerencias de etiquetas...", + "create": "Crear", + "createNewLabel": "Crear nueva etiqueta", + "created": "{count} labels created successfully", + "creating": "Creando etiquetas...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(nuevo)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "Sugerencias de etiquetas", + "typeContent": "Type content to get label suggestions...", + "typeForSuggestions": "Escribe para obtener sugerencias" + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Error al aplicar", + "applying": "Applying...", + "description": "La IA analizará tus notas y sugerirá organizarlas en libretas.", + "error": "Error al organizar", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "Sin notas seleccionadas", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Seleccionar todo en", + "selectNote": "Seleccionar nota", + "success": "Organización completada", + "title": "Organizar con IA" + }, + "clarify": "Aclarar", "clickToAddTag": "Haz clic para agregar esta etiqueta", - "ignoreSuggestion": "Ignorar esta sugerencia", - "generatingTitles": "Generando títulos...", + "generateTitles": "Generar títulos", "generateTitlesTooltip": "Generar títulos con IA", - "poweredByAI": "Funciona con IA", + "generating": "Generando...", + "generatingTitles": "Generando títulos...", + "ignoreSuggestion": "Ignorar esta sugerencia", + "improveStyle": "Mejorar estilo", "languageDetected": "Idioma detectado", + "notebookSummary": { + "regenerate": "Regenerar resumen", + "regenerating": "Regenerando resumen..." + }, + "original": "Original", + "poweredByAI": "Funciona con IA", "processing": "Procesando...", - "tagAdded": "Etiqueta \"{tag}\" agregada", - "titleGenerating": "Generando...", - "titleGenerateWithAI": "Generar títulos con IA", - "titleGenerationMinWords": "El contenido debe tener al menos 10 palabras para generar títulos (actual: {count} palabras)", - "titleGenerationError": "Error al generar títulos", - "titlesGenerated": "💡 ¡{count} títulos generados!", - "titleGenerationFailed": "Error al generar títulos", - "titleApplied": "¡Título aplicado!", - "reformulationNoText": "Por favor selecciona texto o agrega contenido", - "reformulationSelectionTooShort": "Selección demasiado corta, usando contenido completo", - "reformulationMinWords": "El texto debe tener al menos 10 palabras (actual: {count} palabras)", - "reformulationMaxWords": "El texto debe tener máximo 500 palabras", + "reformulateText": "Reformular texto", + "reformulated": "Reformulado", + "reformulating": "Reformulando...", + "reformulationApplied": "¡Texto reformulado aplicado!", + "reformulationComparison": "Comparación de reformulación", "reformulationError": "Error durante la reformulación", "reformulationFailed": "Error al reformular el texto", - "reformulationApplied": "¡Texto reformulado aplicado!", - "transformMarkdown": "Transformar a Markdown", - "transforming": "Transformando...", - "transformSuccess": "¡Texto transformado a Markdown exitosamente!", - "transformError": "Error durante la transformación", - "assistant": "Asistente IA", - "generating": "Generando...", - "generateTitles": "Generar títulos", - "reformulateText": "Reformular texto", - "reformulating": "Reformulando...", - "clarify": "Aclarar", + "reformulationMaxWords": "El texto debe tener máximo 500 palabras", + "reformulationMinWords": "El texto debe tener al menos 10 palabras (actual: {count} palabras)", + "reformulationNoText": "Por favor selecciona texto o agrega contenido", + "reformulationSelectionTooShort": "Selección demasiado corta, usando contenido completo", "shorten": "Acortar", - "improveStyle": "Mejorar estilo", - "reformulationComparison": "Comparación de reformulación", - "original": "Original", - "reformulated": "Reformulado" + "tagAdded": "Etiqueta \"{tag}\" agregada", + "titleApplied": "¡Título aplicado!", + "titleGenerateWithAI": "Generar títulos con IA", + "titleGenerating": "Generando...", + "titleGenerationError": "Error al generar títulos", + "titleGenerationFailed": "Error al generar títulos", + "titleGenerationMinWords": "El contenido debe tener al menos 10 palabras para generar títulos (actual: {count} palabras)", + "titlesGenerated": "💡 ¡{count} títulos generados!", + "transformError": "Error durante la transformación", + "transformMarkdown": "Transformar a Markdown", + "transformSuccess": "¡Texto transformado a Markdown exitosamente!", + "transforming": "Transformando..." }, - "batchOrganization": { - "error": "Error al crear el plan de organización", - "noNotesSelected": "No hay notas seleccionadas", - "title": "Organizar con IA", - "description": "La IA analizará tus notas y sugerirá organizarlas en cuadernos.", - "analyzing": "Analizando tus notas...", - "notesToOrganize": "{count} notas para organizar", - "selected": "{count} seleccionado", - "noNotebooks": "No hay cuadernos disponibles. Crea primero cuadernos para organizar tus notas.", - "noSuggestions": "La IA no encontró una buena manera de organizar estas notas.", - "confidence": "confianza", - "unorganized": "{count} notas no se pudieron categorizar y permanecerán en Notas Generales.", - "applying": "Aplicando...", - "apply": "Aplicar ({count})" + "aiSettings": { + "description": "Configura tus funciones y preferencias impulsadas por IA", + "error": "Error al actualizar la configuración", + "features": "Funciones de IA", + "frequency": "Frecuencia", + "frequencyDaily": "Diario", + "frequencyWeekly": "Semanal", + "provider": "Proveedor de IA", + "providerAuto": "Automático (Recomendado)", + "providerOllama": "Ollama (Local)", + "providerOpenAI": "OpenAI (Nube)", + "saved": "Configuración actualizada", + "saving": "Guardando...", + "title": "Configuración IA", + "titleSuggestionsDesc": "Sugerir títulos para notas sin título después de 50+ palabras", + "paragraphRefactorDesc": "Opciones de mejora de texto con IA", + "frequencyDesc": "Frecuencia de análisis de conexiones entre notas", + "providerDesc": "Elige tu proveedor de IA preferido", + "providerAutoDesc": "Ollama si disponible, OpenAI como alternativa", + "providerOllamaDesc": "100% privado, se ejecuta localmente en tu máquina", + "providerOpenAIDesc": "Más preciso, requiere clave API" + }, + "appearance": { + "description": "Personaliza el aspecto de la aplicación", + "title": "Apariencia" + }, + "auth": { + "backToLogin": "Volver al inicio de sesión", + "checkYourEmail": "Revisa tu correo", + "createAccount": "Crea tu cuenta", + "email": "Correo electrónico", + "emailPlaceholder": "Ingrese su correo electrónico", + "forgotPassword": "¿Olvidaste tu contraseña?", + "forgotPasswordDescription": "Ingresa tu correo electrónico y te enviaremos un enlace para restablecer tu contraseña.", + "forgotPasswordTitle": "Contraseña olvidada", + "hasAccount": "¿Ya tienes una cuenta?", + "name": "Nombre", + "namePlaceholder": "Ingrese su nombre", + "noAccount": "¿No tienes una cuenta?", + "orContinueWith": "O continuar con", + "password": "Contraseña", + "passwordMinChars": "Ingrese contraseña (mínimo 6 caracteres)", + "passwordPlaceholder": "Ingrese su contraseña", + "rememberMe": "Recordarme", + "resetEmailSent": "Hemos enviado un enlace de restablecimiento de contraseña a tu correo si existe en nuestro sistema.", + "resetPassword": "Restablecer contraseña", + "resetPasswordInstructions": "Ingrese su correo para restablecer su contraseña", + "returnToLogin": "Volver al inicio de sesión", + "sendResetLink": "Enviar enlace de restablecimiento", + "sending": "Enviando...", + "signIn": "Iniciar sesión", + "signInToAccount": "Inicia sesión en tu cuenta", + "signOut": "Sign out", + "signUp": "Registrarse" }, "autoLabels": { - "error": "Error al obtener sugerencias de etiquetas", - "noLabelsSelected": "No hay etiquetas seleccionadas", - "created": "{count} etiquetas creadas exitosamente", "analyzing": "Analizando tus notas...", - "title": "Nuevas sugerencias de etiquetas", + "createNewLabel": "Crear esta nueva etiqueta y agregarla", + "created": "{count} etiquetas creadas exitosamente", "description": "He detectado temas recurrentes en \"{notebookName}\" ({totalNotes} notas). ¿Crear etiquetas para ellos?", + "error": "Error al obtener sugerencias de etiquetas", + "new": "(nuevo)", + "noLabelsSelected": "No hay etiquetas seleccionadas", "note": "nota", "notes": "notas", - "typeContent": "Escribe contenido para obtener sugerencias de etiquetas...", - "createNewLabel": "Crear esta nueva etiqueta y agregarla", - "new": "(nuevo)" + "title": "Nuevas sugerencias de etiquetas", + "typeContent": "Escribe contenido para obtener sugerencias de etiquetas..." }, - "titleSuggestions": { - "available": "Sugerencias de título", - "title": "Sugerencias de IA", - "generating": "Generando...", - "selectTitle": "Selecciona un título", - "dismiss": "Descartar" + "batch": { + "organize": "Organizar", + "organizeWithAI": "Organizar con IA" + }, + "batchOrganization": { + "analyzing": "Analizando tus notas...", + "apply": "Aplicar ({count})", + "applying": "Aplicando...", + "confidence": "confianza", + "description": "La IA analizará tus notas y sugerirá organizarlas en cuadernos.", + "error": "Error al crear el plan de organización", + "noNotebooks": "No hay cuadernos disponibles. Crea primero cuadernos para organizar tus notas.", + "noNotesSelected": "No hay notas seleccionadas", + "noSuggestions": "La IA no encontró una buena manera de organizar estas notas.", + "notesToOrganize": "{count} notas para organizar", + "selected": "{count} seleccionado", + "title": "Organizar con IA", + "unorganized": "{count} notas no se pudieron categorizar y permanecerán en Notas Generales." + }, + "collaboration": { + "accessRevoked": "El acceso ha sido revocado", + "addCollaborator": "Agregar colaborador", + "addCollaboratorDescription": "Agrega personas para colaborar en esta nota mediante su correo electrónico.", + "alreadyInList": "Este correo ya está en la lista", + "canEdit": "Puede editar", + "canView": "Puede ver", + "done": "Hecho", + "emailAddress": "Dirección de correo", + "emailPlaceholder": "Ingresa dirección de correo", + "enterEmailAddress": "Ingresa dirección de correo", + "errorLoading": "Error al cargar colaboradores", + "failedToAdd": "Error al agregar colaborador", + "failedToRemove": "Error al eliminar colaborador", + "invite": "Invitar", + "noCollaborators": "Aún no hay colaboradores. ¡Agrega a alguien arriba!", + "noCollaboratorsViewer": "Aún no hay colaboradores.", + "nowHasAccess": "{name} ahora tiene acceso a esta nota", + "owner": "Propietario", + "pending": "Pendiente", + "pendingInvite": "Invitación pendiente", + "peopleWithAccess": "Personas con acceso", + "remove": "Eliminar", + "removeCollaborator": "Eliminar colaborador", + "shareNote": "Compartir nota", + "shareWithCollaborators": "Compartir con colaboradores", + "unnamedUser": "Usuario sin nombre", + "viewerDescription": "Tienes acceso a esta nota. Solo el propietario puede administrar los colaboradores.", + "willBeAdded": "{email} será agregado como colaborador cuando se cree la nota" + }, + "colors": { + "blue": "Azul", + "default": "Predeterminado", + "gray": "Gris", + "green": "Verde", + "orange": "Naranja", + "pink": "Rosa", + "purple": "Púrpura", + "red": "Rojo", + "yellow": "Amarillo" + }, + "common": { + "add": "Agregar", + "cancel": "Cancelar", + "close": "Cerrar", + "confirm": "Confirmar", + "delete": "Eliminar", + "edit": "Editar", + "error": "Error", + "loading": "Cargando", + "noResults": "Sin resultados", + "notAvailable": "No disponible", + "optional": "Opcional", + "remove": "Eliminar", + "required": "Requerido", + "save": "Guardar", + "search": "Buscar", + "success": "Éxito", + "unknown": "Desconocido" + }, + "connection": { + "clickToView": "Haz clic para ver la nota", + "helpful": "Útil", + "isHelpful": "¿Es útil esta conexión?", + "memoryEchoDiscovery": "Descubrimiento de Memory Echo", + "notHelpful": "No útil", + "similarityInfo": "Estas notas están conectadas por {similarity}% de similitud" + }, + "dataManagement": { + "cleanup": { + "button": "Cleanup", + "description": "Remove labels and connections that reference deleted notes.", + "failed": "Error during cleanup", + "title": "Cleanup Orphaned Data" + }, + "cleanupComplete": "Limpieza completada", + "cleanupError": "Error de limpieza", + "dangerZone": "Zona de peligro", + "dangerZoneDescription": "Estas acciones son irreversibles", + "delete": { + "button": "Delete All Notes", + "confirm": "Are you sure? This will permanently delete all your notes.", + "description": "Permanently delete all your notes. This action cannot be undone.", + "failed": "Failed to delete notes", + "success": "All notes deleted", + "title": "Delete All Notes" + }, + "deleting": "Eliminando", + "export": { + "button": "Export Notes", + "description": "Download all your notes as a JSON file. This includes all content, labels, and metadata.", + "failed": "Failed to export notes", + "success": "Notes exported successfully", + "title": "Export All Notes" + }, + "exporting": "Exportando", + "import": { + "button": "Import Notes", + "description": "Upload a JSON file to import notes. This will add to your existing notes, not replace them.", + "failed": "Failed to import notes", + "success": "Imported {count} notes", + "title": "Import Notes" + }, + "importing": "Importando", + "indexing": { + "button": "Rebuild Index", + "description": "Regenerate embeddings for all notes to improve semantic search.", + "failed": "Error during indexing", + "success": "Indexing complete: {count} notes processed", + "title": "Rebuild Search Index" + }, + "indexingComplete": "Indexación completada", + "indexingError": "Error de indexación", + "title": "Data Management", + "toolsDescription": "Tools to maintain your database health" + }, + "demoMode": { + "activated": "¡Modo demostración activado! Memory Echo funcionará instantáneamente.", + "createNotesTip": "¡Crea 2+ notas similares y ve Memory Echo en acción!", + "deactivated": "Modo demostración desactivado. Parámetros normales restaurados.", + "delayBetweenNotes": "Retraso de 0 días entre notas (normalmente 7 días)", + "description": "Acelera Memory Echo para pruebas. Las conexiones aparecen instantáneamente.", + "parametersActive": "Parámetros de demostración activos:", + "similarityThreshold": "Umbral de similitud del 50% (normalmente 75%)", + "title": "Modo demostración", + "toggleFailed": "Error al alternar modo demostración", + "unlimitedInsights": "Insights ilimitados (sin límites de frecuencia)" + }, + "diagnostics": { + "apiStatus": "Estado de la API", + "checking": "Checking...", + "configuredProvider": "Proveedor configurado", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "Detalles de la prueba:", + "tip1": "Asegúrate de que Ollama esté ejecutándose (ollama serve)", + "tip2": "Verifica que el modelo esté instalado (ollama pull llama3)", + "tip3": "Verifica tu clave API de OpenAI", + "tip4": "Revisa la conectividad de red", + "title": "Diagnósticos", + "troubleshootingTitle": "Consejos de solución de problemas:" + }, + "favorites": { + "noFavorites": "Sin favoritos", + "pinToFavorite": "Fijar como favorito", + "title": "Favoritos", + "toggleSection": "Alternar sección" + }, + "footer": { + "openSource": "Clon de código abierto", + "privacy": "Privacidad", + "terms": "Términos" + }, + "general": { + "add": "Agregar", + "apply": "Aplicar", + "back": "Atrás", + "cancel": "Cancelar", + "clean": "Clean", + "clear": "Limpiar", + "close": "Cerrar", + "confirm": "Confirmar", + "edit": "Editar", + "error": "Ocurrió un error", + "indexAll": "Index All", + "loading": "Cargando...", + "next": "Siguiente", + "operationFailed": "Operación fallida", + "operationSuccess": "Operación exitosa", + "preview": "Vista previa", + "previous": "Anterior", + "reset": "Restablecer", + "save": "Guardar", + "select": "Seleccionar", + "submit": "Enviar", + "testConnection": "Test Connection", + "tryAgain": "Por favor intenta de nuevo" + }, + "generalSettings": { + "description": "Configuración general de la aplicación", + "title": "Configuración general" + }, + "labels": { + "addLabel": "Agregar etiqueta", + "allLabels": "Todas las etiquetas", + "changeColor": "Cambiar color", + "changeColorTooltip": "Cambiar color", + "clearAll": "Limpiar todo", + "confirmDelete": "¿Estás seguro de que quieres eliminar esta etiqueta?", + "count": "{count} etiquetas", + "createLabel": "Crear etiqueta", + "delete": "Eliminar", + "deleteTooltip": "Eliminar etiqueta", + "editLabels": "Editar etiquetas", + "editLabelsDescription": "Crea, edita colores o elimina etiquetas.", + "filter": "Filtrar por etiqueta", + "filterByLabel": "Filtrar por etiqueta", + "labelColor": "Color de etiqueta", + "labelName": "Nombre de etiqueta", + "loading": "Cargando...", + "manage": "Administrar etiquetas", + "manageLabels": "Administrar etiquetas", + "manageLabelsDescription": "Agrega o elimina etiquetas para esta nota. Haz clic en una etiqueta para cambiar su color.", + "manageTooltip": "Administrar etiquetas", + "namePlaceholder": "Ingresa el nombre de la etiqueta", + "newLabelPlaceholder": "Crear nueva etiqueta", + "noLabels": "Sin etiquetas", + "noLabelsFound": "No se encontraron etiquetas.", + "notebookRequired": "⚠️ Las etiquetas solo están disponibles en cuadernos. Mueve esta nota a un cuaderno primero.", + "selectedLabels": "Etiquetas seleccionadas", + "showLess": "Mostrar menos", + "showMore": "Mostrar más", + "tagAdded": "Etiqueta \"{tag}\" agregada", + "title": "Etiquetas" + }, + "memoryEcho": { + "clickToView": "Haz clic para ver", + "comparison": { + "clickToView": "Haz clic para ver la nota", + "helpful": "Útil", + "helpfulQuestion": "¿Es útil esta comparación?", + "highSimilarityInsight": "Estas notas tratan el mismo tema con un alto grado de similitud. Podrían fusionarse o consolidarse.", + "notHelpful": "No útil", + "similarityInfo": "Estas notas están conectadas por {similarity}% de similitud", + "title": "💡 Comparación de notas", + "untitled": "Sin título" + }, + "connection": "conexión", + "connections": "Conexiones", + "connectionsBadge": "{count} conexión{plural}", + "dailyInsight": "Perspectiva diaria de tus notas", + "description": "Conexiones proactivas entre tus notas", + "dismiss": "Descartar por ahora", + "editorSection": { + "close": "Cerrar", + "compare": "Comparar", + "compareAll": "Comparar todas", + "loading": "Cargando...", + "merge": "Fusionar", + "mergeAll": "Fusionar todas", + "title": "⚡ Notas conectadas ({count})", + "view": "Ver" + }, + "fused": "Fusionado", + "fusion": { + "archiveOriginals": "Archivar notas originales", + "cancel": "Cancelar", + "confirmFusion": "Confirmar fusión", + "createBacklinks": "Crear retroenlaces a las notas originales", + "edit": "Editar", + "error": "Error al fusionar las notas", + "finishEditing": "Terminar edición", + "generateError": "Error al generar la fusión", + "generateFusion": "Generar la fusión", + "generating": "Generando...", + "keepAllTags": "Mantener todas las etiquetas", + "mergeNotes": "Fusionar {count} nota(s)", + "modify": "Modificar", + "noContentReturned": "No se devolvió contenido de fusión de la API", + "notesToMerge": "📝 Notas para fusionar", + "optionalPrompt": "💬 Prompt de fusión (opcional)", + "optionsTitle": "Opciones de fusión", + "previewTitle": "📝 Vista previa de la nota fusionada", + "promptPlaceholder": "Instrucciones opcionales para la IA (ej. 'Mantener el estilo formal de la nota 1')...", + "success": "¡Notas fusionadas exitosamente!", + "title": "🔗 Fusión inteligente", + "unknownDate": "Fecha desconocida", + "useLatestTitle": "Usar la nota más reciente como título" + }, + "helpful": "Útil", + "insightReady": "¡Tu perspectiva está lista!", + "notHelpful": "No útil", + "overlay": { + "error": "Error", + "loading": "Cargando...", + "noConnections": "No se encontraron conexiones", + "searchPlaceholder": "Buscar conexiones...", + "sortBy": "Ordenar por:", + "sortOldest": "Más antiguo", + "sortRecent": "Reciente", + "sortSimilarity": "Similitud", + "title": "Notas conectadas", + "viewAll": "Ver todas lado a lado" + }, + "thanksFeedback": "¡Gracias por tus comentarios!", + "thanksFeedbackImproving": "¡Gracias! Usaremos esto para mejorar.", + "title": "Noté algo...", + "viewConnection": "Ver conexión" + }, + "nav": { + "accountSettings": "Configuración de cuenta", + "adminDashboard": "Panel de administración", + "aiSettings": "Configuración IA", + "archive": "Archivo", + "buyMeACoffee": "Cómprame un café", + "configureAI": "Configura tus funciones impulsadas por IA, proveedor y preferencias", + "diagnostics": "Diagnósticos", + "donateOnKofi": "Donar en Ko-fi", + "donationDescription": "Haz una donación única o conviértete en suscriptor mensual.", + "donationNote": "Sin comisiones de plataforma • Pagos instantáneos • Seguro", + "favorites": "Favoritos", + "generalNotes": "Notas generales", + "home": "Inicio", + "login": "Iniciar sesión", + "logout": "Cerrar sesión", + "manageAISettings": "Administrar configuración IA", + "myLibrary": "Mi biblioteca", + "notebooks": "Cuadernos", + "notes": "Notas", + "proPlan": "Plan Pro", + "profile": "Perfil", + "quickAccess": "Acceso rápido", + "recent": "Recientes", + "reminders": "Recordatorios", + "settings": "Configuración", + "sponsorDescription": "Conviértete en suscriptor mensual y obtén reconocimiento.", + "sponsorOnGithub": "Patrocinar en GitHub", + "support": "Apoyar Memento ☕", + "supportDescription": "Memento es 100% gratuito y de código abierto. Tu apoyo ayuda a mantenerlo así.", + "supportDevelopment": "Apoyar el desarrollo de Memento ☕", + "trash": "Papelera", + "userManagement": "Gestión de usuarios", + "workspace": "Espacio de trabajo" + }, + "notebook": { + "cancel": "Cancelar", + "create": "Crear cuaderno", + "createDescription": "Inicia una nueva colección para organizar tus notas, ideas y proyectos de manera eficiente.", + "createNew": "Crear nuevo cuaderno", + "creating": "Creando...", + "delete": "Eliminar cuaderno", + "deleteConfirm": "Eliminar", + "deleteWarning": "¿Estás seguro de que quieres eliminar este cuaderno? Las notas se moverán a Notas generales.", + "edit": "Editar cuaderno", + "editDescription": "Cambia el nombre, icono y color de tu cuaderno.", + "generating": "Generando resumen...", + "labels": "Etiquetas", + "name": "Nombre del cuaderno", + "noLabels": "Sin etiquetas", + "selectColor": "Color", + "selectIcon": "Icono", + "summary": "Resumen del cuaderno", + "summaryDescription": "Genera un resumen impulsado por IA de todas las notas en este cuaderno.", + "summaryError": "Error al generar el resumen" + }, + "notebookSuggestion": { + "description": "Esta nota parece pertenecer a este cuaderno", + "dismiss": "Descartar", + "dismissIn": "Descartar (cierra en {timeLeft}s)", + "generalNotes": "Notas generales", + "move": "Mover", + "moveToNotebook": "Mover al cuaderno", + "title": "¿Mover a {icon} {name}?" + }, + "notebooks": { + "allNotebooks": "Todos los cuadernos", + "create": "Crear", + "createFirst": "Crear el primero", + "noNotebooks": "Sin cuadernos" + }, + "notes": { + "add": "Agregar", + "addCollaborators": "Agregar colaboradores", + "addImage": "Agregar imagen", + "addItem": "Agregar elemento", + "addLink": "Agregar enlace", + "addListItem": "+ Elemento de lista", + "addNote": "Agregar nota", + "adding": "Agregando...", + "aiAssistant": "Asistente IA", + "archive": "Archivar", + "backgroundOptions": "Opciones de fondo", + "changeColor": "Cambiar color", + "changeSize": "Cambiar tamaño", + "clarifyFailed": "Error al aclarar", + "close": "Cerrar", + "color": "Color", + "confirmDelete": "¿Estás seguro de que quieres eliminar esta nota?", + "confirmLeaveShare": "¿Estás seguro de que quieres abandonar esta nota compartida?", + "contentOrMediaRequired": "Por favor ingresa algún contenido o agrega un enlace/imagen", + "copy": "Copiar", + "copyFailed": "Error al copiar la nota", + "copySuccess": "¡Nota copiada exitosamente!", + "createFirstNote": "Crea tu primera nota", + "date": "Fecha", + "delete": "Eliminar", + "dragToReorder": "Arrastra para reordenar", + "duplicate": "Duplicar", + "edit": "Editar nota", + "emptyState": "Sin notas", + "fileTooLarge": "Archivo demasiado grande: {fileName}. El tamaño máximo es {maxSize}.", + "improveFailed": "Error al mejorar", + "inNotebook": "En cuaderno", + "invalidDateTime": "Fecha u hora inválida", + "invalidFileType": "Tipo de archivo inválido: {fileName}. Solo se permiten JPEG, PNG, GIF y WebP.", + "itemOrMediaRequired": "Por favor agrega al menos un elemento o medio", + "large": "Grande", + "leaveShare": "Abandonar", + "linkAddFailed": "Error al agregar el enlace", + "linkAdded": "Enlace agregado", + "linkMetadataFailed": "No se pudieron obtener los metadatos del enlace", + "listItem": "Elemento de lista", + "makeCopy": "Hacer una copia", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown DESACTIVADO", + "markdownOn": "Markdown ACTIVADO", + "markdownPlaceholder": "Toma una nota... (Markdown compatible)", + "medium": "Mediano", + "more": "Más", + "moreOptions": "Más opciones", + "moveFailed": "Error al mover", + "newChecklist": "Nueva lista de verificación", + "newNote": "Nueva nota", + "noContent": "Sin contenido", + "noNotes": "Sin notas", + "noNotesFound": "No se encontraron notas", + "noteCreateFailed": "Error al crear la nota", + "noteCreated": "Nota creada exitosamente", + "others": "Otros", + "pin": "Fijar", + "pinned": "Fijadas", + "pinnedNotes": "Notas fijadas", + "placeholder": "Toma una nota...", + "preview": "Vista previa", + "readOnly": "Solo lectura", + "recent": "Recientes", + "redo": "Rehacer (Ctrl+Y)", + "redoShortcut": "Rehacer (Ctrl+Y)", + "remindMe": "Recordarme", + "reminderDateTimeRequired": "Por favor ingresa fecha y hora", + "reminderMustBeFuture": "El recordatorio debe ser en el futuro", + "reminderPastError": "El recordatorio debe ser en el futuro", + "reminderRemoved": "Recordatorio eliminado", + "reminderSet": "Recordatorio configurado para {datetime}", + "remove": "Remove", + "saving": "Guardando...", + "setReminder": "Configurar recordatorio", + "setReminderButton": "Configurar recordatorio", + "share": "Compartir", + "shareWithCollaborators": "Compartir con colaboradores", + "sharedBy": "Compartido por", + "sharedReadOnly": "Esta nota está compartida contigo en modo solo lectura", + "shortenFailed": "Error al acortar", + "showCollaborators": "Mostrar colaboradores", + "size": "Tamaño", + "small": "Pequeño", + "takeNote": "Toma una nota...", + "takeNoteMarkdown": "Toma una nota... (Markdown compatible)", + "time": "Hora", + "title": "Notas", + "titlePlaceholder": "Título", + "transformFailed": "Error al transformar", + "unarchive": "Desarchivar", + "undo": "Deshacer (Ctrl+Z)", + "undoShortcut": "Deshacer (Ctrl+Z)", + "unpin": "Desfijar", + "unpinned": "Desfijadas", + "untitled": "Sin título", + "uploadFailed": "Error al cargar {filename}", + "view": "Ver nota" + }, + "pagination": { + "next": "→", + "pageInfo": "Página {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "Informal", + "expand": "Expandir", + "formal": "Formal", + "improve": "Mejorar", + "shorten": "Acortar", + "title": "Mejora de texto" + }, + "profile": { + "accountSettings": "Configuración de cuenta", + "autoDetect": "Detección automática", + "changePassword": "Cambiar contraseña", + "changePasswordDescription": "Actualiza tu contraseña. Necesitarás tu contraseña actual.", + "confirmPassword": "Confirmar contraseña", + "currentPassword": "Contraseña actual", + "description": "Actualiza tu información personal", + "displayName": "Nombre para mostrar", + "displaySettings": "Configuración de visualización", + "displaySettingsDescription": "Personaliza la apariencia y el tamaño de fuente.", + "email": "Correo electrónico", + "fontSize": "Tamaño de fuente", + "fontSizeDescription": "Ajusta el tamaño de fuente para mejor legibilidad. Esto se aplica a todo el texto de la interfaz.", + "fontSizeExtraLarge": "Extra grande", + "fontSizeLarge": "Grande", + "fontSizeMedium": "Mediano", + "fontSizeSmall": "Pequeño", + "fontSizeUpdateFailed": "Error al actualizar el tamaño de fuente", + "fontSizeUpdateSuccess": "Tamaño de fuente actualizado exitosamente", + "languageDescription": "Este idioma se usará para las funciones impulsadas por IA, análisis de contenido y texto de la interfaz.", + "languagePreferences": "Preferencias de idioma", + "languagePreferencesDescription": "Elige tu idioma preferido para las funciones de IA y la interfaz.", + "languageUpdateFailed": "Error al actualizar el idioma", + "languageUpdateSuccess": "Idioma actualizado exitosamente", + "manageAISettings": "Administrar configuración IA", + "newPassword": "Nueva contraseña", + "passwordChangeFailed": "Error al cambiar la contraseña", + "passwordChangeSuccess": "Contraseña cambiada exitosamente", + "passwordError": "Error al actualizar la contraseña", + "passwordUpdated": "Contraseña actualizada", + "preferredLanguage": "Idioma preferido", + "profileError": "Error al actualizar el perfil", + "profileUpdated": "Perfil actualizado", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "Seleccionar tamaño de fuente", + "selectLanguage": "Selecciona un idioma", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "Perfil", + "updateFailed": "Error al actualizar el perfil", + "updatePassword": "Actualizar contraseña", + "updateSuccess": "Perfil actualizado" + }, + "reminder": { + "cancel": "Cancelar", + "reminderDate": "Fecha del recordatorio", + "reminderTime": "Hora del recordatorio", + "removeReminder": "Eliminar recordatorio", + "save": "Configurar recordatorio", + "setReminder": "Configurar recordatorio", + "title": "Recordatorio" + }, + "resetPassword": { + "confirmNewPassword": "Confirmar nueva contraseña", + "description": "Ingresa tu nueva contraseña abajo.", + "invalidLinkDescription": "Este enlace de restablecimiento de contraseña es inválido o ha expirado.", + "invalidLinkTitle": "Enlace inválido", + "loading": "Cargando...", + "newPassword": "Nueva contraseña", + "passwordMismatch": "Las contraseñas no coinciden", + "requestNewLink": "Solicitar nuevo enlace", + "resetPassword": "Restablecer contraseña", + "resetting": "Restableciendo...", + "success": "Contraseña restablecida correctamente. Ahora puedes iniciar sesión.", + "title": "Restablecer contraseña" + }, + "search": { + "exactMatch": "Coincidencia exacta", + "noResults": "No se encontraron resultados", + "placeholder": "Buscar", + "related": "Relacionado", + "resultsFound": "{count} notas encontradas", + "searchPlaceholder": "Busca en tus notas...", + "searching": "Buscando...", + "semanticInProgress": "Búsqueda semántica en curso...", + "semanticTooltip": "Búsqueda semántica con IA" }, "semanticSearch": { "exactMatch": "Coincidencia exacta", "related": "Relacionado", "searching": "Buscando..." }, - "paragraphRefactor": { - "title": "Mejora de texto", - "shorten": "Acortar", - "expand": "Expandir", - "improve": "Mejorar", - "formal": "Formal", - "casual": "Informal" - }, - "memoryEcho": { - "title": "Noté algo...", - "description": "Conexiones proactivas entre tus notas", - "dailyInsight": "Perspectiva diaria de tus notas", - "insightReady": "¡Tu perspectiva está lista!", - "viewConnection": "Ver conexión", - "helpful": "Útil", - "notHelpful": "No útil", - "dismiss": "Descartar por ahora", - "thanksFeedback": "¡Gracias por tus comentarios!", - "thanksFeedbackImproving": "¡Gracias! Usaremos esto para mejorar.", - "connections": "Conexiones", - "connection": "conexión", - "connectionsBadge": "{count} conexión{plural}", - "fused": "Fusionado", - "overlay": { - "title": "Notas conectadas", - "searchPlaceholder": "Buscar conexiones...", - "sortBy": "Ordenar por:", - "sortSimilarity": "Similitud", - "sortRecent": "Reciente", - "sortOldest": "Más antiguo", - "viewAll": "Ver todas lado a lado", - "loading": "Cargando...", - "noConnections": "No se encontraron conexiones" - }, - "comparison": { - "title": "💡 Comparación de notas", - "similarityInfo": "Estas notas están conectadas por {similarity}% de similitud", - "highSimilarityInsight": "Estas notas tratan el mismo tema con un alto grado de similitud. Podrían fusionarse o consolidarse.", - "untitled": "Sin título", - "clickToView": "Haz clic para ver la nota", - "helpfulQuestion": "¿Es útil esta comparación?", - "helpful": "Útil", - "notHelpful": "No útil" - }, - "editorSection": { - "title": "⚡ Notas conectadas ({count})", - "loading": "Cargando...", - "view": "Ver", - "compare": "Comparar", - "merge": "Fusionar", - "compareAll": "Comparar todas", - "mergeAll": "Fusionar todas" - }, - "fusion": { - "title": "🔗 Fusión inteligente", - "mergeNotes": "Fusionar {count} nota(s)", - "notesToMerge": "📝 Notas para fusionar", - "optionalPrompt": "💬 Prompt de fusión (opcional)", - "promptPlaceholder": "Instrucciones opcionales para la IA (ej. 'Mantener el estilo formal de la nota 1')...", - "generateFusion": "Generar la fusión", - "generating": "Generando...", - "previewTitle": "📝 Vista previa de la nota fusionada", - "edit": "Editar", - "modify": "Modificar", - "finishEditing": "Terminar edición", - "optionsTitle": "Opciones de fusión", - "archiveOriginals": "Archivar notas originales", - "keepAllTags": "Mantener todas las etiquetas", - "useLatestTitle": "Usar la nota más reciente como título", - "createBacklinks": "Crear retroenlaces a las notas originales", - "cancel": "Cancelar", - "confirmFusion": "Confirmar fusión", - "success": "¡Notas fusionadas exitosamente!", - "error": "Error al fusionar las notas", - "generateError": "Error al generar la fusión", - "noContentReturned": "No se devolvió contenido de fusión de la API", - "unknownDate": "Fecha desconocida" - } - }, - "nav": { - "home": "Inicio", - "notes": "Notas", - "notebooks": "Cuadernos", - "generalNotes": "Notas generales", - "archive": "Archivo", - "settings": "Configuración", - "profile": "Perfil", - "aiSettings": "Configuración IA", - "logout": "Cerrar sesión", - "login": "Iniciar sesión", - "adminDashboard": "Panel de administración", - "diagnostics": "Diagnósticos", - "trash": "Papelera", - "support": "Apoyar Memento ☕", - "reminders": "Recordatorios", - "userManagement": "Gestión de usuarios", - "accountSettings": "Configuración de cuenta", - "manageAISettings": "Administrar configuración IA", - "configureAI": "Configura tus funciones impulsadas por IA, proveedor y preferencias", - "supportDevelopment": "Apoyar el desarrollo de Memento ☕", - "supportDescription": "Memento es 100% gratuito y de código abierto. Tu apoyo ayuda a mantenerlo así.", - "buyMeACoffee": "Cómprame un café", - "donationDescription": "Haz una donación única o conviértete en suscriptor mensual.", - "donateOnKofi": "Donar en Ko-fi", - "donationNote": "Sin comisiones de plataforma • Pagos instantáneos • Seguro", - "sponsorOnGithub": "Patrocinar en GitHub", - "sponsorDescription": "Conviértete en suscriptor mensual y obtén reconocimiento.", - "workspace": "Espacio de trabajo", - "quickAccess": "Acceso rápido", - "myLibrary": "Mi biblioteca", - "favorites": "Favoritos", - "recent": "Recientes", - "proPlan": "Plan Pro" - }, - "notebook": { - "create": "Crear cuaderno", - "createNew": "Crear nuevo cuaderno", - "createDescription": "Inicia una nueva colección para organizar tus notas, ideas y proyectos de manera eficiente.", - "name": "Nombre del cuaderno", - "selectIcon": "Icono", - "selectColor": "Color", - "cancel": "Cancelar", - "creating": "Creando...", - "edit": "Editar cuaderno", - "editDescription": "Cambia el nombre, icono y color de tu cuaderno.", - "delete": "Eliminar cuaderno", - "deleteWarning": "¿Estás seguro de que quieres eliminar este cuaderno? Las notas se moverán a Notas generales.", - "deleteConfirm": "Eliminar", - "summary": "Resumen del cuaderno", - "summaryDescription": "Genera un resumen impulsado por IA de todas las notas en este cuaderno.", - "generating": "Generando resumen...", - "summaryError": "Error al generar el resumen" - }, "settings": { - "title": "Configuración", - "description": "Administra tu configuración y preferencias", + "about": "Acerca de", "account": "Cuenta", "appearance": "Apariencia", - "theme": "Tema", - "themeLight": "Claro", - "themeDark": "Oscuro", - "themeSystem": "Sistema", - "notifications": "Notificaciones", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "Administra tu configuración y preferencias", "language": "Idioma", - "selectLanguage": "Seleccionar idioma", + "languageAuto": "Automático", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "Notificaciones", "privacy": "Privacidad", + "profile": "Perfil", + "searchNoResults": "Sin resultados de búsqueda", "security": "Seguridad", - "about": "Acerca de", - "version": "Versión", + "selectLanguage": "Seleccionar idioma", + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "Error al guardar la configuración", "settingsSaved": "Configuración guardada", - "settingsError": "Error al guardar la configuración" + "theme": "Tema", + "themeDark": "Oscuro", + "themeLight": "Claro", + "themeSystem": "Sistema", + "title": "Configuración", + "version": "Versión" }, - "profile": { - "title": "Perfil", - "description": "Actualiza tu información personal", - "displayName": "Nombre para mostrar", - "email": "Correo electrónico", - "changePassword": "Cambiar contraseña", - "changePasswordDescription": "Actualiza tu contraseña. Necesitarás tu contraseña actual.", - "currentPassword": "Contraseña actual", - "newPassword": "Nueva contraseña", - "confirmPassword": "Confirmar contraseña", - "updatePassword": "Actualizar contraseña", - "passwordChangeSuccess": "Contraseña cambiada exitosamente", - "passwordChangeFailed": "Error al cambiar la contraseña", - "passwordUpdated": "Contraseña actualizada", - "passwordError": "Error al actualizar la contraseña", - "languagePreferences": "Preferencias de idioma", - "languagePreferencesDescription": "Elige tu idioma preferido para las funciones de IA y la interfaz.", - "preferredLanguage": "Idioma preferido", - "selectLanguage": "Selecciona un idioma", - "languageDescription": "Este idioma se usará para las funciones impulsadas por IA, análisis de contenido y texto de la interfaz.", - "autoDetect": "Detección automática", - "updateSuccess": "Perfil actualizado", - "updateFailed": "Error al actualizar el perfil", - "languageUpdateSuccess": "Idioma actualizado exitosamente", - "languageUpdateFailed": "Error al actualizar el idioma", - "profileUpdated": "Perfil actualizado", - "profileError": "Error al actualizar el perfil", - "accountSettings": "Configuración de cuenta", - "manageAISettings": "Administrar configuración IA", - "displaySettings": "Configuración de visualización", - "displaySettingsDescription": "Personaliza la apariencia y el tamaño de fuente.", - "fontSize": "Tamaño de fuente", - "selectFontSize": "Seleccionar tamaño de fuente", - "fontSizeSmall": "Pequeño", - "fontSizeMedium": "Mediano", - "fontSizeLarge": "Grande", - "fontSizeExtraLarge": "Extra grande", - "fontSizeDescription": "Ajusta el tamaño de fuente para mejor legibilidad. Esto se aplica a todo el texto de la interfaz.", - "fontSizeUpdateSuccess": "Tamaño de fuente actualizado exitosamente", - "fontSizeUpdateFailed": "Error al actualizar el tamaño de fuente" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" }, - "aiSettings": { - "title": "Configuración IA", - "description": "Configura tus funciones y preferencias impulsadas por IA", - "features": "Funciones de IA", - "provider": "Proveedor de IA", - "providerAuto": "Automático (Recomendado)", - "providerOllama": "Ollama (Local)", - "providerOpenAI": "OpenAI (Nube)", - "frequency": "Frecuencia", - "frequencyDaily": "Diario", - "frequencyWeekly": "Semanal", - "saving": "Guardando...", - "saved": "Configuración actualizada", - "error": "Error al actualizar la configuración" + "support": { + "aiApiCosts": "Costos de API de IA:", + "buyMeACoffee": "Cómprame un café", + "contributeCode": "Contribuir código", + "description": "Memento es 100% gratuito y de código abierto. Tu apoyo ayuda a mantenerlo así.", + "directImpact": "Impacto directo", + "domainSSL": "Dominio y SSL:", + "donateOnKofi": "Donar en Ko-fi", + "donationDescription": "Haz una donación única o conviértete en suscriptor mensual.", + "githubDescription": "Apoyo recurrente • Reconocimiento público • Enfocado en desarrolladores", + "hostingServers": "Alojamiento y servidores:", + "howSupportHelps": "Cómo ayuda tu apoyo", + "kofiDescription": "Sin comisiones de plataforma • Pagos instantáneos • Seguro", + "otherWaysTitle": "Otras formas de apoyar", + "reportBug": "Reportar un error", + "shareTwitter": "Compartir en Twitter", + "sponsorDescription": "Conviértete en patrocinador mensual y obtén reconocimiento.", + "sponsorOnGithub": "Patrocinar en GitHub", + "sponsorPerks": "Beneficios del patrocinio", + "starGithub": "Estrella en GitHub", + "title": "Apoyar el desarrollo de Memento", + "totalExpenses": "Gastos totales:", + "transparency": "Transparencia", + "transparencyDescription": "Creo en la transparencia total. Así es como se usan las donaciones:" }, - "general": { - "loading": "Cargando...", - "save": "Guardar", - "cancel": "Cancelar", - "add": "Agregar", - "edit": "Editar", - "confirm": "Confirmar", - "close": "Cerrar", - "back": "Atrás", - "next": "Siguiente", - "previous": "Anterior", - "submit": "Enviar", - "reset": "Restablecer", - "apply": "Aplicar", - "clear": "Limpiar", - "select": "Seleccionar", - "tryAgain": "Por favor intenta de nuevo", - "error": "Ocurrió un error", - "operationSuccess": "Operación exitosa", - "operationFailed": "Operación fallida" + "testPages": { + "titleSuggestions": { + "analyzing": "Analizando...", + "contentLabel": "Contenido (necesitas más de 50 palabras):", + "error": "Error:", + "idle": "Inactivo", + "noSuggestions": "Sin sugerencias aún. Escribe más de 50 palabras y espera 2 segundos.", + "placeholder": "Escribe al menos 50 palabras aquí...", + "status": "Estado:", + "suggestions": "Sugerencias ({count}):", + "title": "Probar sugerencias de título", + "wordCount": "Contador de palabras:" + } }, - "colors": { - "default": "Predeterminado", - "red": "Rojo", - "blue": "Azul", - "green": "Verde", - "yellow": "Amarillo", - "purple": "Púrpura", - "pink": "Rosa", - "orange": "Naranja", - "gray": "Gris" + "time": { + "daysAgo": "Hace {count} días", + "hoursAgo": "Hace {count} horas", + "justNow": "Justo ahora", + "minutesAgo": "Hace {count} minutos", + "today": "Hoy", + "tomorrow": "Mañana", + "yesterday": "Ayer" }, - "reminder": { - "title": "Recordatorio", - "setReminder": "Configurar recordatorio", - "removeReminder": "Eliminar recordatorio", - "reminderDate": "Fecha del recordatorio", - "reminderTime": "Hora del recordatorio", - "save": "Configurar recordatorio", - "cancel": "Cancelar" - }, - "notebookSuggestion": { - "title": "¿Mover a {icon} {name}?", - "description": "Esta nota parece pertenecer a este cuaderno", - "move": "Mover", + "titleSuggestions": { + "available": "Sugerencias de título", "dismiss": "Descartar", - "dismissIn": "Descartar (cierra en {timeLeft}s)", - "moveToNotebook": "Mover al cuaderno", - "generalNotes": "Notas generales" + "generating": "Generando...", + "selectTitle": "Selecciona un título", + "title": "Sugerencias de IA" + }, + "toast": { + "feedbackFailed": "Error al enviar comentarios", + "notesFusionSuccess": "¡Notas fusionadas correctamente!", + "openConnectionFailed": "Error al abrir conexión", + "openingConnection": "Abriendo conexión...", + "operationFailed": "Operación fallida", + "operationSuccess": "Operación exitosa", + "saveFailed": "Error al guardar configuración", + "saved": "Configuración guardada", + "thanksFeedback": "¡Gracias por tus comentarios!", + "thanksFeedbackImproving": "¡Gracias! Usaremos esto para mejorar." + }, + "trash": { + "deletePermanently": "Eliminar permanentemente", + "empty": "La papelera está vacía", + "restore": "Restaurar", + "title": "Papelera" + }, + "ui": { + "close": "Cerrar", + "collapse": "Colapsar", + "expand": "Expandir", + "open": "Abrir" } } diff --git a/keep-notes/locales/fa.json b/keep-notes/locales/fa.json index e4a0737..68ad58b 100644 --- a/keep-notes/locales/fa.json +++ b/keep-notes/locales/fa.json @@ -1,510 +1,1046 @@ { - "auth": { - "signIn": "ورود", - "signUp": "ثبت‌نام", - "email": "ایمیل", - "password": "رمز عبور", - "name": "نام", - "emailPlaceholder": "آدرس ایمیل خود را وارد کنید", - "passwordPlaceholder": "رمز عبور خود را وارد کنید", - "namePlaceholder": "نام خود را وارد کنید", - "passwordMinChars": "رمز عبور خود را وارد کنید (حداقل ۶ کاراکتر)", - "resetPassword": "بازنشانی رمز عبور", - "resetPasswordInstructions": "برای بازنشانی رمز عبور ایمیل خود را وارد کنید", - "forgotPassword": "رمز عبور را فراموش کرده‌اید؟", - "noAccount": "حساب کاربری ندارید؟", - "hasAccount": "قبلاً ثبت‌نام کرده‌اید؟", - "signInToAccount": "به حساب کاربری خود وارد شوید", - "createAccount": "ایجاد حساب کاربری", - "rememberMe": "مرا به خاطر بسپار", - "orContinueWith": "یا ادامه با" + "about": { + "appDescription": "یک برنامه یادداشت قدرتمند با قابلیت‌های هوش مصنوعی", + "appName": "Keep Notes", + "buildDate": "تاریخ ساخت", + "description": "اطلاعات درباره برنامه", + "features": { + "description": "قابلیت‌های مبتنی بر هوش مصنوعی", + "dragDrop": "مدیریت یادداشت با کشیدن و رها کردن", + "labelSystem": "سیستم برچسب", + "memoryEcho": "بینش‌های روزانه Memory Echo", + "multipleProviders": "چندین ارائه‌دهنده هوش مصنوعی (OpenAI، Ollama)", + "notebookOrganization": "سازماندهی دفترچه", + "paragraphReformulation": "بازنویسی پاراگراف", + "semanticSearch": "جستجوی معنایی با تعبیه‌ها", + "title": "ویژگی‌ها", + "titleSuggestions": "پیشنهادات عنوان مبتنی بر هوش مصنوعی" + }, + "platform": "پلتفرم", + "platformWeb": "وب", + "support": { + "description": "دریافت کمک و بازخورد", + "documentation": "مستندات", + "feedback": "بازخورد", + "reportIssues": "گزارش مشکلات", + "title": "پشتیبانی" + }, + "technology": { + "ai": "هوش مصنوعی", + "authentication": "احراز هویت", + "backend": "بک‌اند", + "database": "پایگاه داده", + "description": "ساخته شده با فناوری‌های مدرن", + "frontend": "فرانت‌اند", + "testing": "تست", + "title": "پشته فناوری", + "ui": "رابط کاربری" + }, + "title": "درباره", + "version": "نسخه" }, - "notes": { - "title": "یادداشت‌ها", - "newNote": "یادداشت جدید", - "untitled": "بدون عنوان", - "placeholder": "یادداشت بگیرید...", - "markdownPlaceholder": "یادداشت بگیرید... (Markdown پشتیبانی می‌شود)", - "titlePlaceholder": "عنوان", - "listItem": "آیتم لیست", - "addListItem": "+ آیتم لیست", - "newChecklist": "لیست جدید", - "add": "افزودن", - "adding": "در حال افزودن...", - "close": "بستن", - "confirmDelete": "آیا مطمئن هستید که می‌خواهید این یادداشت را حذف کنید؟", - "confirmLeaveShare": "آیا مطمئن هستید که می‌خواهید این یادداشت اشتراکی را ترک کنید؟", - "sharedBy": "به اشتراک گذاشته توسط", - "leaveShare": "ترک", - "delete": "حذف", - "archive": "بایگانی", - "unarchive": "خروج از بایگانی", - "pin": "سنجاق کردن", - "unpin": "برداشتن سنجاق", - "color": "رنگ", - "changeColor": "تغییر رنگ", - "setReminder": "تنظیم یادآوری", - "setReminderButton": "تنظیم یادآوری", - "date": "تاریخ", - "time": "زمان", - "reminderDateTimeRequired": "لطفا تاریخ و زمان را وارد کنید", - "invalidDateTime": "تاریخ یا زمان نامعتبر", - "reminderMustBeFuture": "یادآوری باید در آینده باشد", - "reminderSet": "یادآوری برای {datetime} تنظیم شد", - "addImage": "افزودن تصویر", - "addLink": "افزودن پیوند", - "linkAdded": "پیوند اضافه شد", - "linkMetadataFailed": "نمی‌توان ابرداده‌های پیوند را دریافت کرد", - "linkAddFailed": "افزودن پیوند شکست خورد", - "invalidFileType": "نوع فایل نامعتبر: {fileName}. فقط JPEG، PNG، GIF و WebP مجاز است.", - "fileTooLarge": "فایل خیلی بزرگ است: {fileName}. حداکثر اندازه {maxSize}.", - "uploadFailed": "آپلود {fileName} شکست خورد", - "contentOrMediaRequired": "لطفا محتوا وارد کنید یا پیوند/تصویر اضافه کنید", - "itemOrMediaRequired": "لطفا حداقل یک آیتم یا رسانه اضافه کنید", - "noteCreated": "یادداشت با موفقیت ایجاد شد", - "noteCreateFailed": "ایجاد یادداشت شکست خورد", - "aiAssistant": "دستیار هوش مصنوعی", - "changeSize": "تغییر اندازه", - "backgroundOptions": "گزینه‌های پس‌زمینه", - "moreOptions": "گزینه‌های بیشتر", - "remindMe": "یادآوری به من", - "markdownMode": "مارک‌داون", - "addCollaborators": "افزودن همکاران", - "duplicate": "تکثیر", - "share": "اشتراک‌گذاری", - "showCollaborators": "مشاهده همکاران", - "pinned": "سنجاق شده", - "others": "سایر", - "undo": "بازگردانی", - "redo": "انجام مجدد", - "noNotes": "بدون عنوان", - "noNotesFound": "یادداشتی یافت نشد", - "createFirstNote": "اولین یادداشت خود را ایجاد کنید", - "size": "اندازه", - "small": "کوچک", - "medium": "متوسط", - "large": "بزرگ", - "shareWithCollaborators": "اشتراک‌گذاری با همکاران" - }, - "labels": { - "title": "برچسب‌ها", - "filter": "فیلتر بر اساس برچسب", - "manage": "مدیریت برچسب‌ها", - "manageTooltip": "مدیریت برچسب‌ها", - "changeColor": "تغییر رنگ", - "changeColorTooltip": "تغییر رنگ", - "delete": "حذف", - "deleteTooltip": "حذف برچسب", - "confirmDelete": "آیا مطمئن هستید که می‌خواهید این برچسب را حذف کنید؟", - "newLabelPlaceholder": "ایجاد برچسب جدید", - "namePlaceholder": "نام برچسب", - "addLabel": "افزودن برچسب", - "createLabel": "ایجاد برچسب", - "labelName": "نام برچسب", - "labelColor": "رنگ برچسب", - "manageLabels": "مدیریت برچسب‌ها", - "clearAll": "پاک کردن همه", - "filterByLabel": "فیلتر بر اساس برچسب", - "tagAdded": "برچسب \"{tag}\" اضافه شد", - "showLess": "نمایش کمتر", - "showMore": "نمایش بیشتر", - "editLabels": "ویرایش برچسب‌ها", - "editLabelsDescription": "ایجاد، ویرایش رنگ‌ها یا حذف برچسب‌ها.", - "noLabelsFound": "برچسبی یافت نشد.", - "loading": "در حال بارگذاری...", - "notebookRequired": "⚠️ برچسب‌ها فقط در دفترچه‌ها در دسترس هستند. این یادداشت را ابتدا به یک دفترچه منتقل کنید." - }, - "pagination": { - "previous": "←", - "pageInfo": "صفحه {currentPage} / {totalPages}", - "next": "→" - }, - "search": { - "placeholder": "جستجو", - "searchPlaceholder": "در یادداشت‌های خود جستجو کنید...", - "semanticInProgress": "جستجوی هوش مصنوعی در حال انجام...", - "semanticTooltip": "جستجوی معنایی هوش مصنوعی", - "searching": "در حال جستجو...", - "noResults": "نتیجه‌ای یافت نشد", - "resultsFound": "{count} یادداشت یافت شد", - "exactMatch": "تطابق دقیق", - "related": "مرتبط" - }, - "collaboration": { - "emailPlaceholder": "آدرس ایمیل را وارد کنید", - "addCollaborator": "افزودن همکار", - "removeCollaborator": "حذف همکار", - "owner": "مالک", - "canEdit": "می‌تواند ویرایش کند", - "canView": "می‌تواند مشاهده کند", - "shareNote": "اشتراک‌گذاری یادداشت", - "shareWithCollaborators": "اشتراک‌گذاری با همکاران", - "addCollaboratorDescription": "افراد را برای همکاری در این یادداشت با آدرس ایمیل آنها اضافه کنید.", - "viewerDescription": "شما به این یادداشت دسترسی دارید. فقط مالک می‌تواند همکاران را مدیریت کند.", - "emailAddress": "آدرس ایمیل", - "enterEmailAddress": "آدرس ایمیل را وارد کنید", - "invite": "دعوت", - "peopleWithAccess": "افراد دارای دسترسی", - "noCollaborators": "هنوز همکاری وجود ندارد. کسی را اضافه کنید!", - "noCollaboratorsViewer": "هنوز همکاری وجود ندارد.", - "pendingInvite": "دعوت در انتظار", - "pending": "در انتظار", - "remove": "حذف", - "unnamedUser": "کاربر بدون نام", - "done": "انجام شد", - "willBeAdded": "{email} به عنوان همکار پس از ایجاد یادداشت اضافه خواهد شد", - "alreadyInList": "این ایمیل قبلاً در لیست است", - "nowHasAccess": "{name} اکنون به این یادداشت دسترسی دارد", - "accessRevoked": "دسترسی لغو شد", - "errorLoading": "خطا در بارگذاری همکاران", - "failedToAdd": "شکست در افزودن همکار", - "failedToRemove": "شکست در حذف همکار" + "admin": { + "ai": { + "apiKey": "کلید API", + "baseUrl": "آدرس پایه", + "commonEmbeddingModels": "مدل‌های تعبیه رایج برای APIهای سازگار با OpenAI", + "commonModelsDescription": "مدل‌های رایج برای APIهای سازگار با OpenAI", + "description": "پیکربندی ارائه‌دهندگان هوش مصنوعی برای برچسب‌گذاری خودکار و جستجوی معنایی. برای عملکرد بهینه از ارائه‌دهندگان مختلف استفاده کنید.", + "embeddingsDescription": "ارائه‌دهنده هوش مصنوعی برای تعبیه‌های جستجوی معنایی. پیشنهادی: OpenAI (بهترین کیفیت).", + "embeddingsProvider": "ارائه‌دهنده تعبیه", + "model": "مدل", + "modelRecommendations": "gpt-4o-mini = بهترین ارزش • gpt-4o = بهترین کیفیت", + "openAIKeyDescription": "کلید OpenAI API شما از platform.openai.com", + "openTestPanel": "باز کردن پنل تست هوش مصنوعی", + "provider": "ارائه‌دهنده", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING الزامی است", + "providerTagsRequired": "AI_PROVIDER_TAGS الزامی است", + "saveSettings": "ذخیره تنظیمات هوش مصنوعی", + "saving": "در حال ذخیره...", + "selectEmbeddingModel": "مدل تعبیه نصب شده روی سیستم خود را انتخاب کنید", + "selectOllamaModel": "مدل Ollama نصب شده روی سیستم خود را انتخاب کنید", + "tagsGenerationDescription": "ارائه‌دهنده هوش مصنوعی برای پیشنهادات برچسب خودکار. پیشنهادی: Ollama (رایگان، محلی).", + "tagsGenerationProvider": "ارائه‌دهنده تولید برچسب", + "title": "پیکربندی هوش مصنوعی", + "updateFailed": "شکست در به‌روزرسانی تنظیمات هوش مصنوعی", + "updateSuccess": "تنظیمات هوش مصنوعی با موفقیت به‌روزرسانی شد" + }, + "aiTest": { + "description": "تست ارائه‌دهندگان هوش مصنوعی برای تولید برچسب و تعبیه‌های جستجوی معنایی", + "embeddingDimensions": "ابعاد تعبیه:", + "embeddingsTestDescription": "تست ارائه‌دهنده هوش مصنوعی مسئول تعبیه‌های جستجوی معنایی", + "embeddingsTestTitle": "تست تعبیه", + "error": "خطا:", + "first5Values": "۵ مقدار اول:", + "generatedTags": "برچسب‌های تولید شده:", + "howItWorksTitle": "نحوه کار تست", + "model": "مدل:", + "provider": "ارائه‌دهنده:", + "responseTime": "زمان پاسخ: {time} میلی‌ثانیه", + "runTest": "اجرای تست", + "tagsTestDescription": "تست ارائه‌دهنده هوش مصنوعی مسئول پیشنهادات برچسب خودکار", + "tagsTestTitle": "تست تولید برچسب", + "testError": "خطای تست: {error}", + "testFailed": "تست ناموفق", + "testPassed": "تست موفق", + "testing": "در حال تست...", + "tipDescription": "قبل از تست از پنل تست هوش مصنوعی برای تشخیص مشکلات پیکربندی استفاده کنید.", + "tipTitle": "نکته:", + "title": "تست ارائه‌دهنده هوش مصنوعی", + "vectorDimensions": "ابعاد بردار" + }, + "aiTesting": "تست هوش مصنوعی", + "security": { + "allowPublicRegistration": "اجازه ثبت‌نام عمومی", + "allowPublicRegistrationDescription": "اگر غیرفعال باشد، کاربران جدید فقط توسط مدیر از طریق صفحه مدیریت کاربران قابل اضافه شدن هستند.", + "description": "مدیریت کنترل دسترسی و سیاست‌های ثبت‌نام.", + "title": "تنظیمات امنیتی", + "updateFailed": "شکست در به‌روزرسانی تنظیمات امنیتی", + "updateSuccess": "تنظیمات امنیتی به‌روزرسانی شد" + }, + "settings": "تنظیمات مدیر", + "smtp": { + "description": "پیکربندی سرور ایمیل برای بازنشانی رمز عبور.", + "forceSSL": "اجبار SSL/TLS (معمولاً برای پورت 465)", + "fromEmail": "از ایمیل", + "host": "میزبان", + "ignoreCertErrors": "نادیده گرفتن خطاهای گواهی (فقط میزبان خود/توسعه)", + "password": "رمز عبور", + "port": "پورت", + "saveSettings": "ذخیره تنظیمات SMTP", + "sending": "در حال ارسال...", + "testEmail": "ایمیل تست", + "testFailed": "شکست: {error}", + "testSuccess": "ایمیل تست با موفقیت ارسال شد!", + "title": "پیکربندی SMTP", + "updateFailed": "شکست در به‌روزرسانی تنظیمات SMTP", + "updateSuccess": "تنظیمات SMTP به‌روزرسانی شد", + "username": "نام کاربری" + }, + "title": "داشبورد مدیریت", + "userManagement": "مدیریت کاربران", + "users": { + "addUser": "افزودن کاربر", + "confirmDelete": "Are you sure? This action cannot be undone.", + "createFailed": "شکست در ایجاد کاربر", + "createSuccess": "کاربر با موفقیت ایجاد شد", + "createUser": "ایجاد کاربر", + "createUserDescription": "افزودن کاربر جدید به سیستم.", + "deleteFailed": "شکست در حذف", + "deleteSuccess": "کاربر حذف شد", + "demote": "تنزل", + "email": "ایمیل", + "name": "نام", + "password": "رمز عبور", + "promote": "ارتقا", + "role": "نقش", + "roleUpdateFailed": "شکست در به‌روزرسانی نقش", + "roleUpdateSuccess": "نقش کاربر به {role} به‌روزرسانی شد", + "roles": { + "admin": "مدیر", + "user": "کاربر" + }, + "table": { + "actions": "عملیات", + "createdAt": "تاریخ ایجاد", + "email": "ایمیل", + "name": "نام", + "role": "نقش" + } + } }, "ai": { "analyzing": "در حال تحلیل هوش مصنوعی...", + "assistant": "دستیار هوش مصنوعی", + "autoLabels": { + "analyzing": "در حال تحلیل یادداشت‌های شما برای پیشنهادات برچسب...", + "create": "ایجاد", + "createNewLabel": "Create this new label and add it", + "created": "{count} labels created successfully", + "creating": "در حال ایجاد برچسب‌ها...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(جدید)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "پیشنهادات برچسب", + "typeContent": "Type content to get label suggestions..." + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Failed to apply organization plan", + "applying": "Applying...", + "description": "هوش مصنوعی یادداشت‌های شما را تحلیل کرده و پیشنهاد می‌کند آن‌ها را در دفترچه‌ها سازماندهی کنید.", + "error": "Failed to create organization plan", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "No notes selected", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Select all notes in {notebook}", + "selectNote": "Select note: {title}", + "success": "{count} notes moved successfully", + "title": "Organize with AI" + }, + "clarify": "شفاف‌سازی", "clickToAddTag": "برای افزودن این برچسب کلیک کنید", - "ignoreSuggestion": "نادیده گرفتن این پیشنهاد", - "generatingTitles": "در حال تولید...", + "generateTitles": "تولید عناوین", "generateTitlesTooltip": "تولید عنوان با هوش مصنوعی", - "poweredByAI": "قدرت گرفته از هوش مصنوعی", + "generating": "در حال تولید...", + "generatingTitles": "در حال تولید...", + "ignoreSuggestion": "نادیده گرفتن این پیشنهاد", + "improveStyle": "بهبود سبک", "languageDetected": "زبان شناسایی شد", + "notebookSummary": { + "regenerate": "تولید مجدد خلاصه", + "regenerating": "در حال تولید مجدد خلاصه..." + }, + "original": "اصلی", + "poweredByAI": "قدرت گرفته از هوش مصنوعی", "processing": "در حال پردازش...", - "tagAdded": "برچسب \"{tag}\" اضافه شد", - "titleGenerating": "در حال تولید...", - "titleGenerateWithAI": "تولید عنوان با هوش مصنوعی", - "titleGenerationMinWords": "محتوا باید حداقل 10 کلمه داشته باشد تا عناوین تولید شوند (فعلاً: {count} کلمه)", - "titleGenerationError": "خطا در تولید عناوین", - "titlesGenerated": "💡 {count} عنوان تولید شد!", - "titleGenerationFailed": "تولید عناوین شکست خورد", - "titleApplied": "عنوان اعمال شد!", - "reformulationNoText": "متن را انتخاب کنید یا محتوایی اضافه کنید", - "reformulationSelectionTooShort": "انتخاب کوتاه است، از محتوای کامل استفاده می‌شود", - "reformulationMinWords": "متن باید حداقل 10 کلمه داشته باشد (فعلاً: {count} کلمه)", - "reformulationMaxWords": "متن نباید بیشتر از 500 کلمه داشته باشد", + "reformulateText": "بازنویسی متن", + "reformulated": "بازنویسی شده", + "reformulating": "در حال بازنویسی...", + "reformulationApplied": "متن بازنویسی شده اعمال شد!", + "reformulationComparison": "مقایسه بازنویسی", "reformulationError": "خطا در بازنویسی متن", "reformulationFailed": "بازنویسی متن شکست خورد", - "reformulationApplied": "متن بازنویسی شده اعمال شد!", - "transformMarkdown": "تبدیل به مارک‌داون", - "transforming": "در حال تبدیل...", - "transformSuccess": "متن با موفقیت به مارک‌داون تبدیل شد!", - "transformError": "خطا در تبدیل", - "assistant": "دستیار هوش مصنوعی", - "generating": "در حال تولید...", - "generateTitles": "تولید عناوین", - "reformulateText": "بازنویسی متن", - "reformulating": "در حال بازنویسی...", - "clarify": "شفاف‌سازی", + "reformulationMaxWords": "متن نباید بیشتر از 500 کلمه داشته باشد", + "reformulationMinWords": "متن باید حداقل 10 کلمه داشته باشد (فعلاً: {count} کلمه)", + "reformulationNoText": "متن را انتخاب کنید یا محتوایی اضافه کنید", + "reformulationSelectionTooShort": "انتخاب کوتاه است، از محتوای کامل استفاده می‌شود", "shorten": "کوتاه کردن", - "improveStyle": "بهبود سبک", - "reformulationComparison": "مقایسه بازنویسی", - "original": "اصلی", - "reformulated": "بازنویسی شده" + "tagAdded": "برچسب \"{tag}\" اضافه شد", + "titleApplied": "عنوان اعمال شد!", + "titleGenerateWithAI": "تولید عنوان با هوش مصنوعی", + "titleGenerating": "در حال تولید...", + "titleGenerationError": "خطا در تولید عناوین", + "titleGenerationFailed": "تولید عناوین شکست خورد", + "titleGenerationMinWords": "محتوا باید حداقل 10 کلمه داشته باشد تا عناوین تولید شوند (فعلاً: {count} کلمه)", + "titlesGenerated": "💡 {count} عنوان تولید شد!", + "transformError": "خطا در تبدیل", + "transformMarkdown": "تبدیل به مارک‌داون", + "transformSuccess": "متن با موفقیت به مارک‌داون تبدیل شد!", + "transforming": "در حال تبدیل..." }, - "batchOrganization": { - "title": "سازماندهی دسته‌ای", - "error": "شکست در ایجاد برنامه سازماندهی", - "noNotesSelected": "هیچ یادداشتی انتخاب نشده", - "selectNotes": "یادداشت‌ها را برای سازماندهی انتخاب کنید", - "start": "شروع سازماندهی", - "organizing": "در حال سازماندهی...", - "finished": "سازماندهی با موفقیت به پایان رسید!", - "results": "نتایج", - "totalProcessed": "پردازش شده: {total}", - "categorized": "دسته‌بندی شده: {count}", - "tagsAdded": "برچسب‌ها اضافه شده: {count}", - "categories": "دسته‌ها", - "noTagsAdded": "هیچ برچسبی اضافه نشد", - "suggestedTags": "برچسب‌های پیشنهادی", - "suggestedCategories": "دسته‌های پیشنهادی", - "addTags": "افزودن برچسب‌ها", - "addCategories": "افزودن دسته‌ها", - "reviewChanges": "مشاهده تغییرات", - "applyChanges": "اعمال تغییرات", - "skip": "رد کردن", - "done": "انجام شد", - "close": "بستن", - "backToNote": "بازگشت به یادداشت" + "aiSettings": { + "description": "ویژگی‌ها و ترجیحات هوش مصنوعی خود را پیکربندی کنید", + "error": "به‌روزرسانی شکست خورد", + "features": "ویژگی‌های هوش مصنوعی", + "frequency": "فرکانس", + "frequencyDaily": "روزانه", + "frequencyWeekly": "هفتگی", + "provider": "فروشنده هوش مصنوعی", + "providerAuto": "خودکار (توصیه می‌شود)", + "providerOllama": "Ollama (محلی)", + "providerOpenAI": "OpenAI (ابر)", + "saved": "تنظیم به‌روزرسانی شد", + "saving": "در حال ذخیره...", + "title": "تنظیمات هوش مصنوعی", + "titleSuggestionsDesc": "پیشنهاد عناوان برای یادداشت‌های بدون عنوان پس از ۵۰+ کلمه", + "paragraphRefactorDesc": "گزینه‌های بهبود متن با هوش مصنوعی", + "frequencyDesc": "فرکانس تحلیل ارتباطات یادداشت", + "providerDesc": "فروشنده هوش مصنوعی مورد نظر خود را انتخاب کنید", + "providerAutoDesc": "Ollama در صورت وجود، در غیر این صورت OpenAI", + "providerOllamaDesc": "۱۰۰٪ خصوصی، به صورت محلی اجرا می‌شود", + "providerOpenAIDesc": "دقیق‌ترین، نیاز به کلید API دارد" + }, + "appearance": { + "description": "سفارشی‌سازی ظاهر برنامه", + "title": "ظاهر" + }, + "auth": { + "backToLogin": "Back to login", + "checkYourEmail": "Check your email", + "createAccount": "ایجاد حساب کاربری", + "email": "ایمیل", + "emailPlaceholder": "آدرس ایمیل خود را وارد کنید", + "forgotPassword": "رمز عبور را فراموش کرده‌اید؟", + "forgotPasswordDescription": "Enter your email address and we'll send you a link to reset your password.", + "forgotPasswordTitle": "Forgot Password", + "hasAccount": "قبلاً ثبت‌نام کرده‌اید؟", + "name": "نام", + "namePlaceholder": "نام خود را وارد کنید", + "noAccount": "حساب کاربری ندارید؟", + "orContinueWith": "یا ادامه با", + "password": "رمز عبور", + "passwordMinChars": "رمز عبور خود را وارد کنید (حداقل ۶ کاراکتر)", + "passwordPlaceholder": "رمز عبور خود را وارد کنید", + "rememberMe": "مرا به خاطر بسپار", + "resetEmailSent": "We have sent a password reset link to your email address if it exists in our system.", + "resetPassword": "بازنشانی رمز عبور", + "resetPasswordInstructions": "برای بازنشانی رمز عبور ایمیل خود را وارد کنید", + "returnToLogin": "Return to Login", + "sendResetLink": "Send Reset Link", + "sending": "Sending...", + "signIn": "ورود", + "signInToAccount": "به حساب کاربری خود وارد شوید", + "signOut": "Sign out", + "signUp": "ثبت‌نام" }, "autoLabels": { - "title": "برچسب‌های خودکار", - "toggle": "فعال‌سازی برچسب‌های خودکار", - "enabled": "فعال", - "disabled": "غیرفعال", - "settings": "تنظیمات", + "aiPowered": "قدرت گرفته از هوش مصنوعی", + "analyzing": "Analyzing your notes...", + "applySuggested": "اعمال پیشنهادها", + "autoLabelBatchDescription": "افزودن خودکار برچسب‌ها برای یادداشت‌های انتخاب شده", "autoLabelDescription": "افزودن خودکار برچسب‌ها بر اساس تحلیل هوش مصنوعی", "autoLabelNoteDescription": "افزودن خودکار برچسب‌ها برای این یادداشت", - "autoLabelBatchDescription": "افزودن خودکار برچسب‌ها برای یادداشت‌های انتخاب شده", - "smartTagging": "برچسب‌گذاری هوشمند", + "confidence": "اطمینان: {score}%", "contentAnalysis": "تحلیل محتوا", - "keywordExtraction": "استخراج کلمات کلیدی", - "aiPowered": "قدرت گرفته از هوش مصنوعی", - "suggestedLabels": "برچسب‌های پیشنهادی", - "applySuggested": "اعمال پیشنهادها", + "createNewLabel": "ایجاد این برچسب جدید و افزودن آن", + "created": "{count} labels created successfully", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "disabled": "غیرفعال", "dismissAll": "رد کردن همه", + "enabled": "فعال", + "error": "خطا در برچسب‌های خودکار", "generateMore": "تولید بیشتر", - "settingsDialogTitle": "تنظیمات برچسب‌های خودکار", - "settingsDescription": "پیکربندی ترجیحات برچسب‌های خودکار", - "minConfidence": "حداقل اطمینان", - "minConfidenceDescription": "حداقل امتیاز (0-100) برای پیشنهادات هوش مصنوعی", - "maxLabels": "حداکثر برچسب در هر یادداشت", - "maxLabelsDescription": "حداکثر تعداد برچسب در هر یادداشت", + "keywordExtraction": "استخراج کلمات کلیدی", "labelCategories": "دسته‌های برچسب", "labelCategoriesDescription": "انتخاب دسته‌ها برای برچسب‌گذاری خودکار", - "saveSettings": "ذخیره تنظیمات", - "settingsSaved": "تنظیمات به‌روزرسانی شد", - "error": "خطا در برچسب‌های خودکار", - "processing": "در حال پردازش...", - "noLabelsGenerated": "هیچ برچسبی تولید نشد", "labelsApplied": "برچسب‌ها اعمال شدند", - "confidence": "اطمینان: {score}%", - "learnMore": "بیشتر بدانید" + "learnMore": "بیشتر بدانید", + "maxLabels": "حداکثر برچسب در هر یادداشت", + "maxLabelsDescription": "حداکثر تعداد برچسب در هر یادداشت", + "minConfidence": "حداقل اطمینان", + "minConfidenceDescription": "حداقل امتیاز (0-100) برای پیشنهادات هوش مصنوعی", + "new": "(new)", + "noLabelsGenerated": "هیچ برچسبی تولید نشد", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "processing": "در حال پردازش...", + "saveSettings": "ذخیره تنظیمات", + "settings": "تنظیمات", + "settingsDescription": "پیکربندی ترجیحات برچسب‌های خودکار", + "settingsDialogTitle": "تنظیمات برچسب‌های خودکار", + "settingsSaved": "تنظیمات به‌روزرسانی شد", + "smartTagging": "برچسب‌گذاری هوشمند", + "suggestedLabels": "برچسب‌های پیشنهادی", + "title": "برچسب‌های خودکار", + "toggle": "فعال‌سازی برچسب‌های خودکار", + "typeContent": "Type content to get label suggestions...", + "typeForSuggestions": "برای دریافت پیشنهادات تایپ کنید..." }, - "titleSuggestions": { - "available": "پیشنهادات عنوان", - "title": "پیشنهادات هوش مصنوعی", - "generating": "در حال تولید...", - "selectTitle": "یک عنوان را انتخاب کنید", - "dismiss": "نادیده گرفتن" + "batch": { + "organize": "سازماندهی", + "organizeWithAI": "سازماندهی با هوش مصنوعی" + }, + "batchOrganization": { + "addCategories": "افزودن دسته‌ها", + "addTags": "افزودن برچسب‌ها", + "analyzing": "Analyzing your notes...", + "apply": "Apply ({count})", + "applyChanges": "اعمال تغییرات", + "applyFailed": "شکست در اعمال سازماندهی", + "applying": "Applying...", + "backToNote": "بازگشت به یادداشت", + "categories": "دسته‌ها", + "categorized": "دسته‌بندی شده: {count}", + "close": "بستن", + "confidence": "confidence", + "description": "AI will analyze your notes and suggest organizing them into notebooks.", + "done": "انجام شد", + "error": "شکست در ایجاد برنامه سازماندهی", + "finished": "سازماندهی با موفقیت به پایان رسید!", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "هیچ یادداشتی انتخاب نشده", + "noSuggestions": "AI could not find a good way to organize these notes.", + "noTagsAdded": "هیچ برچسبی اضافه نشد", + "notesToOrganize": "{count} notes to organize", + "organizing": "در حال سازماندهی...", + "results": "نتایج", + "reviewChanges": "مشاهده تغییرات", + "selectAllIn": "انتخاب همه", + "selectNote": "انتخاب یادداشت", + "selectNotes": "یادداشت‌ها را برای سازماندهی انتخاب کنید", + "selected": "{count} selected", + "skip": "رد کردن", + "start": "شروع سازماندهی", + "success": "سازماندهی موفق", + "suggestedCategories": "دسته‌های پیشنهادی", + "suggestedTags": "برچسب‌های پیشنهادی", + "tagsAdded": "برچسب‌ها اضافه شده: {count}", + "title": "سازماندهی دسته‌ای", + "totalProcessed": "پردازش شده: {total}", + "unorganized": "{count} notes couldn't be categorized and will stay in General Notes." + }, + "collaboration": { + "accessRevoked": "دسترسی لغو شد", + "addCollaborator": "افزودن همکار", + "addCollaboratorDescription": "افراد را برای همکاری در این یادداشت با آدرس ایمیل آنها اضافه کنید.", + "alreadyInList": "این ایمیل قبلاً در لیست است", + "canEdit": "می‌تواند ویرایش کند", + "canView": "می‌تواند مشاهده کند", + "done": "انجام شد", + "emailAddress": "آدرس ایمیل", + "emailPlaceholder": "آدرس ایمیل را وارد کنید", + "enterEmailAddress": "آدرس ایمیل را وارد کنید", + "errorLoading": "خطا در بارگذاری همکاران", + "failedToAdd": "شکست در افزودن همکار", + "failedToRemove": "شکست در حذف همکار", + "invite": "دعوت", + "noCollaborators": "هنوز همکاری وجود ندارد. کسی را اضافه کنید!", + "noCollaboratorsViewer": "هنوز همکاری وجود ندارد.", + "nowHasAccess": "{name} اکنون به این یادداشت دسترسی دارد", + "owner": "مالک", + "pending": "در انتظار", + "pendingInvite": "دعوت در انتظار", + "peopleWithAccess": "افراد دارای دسترسی", + "remove": "حذف", + "removeCollaborator": "حذف همکار", + "shareNote": "اشتراک‌گذاری یادداشت", + "shareWithCollaborators": "اشتراک‌گذاری با همکاران", + "unnamedUser": "کاربر بدون نام", + "viewerDescription": "شما به این یادداشت دسترسی دارید. فقط مالک می‌تواند همکاران را مدیریت کند.", + "willBeAdded": "{email} به عنوان همکار پس از ایجاد یادداشت اضافه خواهد شد" + }, + "colors": { + "blue": "آبی", + "default": "پیش‌فرض", + "gray": "خاکستری", + "green": "سبز", + "orange": "نارنجی", + "pink": "صورتی", + "purple": "بنفش", + "red": "قرمز", + "yellow": "زرد" + }, + "common": { + "add": "افزودن", + "cancel": "لغو", + "close": "بستن", + "confirm": "تأیید", + "delete": "حذف", + "edit": "ویرایش", + "error": "خطا", + "loading": "در حال بارگذاری...", + "noResults": "نتیجه‌ای یافت نشد", + "notAvailable": "در دسترس نیست", + "optional": "اختیاری", + "remove": "حذف", + "required": "الزامی", + "save": "ذخیره", + "search": "جستجو", + "success": "موفق", + "unknown": "نامشخص" + }, + "connection": { + "clickToView": "کلیک برای مشاهده یادداشت", + "helpful": "مفید", + "isHelpful": "این اتصال مفید است؟", + "memoryEchoDiscovery": "کشف Memory Echo", + "notHelpful": "غیرمفید", + "similarityInfo": "این یادداشت‌ها با شباهت {similarity}% متصل هستند" + }, + "dataManagement": { + "cleanup": { + "button": "پاکسازی", + "description": "حذف برچسب‌ها و اتصال‌هایی که به یادداشت‌های حذف شده ارجاع می‌دهند.", + "failed": "خطا در حین پاکسازی", + "title": "پاکسازی داده‌های یتیم" + }, + "cleanupComplete": "پاکسازی کامل شد", + "cleanupError": "خطای پاکسازی", + "dangerZone": "منطقه خطر", + "dangerZoneDescription": "این عملیات قابل بازگشت نیستند، با احتیاط باشید", + "delete": { + "button": "حذف همه یادداشت‌ها", + "confirm": "مطمئن هستید؟ این همه یادداشت‌های شما را برای همیشه حذف می‌کند.", + "description": "حذف دائمی همه یادداشت‌های شما. این عمل قابل بازگشت نیست.", + "failed": "شکست در حذف یادداشت‌ها", + "success": "همه یادداشت‌ها حذف شدند", + "title": "حذف همه یادداشت‌ها" + }, + "deleting": "در حال حذف...", + "export": { + "button": "صادرات یادداشت‌ها", + "description": "همه یادداشت‌های خود را به صورت فایل JSON دانلود کنید. شامل تمام محتوا، برچسب‌ها و ابرداده‌ها.", + "failed": "شکست در صادرات یادداشت‌ها", + "success": "یادداشت‌ها با موفقیت صادر شدند", + "title": "صادرات همه یادداشت‌ها" + }, + "exporting": "در حال صادرات...", + "import": { + "button": "وارد کردن یادداشت‌ها", + "description": "فایل JSON را برای وارد کردن یادداشت‌ها آپلود کنید. به یادداشت‌های موجود شما اضافه می‌شود، نه جایگزین.", + "failed": "شکست در وارد کردن یادداشت‌ها", + "success": "{count} یادداشت وارد شد", + "title": "وارد کردن یادداشت‌ها" + }, + "importing": "در حال وارد کردن...", + "indexing": { + "button": "بازسازی نمایه", + "description": "تولید مجدد تعبیه‌ها برای همه یادداشت‌ها برای بهبود جستجوی معنایی.", + "failed": "خطا در حین نمایه‌سازی", + "success": "نمایه‌سازی کامل: {count} یادداشت پردازش شد", + "title": "بازسازی نمایه جستجو" + }, + "indexingComplete": "نمایه‌سازی کامل شد", + "indexingError": "خطای نمایه‌سازی", + "title": "مدیریت داده", + "toolsDescription": "ابزارهایی برای حفظ سلامت پایگاه داده" + }, + "demoMode": { + "activated": "حالت دمو فعال شد! Memory Echo اکنون فوراً کار خواهد کرد.", + "createNotesTip": "۲ یادداشت مشابه یا بیشتر بسازید و Memory Echo را در عمل ببینید!", + "deactivated": "حالت دمو غیرفعال شد. پارامترهای عادی بازیابی شدند.", + "delayBetweenNotes": "تأخیر ۰ روز بین یادداشت‌ها (معمولاً ۷ روز)", + "description": "تسریع Memory Echo برای تست. اتصال‌ها فوراً ظاهر می‌شوند.", + "parametersActive": "پارامترهای دمو فعال:", + "similarityThreshold": "آستانه شباهت ۵۰٪ (معمولاً ۷۵٪)", + "title": "حالت دمو", + "toggleFailed": "شکست در تغییر حالت دمو", + "unlimitedInsights": "بینش‌های نامحدود (بدون محدودیت فرکانس)" + }, + "diagnostics": { + "apiStatus": "وضعیت API", + "checking": "Checking...", + "configuredProvider": "ارائه‌دهنده پیکربندی شده", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "جزئیات تست:", + "tip1": "مطمئن شوید Ollama در حال اجرا است (ollama serve)", + "tip2": "بررسی کنید که مدل نصب شده است (ollama pull llama3)", + "tip3": "کلید OpenAI API خود را تأیید کنید", + "tip4": "اتصال شبکه را بررسی کنید", + "title": "تشخیص", + "troubleshootingTitle": "نکات عیب‌یابی:" + }, + "favorites": { + "noFavorites": "مورد علاقه‌ای نیست", + "pinToFavorite": "سنجاق به مورد علاقه‌ها", + "title": "مورد علاقه‌ها", + "toggleSection": "تغییر بخش مورد علاقه‌ها" + }, + "footer": { + "openSource": "نسخه متن‌باز", + "privacy": "حریم خصوصی", + "terms": "شرایط" + }, + "general": { + "add": "افزودن", + "apply": "اعمال", + "back": "بازگشت", + "cancel": "لغو", + "clean": "Clean", + "clear": "پاک کردن", + "close": "بستن", + "confirm": "تأیید", + "edit": "ویرایش", + "error": "خطایی رخ داد", + "indexAll": "Index All", + "loading": "در حال بارگذاری...", + "next": "بعدی", + "operationFailed": "عملیات شکست خورد", + "operationSuccess": "عملیات موفقیت‌آمیز بود", + "preview": "پیش‌نمایش", + "previous": "قبلی", + "reset": "بازنشانی", + "save": "ذخیره", + "select": "انتخاب", + "submit": "ارسال", + "testConnection": "Test Connection", + "tryAgain": "لطفا دوباره تلاش کنید" + }, + "generalSettings": { + "description": "تنظیمات عمومی برنامه", + "title": "تنظیمات عمومی" + }, + "labels": { + "addLabel": "افزودن برچسب", + "allLabels": "All Labels", + "changeColor": "تغییر رنگ", + "changeColorTooltip": "تغییر رنگ", + "clearAll": "پاک کردن همه", + "confirmDelete": "آیا مطمئن هستید که می‌خواهید این برچسب را حذف کنید؟", + "count": "{count} برچسب", + "createLabel": "ایجاد برچسب", + "delete": "حذف", + "deleteTooltip": "حذف برچسب", + "editLabels": "ویرایش برچسب‌ها", + "editLabelsDescription": "ایجاد، ویرایش رنگ‌ها یا حذف برچسب‌ها.", + "filter": "فیلتر بر اساس برچسب", + "filterByLabel": "فیلتر بر اساس برچسب", + "labelColor": "رنگ برچسب", + "labelName": "نام برچسب", + "loading": "در حال بارگذاری...", + "manage": "مدیریت برچسب‌ها", + "manageLabels": "مدیریت برچسب‌ها", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "مدیریت برچسب‌ها", + "namePlaceholder": "نام برچسب", + "newLabelPlaceholder": "ایجاد برچسب جدید", + "noLabels": "بدون برچسب", + "noLabelsFound": "برچسبی یافت نشد.", + "notebookRequired": "⚠️ برچسب‌ها فقط در دفترچه‌ها در دسترس هستند. این یادداشت را ابتدا به یک دفترچه منتقل کنید.", + "selectedLabels": "Selected Labels", + "showLess": "نمایش کمتر", + "showMore": "نمایش بیشتر", + "tagAdded": "برچسب \"{tag}\" اضافه شد", + "title": "برچسب‌ها" + }, + "memoryEcho": { + "clickToView": "برای مشاهده یادداشت کلیک کنید", + "comparison": { + "clickToView": "برای مشاهده یادداشت کلیک کنید", + "helpful": "مفید", + "helpfulQuestion": "این مقایسه مفید است؟", + "highSimilarityInsight": "این یادداشت‌ها در مورد یک موضوع با درجه بالایی از شباهت صحبت می‌کنند. می‌توانند ادغام یا تلفیق شوند.", + "notHelpful": "غیرمفید", + "similarityInfo": "این یادداشت‌ها با {similarity}% شباهت مرتبط هستند", + "title": "💡 مقایسه یادداشت‌ها", + "untitled": "بدون عنوان" + }, + "connection": "ارتباط", + "connections": "ارتباطات", + "connectionsBadge": "{count} ارتباط{plural}", + "dailyInsight": "بینش روزانه از یادداشت‌های شما", + "description": "ارتباطات پیشگیرانه بین یادداشت‌های شما", + "dismiss": "نادیده گرفتن برای الان", + "editorSection": { + "close": "بستن", + "compare": "مقایسه", + "compareAll": "مقایسه همه", + "loading": "در حال بارگذاری...", + "merge": "ادغام", + "mergeAll": "ادغام همه", + "title": "⚡ یادداشت‌های مرتبط ({count})", + "view": "مشاهده" + }, + "fused": "ادغام شده", + "fusion": { + "archiveOriginals": "بایگانی کردن نسخه‌های اصلی", + "cancel": "لغو", + "confirmFusion": "تأیید ادغام", + "createBacklinks": "ایجاد لینک برگشتی به یادداشت‌های اصلی", + "edit": "ویرایش", + "error": "ادغام یادداشت‌ها شکست خورد", + "finishEditing": "تمام کردن ویرایش", + "generateError": "Failed to generate fusion", + "generateFusion": "تولید ادغام", + "generating": "در حال تولید...", + "keepAllTags": "نگهداری همه برچسب‌ها", + "mergeNotes": "ادغام {count} یادداشت", + "modify": "تغییر", + "noContentReturned": "No fusion content returned from API", + "notesToMerge": "📝 یادداشت‌های برای ادغام", + "optionalPrompt": "💠 پیامک ادغام (اختیاری)", + "optionsTitle": "گزینه‌های ادغام", + "previewTitle": "📝 پیش‌نمایش یادداشت ادغام شده", + "promptPlaceholder": "دستورات اختیاری برای هوش مصنوعی (مثلاً 'سبک رسمی یادداشت 1 را حفظ کن')...", + "success": "یادداشت‌ها با موفقیت ادغام شدند!", + "title": "🔗 ادغام هوشمند", + "unknownDate": "Unknown date", + "useLatestTitle": "استفاده از عنوان جدیدترین یادداشت" + }, + "generateError": "شکست در تولید ادغام", + "helpful": "مفید", + "insightReady": "بینش شما آماده است!", + "noContentReturned": "هیچ محتوایی توسط هوش مصنوعی بازگردانده نشد", + "notHelpful": "غیرمفید", + "overlay": { + "error": "خطا در بارگذاری ارتباطات", + "loading": "در حال بارگذاری...", + "noConnections": "هیچ ارتباطی یافت نشد", + "searchPlaceholder": "جستجوی ارتباطات...", + "sortBy": "مرتب‌سازی بر اساس:", + "sortOldest": "قدیمی‌ترین", + "sortRecent": "جدیدترین", + "sortSimilarity": "شباهت", + "title": "یادداشت‌های مرتبط", + "viewAll": "نمایش همه کنار هم" + }, + "thanksFeedback": "از بازخورد شما متشکرم!", + "thanksFeedbackImproving": "ممنون! ما از این برای بهبود استفاده خواهیم کرد.", + "title": "متوجه چیزی شدم...", + "unknownDate": "تاریخ ناشناخته", + "viewConnection": "مشاهده ارتباط" + }, + "nav": { + "accountSettings": "Account Settings", + "adminDashboard": "داشبورد مدیریت", + "aiSettings": "تنظیمات هوش مصنوعی", + "archive": "بایگانی", + "buyMeACoffee": "Buy me a coffee", + "configureAI": "Configure your AI-powered features, provider, and preferences", + "diagnostics": "تشخیص‌ها", + "donateOnKofi": "Donate on Ko-fi", + "donationDescription": "Make a one-time donation or become a monthly supporter.", + "donationNote": "No platform fees • Instant payouts • Secure", + "favorites": "مورد علاقه‌ها", + "generalNotes": "General Notes", + "home": "خانه", + "login": "ورود", + "logout": "خروج", + "manageAISettings": "Manage AI Settings", + "myLibrary": "کتابخانه من", + "notebooks": "Notebooks", + "notes": "یادداشت‌ها", + "proPlan": "پلن پرو", + "profile": "پروفایل", + "quickAccess": "دسترسی سریع", + "recent": "اخیر", + "reminders": "یادآوری‌ها", + "settings": "تنظیمات", + "sponsorDescription": "Become a monthly sponsor and get recognition.", + "sponsorOnGithub": "Sponsor on GitHub", + "support": "پشتیبانی مامنتو ☕", + "supportDescription": "Memento is 100% free and open-source. Your support helps keep it that way.", + "supportDevelopment": "Support Memento Development ☕", + "trash": "سطل زباله", + "userManagement": "User Management", + "workspace": "فضای کار" + }, + "notebook": { + "cancel": "لغو", + "create": "ایجاد دفترچه", + "createDescription": "یک مجموعه جدید برای سازماندهی یادداشت‌ها، ایده‌ها و پروژه‌های خود به طور مؤثر شروع کنید.", + "createNew": "ایجاد دفترچه جدید", + "creating": "در حال ایجاد...", + "delete": "حذف دفترچه", + "deleteConfirm": "حذف", + "deleteWarning": "آیا مطمئن هستید که می‌خواهید این دفترچه را حذف کنید؟ یادداشت‌ها به یادداشت‌های عمومی منتقل می‌شوند.", + "edit": "ویرایش دفترچه", + "editDescription": "نام، آیکون و رنگ دفترچه خود را تغییر دهید.", + "generating": "در حال تولید خلاصه...", + "labels": "برچسب‌ها", + "name": "نام دفترچه", + "noLabels": "بدون برچسب", + "selectColor": "رنگ", + "selectIcon": "آیکون", + "summary": "خلاصه دفترچه", + "summaryDescription": "تولید یک خلاصه مبتنی بر هوش مصنوعی از تمام یادداشت‌های این دفترچه.", + "summaryError": "خطا در تولید خلاصه" + }, + "notebookSuggestion": { + "description": "به نظر می‌رسد این یادداشت متعلق به این دفترچه است", + "dismiss": "نادیده گرفتن", + "dismissIn": "نادیده گرفتن (بسته می‌شود در {timeLeft} ثانیه)", + "generalNotes": "یادداشت‌های عمومی", + "move": "انتقال", + "moveToNotebook": "انتقال به دفترچه", + "title": "انتقال به {icon} {name}؟" + }, + "notebooks": { + "allNotebooks": "همه دفترچه‌ها", + "create": "ایجاد دفترچه", + "createFirst": "ایجاد اولین دفترچه", + "noNotebooks": "دفترچه‌ای نیست" + }, + "notes": { + "add": "افزودن", + "addCollaborators": "افزودن همکاران", + "addImage": "افزودن تصویر", + "addItem": "Add item", + "addLink": "افزودن پیوند", + "addListItem": "+ آیتم لیست", + "addNote": "افزودن یادداشت", + "adding": "در حال افزودن...", + "aiAssistant": "دستیار هوش مصنوعی", + "archive": "بایگانی", + "backgroundOptions": "گزینه‌های پس‌زمینه", + "changeColor": "تغییر رنگ", + "changeSize": "تغییر اندازه", + "clarifyFailed": "شفاف‌سازی شکست خورد", + "close": "بستن", + "color": "رنگ", + "confirmDelete": "آیا مطمئن هستید که می‌خواهید این یادداشت را حذف کنید؟", + "confirmLeaveShare": "آیا مطمئن هستید که می‌خواهید این یادداشت اشتراکی را ترک کنید؟", + "contentOrMediaRequired": "لطفا محتوا وارد کنید یا پیوند/تصویر اضافه کنید", + "copy": "Copy", + "copyFailed": "Failed to copy note", + "copySuccess": "Note copied successfully!", + "createFirstNote": "اولین یادداشت خود را ایجاد کنید", + "date": "تاریخ", + "delete": "حذف", + "dragToReorder": "بکشید تا مرتب کنید", + "duplicate": "تکثیر", + "edit": "Edit Note", + "emptyState": "یادداشتی نیست", + "fileTooLarge": "فایل خیلی بزرگ است: {fileName}. حداکثر اندازه {maxSize}.", + "improveFailed": "بهبود شکست خورد", + "inNotebook": "در دفترچه", + "invalidDateTime": "تاریخ یا زمان نامعتبر", + "invalidFileType": "نوع فایل نامعتبر: {fileName}. فقط JPEG، PNG، GIF و WebP مجاز است.", + "itemOrMediaRequired": "لطفا حداقل یک آیتم یا رسانه اضافه کنید", + "large": "بزرگ", + "leaveShare": "ترک", + "linkAddFailed": "افزودن پیوند شکست خورد", + "linkAdded": "پیوند اضافه شد", + "linkMetadataFailed": "نمی‌توان ابرداده‌های پیوند را دریافت کرد", + "listItem": "آیتم لیست", + "makeCopy": "Make a copy", + "markdown": "Markdown", + "markdownMode": "مارک‌داون", + "markdownOff": "Markdown OFF", + "markdownOn": "Markdown ON", + "markdownPlaceholder": "یادداشت بگیرید... (Markdown پشتیبانی می‌شود)", + "medium": "متوسط", + "more": "بیشتر", + "moreOptions": "گزینه‌های بیشتر", + "moveFailed": "انتقال شکست خورد", + "newChecklist": "لیست جدید", + "newNote": "یادداشت جدید", + "noContent": "No content", + "noNotes": "بدون عنوان", + "noNotesFound": "یادداشتی یافت نشد", + "noteCreateFailed": "ایجاد یادداشت شکست خورد", + "noteCreated": "یادداشت با موفقیت ایجاد شد", + "others": "سایر", + "pin": "سنجاق کردن", + "pinned": "سنجاق شده", + "pinnedNotes": "یادداشت‌های سنجاق شده", + "placeholder": "یادداشت بگیرید...", + "preview": "Preview", + "readOnly": "Read Only", + "recent": "اخیر", + "redo": "انجام مجدد", + "redoShortcut": "انجام مجدد (Ctrl+Y)", + "remindMe": "یادآوری به من", + "reminderDateTimeRequired": "لطفا تاریخ و زمان را وارد کنید", + "reminderMustBeFuture": "یادآوری باید در آینده باشد", + "reminderPastError": "Reminder must be in the future", + "reminderRemoved": "Reminder removed", + "reminderSet": "یادآوری برای {datetime} تنظیم شد", + "remove": "حذف", + "saving": "Saving...", + "setReminder": "تنظیم یادآوری", + "setReminderButton": "تنظیم یادآوری", + "share": "اشتراک‌گذاری", + "shareWithCollaborators": "اشتراک‌گذاری با همکاران", + "sharedBy": "به اشتراک گذاشته توسط", + "sharedReadOnly": "This note is shared with you in read-only mode", + "shortenFailed": "کوتاه کردن شکست خورد", + "showCollaborators": "مشاهده همکاران", + "size": "اندازه", + "small": "کوچک", + "takeNote": "Take a note...", + "takeNoteMarkdown": "Take a note... (Markdown supported)", + "time": "زمان", + "title": "یادداشت‌ها", + "titlePlaceholder": "عنوان", + "transformFailed": "تبدیل شکست خورد", + "unarchive": "خروج از بایگانی", + "undo": "بازگردانی", + "undoShortcut": "بازگردانی (Ctrl+Z)", + "unpin": "برداشتن سنجاق", + "unpinned": "سنجاق نشده", + "untitled": "بدون عنوان", + "uploadFailed": "آپلود {fileName} شکست خورد", + "view": "View Note" + }, + "pagination": { + "next": "→", + "pageInfo": "Page {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "غیررسمی", + "expand": "بسط دادن", + "formal": "رسمی", + "improve": "بهبود", + "shorten": "کوتاه کردن", + "title": "بهبود متن" + }, + "profile": { + "accountSettings": "تنظیمات حساب", + "autoDetect": "تشخیص خودکار", + "changePassword": "تغییر رمز عبور", + "changePasswordDescription": "رمز عبور خود را به‌روز کنید. رمز عبور فعلی شما لازم است.", + "confirmPassword": "تأیید رمز عبور", + "currentPassword": "رمز عبور فعلی", + "description": "اطلاعات شخصی خود را به‌روز کنید", + "displayName": "نام نمایشی", + "displaySettings": "تنظیمات نمایش", + "displaySettingsDescription": "ظاهر و اندازه فونت را سفارشی کنید.", + "email": "ایمیل", + "fontSize": "اندازه فونت", + "fontSizeDescription": "اندازه فونت را برای خوانایی بهتر تنظیم کنید. این مورد به تمام متن‌های رابط کاربری اعمال می‌شود.", + "fontSizeExtraLarge": "بسیار بزرگ", + "fontSizeLarge": "بزرگ", + "fontSizeMedium": "متوسط", + "fontSizeSmall": "کوچک", + "fontSizeUpdateFailed": "به‌روزرسانی اندازه فونت شکست خورد", + "fontSizeUpdateSuccess": "اندازه فونت با موفقیت به‌روزرسانی شد", + "languageDescription": "این زبان برای ویژگی‌های هوش مصنوعی، تحلیل محتوا و متن رابط کاربری استفاده خواهد شد.", + "languagePreferences": "ترجیحات زبان", + "languagePreferencesDescription": "زبان مورد نظر خود را برای ویژگی‌های هوش مصنوعی و رابط کاربری انتخاب کنید.", + "languageUpdateFailed": "به‌روزرسانی زبان شکست خورد", + "languageUpdateSuccess": "زبان با موفقیت به‌روزرسانی شد", + "manageAISettings": "مدیریت تنظیمات هوش مصنوعی", + "newPassword": "رمز عبور جدید", + "passwordChangeFailed": "تغییر رمز عبور شکست خورد", + "passwordChangeSuccess": "رمز عبور با موفقیت تغییر کرد", + "passwordError": "خطا در به‌روزرسانی رمز عبور", + "passwordUpdated": "رمز عبور به‌روزرسانی شد", + "preferredLanguage": "زبان مورد نظر", + "profileError": "خطا در به‌روزرسانی پروفایل", + "profileUpdated": "پروفایل به‌روزرسانی شد", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "اندازه فونت را انتخاب کنید", + "selectLanguage": "یک زبان انتخاب کنید", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "پروفایل", + "updateFailed": "به‌روزرسانی پروفایل شکست خورد", + "updatePassword": "به‌روزرسانی رمز عبور", + "updateSuccess": "پروفایل به‌روزرسانی شد" + }, + "reminder": { + "cancel": "لغو", + "reminderDate": "تاریخ یادآوری", + "reminderTime": "زمان یادآوری", + "removeReminder": "حذف یادآوری", + "save": "تنظیم", + "setReminder": "تنظیم یادآوری", + "title": "یادآوری" + }, + "resetPassword": { + "confirmNewPassword": "تأیید رمز عبور جدید", + "description": "رمز عبور جدید خود را در زیر وارد کنید.", + "invalidLinkDescription": "این لینک بازنشانی رمز عبور نامعتبر یا منقضی شده است.", + "invalidLinkTitle": "لینک نامعتبر", + "loading": "در حال بارگذاری...", + "newPassword": "رمز عبور جدید", + "passwordMismatch": "رمزهای عبور مطابقت ندارند", + "requestNewLink": "درخواست لینک جدید", + "resetPassword": "بازنشانی رمز عبور", + "resetting": "در حال بازنشانی...", + "success": "رمز عبور با موفقیت بازنشانی شد. اکنون می‌توانید وارد شوید.", + "title": "بازنشانی رمز عبور" + }, + "search": { + "exactMatch": "تطابق دقیق", + "noResults": "نتیجه‌ای یافت نشد", + "placeholder": "جستجو", + "related": "مرتبط", + "resultsFound": "{count} یادداشت یافت شد", + "searchPlaceholder": "در یادداشت‌های خود جستجو کنید...", + "searching": "در حال جستجو...", + "semanticInProgress": "جستجوی هوش مصنوعی در حال انجام...", + "semanticTooltip": "جستجوی معنایی هوش مصنوعی" }, "semanticSearch": { "exactMatch": "تطابق دقیق", "related": "مرتبط", "searching": "در حال جستجو..." }, - "paragraphRefactor": { - "title": "بهبود متن", - "shorten": "کوتاه کردن", - "expand": "بسط دادن", - "improve": "بهبود", - "formal": "رسمی", - "casual": "غیررسمی" - }, - "memoryEcho": { - "title": "متوجه چیزی شدم...", - "description": "ارتباطات پیشگیرانه بین یادداشت‌های شما", - "dailyInsight": "بینش روزانه از یادداشت‌های شما", - "insightReady": "بینش شما آماده است!", - "viewConnection": "مشاهده ارتباط", - "helpful": "مفید", - "notHelpful": "غیرمفید", - "dismiss": "نادیده گرفتن برای الان", - "thanksFeedback": "از بازخورد شما متشکرم!", - "thanksFeedbackImproving": "ممنون! ما از این برای بهبود استفاده خواهیم کرد.", - "connections": "ارتباطات", - "connection": "ارتباط", - "connectionsBadge": "{count} ارتباط{plural}", - "fused": "ادغام شده", - "overlay": { - "title": "یادداشت‌های مرتبط", - "searchPlaceholder": "جستجوی ارتباطات...", - "sortBy": "مرتب‌سازی بر اساس:", - "sortSimilarity": "شباهت", - "sortRecent": "جدیدترین", - "sortOldest": "قدیمی‌ترین", - "viewAll": "نمایش همه کنار هم", - "loading": "در حال بارگذاری...", - "noConnections": "هیچ ارتباطی یافت نشد" - }, - "comparison": { - "title": "💡 مقایسه یادداشت‌ها", - "similarityInfo": "این یادداشت‌ها با {similarity}% شباهت مرتبط هستند", - "highSimilarityInsight": "این یادداشت‌ها در مورد یک موضوع با درجه بالایی از شباهت صحبت می‌کنند. می‌توانند ادغام یا تلفیق شوند.", - "untitled": "بدون عنوان", - "clickToView": "برای مشاهده یادداشت کلیک کنید", - "helpfulQuestion": "این مقایسه مفید است؟", - "helpful": "مفید", - "notHelpful": "غیرمفید" - }, - "editorSection": { - "title": "⚡ یادداشت‌های مرتبط ({count})", - "loading": "در حال بارگذاری...", - "view": "مشاهده", - "compare": "مقایسه", - "merge": "ادغام", - "compareAll": "مقایسه همه", - "mergeAll": "ادغام همه" - }, - "fusion": { - "title": "🔗 ادغام هوشمند", - "mergeNotes": "ادغام {count} یادداشت", - "notesToMerge": "📝 یادداشت‌های برای ادغام", - "optionalPrompt": "💠 پیامک ادغام (اختیاری)", - "promptPlaceholder": "دستورات اختیاری برای هوش مصنوعی (مثلاً 'سبک رسمی یادداشت 1 را حفظ کن')...", - "generateFusion": "تولید ادغام", - "generating": "در حال تولید...", - "previewTitle": "📝 پیش‌نمایش یادداشت ادغام شده", - "edit": "ویرایش", - "modify": "تغییر", - "finishEditing": "تمام کردن ویرایش", - "optionsTitle": "گزینه‌های ادغام", - "archiveOriginals": "بایگانی کردن نسخه‌های اصلی", - "keepAllTags": "نگهداری همه برچسب‌ها", - "useLatestTitle": "استفاده از عنوان جدیدترین یادداشت", - "createBacklinks": "ایجاد لینک برگشتی به یادداشت‌های اصلی", - "cancel": "لغو", - "confirmFusion": "تأیید ادغام", - "success": "یادداشت‌ها با موفقیت ادغام شدند!", - "error": "ادغام یادداشت‌ها شکست خورد" - }, - "generateError": "شکست در تولید ادغام", - "noContentReturned": "هیچ محتوایی توسط هوش مصنوعی بازگردانده نشد", - "unknownDate": "تاریخ ناشناخته" - }, - "nav": { - "home": "خانه", - "notes": "یادداشت‌ها", - "archive": "بایگانی", - "settings": "تنظیمات", - "profile": "پروفایل", - "aiSettings": "تنظیمات هوش مصنوعی", - "logout": "خروج", - "login": "ورود", - "adminDashboard": "داشبورد مدیریت", - "diagnostics": "تشخیص‌ها", - "trash": "سطل زباله", - "support": "پشتیبانی مامنتو ☕", - "reminders": "یادآوری‌ها", - "workspace": "فضای کار", - "quickAccess": "دسترسی سریع", - "myLibrary": "کتابخانه من", - "favorites": "مورد علاقه‌ها", - "recent": "اخیر", - "proPlan": "پلن پرو" - }, "settings": { - "title": "تنظیمات", - "description": "مدیریت تنظیمات و ترجیحات خود", + "about": "درباره", "account": "حساب کاربری", "appearance": "ظاهر", - "theme": "تم", - "themeLight": "روشن", - "themeDark": "تاریک", - "themeSystem": "سیستم", - "notifications": "اعلان‌ها", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "مدیریت تنظیمات و ترجیحات خود", "language": "زبان", - "selectLanguage": "انتخاب زبان", + "languageAuto": "تشخیص خودکار", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "اعلان‌ها", "privacy": "حریم خصوصی", + "profile": "پروفایل", + "searchNoResults": "تنظیمات مطابق یافت نشد", "security": "امنیت", - "about": "درباره", - "version": "نسخه", + "selectLanguage": "انتخاب زبان", + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "خطا در ذخیره تنظیمات", "settingsSaved": "تنظیمات ذخیره شد", - "settingsError": "خطا در ذخیره تنظیمات" + "theme": "تم", + "themeDark": "تاریک", + "themeLight": "روشن", + "themeSystem": "سیستم", + "title": "تنظیمات", + "version": "نسخه" }, - "profile": { - "title": "پروفایل", - "description": "اطلاعات شخصی خود را به‌روز کنید", - "displayName": "نام نمایشی", - "email": "ایمیل", - "changePassword": "تغییر رمز عبور", - "changePasswordDescription": "رمز عبور خود را به‌روز کنید. رمز عبور فعلی شما لازم است.", - "currentPassword": "رمز عبور فعلی", - "newPassword": "رمز عبور جدید", - "confirmPassword": "تأیید رمز عبور", - "updatePassword": "به‌روزرسانی رمز عبور", - "passwordChangeSuccess": "رمز عبور با موفقیت تغییر کرد", - "passwordChangeFailed": "تغییر رمز عبور شکست خورد", - "passwordUpdated": "رمز عبور به‌روزرسانی شد", - "passwordError": "خطا در به‌روزرسانی رمز عبور", - "languagePreferences": "ترجیحات زبان", - "languagePreferencesDescription": "زبان مورد نظر خود را برای ویژگی‌های هوش مصنوعی و رابط کاربری انتخاب کنید.", - "preferredLanguage": "زبان مورد نظر", - "selectLanguage": "یک زبان انتخاب کنید", - "languageDescription": "این زبان برای ویژگی‌های هوش مصنوعی، تحلیل محتوا و متن رابط کاربری استفاده خواهد شد.", - "autoDetect": "تشخیص خودکار", - "updateSuccess": "پروفایل به‌روزرسانی شد", - "updateFailed": "به‌روزرسانی پروفایل شکست خورد", - "languageUpdateSuccess": "زبان با موفقیت به‌روزرسانی شد", - "languageUpdateFailed": "به‌روزرسانی زبان شکست خورد", - "profileUpdated": "پروفایل به‌روزرسانی شد", - "profileError": "خطا در به‌روزرسانی پروفایل", - "accountSettings": "تنظیمات حساب", - "manageAISettings": "مدیریت تنظیمات هوش مصنوعی", - "displaySettings": "تنظیمات نمایش", - "displaySettingsDescription": "ظاهر و اندازه فونت را سفارشی کنید.", - "fontSize": "اندازه فونت", - "selectFontSize": "اندازه فونت را انتخاب کنید", - "fontSizeSmall": "کوچک", - "fontSizeMedium": "متوسط", - "fontSizeLarge": "بزرگ", - "fontSizeExtraLarge": "بسیار بزرگ", - "fontSizeDescription": "اندازه فونت را برای خوانایی بهتر تنظیم کنید. این مورد به تمام متن‌های رابط کاربری اعمال می‌شود.", - "fontSizeUpdateSuccess": "اندازه فونت با موفقیت به‌روزرسانی شد", - "fontSizeUpdateFailed": "به‌روزرسانی اندازه فونت شکست خورد" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" }, - "aiSettings": { - "title": "تنظیمات هوش مصنوعی", - "description": "ویژگی‌ها و ترجیحات هوش مصنوعی خود را پیکربندی کنید", - "features": "ویژگی‌های هوش مصنوعی", - "provider": "فروشنده هوش مصنوعی", - "providerAuto": "خودکار (توصیه می‌شود)", - "providerOllama": "Ollama (محلی)", - "providerOpenAI": "OpenAI (ابر)", - "frequency": "فرکانس", - "frequencyDaily": "روزانه", - "frequencyWeekly": "هفتگی", - "saving": "در حال ذخیره...", - "saved": "تنظیم به‌روزرسانی شد", - "error": "به‌روزرسانی شکست خورد" + "support": { + "aiApiCosts": "هزینه‌های AI API:", + "buyMeACoffee": "برای من قهوه بخرید", + "contributeCode": "مشارکت در کد", + "description": "Memento ۱۰۰٪ رایگان و متن‌باز است. حمایت شما به حفظ این وضعیت کمک می‌کند.", + "directImpact": "تأثیر مستقیم", + "domainSSL": "دامنه و SSL:", + "donateOnKofi": "کمک در Ko-fi", + "donationDescription": "یک کمک مالی یکباره انجام دهید یا حامی ماهانه شوید.", + "githubDescription": "حمایت مکرر • شناخت عمومی • متمرکز بر توسعه‌دهندگان", + "hostingServers": "میزبانی و سرورها:", + "howSupportHelps": "حمایت شما چگونه کمک می‌کند", + "kofiDescription": "بدون کارمزد پلتفرم • پرداخت فوری • امن", + "otherWaysTitle": "سایر روش‌های حمایت", + "reportBug": "گزارش باگ", + "shareTwitter": "اشتراک‌گذاری در توییتر", + "sponsorDescription": "حامی ماهانه شوید و شناخته شوید.", + "sponsorOnGithub": "حمایت در GitHub", + "sponsorPerks": "مزایای حامیان", + "starGithub": "ستاره در GitHub", + "title": "پشتیبانی از توسعه Memento", + "totalExpenses": "کل هزینه‌ها:", + "transparency": "شفافیت", + "transparencyDescription": "من به شفافیت کامل اعتقاد دارم. نحوه استفاده از کمک‌ها:" }, - "general": { - "loading": "در حال بارگذاری...", - "save": "ذخیره", - "cancel": "لغو", - "add": "افزودن", - "edit": "ویرایش", - "confirm": "تأیید", + "testPages": { + "titleSuggestions": { + "analyzing": "در حال تحلیل...", + "contentLabel": "محتوا (نیاز به ۵۰ کلمه یا بیشتر):", + "error": "خطا:", + "idle": "بیکار", + "noSuggestions": "هنوز پیشنهادی نیست. ۵۰ کلمه یا بیشتر تایپ کنید و ۲ ثانیه صبر کنید.", + "placeholder": "حداقل ۵۰ کلمه اینجا تایپ کنید...", + "status": "وضعیت:", + "suggestions": "پیشنهادات ({count}):", + "title": "تست پیشنهادات عنوان", + "wordCount": "تعداد کلمات:" + } + }, + "time": { + "daysAgo": "{count} روز پیش", + "hoursAgo": "{count} ساعت پیش", + "justNow": "همین الان", + "minutesAgo": "{count} دقیقه پیش", + "today": "امروز", + "tomorrow": "فردا", + "yesterday": "دیروز" + }, + "titleSuggestions": { + "available": "پیشنهادات عنوان", + "dismiss": "نادیده گرفتن", + "generating": "در حال تولید...", + "selectTitle": "یک عنوان را انتخاب کنید", + "title": "پیشنهادات هوش مصنوعی" + }, + "toast": { + "feedbackFailed": "شکست در ارسال بازخورد", + "notesFusionSuccess": "یادداشت‌ها با موفقیت ادغام شدند!", + "openConnectionFailed": "شکست در باز کردن اتصال", + "openingConnection": "در حال باز کردن اتصال...", + "operationFailed": "عملیات ناموفق", + "operationSuccess": "عملیات موفق", + "saveFailed": "شکست در ذخیره تنظیم", + "saved": "تنظیم ذخیره شد", + "thanksFeedback": "ممنون از بازخورد شما!", + "thanksFeedbackImproving": "ممنون! از این برای بهبود استفاده می‌کنیم." + }, + "trash": { + "deletePermanently": "حذف دائمی", + "empty": "سطل زباله خالی است", + "restore": "بازیابی", + "title": "سطل زباله" + }, + "ui": { "close": "بستن", - "back": "بازگشت", - "next": "بعدی", - "previous": "قبلی", - "submit": "ارسال", - "reset": "بازنشانی", - "apply": "اعمال", - "clear": "پاک کردن", - "select": "انتخاب", - "tryAgain": "لطفا دوباره تلاش کنید", - "error": "خطایی رخ داد", - "operationSuccess": "عملیات موفقیت‌آمیز بود", - "operationFailed": "عملیات شکست خورد" - }, - "colors": { - "default": "پیش‌فرض", - "red": "قرمز", - "blue": "آبی", - "green": "سبز", - "yellow": "زرد", - "purple": "بنفش", - "pink": "صورتی", - "orange": "نارنجی", - "gray": "خاکستری" - }, - "reminder": { - "title": "یادآوری", - "setReminder": "تنظیم یادآوری", - "removeReminder": "حذف یادآوری", - "reminderDate": "تاریخ یادآوری", - "reminderTime": "زمان یادآوری", - "save": "تنظیم", - "cancel": "لغو" - }, - - "notebook": { - "create": "ایجاد دفترچه", - "createNew": "ایجاد دفترچه جدید", - "createDescription": "یک مجموعه جدید برای سازماندهی یادداشت‌ها، ایده‌ها و پروژه‌های خود به طور مؤثر شروع کنید.", - "name": "نام دفترچه", - "selectIcon": "آیکون", - "selectColor": "رنگ", - "cancel": "لغو", - "creating": "در حال ایجاد...", - "edit": "ویرایش دفترچه", - "editDescription": "نام، آیکون و رنگ دفترچه خود را تغییر دهید.", - "delete": "حذف دفترچه", - "deleteWarning": "آیا مطمئن هستید که می‌خواهید این دفترچه را حذف کنید؟ یادداشت‌ها به یادداشت‌های عمومی منتقل می‌شوند.", - "deleteConfirm": "حذف", - "summary": "خلاصه دفترچه", - "summaryDescription": "تولید یک خلاصه مبتنی بر هوش مصنوعی از تمام یادداشت‌های این دفترچه.", - "generating": "در حال تولید خلاصه...", - "summaryError": "خطا در تولید خلاصه" + "collapse": "جمع کردن", + "expand": "بسط دادن", + "open": "باز کردن" } } diff --git a/keep-notes/locales/fr.json b/keep-notes/locales/fr.json index ae2fda2..3367732 100644 --- a/keep-notes/locales/fr.json +++ b/keep-notes/locales/fr.json @@ -1,542 +1,959 @@ { - "auth": { - "signIn": "Connexion", - "signUp": "S'inscrire", - "email": "Email", - "password": "Mot de passe", - "name": "Nom", - "emailPlaceholder": "Entrez votre adresse email", - "passwordPlaceholder": "Entrez votre mot de passe", - "namePlaceholder": "Entrez votre nom", - "passwordMinChars": "Entrez votre mot de passe (min 6 caractères)", - "resetPassword": "Réinitialiser le mot de passe", - "resetPasswordInstructions": "Entrez votre email pour réinitialiser votre mot de passe", - "forgotPassword": "Mot de passe oublié ?", - "noAccount": "Pas de compte ?", - "hasAccount": "Déjà un compte ?", - "signInToAccount": "Connectez-vous à votre compte", - "createAccount": "Créez votre compte", - "rememberMe": "Se souvenir de moi", - "orContinueWith": "Ou continuer avec", - "checkYourEmail": "Vérifiez votre email", - "resetEmailSent": "Nous avons envoyé un lien de réinitialisation à votre adresse email si elle existe dans notre système.", - "returnToLogin": "Retour à la connexion", - "forgotPasswordTitle": "Mot de passe oublié", - "forgotPasswordDescription": "Entrez votre adresse email et nous vous enverrons un lien pour réinitialiser votre mot de passe.", - "sending": "Envoi en cours...", - "sendResetLink": "Envoyer le lien de réinitialisation", - "backToLogin": "Retour à la connexion" + "about": { + "appDescription": "Une application de prise de notes puissante avec des fonctionnalités IA", + "appName": "Keep Notes", + "buildDate": "Date de build", + "description": "Informations sur l'application", + "features": { + "description": "Capacités alimentées par l'IA", + "dragDrop": "Gestion des notes par glisser-déposer", + "labelSystem": "Système d'étiquettes", + "memoryEcho": "Perspectives quotidiennes Memory Echo", + "multipleProviders": "Plusieurs fournisseurs IA (OpenAI, Ollama)", + "notebookOrganization": "Organisation en carnets", + "paragraphReformulation": "Reformulation de paragraphes", + "semanticSearch": "Recherche sémantique avec embeddings", + "title": "Fonctionnalités", + "titleSuggestions": "Suggestions de titre alimentées par l'IA" + }, + "platform": "Plateforme", + "platformWeb": "Web", + "support": { + "description": "Obtenez de l'aide et donnez votre avis", + "documentation": "Documentation", + "feedback": "Commentaires", + "reportIssues": "Signaler des problèmes", + "title": "Support" + }, + "technology": { + "ai": "IA", + "authentication": "Authentification", + "backend": "Backend", + "database": "Base de données", + "description": "Construit avec des technologies modernes", + "frontend": "Frontend", + "testing": "Tests", + "title": "Stack technologique", + "ui": "UI" + }, + "title": "À propos", + "version": "Version" }, - "sidebar": { - "notes": "Notes", - "reminders": "Rappels", - "labels": "Libellés", - "editLabels": "Modifier les libellés", - "archive": "Archives", - "trash": "Corbeille" - }, - "notes": { - "title": "Notes", - "newNote": "Nouvelle note", - "untitled": "Sans titre", - "placeholder": "Prenez une note...", - "markdownPlaceholder": "Prenez une note... (Markdown supporté)", - "titlePlaceholder": "Titre", - "listItem": "Élément de liste", - "addListItem": "+ Élément de liste", - "newChecklist": "Nouvelle liste", - "add": "Ajouter", - "adding": "Ajout...", - "close": "Fermer", - "confirmDelete": "Êtes-vous sûr de vouloir supprimer cette note ?", - "confirmLeaveShare": "Êtes-vous sûr de vouloir quitter cette note partagée ?", - "sharedBy": "Partagé par", - "leaveShare": "Quitter", - "delete": "Supprimer", - "archive": "Archiver", - "unarchive": "Désarchiver", - "pin": "Épingler", - "unpin": "Désépingler", - "color": "Couleur", - "changeColor": "Changer la couleur", - "setReminder": "Définir un rappel", - "setReminderButton": "Définir un rappel", - "date": "Date", - "time": "Heure", - "reminderDateTimeRequired": "Veuillez entrer la date et l'heure", - "invalidDateTime": "Date ou heure invalide", - "reminderMustBeFuture": "Le rappel doit être dans le futur", - "reminderSet": "Rappel défini pour {datetime}", - "reminderPastError": "Le rappel doit être dans le futur", - "reminderRemoved": "Rappel supprimé", - "addImage": "Ajouter une image", - "addLink": "Ajouter un lien", - "linkAdded": "Lien ajouté", - "linkMetadataFailed": "Impossible de récupérer les métadonnées du lien", - "linkAddFailed": "Échec de l'ajout du lien", - "invalidFileType": "Type de fichier invalide : {fileName}. Seuls JPEG, PNG, GIF et WebP sont autorisés.", - "fileTooLarge": "Fichier trop volumineux : {fileName}. La taille maximale est {maxSize}.", - "uploadFailed": "Échec du téléchargement de {filename}", - "contentOrMediaRequired": "Veuillez entrer du contenu ou ajouter un lien/image", - "itemOrMediaRequired": "Veuillez ajouter au moins un élément ou un média", - "noteCreated": "Note créée avec succès", - "noteCreateFailed": "Échec de la création de la note", - "aiAssistant": "Assistant IA", - "changeSize": "Changer la taille", - "backgroundOptions": "Options d'arrière-plan", - "moreOptions": "Plus d'options", - "remindMe": "Me rappeler", - "markdownMode": "Markdown", - "addCollaborators": "Ajouter des collaborateurs", - "duplicate": "Dupliquer", - "share": "Partager", - "showCollaborators": "Voir les collaborateurs", - "pinned": "Épinglées", - "others": "Autres", - "noNotes": "Aucune note", - "noNotesFound": "Aucune note trouvée", - "createFirstNote": "Créez votre première note", - "size": "Taille", - "small": "Petit", - "medium": "Moyen", - "large": "Grand", - "shareWithCollaborators": "Partager avec les collaborateurs", - "view": "Voir la note", - "edit": "Modifier la note", - "readOnly": "Lecture seule", - "preview": "Aperçu", - "noContent": "Aucun contenu", - "takeNote": "Prenez une note...", - "takeNoteMarkdown": "Prenez une note... (Markdown supporté)", - "addItem": "Ajouter un élément", - "sharedReadOnly": "Cette note est partagée avec vous en mode lecture seule", - "makeCopy": "Faire une copie", - "saving": "Enregistrement...", - "copySuccess": "Note copiée avec succès !", - "copyFailed": "Échec de la copie de la note", - "copy": "Copie", - "markdownOn": "Markdown ACTIVÉ", - "markdownOff": "Markdown DÉSACTIVÉ", - "undo": "Annuler (Ctrl+Z)", - "redo": "Rétablir (Ctrl+Y)" - }, - "pagination": { - "previous": "←", - "pageInfo": "Page {currentPage} / {totalPages}", - "next": "→" - }, - "labels": { - "title": "Étiquettes", - "filter": "Filtrer par étiquette", - "manage": "Gérer les étiquettes", - "manageTooltip": "Gérer les étiquettes", - "changeColor": "Changer la couleur", - "changeColorTooltip": "Changer la couleur", - "delete": "Supprimer", - "deleteTooltip": "Supprimer l'étiquette", - "confirmDelete": "Êtes-vous sûr de vouloir supprimer cette étiquette ?", - "newLabelPlaceholder": "Créer une nouvelle étiquette", - "namePlaceholder": "Nom de l'étiquette", - "addLabel": "Ajouter une étiquette", - "createLabel": "Créer une étiquette", - "labelName": "Nom de l'étiquette", - "labelColor": "Couleur de l'étiquette", - "manageLabels": "Gérer les étiquettes", - "manageLabelsDescription": "Ajoutez ou supprimez des étiquettes pour cette note. Cliquez sur une étiquette pour changer sa couleur.", - "selectedLabels": "Étiquettes sélectionnées", - "allLabels": "Toutes les étiquettes", - "clearAll": "Tout effacer", - "filterByLabel": "Filtrer par étiquette", - "tagAdded": "Tag \"{tag}\" ajouté", - "showLess": "Afficher moins", - "showMore": "Afficher plus", - "editLabels": "Modifier les étiquettes", - "editLabelsDescription": "Créer, modifier les couleurs ou supprimer des étiquettes.", - "noLabelsFound": "Aucune étiquette trouvée.", - "loading": "Chargement...", - "notebookRequired": "⚠️ Les étiquettes ne sont disponibles que dans les carnets. Déplacez cette note dans un carnet d'abord." - }, - "search": { - "placeholder": "Rechercher", - "searchPlaceholder": "Rechercher dans vos notes...", - "semanticInProgress": "Recherche IA en cours...", - "semanticTooltip": "Recherche sémantique IA", - "searching": "Recherche en cours...", - "noResults": "Aucun résultat trouvé", - "resultsFound": "{count} notes trouvées", - "exactMatch": "Correspondance exacte", - "related": "Connexe" - }, - "collaboration": { - "emailPlaceholder": "Entrez l'adresse email", - "addCollaborator": "Ajouter un collaborateur", - "removeCollaborator": "Supprimer le collaborateur", - "owner": "Propriétaire", - "canEdit": "Peut modifier", - "canView": "Peut voir", - "shareNote": "Partager la note", - "shareWithCollaborators": "Partager avec les collaborateurs", - "addCollaboratorDescription": "Ajoutez des personnes pour collaborer à cette note par leur adresse email.", - "viewerDescription": "Vous avez accès à cette note. Seul le propriétaire peut gérer les collaborateurs.", - "emailAddress": "Adresse email", - "enterEmailAddress": "Entrez l'adresse email", - "invite": "Inviter", - "peopleWithAccess": "Personnes ayant accès", - "noCollaborators": "Aucun collaborateur encore. Ajoutez quelqu'un ci-dessus !", - "noCollaboratorsViewer": "Aucun collaborateur encore.", - "pendingInvite": "Invitation en attente", - "pending": "En attente", - "remove": "Supprimer", - "unnamedUser": "Utilisateur sans nom", - "done": "Terminé", - "willBeAdded": "{email} sera ajouté comme collaborateur lorsque la note sera créée", - "alreadyInList": "Cet email est déjà dans la liste", - "nowHasAccess": "{name} a maintenant accès à cette note", - "accessRevoked": "L'accès a été révoqué", - "errorLoading": "Erreur lors du chargement des collaborateurs", - "failedToAdd": "Échec de l'ajout du collaborateur", - "failedToRemove": "Échec de la suppression du collaborateur" + "admin": { + "ai": { + "apiKey": "Clé API", + "baseUrl": "URL de base", + "commonEmbeddingModels": "Modèles d'embeddings courants pour API compatibles OpenAI", + "commonModelsDescription": "Modèles courants pour API compatibles OpenAI", + "description": "Configurez les fournisseurs IA pour l'étiquetage auto et la recherche sémantique.", + "embeddingsDescription": "Fournisseur IA pour la recherche sémantique. Recommandé : OpenAI (meilleure qualité).", + "embeddingsProvider": "Fournisseur d'embeddings", + "model": "Modèle", + "modelRecommendations": "gpt-4o-mini = Meilleur prix • gpt-4o = Meilleure qualité", + "openAIKeyDescription": "Votre clé API OpenAI depuis platform.openai.com", + "openTestPanel": "Ouvrir le panneau de test IA", + "provider": "Fournisseur", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING est requis", + "providerTagsRequired": "AI_PROVIDER_TAGS est requis", + "saveSettings": "Enregistrer les paramètres IA", + "saving": "Enregistrement...", + "selectEmbeddingModel": "Sélectionnez un modèle d'embedding installé localement", + "selectOllamaModel": "Sélectionnez un modèle Ollama installé localement", + "tagsGenerationDescription": "Fournisseur IA pour les suggestions d'étiquettes. Recommandé : Ollama (gratuit, local).", + "tagsGenerationProvider": "Fournisseur de génération d'étiquettes", + "title": "Configuration IA", + "updateFailed": "Échec de la mise à jour des paramètres IA", + "updateSuccess": "Paramètres IA mis à jour avec succès", + "providerOllamaOption": "🦙 Ollama (Local & Gratuit)", + "providerOpenAIOption": "🤖 OpenAI (GPT-5, GPT-4)", + "providerCustomOption": "🔧 Custom Compatible OpenAI", + "bestValue": "Meilleur rapport qualité/prix", + "bestQuality": "Meilleure qualité", + "saved": "(Enregistré)" + }, + "aiTest": { + "description": "Test your AI providers for tag generation and semantic search embeddings", + "embeddingDimensions": "Embedding Dimensions:", + "embeddingsTestDescription": "Test the AI provider responsible for semantic search embeddings", + "embeddingsTestTitle": "Embeddings Test", + "error": "Error:", + "first5Values": "First 5 values:", + "generatedTags": "Generated Tags:", + "howItWorksTitle": "How Testing Works", + "model": "Model:", + "provider": "Provider:", + "responseTime": "Response time: {time}ms", + "runTest": "Run Test", + "tagsTestDescription": "Test the AI provider responsible for automatic tag suggestions", + "tagsTestTitle": "Tags Generation Test", + "testError": "Test Error: {error}", + "testFailed": "Test Failed", + "testPassed": "Test Passed", + "testing": "Testing...", + "tipDescription": "Use the AI Test Panel to diagnose configuration issues before testing.", + "tipTitle": "Tip:", + "title": "AI Provider Testing", + "vectorDimensions": "vector dimensions" + }, + "aiTesting": "AI Testing", + "security": { + "allowPublicRegistration": "Allow Public Registration", + "allowPublicRegistrationDescription": "If disabled, new users can only be added by an Administrator via the User Management page.", + "description": "Manage access control and registration policies.", + "title": "Security Settings", + "updateFailed": "Failed to update security settings", + "updateSuccess": "Security Settings updated" + }, + "settings": "Admin Settings", + "smtp": { + "description": "Configure email server for password resets.", + "forceSSL": "Force SSL/TLS (usually for port 465)", + "fromEmail": "From Email", + "host": "Host", + "ignoreCertErrors": "Ignore Certificate Errors (Self-hosted/Dev only)", + "password": "Password", + "port": "Port", + "saveSettings": "Save SMTP Settings", + "sending": "Sending...", + "testEmail": "Test Email", + "testFailed": "Failed: {error}", + "testSuccess": "Test email sent successfully!", + "title": "SMTP Configuration", + "updateFailed": "Failed to update SMTP settings", + "updateSuccess": "SMTP Settings updated", + "username": "Username" + }, + "title": "Admin Dashboard", + "userManagement": "User Management", + "users": { + "addUser": "Add User", + "confirmDelete": "Êtes-vous sûr ? Cette action est irréversible.", + "createFailed": "Failed to create user", + "createSuccess": "User created successfully", + "createUser": "Create User", + "createUserDescription": "Add a new user to the system.", + "deleteFailed": "Échec de la suppression", + "deleteSuccess": "Utilisateur supprimé", + "demote": "Rétrograder en utilisateur", + "email": "Email", + "name": "Name", + "password": "Password", + "promote": "Promouvoir en admin", + "role": "Role", + "roleUpdateFailed": "Échec de la mise à jour du rôle", + "roleUpdateSuccess": "Rôle de l'utilisateur mis à jour à {role}", + "roles": { + "admin": "Admin", + "user": "Utilisateur" + }, + "table": { + "actions": "Actions", + "createdAt": "Créé le", + "email": "Email", + "name": "Nom", + "role": "Rôle" + } + } }, "ai": { - "analyzing": "IA en cours d'analyse...", - "clickToAddTag": "Cliquer pour ajouter ce tag", - "ignoreSuggestion": "Ignorer cette suggestion", - "generatingTitles": "Génération en cours...", - "generateTitlesTooltip": "Générer des titres avec l'IA", - "poweredByAI": "Propulsé par l'IA", - "languageDetected": "Langue détectée", - "processing": "Traitement en cours...", - "tagAdded": "Tag \"{tag}\" ajouté", - "titleGenerating": "Génération en cours...", - "titleGenerateWithAI": "Générer des titres avec l'IA", - "titleGenerationMinWords": "Le contenu doit avoir au moins 10 mots pour générer des titres (actuel : {count} mots)", - "titleGenerationError": "Erreur lors de la génération des titres", - "titlesGenerated": "💡 {count} titres générés !", - "titleGenerationFailed": "Impossible de générer des titres", - "titleApplied": "Titre appliqué !", - "reformulationNoText": "Veuillez sélectionner du texte ou ajouter du contenu", - "reformulationSelectionTooShort": "Sélection trop courte, utilisation du contenu complet", - "reformulationMinWords": "Le texte doit avoir au moins 10 mots (actuel : {count} mots)", - "reformulationMaxWords": "Le texte doit avoir maximum 500 mots", - "reformulationError": "Erreur lors de la reformulation", - "reformulationFailed": "Impossible de reformuler le texte", - "reformulationApplied": "Texte reformulé appliqué !", - "transformMarkdown": "Transformer en Markdown", - "transforming": "Transformation en cours...", - "transformSuccess": "Texte transformé en Markdown avec succès !", - "transformError": "Erreur lors de la transformation", - "assistant": "Assistant IA", - "generating": "Génération...", - "generateTitles": "Générer des titres", - "reformulateText": "Reformuler le texte", - "reformulating": "Reformulation...", - "clarify": "Clarifier", - "shorten": "Raccourcir", - "improveStyle": "Améliorer le style", - "reformulationComparison": "Comparaison de Reformulation", + "analyzing": "AI analyzing...", + "assistant": "AI Assistant", + "autoLabels": { + "analyzing": "Analyse de vos notes pour les suggestions d'étiquettes...", + "create": "Créer", + "createNewLabel": "Créer cette nouvelle étiquette et l'ajouter", + "created": "{count} labels created successfully", + "creating": "Création des étiquettes...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(nouveau)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "Suggestions d'étiquettes", + "typeContent": "Type content to get label suggestions...", + "typeForSuggestions": "Tapez du contenu pour obtenir des suggestions d'étiquettes..." + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Échec de l'application du plan d'organisation", + "applying": "Applying...", + "description": "L'IA analysera vos notes et suggérera de les organiser dans des carnets.", + "error": "Échec de la création du plan d'organisation", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "Aucune note sélectionnée", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Sélectionner toutes les notes dans {notebook}", + "selectNote": "Sélectionner la note : {title}", + "success": "{count} notes déplacées avec succès", + "title": "Organiser avec l'IA" + }, + "clarify": "Clarify", + "clickToAddTag": "Click to add this tag", + "generateTitles": "Generate titles", + "generateTitlesTooltip": "Generate titles with AI", + "generating": "Generating...", + "generatingTitles": "Generating titles...", + "ignoreSuggestion": "Ignore this suggestion", + "improveStyle": "Improve style", + "languageDetected": "Language detected", + "notebookSummary": { + "regenerate": "Régénérer le résumé", + "regenerating": "Régénération du résumé..." + }, "original": "Original", - "reformulated": "Réformulé" + "poweredByAI": "Powered by AI", + "processing": "Processing...", + "reformulateText": "Reformulate text", + "reformulated": "Reformulated", + "reformulating": "Reformulating...", + "reformulationApplied": "Reformulated text applied!", + "reformulationComparison": "Reformulation Comparison", + "reformulationError": "Error during reformulation", + "reformulationFailed": "Failed to reformulate text", + "reformulationMaxWords": "Text must have maximum 500 words", + "reformulationMinWords": "Text must have at least 10 words (current: {count} words)", + "reformulationNoText": "Please select text or add content", + "reformulationSelectionTooShort": "Selection too short, using full content", + "shorten": "Shorten", + "tagAdded": "Tag \"{tag}\" added", + "titleApplied": "Title applied!", + "titleGenerateWithAI": "Generate titles with AI", + "titleGenerating": "Generating...", + "titleGenerationError": "Error generating titles", + "titleGenerationFailed": "Failed to generate titles", + "titleGenerationMinWords": "Content must have at least 10 words to generate titles (current: {count} words)", + "titlesGenerated": "💡 {count} titles generated!", + "transformError": "Error during transformation", + "transformMarkdown": "Transform to Markdown", + "transformSuccess": "Text transformed to Markdown successfully!", + "transforming": "Transforming..." }, - "batchOrganization": { - "error": "Échec de la création du plan d'organisation", - "noNotesSelected": "Aucune note sélectionnée", - "title": "Organiser avec l'IA", - "description": "L'IA analysera vos notes et suggérera de les organiser dans des carnets.", - "analyzing": "Analyse de vos notes...", - "notesToOrganize": "{count} notes à organiser", - "selected": "{count} sélectionné", - "noNotebooks": "Aucun carnet disponible. Créez d'abord des carnets pour organiser vos notes.", - "noSuggestions": "L'IA n'a pas trouvé de bonne manière d'organiser ces notes.", - "confidence": "confiance", - "unorganized": "{count} notes n'ont pas pu être catégorisées et resteront dans les Notes générales.", - "applying": "Application...", - "apply": "Appliquer ({count})" + "aiSettings": { + "description": "Configurez vos fonctionnalités IA et préférences", + "error": "Échec de la mise à jour", + "features": "Fonctionnalités IA", + "frequency": "Fréquence", + "frequencyDaily": "Quotidienne", + "frequencyWeekly": "Hebdomadaire", + "provider": "Fournisseur IA", + "providerAuto": "Auto (Recommandé)", + "providerOllama": "Ollama (Local)", + "providerOpenAI": "OpenAI (Cloud)", + "saved": "Paramètre mis à jour", + "saving": "Enregistrement...", + "title": "Paramètres IA", + "titleSuggestionsDesc": "Suggérer des titres pour les notes sans titre après 50+ mots", + "paragraphRefactorDesc": "Options d'amélioration de texte propulsées par l'IA", + "frequencyDesc": "Fréquence d'analyse des connexions entre notes", + "providerDesc": "Choisissez votre fournisseur IA préféré", + "providerAutoDesc": "Ollama si disponible, sinon OpenAI", + "providerOllamaDesc": "100% privé, fonctionne localement sur votre machine", + "providerOpenAIDesc": "Plus précis, nécessite une clé API" + }, + "appearance": { + "description": "Personnaliser l'apparence de l'application", + "title": "Apparence" + }, + "auth": { + "backToLogin": "Retour à la connexion", + "checkYourEmail": "Vérifiez votre email", + "createAccount": "Créez votre compte", + "email": "Email", + "emailPlaceholder": "Entrez votre adresse email", + "forgotPassword": "Mot de passe oublié ?", + "forgotPasswordDescription": "Entrez votre adresse email et nous vous enverrons un lien pour réinitialiser votre mot de passe.", + "forgotPasswordTitle": "Mot de passe oublié", + "hasAccount": "Déjà un compte ?", + "name": "Nom", + "namePlaceholder": "Entrez votre nom", + "noAccount": "Pas de compte ?", + "orContinueWith": "Ou continuer avec", + "password": "Mot de passe", + "passwordMinChars": "Entrez votre mot de passe (min 6 caractères)", + "passwordPlaceholder": "Entrez votre mot de passe", + "rememberMe": "Se souvenir de moi", + "resetEmailSent": "Nous avons envoyé un lien de réinitialisation à votre adresse email si elle existe dans notre système.", + "resetPassword": "Réinitialiser le mot de passe", + "resetPasswordInstructions": "Entrez votre email pour réinitialiser votre mot de passe", + "returnToLogin": "Retour à la connexion", + "sendResetLink": "Envoyer le lien de réinitialisation", + "sending": "Envoi en cours...", + "signIn": "Connexion", + "signInToAccount": "Connectez-vous à votre compte", + "signOut": "Sign out", + "signUp": "S'inscrire" }, "autoLabels": { - "error": "Échec de la récupération des suggestions d'étiquettes", - "noLabelsSelected": "Aucune étiquette sélectionnée", - "created": "{count} étiquettes créées avec succès", "analyzing": "Analyse de vos notes...", - "title": "Nouvelles suggestions d'étiquettes", + "createNewLabel": "Créer cette nouvelle étiquette et l'ajouter", + "created": "{count} étiquettes créées avec succès", "description": "J'ai détecté des thèmes récurrents dans \"{notebookName}\" ({totalNotes} notes). Créer des étiquettes pour eux ?", + "error": "Échec de la récupération des suggestions d'étiquettes", + "new": "(nouveau)", + "noLabelsSelected": "Aucune étiquette sélectionnée", "note": "note", "notes": "notes", - "typeContent": "Tapez du contenu pour obtenir des suggestions d'étiquettes...", - "createNewLabel": "Créer cette nouvelle étiquette et l'ajouter", - "new": "(nouveau)" + "title": "Nouvelles suggestions d'étiquettes", + "typeContent": "Tapez du contenu pour obtenir des suggestions d'étiquettes..." }, - "titleSuggestions": { - "available": "Suggestions de titre", - "title": "Suggestions IA", - "generating": "Génération en cours...", - "selectTitle": "Sélectionnez un titre", - "dismiss": "Ignorer" + "batch": { + "organize": "Organiser", + "organizeWithAI": "Organiser avec l'IA" + }, + "batchOrganization": { + "analyzing": "Analyse de vos notes...", + "apply": "Appliquer ({count})", + "applying": "Application...", + "confidence": "confiance", + "description": "L'IA analysera vos notes et suggérera de les organiser dans des carnets.", + "error": "Échec de la création du plan d'organisation", + "noNotebooks": "Aucun carnet disponible. Créez d'abord des carnets pour organiser vos notes.", + "noNotesSelected": "Aucune note sélectionnée", + "noSuggestions": "L'IA n'a pas trouvé de bonne manière d'organiser ces notes.", + "notesToOrganize": "{count} notes à organiser", + "selected": "{count} sélectionné", + "title": "Organiser avec l'IA", + "unorganized": "{count} notes n'ont pas pu être catégorisées et resteront dans les Notes générales." + }, + "collaboration": { + "accessRevoked": "L'accès a été révoqué", + "addCollaborator": "Ajouter un collaborateur", + "addCollaboratorDescription": "Ajoutez des personnes pour collaborer à cette note par leur adresse email.", + "alreadyInList": "Cet email est déjà dans la liste", + "canEdit": "Peut modifier", + "canView": "Peut voir", + "done": "Terminé", + "emailAddress": "Adresse email", + "emailPlaceholder": "Entrez l'adresse email", + "enterEmailAddress": "Entrez l'adresse email", + "errorLoading": "Erreur lors du chargement des collaborateurs", + "failedToAdd": "Échec de l'ajout du collaborateur", + "failedToRemove": "Échec de la suppression du collaborateur", + "invite": "Inviter", + "noCollaborators": "Aucun collaborateur encore. Ajoutez quelqu'un ci-dessus !", + "noCollaboratorsViewer": "Aucun collaborateur encore.", + "nowHasAccess": "{name} a maintenant accès à cette note", + "owner": "Propriétaire", + "pending": "En attente", + "pendingInvite": "Invitation en attente", + "peopleWithAccess": "Personnes ayant accès", + "remove": "Supprimer", + "removeCollaborator": "Supprimer le collaborateur", + "shareNote": "Partager la note", + "shareWithCollaborators": "Partager avec les collaborateurs", + "unnamedUser": "Utilisateur sans nom", + "viewerDescription": "Vous avez accès à cette note. Seul le propriétaire peut gérer les collaborateurs.", + "willBeAdded": "{email} sera ajouté comme collaborateur lorsque la note sera créée" + }, + "colors": { + "blue": "Bleu", + "default": "Défaut", + "gray": "Gris", + "green": "Vert", + "orange": "Orange", + "pink": "Rose", + "purple": "Violet", + "red": "Rouge", + "yellow": "Jaune" + }, + "common": { + "add": "Ajouter", + "cancel": "Annuler", + "close": "Fermer", + "confirm": "Confirmer", + "delete": "Supprimer", + "edit": "Modifier", + "error": "Erreur", + "loading": "Chargement...", + "noResults": "Aucun résultat", + "notAvailable": "N/A", + "optional": "Optionnel", + "remove": "Supprimer", + "required": "Requis", + "save": "Enregistrer", + "search": "Rechercher", + "success": "Succès", + "unknown": "Inconnu" + }, + "connection": { + "clickToView": "Cliquer pour voir la note", + "helpful": "Utile", + "isHelpful": "Cette connexion est-elle utile ?", + "memoryEchoDiscovery": "Découverte Memory Echo", + "notHelpful": "Pas utile", + "similarityInfo": "Ces notes sont connectées par {similarity}% de similarité" + }, + "dataManagement": { + "cleanup": { + "button": "Cleanup", + "description": "Remove labels and connections that reference deleted notes.", + "failed": "Error during cleanup", + "title": "Cleanup Orphaned Data" + }, + "cleanupComplete": "Nettoyage terminé : {created} créés, {deleted} supprimés", + "cleanupError": "Erreur lors du nettoyage", + "dangerZone": "Zone de danger", + "dangerZoneDescription": "Supprimer définitivement vos données", + "delete": { + "button": "Delete All Notes", + "confirm": "Are you sure? This will permanently delete all your notes.", + "description": "Permanently delete all your notes. This action cannot be undone.", + "failed": "Failed to delete notes", + "success": "All notes deleted", + "title": "Delete All Notes" + }, + "deleting": "Suppression...", + "export": { + "button": "Export Notes", + "description": "Download all your notes as a JSON file. This includes all content, labels, and metadata.", + "failed": "Failed to export notes", + "success": "Notes exported successfully", + "title": "Export All Notes" + }, + "exporting": "Exportation...", + "import": { + "button": "Import Notes", + "description": "Upload a JSON file to import notes. This will add to your existing notes, not replace them.", + "failed": "Failed to import notes", + "success": "Imported {count} notes", + "title": "Import Notes" + }, + "importing": "Importation...", + "indexing": { + "button": "Rebuild Index", + "description": "Regenerate embeddings for all notes to improve semantic search.", + "failed": "Error during indexing", + "success": "Indexing complete: {count} notes processed", + "title": "Rebuild Search Index" + }, + "indexingComplete": "Indexation terminée : {count} notes traitées", + "indexingError": "Erreur lors de l'indexation", + "title": "Data Management", + "toolsDescription": "Tools to maintain your database health" + }, + "demoMode": { + "activated": "Mode Démo activé ! Memory Echo fonctionnera maintenant instantanément.", + "createNotesTip": "Créez 2+ notes similaires et voyez Memory Echo en action !", + "deactivated": "Mode Démo désactivé. Paramètres normaux restaurés.", + "delayBetweenNotes": "Délai de 0 jour entre les notes (normalement 7 jours)", + "description": "Accélère Memory Echo pour les tests. Les connexions apparaissent instantanément.", + "parametersActive": "Paramètres démo actifs :", + "similarityThreshold": "Seuil de similarité de 50% (normalement 75%)", + "title": "Mode Démo", + "toggleFailed": "Échec du basculement du mode démo", + "unlimitedInsights": "Perspectives illimitées (pas de limites de fréquence)" + }, + "diagnostics": { + "apiStatus": "Statut de l'API", + "checking": "Vérification...", + "configuredProvider": "Fournisseur configuré", + "description": "Vérifiez l'état de la connexion de votre fournisseur IA", + "errorStatus": "Erreur", + "operational": "Opérationnel", + "testDetails": "Détails du test :", + "tip1": "Assurez-vous qu'Ollama fonctionne (ollama serve)", + "tip2": "Vérifiez que le modèle est installé (ollama pull llama3)", + "tip3": "Vérifiez votre clé API pour OpenAI", + "tip4": "Vérifiez la connectivité réseau", + "title": "Diagnostics", + "troubleshootingTitle": "Conseils de dépannage :" + }, + "favorites": { + "noFavorites": "Aucune note épinglée encore", + "pinToFavorite": "Épinglez une note pour l'ajouter aux favoris", + "title": "Favoris", + "toggleSection": "Basculer la section des notes épinglées" + }, + "footer": { + "openSource": "Clone Open Source", + "privacy": "Confidentialité", + "terms": "Conditions" + }, + "general": { + "add": "Ajouter", + "apply": "Appliquer", + "back": "Retour", + "cancel": "Annuler", + "clean": "Nettoyer", + "clear": "Effacer", + "close": "Fermer", + "confirm": "Confirmer", + "edit": "Modifier", + "error": "Une erreur est survenue", + "indexAll": "Tout indexer", + "loading": "Chargement...", + "next": "Suivant", + "operationFailed": "Opération échouée", + "operationSuccess": "Opération réussie", + "preview": "Aperçu", + "previous": "Précédent", + "reset": "Réinitialiser", + "save": "Enregistrer", + "select": "Sélectionner", + "submit": "Soumettre", + "testConnection": "Tester la connexion", + "tryAgain": "Veuillez réessayer" + }, + "generalSettings": { + "description": "Paramètres généraux de l'application", + "title": "Paramètres généraux" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} étiquettes", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "Aucune étiquette", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "Cliquer pour voir la note →", + "comparison": { + "clickToView": "Click to view note", + "helpful": "Helpful", + "helpfulQuestion": "Is this comparison helpful?", + "highSimilarityInsight": "These notes deal with the same topic with a high degree of similarity. They could be merged or consolidated.", + "notHelpful": "Not Helpful", + "similarityInfo": "These notes are connected by {similarity}% similarity", + "title": "💡 Note Comparison", + "untitled": "Untitled" + }, + "connection": "connection", + "connections": "Connections", + "connectionsBadge": "{count} connection{plural}", + "title": "💡 J'ai remarqué quelque chose...", + "description": "Connexions proactives entre vos notes", + "dailyInsight": "Aperçu quotidien de vos notes", + "viewConnection": "Voir la connexion", + "helpful": "Utile", + "notHelpful": "Pas utile", + "dismiss": "Ignorer pour l'instant", + "insightReady": "Votre aperçu est prêt !", + "overlay": { + "title": "Notes connectées", + "loading": "Chargement...", + "error": "Échec du chargement des connexions", + "noConnections": "Aucune connexion trouvée", + "viewAll": "Tout voir côte à côte", + "searchPlaceholder": "Rechercher des connexions...", + "sortBy": "Trier par :", + "sortRecent": "Récent", + "sortSimilarity": "Similarité", + "sortOldest": "Plus ancien" + }, + "thanksFeedback": "Thanks for your feedback!", + "thanksFeedbackImproving": "Thanks! We'll use this to improve." + }, + "nav": { + "accountSettings": "Paramètres du compte", + "adminDashboard": "Tableau de bord Admin", + "aiSettings": "Paramètres IA", + "archive": "Archives", + "buyMeACoffee": "Offrez-moi un café", + "configureAI": "Configurez vos fonctionnalités IA, votre fournisseur et vos préférences", + "diagnostics": "Diagnostics", + "donateOnKofi": "Faire un don sur Ko-fi", + "donationDescription": "Faites un don ponctuel ou devenez supporter mensuel.", + "donationNote": "Sans frais de plateforme • Paiements instantanés • Sécurisé", + "favorites": "Favoris", + "generalNotes": "Notes générales", + "home": "Accueil", + "login": "Connexion", + "logout": "Déconnexion", + "manageAISettings": "Gérer les paramètres IA", + "myLibrary": "Ma bibliothèque", + "notebooks": "Cahiers", + "notes": "Notes", + "proPlan": "Pro Plan", + "profile": "Profil", + "quickAccess": "Accès rapide", + "recent": "Récent", + "reminders": "Rappels", + "settings": "Paramètres", + "sponsorDescription": "Devenez sponsor mensuel et obtenez une reconnaissance.", + "sponsorOnGithub": "Sponsoriser sur GitHub", + "support": "Support Memento ☕", + "supportDescription": "Memento est 100% gratuit et open-source. Votre soutien aide à le garder ainsi.", + "supportDevelopment": "Supporter le développement de Memento ☕", + "trash": "Corbeille", + "userManagement": "Gestion des utilisateurs", + "workspace": "Espace de travail" + }, + "notebook": { + "cancel": "Cancel", + "create": "Create Notebook", + "createDescription": "Start a new collection to organize your notes, ideas, and projects efficiently.", + "createNew": "Create New Notebook", + "creating": "Creating...", + "delete": "Delete Notebook", + "deleteConfirm": "Delete", + "deleteWarning": "Are you sure you want to delete this notebook? Notes will be moved to General Notes.", + "edit": "Edit Notebook", + "editDescription": "Change the name, icon, and color of your notebook.", + "generating": "Generating summary...", + "labels": "Étiquettes :", + "name": "Notebook Name", + "noLabels": "Aucune étiquette", + "selectColor": "Color", + "selectIcon": "Icon", + "summary": "Notebook Summary", + "summaryDescription": "Generate an AI-powered summary of all notes in this notebook.", + "summaryError": "Error generating summary" + }, + "notebookSuggestion": { + "description": "Cette note semble appartenir à ce notebook", + "dismiss": "Rejeter", + "dismissIn": "Rejeter (ferme dans {timeLeft}s)", + "generalNotes": "Notes générales", + "move": "Déplacer", + "moveToNotebook": "Déplacer vers un notebook", + "title": "Déplacer vers {icon} {name} ?" + }, + "notebooks": { + "allNotebooks": "Tous les carnets", + "create": "Créer un carnet", + "createFirst": "Créez votre premier carnet", + "noNotebooks": "Aucun carnet encore" + }, + "notes": { + "add": "Add", + "addCollaborators": "Add collaborators", + "addImage": "Add image", + "addItem": "Add item", + "addLink": "Add link", + "addListItem": "+ List item", + "addNote": "Ajouter une note", + "adding": "Adding...", + "aiAssistant": "AI Assistant", + "archive": "Archive", + "backgroundOptions": "Background options", + "changeColor": "Change color", + "changeSize": "Change size", + "clarifyFailed": "Échec de la clarification du texte", + "close": "Close", + "color": "Color", + "confirmDelete": "Are you sure you want to delete this note?", + "confirmLeaveShare": "Are you sure you want to leave this shared note?", + "contentOrMediaRequired": "Please enter some content or add a link/image", + "copy": "Copy", + "copyFailed": "Failed to copy note", + "copySuccess": "Note copied successfully!", + "createFirstNote": "Create your first note", + "date": "Date", + "delete": "Delete", + "dragToReorder": "Glisser pour réorganiser", + "duplicate": "Duplicate", + "edit": "Edit Note", + "emptyState": "Aucune note encore. Créez votre première note !", + "fileTooLarge": "File too large: {fileName}. Maximum size is {maxSize}.", + "improveFailed": "Échec de l'amélioration du texte", + "inNotebook": "Dans le carnet", + "invalidDateTime": "Invalid date or time", + "invalidFileType": "Invalid file type: {fileName}. Only JPEG, PNG, GIF, and WebP allowed.", + "itemOrMediaRequired": "Please add at least one item or media", + "large": "Large", + "leaveShare": "Leave", + "linkAddFailed": "Failed to add link", + "linkAdded": "Link added", + "linkMetadataFailed": "Could not fetch link metadata", + "listItem": "List item", + "makeCopy": "Make a copy", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown OFF", + "markdownOn": "Markdown ON", + "markdownPlaceholder": "Take a note... (Markdown supported)", + "medium": "Medium", + "more": "Plus d'options", + "moreOptions": "More options", + "moveFailed": "Échec du déplacement de la note. Veuillez réessayer.", + "newChecklist": "New checklist", + "newNote": "New note", + "noContent": "No content", + "noNotes": "No notes", + "noNotesFound": "No notes found", + "noteCreateFailed": "Failed to create note", + "noteCreated": "Note created successfully", + "others": "Others", + "pin": "Pin", + "pinned": "Pinned", + "pinnedNotes": "Notes épinglées", + "placeholder": "Take a note...", + "preview": "Preview", + "readOnly": "Read Only", + "recent": "Récent", + "redo": "Redo (Ctrl+Y)", + "redoShortcut": "Rétablir (Ctrl+Y)", + "remindMe": "Remind me", + "reminderDateTimeRequired": "Please enter date and time", + "reminderMustBeFuture": "Reminder must be in the future", + "reminderPastError": "Reminder must be in the future", + "reminderRemoved": "Reminder removed", + "reminderSet": "Reminder set for {datetime}", + "remove": "Supprimer", + "saving": "Saving...", + "setReminder": "Set reminder", + "setReminderButton": "Set Reminder", + "share": "Share", + "shareWithCollaborators": "Share with collaborators", + "sharedBy": "Shared by", + "sharedReadOnly": "This note is shared with you in read-only mode", + "shortenFailed": "Échec du raccourcissement du texte", + "showCollaborators": "Show collaborators", + "size": "Size", + "small": "Small", + "takeNote": "Take a note...", + "takeNoteMarkdown": "Take a note... (Markdown supported)", + "time": "Time", + "title": "Notes", + "titlePlaceholder": "Title", + "transformFailed": "Échec de la transformation du texte", + "unarchive": "Unarchive", + "undo": "Undo (Ctrl+Z)", + "undoShortcut": "Annuler (Ctrl+Z)", + "unpin": "Unpin", + "unpinned": "Désépinglées", + "untitled": "Untitled", + "uploadFailed": "Échec du téléchargement", + "view": "View Note" + }, + "pagination": { + "next": "→", + "pageInfo": "Page {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "Décontracté", + "expand": "Développer", + "formal": "Formel", + "improve": "Améliorer", + "shorten": "Raccourcir", + "title": "Amélioration du texte" + }, + "profile": { + "accountSettings": "Paramètres du compte", + "autoDetect": "Détection automatique", + "changePassword": "Changer le mot de passe", + "changePasswordDescription": "Mettez à jour votre mot de passe. Vous aurez besoin de votre mot de passe actuel.", + "confirmPassword": "Confirmer le mot de passe", + "currentPassword": "Mot de passe actuel", + "description": "Mettez à jour vos informations personnelles", + "displayName": "Nom d'affichage", + "displaySettings": "Paramètres d'affichage", + "displaySettingsDescription": "Personnalisez l'apparence et la taille de la police.", + "email": "Email", + "fontSize": "Taille de la police", + "fontSizeDescription": "Ajustez la taille de la police pour une meilleure lisibilité. Cela s'applique à tout le texte de l'interface.", + "fontSizeExtraLarge": "Très grande", + "fontSizeLarge": "Grande", + "fontSizeMedium": "Moyenne", + "fontSizeSmall": "Petite", + "fontSizeUpdateFailed": "Échec de la mise à jour de la taille de police", + "fontSizeUpdateSuccess": "Taille de police mise à jour avec succès", + "languageDescription": "Cette langue sera utilisée pour les fonctionnalités IA, l'analyse de contenu et le texte de l'interface.", + "languagePreferences": "Préférences linguistiques", + "languagePreferencesDescription": "Choisissez votre langue préférée pour les fonctionnalités IA et l'interface.", + "languageUpdateFailed": "Échec de la mise à jour de la langue", + "languageUpdateSuccess": "Langue mise à jour avec succès", + "manageAISettings": "Gérer les paramètres IA", + "newPassword": "Nouveau mot de passe", + "passwordChangeFailed": "Échec du changement de mot de passe", + "passwordChangeSuccess": "Mot de passe changé avec succès", + "passwordError": "Erreur lors de la mise à jour du mot de passe", + "passwordUpdated": "Mot de passe mis à jour", + "preferredLanguage": "Langue préférée", + "profileError": "Erreur lors de la mise à jour du profil", + "profileUpdated": "Profil mis à jour", + "recentNotesUpdateFailed": "Échec de la mise à jour du paramètre des notes récentes", + "recentNotesUpdateSuccess": "Paramètre des notes récentes mis à jour avec succès", + "selectFontSize": "Sélectionner la taille de la police", + "selectLanguage": "Sélectionner une langue", + "showRecentNotes": "Afficher la section Récent", + "showRecentNotesDescription": "Afficher les notes récentes (7 derniers jours) sur la page principale", + "title": "Profil", + "updateFailed": "Échec de la mise à jour du profil", + "updatePassword": "Mettre à jour le mot de passe", + "updateSuccess": "Profil mis à jour" + }, + "reminder": { + "cancel": "Annuler", + "reminderDate": "Date du rappel", + "reminderTime": "Heure du rappel", + "removeReminder": "Supprimer le rappel", + "save": "Définir", + "setReminder": "Définir un rappel", + "title": "Rappel" + }, + "resetPassword": { + "confirmNewPassword": "Confirmer le nouveau mot de passe", + "description": "Entrez votre nouveau mot de passe ci-dessous.", + "invalidLinkDescription": "Ce lien de réinitialisation de mot de passe est invalide ou a expiré.", + "invalidLinkTitle": "Lien invalide", + "loading": "Chargement...", + "newPassword": "Nouveau mot de passe", + "passwordMismatch": "Les mots de passe ne correspondent pas", + "requestNewLink": "Demander un nouveau lien", + "resetPassword": "Réinitialiser le mot de passe", + "resetting": "Réinitialisation...", + "success": "Mot de passe réinitialisé avec succès. Vous pouvez maintenant vous connecter.", + "title": "Réinitialiser le mot de passe" + }, + "search": { + "exactMatch": "Correspondance exacte", + "noResults": "Aucun résultat trouvé", + "placeholder": "Rechercher", + "related": "Connexe", + "resultsFound": "{count} notes trouvées", + "searchPlaceholder": "Rechercher dans vos notes...", + "searching": "Recherche en cours...", + "semanticInProgress": "Recherche IA en cours...", + "semanticTooltip": "Recherche sémantique IA" }, "semanticSearch": { "exactMatch": "Correspondance exacte", "related": "Connexe", "searching": "Recherche en cours..." }, - "paragraphRefactor": { - "title": "Amélioration du texte", - "shorten": "Raccourcir", - "expand": "Développer", - "improve": "Améliorer", - "formal": "Formel", - "casual": "Décontracté" + "settings": { + "about": "About", + "account": "Account", + "appearance": "Appearance", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "Manage your settings and preferences", + "language": "Language", + "languageAuto": "Langue définie sur Auto", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "Notifications", + "privacy": "Privacy", + "profile": "Profil", + "searchNoResults": "Aucun paramètre trouvé", + "security": "Security", + "selectLanguage": "Select language", + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "Error saving settings", + "settingsSaved": "Settings saved", + "theme": "Theme", + "themeDark": "Dark", + "themeLight": "Light", + "themeSystem": "System", + "title": "Settings", + "version": "Version" }, - "memoryEcho": { - "title": "J'ai remarqué quelque chose...", - "description": "Connexions proactives entre vos notes", - "dailyInsight": "Perspective quotidienne de vos notes", - "insightReady": "Votre perspective est prête !", - "viewConnection": "Voir la connexion", - "helpful": "Utile", - "notHelpful": "Pas utile", - "dismiss": "Ignorer pour l'instant", - "thanksFeedback": "Merci pour votre feedback !", - "thanksFeedbackImproving": "Merci ! Nous l'utiliserons pour nous améliorer.", - "connections": "Connexions", - "connection": "connexion", - "connectionsBadge": "{count} connexion{plural}", - "fused": "Fusionné", - "overlay": { - "title": "Notes Connexes", - "searchPlaceholder": "Rechercher des connexions...", - "sortBy": "Trier par :", - "sortSimilarity": "Similarité", - "sortRecent": "Plus récent", - "sortOldest": "Plus ancien", - "viewAll": "Tout voir côte à côte", - "loading": "Chargement...", - "noConnections": "Aucune connexion trouvée" - }, - "comparison": { - "title": "💡 Comparaison de Notes", - "similarityInfo": "Ces notes sont connectées par {similarity}% de similarité", - "highSimilarityInsight": "Ces notes traitent du même sujet avec un haut degré de similarité. Elles pourraient être fusionnées ou consolidées.", - "untitled": "Sans titre", - "clickToView": "Cliquez pour voir la note", - "helpfulQuestion": "Cette comparaison est-elle utile ?", - "helpful": "Utile", - "notHelpful": "Pas utile" - }, - "editorSection": { - "title": "⚡ Notes Connexes ({count})", - "loading": "Chargement...", - "view": "Voir", - "compare": "Comparer", - "merge": "Fusionner", - "compareAll": "Tout comparer", - "mergeAll": "Tout fusionner" - }, - "fusion": { - "title": "🔗 Fusion Intelligente", - "mergeNotes": "Fusionner {count} note(s)", - "notesToMerge": "📝 Notes à fusionner", - "optionalPrompt": "💬 Prompt de fusion (optionnel)", - "promptPlaceholder": "Instructions optionnelles pour l'IA (ex: 'Garder le style formel de la note 1')...", - "generateFusion": "Générer la fusion", - "generating": "Génération...", - "previewTitle": "📝 Preview de la note fusionnée", - "edit": "Modifier", - "modify": "Modifier", - "finishEditing": "Terminer l'édition", - "optionsTitle": "Options de fusion", - "archiveOriginals": "Archiver les notes originales", - "keepAllTags": "Conserver tous les tags", - "useLatestTitle": "Conserver la note la plus récente comme titre", - "createBacklinks": "Créer un rétrolien vers les notes originales", - "cancel": "Annuler", - "confirmFusion": "Confirmer la fusion", - "success": "Notes fusionnées avec succès !", - "error": "Échec de la fusion des notes", - "generateError": "Échec de la génération de la fusion", - "noContentReturned": "Aucun contenu de fusion retourné par l'API", - "unknownDate": "Date inconnue" + "sidebar": { + "archive": "Archives", + "editLabels": "Modifier les libellés", + "labels": "Libellés", + "notes": "Notes", + "reminders": "Rappels", + "trash": "Corbeille" + }, + "support": { + "aiApiCosts": "Coûts API IA :", + "buyMeACoffee": "Offrez-moi un café", + "contributeCode": "Contribuer au code", + "description": "Memento est 100% gratuit et open-source. Votre soutien aide à le garder ainsi.", + "directImpact": "Impact direct", + "domainSSL": "Domaine et SSL :", + "donateOnKofi": "Faire un don sur Ko-fi", + "donationDescription": "Faites un don ponctuel ou devenez supporter mensuel.", + "githubDescription": "Support récurrent • Reconnaissance publique • Axé développeurs", + "hostingServers": "Hébergement et serveurs :", + "howSupportHelps": "Comment votre soutien aide", + "kofiDescription": "Sans frais de plateforme • Paiements instantanés • Sécurisé", + "otherWaysTitle": "Autres façons de soutenir", + "reportBug": "Signaler un bug", + "shareTwitter": "Partager sur Twitter", + "sponsorDescription": "Devenez sponsor mensuel et obtenez une reconnaissance.", + "sponsorOnGithub": "Sponsoriser sur GitHub", + "sponsorPerks": "Avantages sponsors", + "starGithub": "Étoiler sur GitHub", + "title": "Supporter le développement de Memento", + "totalExpenses": "Total des dépenses :", + "transparency": "Transparence", + "transparencyDescription": "Je crois en une transparence totale. Voici comment les dons sont utilisés :" + }, + "testPages": { + "titleSuggestions": { + "analyzing": "Analyse...", + "contentLabel": "Contenu (besoin de 50+ mots) :", + "error": "Erreur :", + "idle": "Inactif", + "noSuggestions": "Pas encore de suggestions. Tapez 50+ mots et attendez 2 secondes.", + "placeholder": "Tapez au moins 50 mots ici...", + "status": "Statut :", + "suggestions": "Suggestions ({count}) :", + "title": "Test des suggestions de titre", + "wordCount": "Nombre de mots :" } }, - "nav": { - "home": "Accueil", - "notes": "Notes", - "notebooks": "Cahiers", - "generalNotes": "Notes générales", - "archive": "Archives", - "settings": "Paramètres", - "profile": "Profil", - "aiSettings": "Paramètres IA", - "logout": "Déconnexion", - "login": "Connexion", - "adminDashboard": "Tableau de bord Admin", - "diagnostics": "Diagnostics", - "trash": "Corbeille", - "support": "Support Memento ☕", - "reminders": "Rappels", - "userManagement": "Gestion des utilisateurs", - "accountSettings": "Paramètres du compte", - "manageAISettings": "Gérer les paramètres IA", - "configureAI": "Configurez vos fonctionnalités IA, votre fournisseur et vos préférences", - "supportDevelopment": "Supporter le développement de Memento ☕", - "supportDescription": "Memento est 100% gratuit et open-source. Votre soutien aide à le garder ainsi.", - "buyMeACoffee": "Offrez-moi un café", - "donationDescription": "Faites un don ponctuel ou devenez supporter mensuel.", - "donateOnKofi": "Faire un don sur Ko-fi", - "donationNote": "Sans frais de plateforme • Paiements instantanés • Sécurisé", - "sponsorOnGithub": "Sponsoriser sur GitHub", - "sponsorDescription": "Devenez sponsor mensuel et obtenez une reconnaissance.", - "workspace": "Espace de travail", - "quickAccess": "Accès rapide", - "myLibrary": "Ma bibliothèque", - "favorites": "Favoris", - "recent": "Récent", - "proPlan": "Pro Plan" + "time": { + "daysAgo": "il y a {count}j", + "hoursAgo": "il y a {count}h", + "justNow": "à l'instant", + "minutesAgo": "il y a {count}m", + "today": "Aujourd'hui", + "tomorrow": "Demain", + "yesterday": "Hier" }, - "settings": { - "title": "Paramètres", - "description": "Gérez vos paramètres et préférences", - "account": "Compte", - "appearance": "Apparence", - "theme": "Thème", - "themeLight": "Clair", - "themeDark": "Sombre", - "themeSystem": "Système", - "notifications": "Notifications", - "language": "Langue", - "selectLanguage": "Sélectionner la langue", - "privacy": "Confidentialité", - "security": "Sécurité", - "about": "À propos", - "version": "Version", - "settingsSaved": "Paramètres enregistrés", - "settingsError": "Erreur lors de l'enregistrement des paramètres" + "titleSuggestions": { + "available": "Suggestions de titre", + "dismiss": "Ignorer", + "generating": "Génération en cours...", + "selectTitle": "Sélectionnez un titre", + "title": "Suggestions IA" }, - "profile": { - "title": "Profil", - "description": "Mettez à jour vos informations personnelles", - "displayName": "Nom d'affichage", - "email": "Email", - "changePassword": "Changer le mot de passe", - "changePasswordDescription": "Mettez à jour votre mot de passe. Vous aurez besoin de votre mot de passe actuel.", - "currentPassword": "Mot de passe actuel", - "newPassword": "Nouveau mot de passe", - "confirmPassword": "Confirmer le mot de passe", - "updatePassword": "Mettre à jour le mot de passe", - "passwordChangeSuccess": "Mot de passe changé avec succès", - "passwordChangeFailed": "Échec du changement de mot de passe", - "passwordUpdated": "Mot de passe mis à jour", - "passwordError": "Erreur lors de la mise à jour du mot de passe", - "languagePreferences": "Préférences linguistiques", - "languagePreferencesDescription": "Choisissez votre langue préférée pour les fonctionnalités IA et l'interface.", - "preferredLanguage": "Langue préférée", - "selectLanguage": "Sélectionner une langue", - "languageDescription": "Cette langue sera utilisée pour les fonctionnalités IA, l'analyse de contenu et le texte de l'interface.", - "autoDetect": "Détection automatique", - "updateSuccess": "Profil mis à jour", - "updateFailed": "Échec de la mise à jour du profil", - "languageUpdateSuccess": "Langue mise à jour avec succès", - "languageUpdateFailed": "Échec de la mise à jour de la langue", - "profileUpdated": "Profil mis à jour", - "profileError": "Erreur lors de la mise à jour du profil", - "accountSettings": "Paramètres du compte", - "manageAISettings": "Gérer les paramètres IA", - "displaySettings": "Paramètres d'affichage", - "displaySettingsDescription": "Personnalisez l'apparence et la taille de la police.", - "fontSize": "Taille de la police", - "selectFontSize": "Sélectionner la taille de la police", - "fontSizeSmall": "Petite", - "fontSizeMedium": "Moyenne", - "fontSizeLarge": "Grande", - "fontSizeExtraLarge": "Très grande", - "fontSizeDescription": "Ajustez la taille de la police pour une meilleure lisibilité. Cela s'applique à tout le texte de l'interface.", - "fontSizeUpdateSuccess": "Taille de police mise à jour avec succès", - "fontSizeUpdateFailed": "Échec de la mise à jour de la taille de police", - "showRecentNotes": "Afficher la section Récent", - "showRecentNotesDescription": "Afficher les notes récentes (7 derniers jours) sur la page principale", - "recentNotesUpdateSuccess": "Paramètre des notes récentes mis à jour avec succès", - "recentNotesUpdateFailed": "Échec de la mise à jour du paramètre des notes récentes" - }, - "aiSettings": { - "title": "Paramètres IA", - "description": "Configurez vos fonctionnalités IA et préférences", - "features": "Fonctionnalités IA", - "provider": "Fournisseur IA", - "providerAuto": "Auto (Recommandé)", - "providerOllama": "Ollama (Local)", - "providerOpenAI": "OpenAI (Cloud)", - "frequency": "Fréquence", - "frequencyDaily": "Quotidienne", - "frequencyWeekly": "Hebdomadaire", - "saving": "Enregistrement...", - "saved": "Paramètre mis à jour", - "error": "Échec de la mise à jour" - }, - "general": { - "loading": "Chargement...", - "save": "Enregistrer", - "cancel": "Annuler", - "add": "Ajouter", - "edit": "Modifier", - "confirm": "Confirmer", - "close": "Fermer", - "back": "Retour", - "next": "Suivant", - "previous": "Précédent", - "submit": "Soumettre", - "reset": "Réinitialiser", - "apply": "Appliquer", - "clear": "Effacer", - "select": "Sélectionner", - "tryAgain": "Veuillez réessayer", - "error": "Une erreur est survenue", + "toast": { + "feedbackFailed": "Échec de l'envoi du feedback", + "notesFusionSuccess": "Notes fusionnées avec succès !", + "openConnectionFailed": "Échec de l'ouverture de la connexion", + "openingConnection": "Ouverture de la connexion...", + "operationFailed": "Opération échouée", "operationSuccess": "Opération réussie", - "operationFailed": "Opération échouée" + "saveFailed": "Échec de l'enregistrement du paramètre", + "saved": "Paramètre enregistré", + "thanksFeedback": "Merci pour votre feedback !", + "thanksFeedbackImproving": "Merci ! Nous l'utiliserons pour nous améliorer." }, - "colors": { - "default": "Défaut", - "red": "Rouge", - "blue": "Bleu", - "green": "Vert", - "yellow": "Jaune", - "purple": "Violet", - "pink": "Rose", - "orange": "Orange", - "gray": "Gris" + "trash": { + "deletePermanently": "Supprimer définitivement", + "empty": "La corbeille est vide", + "restore": "Restaurer", + "title": "Corbeille" }, - "reminder": { - "title": "Rappel", - "setReminder": "Définir un rappel", - "removeReminder": "Supprimer le rappel", - "reminderDate": "Date du rappel", - "reminderTime": "Heure du rappel", - "save": "Définir", - "cancel": "Annuler" - }, - "notebook": { - "create": "Créer un notebook", - "createNew": "Créer un nouveau notebook", - "createDescription": "Créez une nouvelle collection pour organiser vos notes, idées et projets efficacement.", - "name": "Nom du notebook", - "selectIcon": "Icône", - "selectColor": "Couleur", - "cancel": "Annuler", - "creating": "Création...", - "edit": "Modifier le notebook", - "editDescription": "Modifiez le nom, l'icône et la couleur de votre notebook.", - "delete": "Supprimer le notebook", - "deleteWarning": "Êtes-vous sûr de vouloir supprimer ce notebook ? Les notes seront déplacées vers Notes générales.", - "deleteConfirm": "Supprimer", - "summary": "Résumé du notebook", - "summaryDescription": "Générer un résumé alimenté par l'IA de toutes les notes de ce notebook.", - "generating": "Génération du résumé...", - "summaryError": "Erreur lors de la génération du résumé" - }, - "notebookSuggestion": { - "title": "Déplacer vers {icon} {name} ?", - "description": "Cette note semble appartenir à ce notebook", - "move": "Déplacer", - "dismiss": "Rejeter", - "dismissIn": "Rejeter (ferme dans {timeLeft}s)", - "moveToNotebook": "Déplacer vers un notebook", - "generalNotes": "Notes générales" + "ui": { + "close": "Fermer", + "collapse": "Réduire", + "expand": "Développer", + "open": "Ouvrir" } } \ No newline at end of file diff --git a/keep-notes/locales/hi.json b/keep-notes/locales/hi.json index a98275b..87a8e14 100644 --- a/keep-notes/locales/hi.json +++ b/keep-notes/locales/hi.json @@ -1,553 +1,993 @@ { - "auth": { - "signIn": "साइन इन करें", - "signUp": "साइन अप करें", - "email": "ईमेल", - "password": "पासवर्ड", - "name": "नाम", - "emailPlaceholder": "अपना ईमेल पता दर्ज करें", - "passwordPlaceholder": "अपना पासवर्ड दर्ज करें", - "namePlaceholder": "अपना नाम दर्ज करें", - "passwordMinChars": "पासवर्ड दर्ज करें (न्यूनतम 6 वर्ण)", - "resetPassword": "पासवर्ड रीसेट करें", - "resetPasswordInstructions": "पासवर्ड रीसेट करने के लिए अपना ईमेल दर्ज करें", - "forgotPassword": "पासवर्ड भूल गए?", - "noAccount": "खाता नहीं है?", - "hasAccount": "पहले से खाता है?", - "signInToAccount": "अपने खाते में साइन इन करें", - "createAccount": "अपना खाता बनाएं", - "rememberMe": "मुझे याद रखें", - "orContinueWith": "या जारी रखें", - "checkYourEmail": "अपना ईमेल जांचें", - "resetEmailSent": "यदि आपका ईमेल हमारे सिस्टम में मौजूद है, तो हमने आपके पासवर्ड रीसेट लिंक भेज दिया है।", - "returnToLogin": "लॉगिन पर वापस जाएं", - "forgotPasswordTitle": "पासवर्ड भूल गए", - "forgotPasswordDescription": "अपना ईमेल पता दर्ज करें और हम आपको पासवर्ड रीसेट करने का लिंक भेजेंगे।", - "sending": "भेज रहे हैं...", - "sendResetLink": "रीसेट लिंक भेजें", - "backToLogin": "लॉगिन पर वापस जाएं" - }, - "notes": { - "title": "नोट्स", - "newNote": "नया नोट", - "untitled": "शीर्षकहीन", - "placeholder": "नोट लें...", - "markdownPlaceholder": "नोट लें... (Markdown समर्थित)", - "titlePlaceholder": "शीर्षक", - "listItem": "सूची आइटम", - "addListItem": "+ सूची आइटम", - "newChecklist": "नई चेकलिस्ट", - "add": "जोड़ें", - "adding": "जोड़ रहे हैं...", - "close": "बंद करें", - "confirmDelete": "क्या आप वाकई इस नोट को हटाना चाहते हैं?", - "confirmLeaveShare": "क्या आप वाकई इस साझा नोट को छोड़ना चाहते हैं?", - "sharedBy": "द्वारा साझा किया गया", - "leaveShare": "छोड़ें", - "delete": "हटाएं", - "archive": "संग्रहित करें", - "unarchive": "संग्रह से निकालें", - "pin": "पिन करें", - "unpin": "अनपिन करें", - "color": "रंग", - "changeColor": "रंग बदलें", - "setReminder": "रिमाइंडर सेट करें", - "setReminderButton": "रिमाइंडर सेट करें", - "date": "दिनांक", - "time": "समय", - "reminderDateTimeRequired": "कृपया दिनांक और समय दर्ज करें", - "invalidDateTime": "अमान्य दिनांक या समय", - "reminderMustBeFuture": "रिमाइंडर भविष्य में होना चाहिए", - "reminderSet": "{datetime} के लिए रिमाइंडर सेट किया गया", - "reminderPastError": "रिमाइंडर भविष्य में होना चाहिए", - "reminderRemoved": "रिमाइंडर हटा दिया गया", - "addImage": "छवि जोड़ें", - "addLink": "लिंक जोड़ें", - "linkAdded": "लिंक जोड़ा गया", - "linkMetadataFailed": "लिंक मेटाडेटा प्राप्त नहीं किया जा सका", - "linkAddFailed": "लिंक जोड़ने में विफल", - "invalidFileType": "अमान्य फ़ाइल प्रकार: {fileName}. केवल JPEG, PNG, GIF और WebP अनुमत हैं।", - "fileTooLarge": "फ़ाइल बहुत बड़ी है: {fileName}. अधिकतम आकार {maxSize} है।", - "uploadFailed": "{filename} अपलोड करने में विफल", - "contentOrMediaRequired": "कृपया कुछ सामग्री दर्ज करें या लिंक/छवि जोड़ें", - "itemOrMediaRequired": "कृपया कम से कम एक आइटम या मीडिया जोड़ें", - "noteCreated": "नोट सफलतापूर्वक बनाया गया", - "noteCreateFailed": "नोट बनाने में विफल", - "aiAssistant": "AI सहायक", - "changeSize": "आकार बदलें", - "backgroundOptions": "बैकग्राउंड विकल्प", - "moreOptions": "अधिक विकल्प", - "remindMe": "मुझे याद दिलाएं", - "markdownMode": "Markdown", - "addCollaborators": "सहयोगी जोड़ें", - "duplicate": "डुप्लिकेट", - "share": "साझा करें", - "showCollaborators": "सहयोगी दिखाएं", - "pinned": "पिन किए गए", - "others": "अन्य", - "noNotes": "कोई नोट नहीं", - "noNotesFound": "कोई नोट नहीं मिला", - "createFirstNote": "अपना पहला नोट बनाएं", - "size": "आकार", - "small": "छोटा", - "medium": "मध्यम", - "large": "बड़ा", - "shareWithCollaborators": "सहयोगियों के साथ साझा करें", - "view": "नोट देखें", - "edit": "नोट संपादित करें", - "readOnly": "केवल पढ़ने के लिए", - "preview": "पूर्वावलोकन", - "noContent": "कोई सामग्री नहीं", - "takeNote": "नोट लें...", - "takeNoteMarkdown": "नोट लें... (Markdown समर्थित)", - "addItem": "आइटम जोड़ें", - "sharedReadOnly": "यह नोट आपके साथ केवल-पढ़ने के मोड में साझा किया गया है", - "makeCopy": "कॉपी बनाएं", - "saving": "सहेज रहे हैं...", - "copySuccess": "नोट सफलतापूर्वक कॉपी किया गया!", - "copyFailed": "नोट कॉपी करने में विफल", - "copy": "कॉपी", - "markdownOn": "Markdown चालू", - "markdownOff": "Markdown बंद", - "undo": "पूर्ववत करें (Ctrl+Z)", - "redo": "फिर से करें (Ctrl+Y)" - }, - "pagination": { - "previous": "←", - "pageInfo": "पृष्ठ {currentPage} / {totalPages}", - "next": "→" - }, - "ai": { - "analyzing": "AI विश्लेषण जारी है...", - "clickToAddTag": "इस टैग को जोड़ने के लिए क्लिक करें", - "ignoreSuggestion": "इस सुझाव को अनदेखा करें", - "generatingTitles": "शीर्षक उत्पन्न किए जा रहे हैं...", - "generateTitlesTooltip": "AI से शीर्षक उत्पन्न करें", - "poweredByAI": "AI द्वारा संचालित", - "languageDetected": "भाषा का पता लगाया गया", - "processing": "प्रसंस्करण...", - "tagAdded": "टैग \"{tag}\" जोड़ा गया", - "titleGenerating": "उत्पन्न हो रहा है...", - "titleGenerateWithAI": "AI से शीर्षक उत्पन्न करें", - "titleGenerationMinWords": "शीर्षक उत्पन्न करने के लिए सामग्री में कम से कम 10 शब्द होने चाहिए (वर्तमान: {count} शब्द)", - "titleGenerationError": "शीर्षक उत्पन्न करने में त्रुटि", - "titlesGenerated": "💡 {count} शीर्षक उत्पन्न हुए!", - "titleGenerationFailed": "शीर्षक उत्पन्न करने में विफल", - "titleApplied": "शीर्षक लागू किया गया!", - "reformulationNoText": "कृपया पाठ चुनें या सामग्री जोड़ें", - "reformulationSelectionTooShort": "चयन बहुत छोटा है, पूर्ण सामग्री का उपयोग किया जा रहा है", - "reformulationMinWords": "पाठ में कम से कम 10 शब्द होने चाहिए (वर्तमान: {count} शब्द)", - "reformulationMaxWords": "पाठ में अधिकतम 500 शब्द होने चाहिए", - "reformulationError": "पुनर्प्रारूपण के दौरान त्रुटि", - "reformulationFailed": "पाठ पुनर्प्रारूपित करने में विफल", - "reformulationApplied": "पुनर्प्रारूपित पाठ लागू किया गया!", - "transformMarkdown": "Markdown में रूपांतरित करें", - "transforming": "रूपांतरित हो रहा है...", - "transformSuccess": "पाठ सफलतापूर्वक Markdown में रूपांतरित हो गया!", - "transformError": "रूपांतरण के दौरान त्रुटि", - "assistant": "AI सहायक", - "generating": "उत्पन्न हो रहा है...", - "generateTitles": "शीर्षक उत्पन्न करें", - "reformulateText": "पाठ पुनर्प्रारूपित करें", - "reformulating": "पुनर्प्रारूपित हो रहा है...", - "clarify": "स्पष्ट करें", - "shorten": "छोटा करें", - "improveStyle": "शैली में सुधार करें", - "reformulationComparison": "पुनर्प्रारूपण तुलना", - "original": "मूल", - "reformulated": "पुनर्प्रारूपित", - "batchOrganization": { - "error": "संगठन योजना बनाने में विफल", - "noNotesSelected": "कोई नोट चयनित नहीं", - "title": "AI से व्यवस्थित करें", - "description": "AI आपके नोट्स का विश्लेषण करेगा और उन्हें नोटबुक में व्यवस्थित करने का प्रस्ताव देगा।", - "analyzing": "नोट्स का विश्लेषण जारी है...", - "notesToOrganize": "{count} नोट्स का संगठन करें", - "selected": "{count} चयनित", - "noNotebooks": "कोई नोटबुक उपलब्ध नहीं है। अपने नोट्स को व्यवस्थित करने के लिए पहले नोटबुक बनाएं।", - "noSuggestions": "AI इन नोट्स को व्यवस्थित करने का कोई अच्छा तरीका नहीं ढूंढ सका।", - "confidence": "विश्वसनीता", - "unorganized": "{count} नोट्स को वर्गीकृत नहीं किया गया और वे सामान्य नोट्स में रहेंगे।", - "applying": "लागू हो रहा है...", - "apply": "लागू करें ({count})" + "about": { + "appDescription": "AI-संचालित सुविधाओं के साथ एक शक्तिशाली नोट लेने वाला एप्लिकेशन", + "appName": "Keep Notes", + "buildDate": "बिल्ड तिथि", + "description": "एप्लिकेशन के बारे में जानकारी", + "features": { + "description": "AI-संचालित क्षमताएं", + "dragDrop": "ड्रैग और ड्रॉप नोट प्रबंधन", + "labelSystem": "लेबल सिस्टम", + "memoryEcho": "Memory Echo दैनिक अंतर्दृष्टि", + "multipleProviders": "कई AI प्रदाता (OpenAI, Ollama)", + "notebookOrganization": "नोटबुक संगठन", + "paragraphReformulation": "अनुच्छेद पुनर्सुधार", + "semanticSearch": "एम्बेडिंग्स के साथ सिमेंटिक खोज", + "title": "सुविधाएं", + "titleSuggestions": "AI-संचालित शीर्षक सुझाव" }, - "autoLabels": { - "error": "लेबल सुझाव प्राप्त करने में विफल", - "noLabelsSelected": "कोई लेबल चयनित नहीं", - "created": "{count} लेबल सफलतापूर्वक बनाए गए", - "analyzing": "नोट्स का विश्लेषण जारी है...", - "title": "नए लेबल सुझाव", - "description": "मैंने \"{notebookName}\" ({totalNotes} नोट्स) में पुनरावर्ती विषयों का पता लगाया है। उनके लिए लेबल बनाना है?", - "note": "नोट", - "notes": "नोट्स", - "typeContent": "लेबल सुझाव प्राप्त करने के लिए सामग्री टाइप करें...", - "createNewLabel": "इस नए लेबल को बनाएं और जोड़ें", - "new": "(नया)" + "platform": "प्लेटफ़ॉर्म", + "platformWeb": "वेब", + "support": { + "description": "सहायता और प्रतिक्रिया प्राप्त करें", + "documentation": "प्रलेखन", + "feedback": "प्रतिक्रिया", + "reportIssues": "समस्याएं रिपोर्ट करें", + "title": "समर्थन" + }, + "technology": { + "ai": "AI", + "authentication": "प्रमाणीकरण", + "backend": "बैकएंड", + "database": "डेटाबेस", + "description": "आधुनिक तकनीकों के साथ निर्मित", + "frontend": "फ्रंटएंड", + "testing": "परीक्षण", + "title": "तकनीकी स्टैक", + "ui": "UI" + }, + "title": "के बारे में", + "version": "संस्करण" + }, + "admin": { + "ai": { + "apiKey": "API कुंजी", + "baseUrl": "बेस URL", + "commonEmbeddingModels": "OpenAI-संगत API के लिए सामान्य एम्बेडिंग मॉडल", + "commonModelsDescription": "OpenAI-संगत API के लिए सामान्य मॉडल", + "description": "स्वचालित टैगिंग और सिमेंटिक खोज के लिए AI प्रदाताओं को कॉन्फ़िगर करें। इष्टतम प्रदर्शन के लिए विभिन्न प्रदाताओं का उपयोग करें।", + "embeddingsDescription": "सिमेंटिक खोज एम्बेडिंग्स के लिए AI प्रदाता। अनुशंसित: OpenAI (सर्वोत्तम गुणवत्ता)।", + "embeddingsProvider": "एम्बेडिंग्स प्रदाता", + "model": "मॉडल", + "modelRecommendations": "gpt-4o-mini = सर्वोत्तम मूल्य • gpt-4o = सर्वोत्तम गुणवत्ता", + "openAIKeyDescription": "platform.openai.com से आपकी OpenAI API कुंजी", + "openTestPanel": "AI परीक्षण पैनल खोलें", + "provider": "प्रदाता", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING आवश्यक है", + "providerTagsRequired": "AI_PROVIDER_TAGS आवश्यक है", + "saveSettings": "AI सेटिंग्स सहेजें", + "saving": "सहेज रहे हैं...", + "selectEmbeddingModel": "अपने सिस्टम पर इंस्टॉल किए गए एम्बेडिंग मॉडल का चयन करें", + "selectOllamaModel": "अपने सिस्टम पर इंस्टॉल किए गए Ollama मॉडल का चयन करें", + "tagsGenerationDescription": "स्वचालित टैग सुझावों के लिए AI प्रदाता। अनुशंसित: Ollama (मुफ्त, स्थानीय)।", + "tagsGenerationProvider": "टैग जनरेशन प्रदाता", + "title": "AI कॉन्फ़िगरेशन", + "updateFailed": "AI सेटिंग्स अपडेट करने में विफल", + "updateSuccess": "AI सेटिंग्स सफलतापूर्वक अपडेट की गईं" + }, + "aiTest": { + "description": "टैग जनरेशन और सिमेंटिक खोज एम्बेडिंग्स के लिए अपने AI प्रदाताओं का परीक्षण करें", + "embeddingDimensions": "एम्बेडिंग आयाम:", + "embeddingsTestDescription": "सिमेंटिक खोज एम्बेडिंग्स के लिए जिम्मेदार AI प्रदाता का परीक्षण करें", + "embeddingsTestTitle": "एम्बेडिंग्स परीक्षण", + "error": "त्रुटि:", + "first5Values": "पहले 5 मान:", + "generatedTags": "उत्पन्न टैग:", + "howItWorksTitle": "परीक्षण कैसे काम करता है", + "model": "मॉडल:", + "provider": "प्रदाता:", + "responseTime": "प्रतिक्रिया समय: {time}ms", + "runTest": "परीक्षण चलाएं", + "tagsTestDescription": "स्वचालित टैग सुझावों के लिए जिम्मेदार AI प्रदाता का परीक्षण करें", + "tagsTestTitle": "टैग जनरेशन परीक्षण", + "testError": "परीक्षण त्रुटि: {error}", + "testFailed": "परीक्षण विफल", + "testPassed": "परीक्षण पास", + "testing": "परीक्षण हो रहा है...", + "tipDescription": "परीक्षण से पहले कॉन्फ़िगरेशन समस्याओं का निदान करने के लिए AI परीक्षण पैनल का उपयोग करें।", + "tipTitle": "सुझाव:", + "title": "AI प्रदाता परीक्षण", + "vectorDimensions": "वेक्टर आयाम" + }, + "aiTesting": "AI परीक्षण", + "security": { + "allowPublicRegistration": "सार्वजनिक पंजीकरण की अनुमति दें", + "allowPublicRegistrationDescription": "यदि अक्षम है, तो नए उपयोगकर्ताओं को केवल एडमिन द्वारा उपयोगकर्ता प्रबंधन पृष्ठ के माध्यम से जोड़ा जा सकता है।", + "description": "पहुंच नियंत्रण और पंजीकरण नीतियां प्रबंधित करें।", + "title": "सुरक्षा सेटिंग्स", + "updateFailed": "सुरक्षा सेटिंग्स अपडेट करने में विफल", + "updateSuccess": "सुरक्षा सेटिंग्स अपडेट की गईं" + }, + "settings": "एडमिन सेटिंग्स", + "smtp": { + "description": "पासवर्ड रीसेट के लिए ईमेल सर्वर कॉन्फ़िगर करें।", + "forceSSL": "SSL/TLS बाध्य करें (आमतौर पर पोर्ट 465 के लिए)", + "fromEmail": "प्रेषक ईमेल", + "host": "होस्ट", + "ignoreCertErrors": "प्रमाणपत्र त्रुटियों को अनदेखा करें (केवल स्व-होस्ट/विकास)", + "password": "पासवर्ड", + "port": "पोर्ट", + "saveSettings": "SMTP सेटिंग्स सहेजें", + "sending": "भेज रहे हैं...", + "testEmail": "परीक्षण ईमेल", + "testFailed": "विफल: {error}", + "testSuccess": "परीक्षण ईमेल सफलतापूर्वक भेजा गया!", + "title": "SMTP कॉन्फ़िगरेशन", + "updateFailed": "SMTP सेटिंग्स अपडेट करने में विफल", + "updateSuccess": "SMTP सेटिंग्स अपडेट की गईं", + "username": "उपयोगकर्ता नाम" + }, + "title": "एडमिन डैशबोर्ड", + "userManagement": "उपयोगकर्ता प्रबंधन", + "users": { + "addUser": "उपयोगकर्ता जोड़ें", + "confirmDelete": "Are you sure? This action cannot be undone.", + "createFailed": "उपयोगकर्ता बनाने में विफल", + "createSuccess": "उपयोगकर्ता सफलतापूर्वक बनाया गया", + "createUser": "उपयोगकर्ता बनाएं", + "createUserDescription": "सिस्टम में एक नया उपयोगकर्ता जोड़ें।", + "deleteFailed": "हटाने में विफल", + "deleteSuccess": "उपयोगकर्ता हटाया गया", + "demote": "अवमत करें", + "email": "ईमेल", + "name": "नाम", + "password": "पासवर्ड", + "promote": "पदोन्नत करें", + "role": "भूमिका", + "roleUpdateFailed": "भूमिका अपडेट करने में विफल", + "roleUpdateSuccess": "उपयोगकर्ता भूमिका को {role} में अपडेट किया गया", + "roles": { + "admin": "व्यवस्थापक", + "user": "उपयोगकर्ता" + }, + "table": { + "actions": "कार्रवाई", + "createdAt": "बनाया गया", + "email": "ईमेल", + "name": "नाम", + "role": "भूमिका" + } } }, - "memoryEcho.fusion": { - "generateError": "फ्यूजन उत्पन्न करने में विफल", - "noContentReturned": "API से कोई फ्यूजन कंटेंट नहीं लौटा", - "unknownDate": "अज्ञात तारीख" - }, - "labels": { - "title": "लेबल", - "filter": "लेबल से फ़िल्टर करें", - "manage": "लेबल प्रबंधित करें", - "manageTooltip": "लेबल प्रबंधित करें", - "changeColor": "रंग बदलें", - "changeColorTooltip": "रंग बदलें", - "delete": "हटाएं", - "deleteTooltip": "लेबल हटाएं", - "confirmDelete": "क्या आप वाकई इस लेबल को हटाना चाहते हैं?", - "newLabelPlaceholder": "नया लेबल बनाएं", - "namePlaceholder": "लेबल नाम दर्ज करें", - "addLabel": "लेबल जोड़ें", - "createLabel": "लेबल बनाएं", - "labelName": "लेबल नाम", - "labelColor": "लेबल रंग", - "manageLabels": "लेबल प्रबंधित करें", - "manageLabelsDescription": "इस नोट के लिए लेबल जोड़ें या हटाएं। रंग बदलने के लिए लेबल पर क्लिक करें।", - "selectedLabels": "चयनित लेबल", - "allLabels": "सभी लेबल", - "clearAll": "सभी साफ़ करें", - "filterByLabel": "लेबल से फ़िल्टर करें", - "tagAdded": "टैग \"{tag}\" जोड़ा गया", - "showLess": "कम दिखाएं", - "showMore": "अधिक दिखाएं", - "editLabels": "लेबल संपादित करें", - "editLabelsDescription": "लेबल बनाएं, रंग संपादित करें या हटाएं।", - "noLabelsFound": "कोई लेबल नहीं मिला।", - "loading": "लोड हो रहा है...", - "notebookRequired": "⚠️ लेबल केवल नोटबुक में उपलब्ध हैं। इस नोट को पहले किसी नोटबुक में ले जाएं।" - }, - "search": { - "placeholder": "खोजें", - "searchPlaceholder": "अपने नोट्स खोजें...", - "semanticInProgress": "AI खोज जारी है...", - "semanticTooltip": "AI अर्थात्मक खोज", - "searching": "खोज रहे हैं...", - "noResults": "कोई परिणाम नहीं मिला", - "resultsFound": "{count} नोट मिले", - "exactMatch": "सटीक मेल", - "related": "संबंधित" - }, - "collaboration": { - "emailPlaceholder": "ईमेल पता दर्ज करें", - "addCollaborator": "सहयोगी जोड़ें", - "removeCollaborator": "सहयोगी हटाएं", - "owner": "मालिक", - "canEdit": "संपादन कर सकते हैं", - "canView": "देख सकते हैं", - "shareNote": "नोट साझा करें", - "shareWithCollaborators": "सहयोगियों के साथ साझा करें", - "addCollaboratorDescription": "अपने ईमेल पते से इस नोट पर सहयोग करने के लिए लोगों को जोड़ें।", - "viewerDescription": "आपके पास इस नोट तक पहुंच है। केवल मालिक ही सहयोगियों का प्रबंधन कर सकता है।", - "emailAddress": "ईमेल पता", - "enterEmailAddress": "ईमेल पता दर्ज करें", - "invite": "आमंत्रित करें", - "peopleWithAccess": "पहुंच वाले लोग", - "noCollaborators": "अभी तक कोई सहयोगी नहीं है। ऊपर किसी को जोड़ें!", - "noCollaboratorsViewer": "अभी तक कोई सहयोगी नहीं है।", - "pendingInvite": "लंबित निमंत्रण", - "pending": "लंबित", - "remove": "हटाएं", - "unnamedUser": "बेनाम उपयोगकर्ता", - "done": "पूर्ण", - "willBeAdded": "नोट बनाते समय {email} को सहयोगी के रूप में जोड़ा जाएगा", - "alreadyInList": "यह ईमेल पहले से सूची में है", - "nowHasAccess": "अब {name} के पास इस नोट तक पहुंच है", - "accessRevoked": "पहुंच रद्द कर दी गई", - "errorLoading": "सहयोगी लोड करने में त्रुटि", - "failedToAdd": "सहयोगी जोड़ने में विफल", - "failedToRemove": "सहयोगी हटाने में विफल" - }, "ai": { "analyzing": "AI विश्लेषण जारी है...", + "assistant": "AI सहायक", + "autoLabels": { + "analyzing": "लेबल सुझावों के लिए आपके नोट्स का विश्लेषण किया जा रहा है...", + "create": "बनाएं", + "createNewLabel": "Create this new label and add it", + "created": "{count} labels created successfully", + "creating": "लेबल बनाए जा रहे हैं...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(नया)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "लेबल सुझाव", + "typeContent": "Type content to get label suggestions..." + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Failed to apply organization plan", + "applying": "Applying...", + "description": "AI आपके नोट्स का विश्लेषण करेगा और उन्हें नोटबुक में व्यवस्थित करने का सुझाव देगा।", + "error": "Failed to create organization plan", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "No notes selected", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Select all notes in {notebook}", + "selectNote": "Select note: {title}", + "success": "{count} notes moved successfully", + "title": "Organize with AI" + }, + "clarify": "स्पष्ट करें", "clickToAddTag": "इस टैग को जोड़ने के लिए क्लिक करें", - "ignoreSuggestion": "इस सुझाव को अनदेखा करें", - "generatingTitles": "शीर्षक उत्पन्न किए जा रहे हैं...", + "generateTitles": "शीर्षक उत्पन्न करें", "generateTitlesTooltip": "AI से शीर्षक उत्पन्न करें", - "poweredByAI": "AI द्वारा संचालित", + "generating": "उत्पन्न हो रहा है...", + "generatingTitles": "शीर्षक उत्पन्न किए जा रहे हैं...", + "ignoreSuggestion": "इस सुझाव को अनदेखा करें", + "improveStyle": "शैली में सुधार करें", "languageDetected": "भाषा का पता लगाया गया", + "notebookSummary": { + "regenerate": "सारांश पुनः उत्पन्न करें", + "regenerating": "सारांश पुनः उत्पन्न हो रहा है..." + }, + "original": "मूल", + "poweredByAI": "AI द्वारा संचालित", "processing": "प्रसंस्करण...", - "tagAdded": "टैग \"{tag}\" जोड़ा गया", - "titleGenerating": "उत्पन्न हो रहा है...", - "titleGenerateWithAI": "AI से शीर्षक उत्पन्न करें", - "titleGenerationMinWords": "शीर्षक उत्पन्न करने के लिए सामग्री में कम से कम 10 शब्द होने चाहिए (वर्तमान: {count} शब्द)", - "titleGenerationError": "शीर्षक उत्पन्न करने में त्रुटि", - "titlesGenerated": "💡 {count} शीर्षक उत्पन्न हुए!", - "titleGenerationFailed": "शीर्षक उत्पन्न करने में विफल", - "titleApplied": "शीर्षक लागू किया गया!", - "reformulationNoText": "कृपया पाठ चुनें या सामग्री जोड़ें", - "reformulationSelectionTooShort": "चयन बहुत छोटा है, पूर्ण सामग्री का उपयोग किया जा रहा है", - "reformulationMinWords": "पाठ में कम से कम 10 शब्द होने चाहिए (वर्तमान: {count} शब्द)", - "reformulationMaxWords": "पाठ में अधिकतम 500 शब्द होने चाहिए", + "reformulateText": "पाठ पुनर्प्रारूपित करें", + "reformulated": "पुनर्प्रारूपित", + "reformulating": "पुनर्प्रारूपित हो रहा है...", + "reformulationApplied": "पुनर्प्रारूपित पाठ लागू किया गया!", + "reformulationComparison": "पुनर्प्रारूपण तुलना", "reformulationError": "पुनर्प्रारूपण के दौरान त्रुटि", "reformulationFailed": "पाठ पुनर्प्रारूपित करने में विफल", - "reformulationApplied": "पुनर्प्रारूपित पाठ लागू किया गया!", - "transformMarkdown": "Markdown में रूपांतरित करें", - "transforming": "रूपांतरित हो रहा है...", - "transformSuccess": "पाठ सफलतापूर्वक Markdown में रूपांतरित हो गया!", - "transformError": "रूपांतरण के दौरान त्रुटि", - "assistant": "AI सहायक", - "generating": "उत्पन्न हो रहा है...", - "generateTitles": "शीर्षक उत्पन्न करें", - "reformulateText": "पाठ पुनर्प्रारूपित करें", - "reformulating": "पुनर्प्रारूपित हो रहा है...", - "clarify": "स्पष्ट करें", + "reformulationMaxWords": "पाठ में अधिकतम 500 शब्द होने चाहिए", + "reformulationMinWords": "पाठ में कम से कम 10 शब्द होने चाहिए (वर्तमान: {count} शब्द)", + "reformulationNoText": "कृपया पाठ चुनें या सामग्री जोड़ें", + "reformulationSelectionTooShort": "चयन बहुत छोटा है, पूर्ण सामग्री का उपयोग किया जा रहा है", "shorten": "छोटा करें", - "improveStyle": "शैली में सुधार करें", - "reformulationComparison": "पुनर्प्रारूपण तुलना", - "original": "मूल", - "reformulated": "पुनर्प्रारूपित" + "tagAdded": "टैग \"{tag}\" जोड़ा गया", + "titleApplied": "शीर्षक लागू किया गया!", + "titleGenerateWithAI": "AI से शीर्षक उत्पन्न करें", + "titleGenerating": "उत्पन्न हो रहा है...", + "titleGenerationError": "शीर्षक उत्पन्न करने में त्रुटि", + "titleGenerationFailed": "शीर्षक उत्पन्न करने में विफल", + "titleGenerationMinWords": "शीर्षक उत्पन्न करने के लिए सामग्री में कम से कम 10 शब्द होने चाहिए (वर्तमान: {count} शब्द)", + "titlesGenerated": "💡 {count} शीर्षक उत्पन्न हुए!", + "transformError": "रूपांतरण के दौरान त्रुटि", + "transformMarkdown": "Markdown में रूपांतरित करें", + "transformSuccess": "पाठ सफलतापूर्वक Markdown में रूपांतरित हो गया!", + "transforming": "रूपांतरित हो रहा है..." }, - "titleSuggestions": { - "available": "शीर्षक सुझाव", - "title": "AI सुझाव", - "generating": "उत्पन्न हो रहा है...", - "selectTitle": "शीर्षक चुनें", - "dismiss": "खारिज करें" + "aiSettings": { + "description": "अपनी AI-संचालित सुविधाओं और प्राथमिकताओं को कॉन्फ़िगर करें", + "error": "सेटिंग अपडेट करने में विफल", + "features": "AI सुविधाएं", + "frequency": "आवृत्ति", + "frequencyDaily": "दैनिक", + "frequencyWeekly": "साप्ताहिक", + "provider": "AI प्रदाता", + "providerAuto": "ऑटो (अनुशंसित)", + "providerOllama": "Ollama (स्थानीय)", + "providerOpenAI": "OpenAI (क्लाउड)", + "saved": "सेटिंग अपडेट की गई", + "saving": "सहेज रहे हैं...", + "title": "AI सेटिंग्स", + "titleSuggestionsDesc": "50+ शब्दों के बाद शीर्षक रहित नोट्स के लिए शीर्षक सुझाएं", + "paragraphRefactorDesc": "AI-संचालित पाठ सुधार विकल्प", + "frequencyDesc": "नोट कनेक्शन कितनी बार विश्लेषण करें", + "providerDesc": "अपना पसंदीदा AI प्रदाता चुनें", + "providerAutoDesc": "Ollama जब उपलब्ध हो, OpenAI फॉलबैक", + "providerOllamaDesc": "100% निजी, स्थानीय रूप से चलता है", + "providerOpenAIDesc": "सबसे सटीक, API कुंजी की आवश्यकता है" + }, + "appearance": { + "description": "ऐप के दिखने के तरीके को अनुकूलित करें", + "title": "दिखावट" + }, + "auth": { + "backToLogin": "लॉगिन पर वापस जाएं", + "checkYourEmail": "अपना ईमेल जांचें", + "createAccount": "अपना खाता बनाएं", + "email": "ईमेल", + "emailPlaceholder": "अपना ईमेल पता दर्ज करें", + "forgotPassword": "पासवर्ड भूल गए?", + "forgotPasswordDescription": "अपना ईमेल पता दर्ज करें और हम आपको पासवर्ड रीसेट करने का लिंक भेजेंगे।", + "forgotPasswordTitle": "पासवर्ड भूल गए", + "hasAccount": "पहले से खाता है?", + "name": "नाम", + "namePlaceholder": "अपना नाम दर्ज करें", + "noAccount": "खाता नहीं है?", + "orContinueWith": "या जारी रखें", + "password": "पासवर्ड", + "passwordMinChars": "पासवर्ड दर्ज करें (न्यूनतम 6 वर्ण)", + "passwordPlaceholder": "अपना पासवर्ड दर्ज करें", + "rememberMe": "मुझे याद रखें", + "resetEmailSent": "यदि आपका ईमेल हमारे सिस्टम में मौजूद है, तो हमने आपके पासवर्ड रीसेट लिंक भेज दिया है।", + "resetPassword": "पासवर्ड रीसेट करें", + "resetPasswordInstructions": "पासवर्ड रीसेट करने के लिए अपना ईमेल दर्ज करें", + "returnToLogin": "लॉगिन पर वापस जाएं", + "sendResetLink": "रीसेट लिंक भेजें", + "sending": "भेज रहे हैं...", + "signIn": "साइन इन करें", + "signInToAccount": "अपने खाते में साइन इन करें", + "signOut": "Sign out", + "signUp": "साइन अप करें" + }, + "autoLabels": { + "analyzing": "नोट्स का विश्लेषण जारी है...", + "createNewLabel": "इस नए लेबल को बनाएं और जोड़ें", + "created": "{count} लेबल सफलतापूर्वक बनाए गए", + "description": "मैंने \"{notebookName}\" ({totalNotes} नोट्स) में पुनरावर्ती विषयों का पता लगाया है। उनके लिए लेबल बनाना है?", + "error": "लेबल सुझाव प्राप्त करने में विफल", + "new": "(नया)", + "noLabelsSelected": "कोई लेबल चयनित नहीं", + "note": "नोट", + "notes": "नोट्स", + "title": "नए लेबल सुझाव", + "typeContent": "लेबल सुझाव प्राप्त करने के लिए सामग्री टाइप करें...", + "typeForSuggestions": "सुझाव प्राप्त करने के लिए टाइप करें..." + }, + "batch": { + "organize": "व्यवस्थित करें", + "organizeWithAI": "AI से व्यवस्थित करें" + }, + "batchOrganization": { + "analyzing": "नोट्स का विश्लेषण जारी है...", + "apply": "लागू करें ({count})", + "applyFailed": "व्यवस्थित करने में विफल", + "applying": "लागू हो रहा है...", + "confidence": "विश्वसनीता", + "description": "AI आपके नोट्स का विश्लेषण करेगा और उन्हें नोटबुक में व्यवस्थित करने का प्रस्ताव देगा।", + "error": "संगठन योजना बनाने में विफल", + "noNotebooks": "कोई नोटबुक उपलब्ध नहीं है। अपने नोट्स को व्यवस्थित करने के लिए पहले नोटबुक बनाएं।", + "noNotesSelected": "कोई नोट चयनित नहीं", + "noSuggestions": "AI इन नोट्स को व्यवस्थित करने का कोई अच्छा तरीका नहीं ढूंढ सका।", + "notesToOrganize": "{count} नोट्स का संगठन करें", + "selectAllIn": "सभी का चयन करें", + "selectNote": "नोट चुनें", + "selected": "{count} चयनित", + "success": "व्यवस्थित करना सफल", + "title": "AI से व्यवस्थित करें", + "unorganized": "{count} नोट्स को वर्गीकृत नहीं किया गया और वे सामान्य नोट्स में रहेंगे।" + }, + "collaboration": { + "accessRevoked": "Access has been revoked", + "addCollaborator": "Add collaborator", + "addCollaboratorDescription": "Add people to collaborate on this note by their email address.", + "alreadyInList": "This email is already in the list", + "canEdit": "Can edit", + "canView": "Can view", + "done": "Done", + "emailAddress": "Email address", + "emailPlaceholder": "Enter email address", + "enterEmailAddress": "Enter email address", + "errorLoading": "Error loading collaborators", + "failedToAdd": "Failed to add collaborator", + "failedToRemove": "Failed to remove collaborator", + "invite": "Invite", + "noCollaborators": "No collaborators yet. Add someone above!", + "noCollaboratorsViewer": "No collaborators yet.", + "nowHasAccess": "{name} now has access to this note", + "owner": "Owner", + "pending": "Pending", + "pendingInvite": "Pending Invite", + "peopleWithAccess": "People with access", + "remove": "Remove", + "removeCollaborator": "Remove collaborator", + "shareNote": "Share note", + "shareWithCollaborators": "Share with collaborators", + "unnamedUser": "Unnamed User", + "viewerDescription": "You have access to this note. Only the owner can manage collaborators.", + "willBeAdded": "{email} will be added as collaborator when note is created" + }, + "colors": { + "blue": "नीला", + "default": "डिफ़ॉल्ट", + "gray": "ग्रे", + "green": "हरा", + "orange": "नारंगी", + "pink": "गुलाबी", + "purple": "बैंगनी", + "red": "लाल", + "yellow": "पीला" + }, + "common": { + "add": "जोड़ें", + "cancel": "रद्द करें", + "close": "बंद करें", + "confirm": "पुष्टि करें", + "delete": "हटाएं", + "edit": "संपादित करें", + "error": "त्रुटि", + "loading": "लोड हो रहा है...", + "noResults": "कोई परिणाम नहीं", + "notAvailable": "उपलब्ध नहीं", + "optional": "वैकल्पिक", + "remove": "हटाएं", + "required": "आवश्यक", + "save": "सहेजें", + "search": "खोजें", + "success": "सफल", + "unknown": "अज्ञात" + }, + "connection": { + "clickToView": "नोट देखने के लिए क्लिक करें", + "helpful": "मददगार", + "isHelpful": "क्या यह कनेक्शन मददगार है?", + "memoryEchoDiscovery": "Memory Echo खोज", + "notHelpful": "असहायक", + "similarityInfo": "ये नोट्स {similarity}% समानता से जुड़े हैं" + }, + "dataManagement": { + "cleanup": { + "button": "साफ़ करें", + "description": "हटाए गए नोट्स का संदर्भ देने वाले लेबल और कनेक्शन हटाएं।", + "failed": "सफ़ाई के दौरान त्रुटि", + "title": "ऑर्फन डेटा साफ़ करें" + }, + "cleanupComplete": "सफ़ाई पूर्ण", + "cleanupError": "सफ़ाई त्रुटि", + "dangerZone": "खतरे का क्षेत्र", + "dangerZoneDescription": "ये कार्रवाई पूर्ववत नहीं की जा सकती, सावधान रहें", + "delete": { + "button": "सभी नोट्स हटाएं", + "confirm": "क्या आप सुनिश्चित हैं? यह आपके सभी नोट्स को स्थायी रूप से हटा देगा।", + "description": "अपने सभी नोट्स को स्थायी रूप से हटाएं। यह क्रिया पूर्ववत नहीं की जा सकती।", + "failed": "नोट्स हटाने में विफल", + "success": "सभी नोट्स हटा दिए गए", + "title": "सभी नोट्स हटाएं" + }, + "deleting": "हटाया जा रहा है...", + "export": { + "button": "नोट्स निर्यात करें", + "description": "अपने सभी नोट्स को JSON फ़ाइल के रूप में डाउनलोड करें। इसमें सभी सामग्री, लेबल और मेटाडेटा शामिल हैं।", + "failed": "नोट्स निर्यात करने में विफल", + "success": "नोट्स सफलतापूर्वक निर्यात किए गए", + "title": "सभी नोट्स निर्यात करें" + }, + "exporting": "निर्यात हो रहा है...", + "import": { + "button": "नोट्स आयात करें", + "description": "नोट्स आयात करने के लिए JSON फ़ाइल अपलोड करें। यह आपके मौजूदा नोट्स में जोड़ेगा, बदले नहीं।", + "failed": "नोट्स आयात करने में विफल", + "success": "{count} नोट्स आयात किए गए", + "title": "नोट्स आयात करें" + }, + "importing": "आयात हो रहा है...", + "indexing": { + "button": "इंडेक्स पुनर्निर्माण करें", + "description": "सिमेंटिक खोज में सुधार के लिए सभी नोट्स के लिए एम्बेडिंग्स पुनः उत्पन्न करें।", + "failed": "इंडेक्सिंग के दौरान त्रुटि", + "success": "इंडेक्सिंग पूर्ण: {count} नोट्स संसाधित", + "title": "खोज इंडेक्स पुनर्निर्माण करें" + }, + "indexingComplete": "इंडेक्सिंग पूर्ण", + "indexingError": "इंडेक्सिंग त्रुटि", + "title": "डेटा प्रबंधन", + "toolsDescription": "अपने डेटाबेस स्वास्थ्य को बनाए रखने के लिए उपकरण" + }, + "demoMode": { + "activated": "डेमो मोड सक्रिय! Memory Echo अब तुरंत काम करेगा।", + "createNotesTip": "2+ समान नोट्स बनाएं और Memory Echo को काम करते हुए देखें!", + "deactivated": "डेमो मोड अक्षम। सामान्य पैरामीटर बहाल।", + "delayBetweenNotes": "नोट्स के बीच 0-दिन की देरी (आमतौर पर 7 दिन)", + "description": "परीक्षण के लिए Memory Echo को तेज करता है। कनेक्शन तुरंत दिखाई देते हैं।", + "parametersActive": "डेमो पैरामीटर सक्रिय:", + "similarityThreshold": "50% समानता थ्रेशोल्ड (आमतौर पर 75%)", + "title": "डेमो मोड", + "toggleFailed": "डेमो मोड टॉगल करने में विफल", + "unlimitedInsights": "असीमित अंतर्दृष्टि (कोई आवृत्ति सीमा नहीं)" + }, + "diagnostics": { + "apiStatus": "API स्थिति", + "checking": "Checking...", + "configuredProvider": "कॉन्फ़िगर किया गया प्रदाता", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "परीक्षण विवरण:", + "tip1": "सुनिश्चित करें कि Ollama चल रहा है (ollama serve)", + "tip2": "जांचें कि मॉडल इंस्टॉल है (ollama pull llama3)", + "tip3": "अपनी OpenAI API कुंजी सत्यापित करें", + "tip4": "नेटवर्क कनेक्टिविटी जांचें", + "title": "निदान", + "troubleshootingTitle": "समस्या निवारण सुझाव:" + }, + "favorites": { + "noFavorites": "कोई पसंदीदा नहीं", + "pinToFavorite": "पसंदीदा में पिन करें", + "title": "पसंदीदा", + "toggleSection": "पसंदीदा अनुभाग टॉगल करें" + }, + "footer": { + "openSource": "ओपन सोर्स क्लोन", + "privacy": "गोपनीयता", + "terms": "नियम" + }, + "general": { + "add": "जोड़ें", + "apply": "लागू करें", + "back": "वापस", + "cancel": "रद्द करें", + "clean": "Clean", + "clear": "साफ़ करें", + "close": "बंद करें", + "confirm": "पुष्टि करें", + "edit": "संपादित करें", + "error": "एक त्रुटि हुई", + "indexAll": "Index All", + "loading": "लोड हो रहा है...", + "next": "अगला", + "operationFailed": "ऑपरेशन विफल", + "operationSuccess": "ऑपरेशन सफल", + "preview": "पूर्वावलोकन", + "previous": "पिछला", + "reset": "रीसेट करें", + "save": "सहेजें", + "select": "चुनें", + "submit": "जमा करें", + "testConnection": "Test Connection", + "tryAgain": "कृपया पुनः प्रयास करें" + }, + "generalSettings": { + "description": "सामान्य एप्लिकेशन सेटिंग्स", + "title": "सामान्य सेटिंग्स" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} labels", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "No labels", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "नोट देखने के लिए क्लिक करें", + "comparison": { + "clickToView": "नोट देखने के लिए क्लिक करें", + "helpful": "मददगार", + "helpfulQuestion": "क्या यह तुलना मददगार है?", + "highSimilarityInsight": "ये नोट्स उच्च समानता के साथ एक ही विषय से संबंधित हैं। इन्हें मर्ज या समेकित किया जा सकता है।", + "notHelpful": "असहायक", + "similarityInfo": "ये नोट्स {similarity}% समानता से कनेक्टेड हैं", + "title": "💡 नोट्स की तुलना", + "untitled": "शीर्षकहीन" + }, + "connection": "कनेक्शन", + "connections": "कनेक्शन", + "connectionsBadge": "{count} कनेक्शन", + "dailyInsight": "अपने नोट्स से दैनिक अंतर्दृष्टि", + "description": "आपके नोट्स के बीच सक्रिय कनेक्शन", + "dismiss": "अभी खारिज करें", + "editorSection": { + "close": "बंद करें", + "compare": "तुलना करें", + "compareAll": "सभी की तुलना करें", + "loading": "लोड हो रहा है...", + "merge": "मर्ज करें", + "mergeAll": "सभी को मर्ज करें", + "title": "⚡ कनेक्टेड नोट्स ({count})", + "view": "देखें" + }, + "fused": "फ्यूज्ड", + "fusion": { + "archiveOriginals": "मूल नोट्स संग्रहित करें", + "cancel": "रद्द करें", + "confirmFusion": "फ्यूजन पुष्टि करें", + "createBacklinks": "मूल नोट्स के लिए बैकलिंक बनाएं", + "edit": "संपादित करें", + "error": "नोट्स मर्ज करने में विफल", + "finishEditing": "संपादन समाप्त करें", + "generateError": "Failed to generate fusion", + "generateFusion": "फ्यूजन उत्पन्न करें", + "generating": "उत्पन्न हो रहा है...", + "keepAllTags": "सभी टैग रखें", + "mergeNotes": "{count} नोट मर्ज करें", + "modify": "संशोधित करें", + "noContentReturned": "No fusion content returned from API", + "notesToMerge": "📝 मर्ज करने के लिए नोट्स", + "optionalPrompt": "💬 फ्यूजन प्रॉम्प्ट (वैकल्पिक)", + "optionsTitle": "फ्यूजन विकल्प", + "previewTitle": "📝 मर्ज किए गए नोट का पूर्वावलोकन", + "promptPlaceholder": "AI के लिए वैकल्पिक निर्देश (जैसे, 'नोट 1 की औपचारिक शैली बनाए रखें')...", + "success": "नोट्स सफलतापूर्वक मर्ज किए गए!", + "title": "🔗 इंटेलिजेंट फ्यूजन", + "unknownDate": "Unknown date", + "useLatestTitle": "नवीनतम नोट को शीर्षक के रूप में उपयोग करें" + }, + "helpful": "मददगार", + "insightReady": "आपकी अंतर्दृष्टि तैयार है!", + "notHelpful": "असहायक", + "overlay": { + "error": "कनेक्शन लोड करने में त्रुटि", + "loading": "लोड हो रहा है...", + "noConnections": "कोई कनेक्शन नहीं मिला", + "searchPlaceholder": "कनेक्शन खोजें...", + "sortBy": "इससे क्रमबद्ध करें:", + "sortOldest": "सबसे पुराना", + "sortRecent": "हालिया", + "sortSimilarity": "समानता", + "title": "कनेक्टेड नोट्स", + "viewAll": "सभी को साथ-साथ देखें" + }, + "thanksFeedback": "आपकी प्रतिक्रिया के लिए धन्यवाद!", + "thanksFeedbackImproving": "धन्यवाद! हम इसे सुधार के लिए उपयोग करेंगे।", + "title": "मैंने कुछ नोटिस किया...", + "viewConnection": "कनेक्शन देखें" + }, + "nav": { + "accountSettings": "खाता सेटिंग्स", + "adminDashboard": "एडमिन डैशबोर्ड", + "aiSettings": "AI सेटिंग्स", + "archive": "संग्रह", + "buyMeACoffee": "मुझे कॉफी खरीदें", + "configureAI": "अपनी AI-संचालित सुविधाओं, प्रदाता और प्राथमिकताओं को कॉन्फ़िगर करें", + "diagnostics": "निदान", + "donateOnKofi": "Ko-fi पर दान करें", + "donationDescription": "एक बार का दान करें या मासिक समर्थक बनें।", + "donationNote": "कोई प्लेटफ़ॉर्म शुल्क नहीं • त्वरित भुगतान • सुरक्षित", + "favorites": "पसंदीदा", + "generalNotes": "सामान्य नोट्स", + "home": "होम", + "login": "लॉग इन", + "logout": "लॉग आउट", + "manageAISettings": "AI सेटिंग्स प्रबंधित करें", + "myLibrary": "मेरी लाइब्रेरी", + "notebooks": "नोटबुक", + "notes": "नोट्स", + "proPlan": "प्रो योजना", + "profile": "प्रोफ़ाइल", + "quickAccess": "त्वरित पहुँच", + "recent": "हालिया", + "reminders": "रिमाइंडर", + "settings": "सेटिंग्स", + "sponsorDescription": "मासिक प्रायोजक बनें और मान्यता प्राप्त करें।", + "sponsorOnGithub": "GitHub पर प्रायोजित करें", + "support": "Memento का समर्थन करें ☕", + "supportDescription": "Memento 100% निःशुल्क और ओपन-सोर्स है। आपका समर्थन इसे ऐसे ही बनाए रखने में मदद करता है।", + "supportDevelopment": "Memento विकास का समर्थन करें ☕", + "trash": "कचरा", + "userManagement": "उपयोगकर्ता प्रबंधन", + "workspace": "कार्यस्थल" + }, + "notebook": { + "cancel": "रद्द करें", + "create": "नोटबुक बनाएं", + "createDescription": "अपने नोट्स, विचारों और परियोजनाओं को कुशलता से व्यवस्थित करने के लिए एक नया संग्रह शुरू करें।", + "createNew": "नया नोटबुक बनाएं", + "creating": "बना रहे हैं...", + "delete": "नोटबुक हटाएं", + "deleteConfirm": "हटाएं", + "deleteWarning": "क्या आप वाकई इस नोटबुक को हटाना चाहते हैं? नोट्स को सामान्य नोट्स में ले जाया जाएगा।", + "edit": "नोटबुक संपादित करें", + "editDescription": "नोटबुक का नाम, आइकन और रंग बदलें।", + "generating": "सारांश उत्पन्न हो रहा है...", + "labels": "लेबल", + "name": "नोटबुक नाम", + "noLabels": "कोई लेबल नहीं", + "selectColor": "रंग", + "selectIcon": "आइकन", + "summary": "नोटबुक सारांश", + "summaryDescription": "इस नोटबुक के सभी नोट्स का AI-संचालित सारांश उत्पन्न करें।", + "summaryError": "सारांश उत्पन्न करने में त्रुटि" + }, + "notebookSuggestion": { + "description": "यह नोट इस नोटबुक से संबंधित प्रतीत होता है", + "dismiss": "खारिज करें", + "dismissIn": "खारिज करें ({timeLeft}सेकंड में बंद होगा)", + "generalNotes": "सामान्य नोट्स", + "move": "ले जाएं", + "moveToNotebook": "नोटबुक में ले जाएं", + "title": "{icon} {name} में ले जाएं?" + }, + "notebooks": { + "allNotebooks": "सभी नोटबुक", + "create": "नोटबुक बनाएं", + "createFirst": "अपनी पहली नोटबुक बनाएं", + "noNotebooks": "कोई नोटबुक नहीं" + }, + "notes": { + "add": "जोड़ें", + "addCollaborators": "सहयोगी जोड़ें", + "addImage": "छवि जोड़ें", + "addItem": "आइटम जोड़ें", + "addLink": "लिंक जोड़ें", + "addListItem": "+ सूची आइटम", + "addNote": "नोट जोड़ें", + "adding": "जोड़ रहे हैं...", + "aiAssistant": "AI सहायक", + "archive": "संग्रहित करें", + "backgroundOptions": "बैकग्राउंड विकल्प", + "changeColor": "रंग बदलें", + "changeSize": "आकार बदलें", + "clarifyFailed": "स्पष्ट करने में विफल", + "close": "बंद करें", + "color": "रंग", + "confirmDelete": "क्या आप वाकई इस नोट को हटाना चाहते हैं?", + "confirmLeaveShare": "क्या आप वाकई इस साझा नोट को छोड़ना चाहते हैं?", + "contentOrMediaRequired": "कृपया कुछ सामग्री दर्ज करें या लिंक/छवि जोड़ें", + "copy": "कॉपी", + "copyFailed": "नोट कॉपी करने में विफल", + "copySuccess": "नोट सफलतापूर्वक कॉपी किया गया!", + "createFirstNote": "अपना पहला नोट बनाएं", + "date": "दिनांक", + "delete": "हटाएं", + "dragToReorder": "पुनर्व्यवस्थित करने के लिए खींचें", + "duplicate": "डुप्लिकेट", + "edit": "नोट संपादित करें", + "emptyState": "कोई नोट नहीं", + "fileTooLarge": "फ़ाइल बहुत बड़ी है: {fileName}. अधिकतम आकार {maxSize} है।", + "improveFailed": "सुधारने में विफल", + "inNotebook": "नोटबुक में", + "invalidDateTime": "अमान्य दिनांक या समय", + "invalidFileType": "अमान्य फ़ाइल प्रकार: {fileName}. केवल JPEG, PNG, GIF और WebP अनुमत हैं।", + "itemOrMediaRequired": "कृपया कम से कम एक आइटम या मीडिया जोड़ें", + "large": "बड़ा", + "leaveShare": "छोड़ें", + "linkAddFailed": "लिंक जोड़ने में विफल", + "linkAdded": "लिंक जोड़ा गया", + "linkMetadataFailed": "लिंक मेटाडेटा प्राप्त नहीं किया जा सका", + "listItem": "सूची आइटम", + "makeCopy": "कॉपी बनाएं", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown बंद", + "markdownOn": "Markdown चालू", + "markdownPlaceholder": "नोट लें... (Markdown समर्थित)", + "medium": "मध्यम", + "more": "अधिक", + "moreOptions": "अधिक विकल्प", + "moveFailed": "ले जाने में विफल", + "newChecklist": "नई चेकलिस्ट", + "newNote": "नया नोट", + "noContent": "कोई सामग्री नहीं", + "noNotes": "कोई नोट नहीं", + "noNotesFound": "कोई नोट नहीं मिला", + "noteCreateFailed": "नोट बनाने में विफल", + "noteCreated": "नोट सफलतापूर्वक बनाया गया", + "others": "अन्य", + "pin": "पिन करें", + "pinned": "पिन किए गए", + "pinnedNotes": "पिन किए गए नोट्स", + "placeholder": "नोट लें...", + "preview": "पूर्वावलोकन", + "readOnly": "केवल पढ़ने के लिए", + "recent": "हालिया", + "redo": "फिर से करें (Ctrl+Y)", + "redoShortcut": "फिर से करें (Ctrl+Y)", + "remindMe": "मुझे याद दिलाएं", + "reminderDateTimeRequired": "कृपया दिनांक और समय दर्ज करें", + "reminderMustBeFuture": "रिमाइंडर भविष्य में होना चाहिए", + "reminderPastError": "रिमाइंडर भविष्य में होना चाहिए", + "reminderRemoved": "रिमाइंडर हटा दिया गया", + "reminderSet": "{datetime} के लिए रिमाइंडर सेट किया गया", + "remove": "हटाएं", + "saving": "सहेज रहे हैं...", + "setReminder": "रिमाइंडर सेट करें", + "setReminderButton": "रिमाइंडर सेट करें", + "share": "साझा करें", + "shareWithCollaborators": "सहयोगियों के साथ साझा करें", + "sharedBy": "द्वारा साझा किया गया", + "sharedReadOnly": "यह नोट आपके साथ केवल-पढ़ने के मोड में साझा किया गया है", + "shortenFailed": "छोटा करने में विफल", + "showCollaborators": "सहयोगी दिखाएं", + "size": "आकार", + "small": "छोटा", + "takeNote": "नोट लें...", + "takeNoteMarkdown": "नोट लें... (Markdown समर्थित)", + "time": "समय", + "title": "नोट्स", + "titlePlaceholder": "शीर्षक", + "transformFailed": "रूपांतरित करने में विफल", + "unarchive": "संग्रह से निकालें", + "undo": "पूर्ववत करें (Ctrl+Z)", + "undoShortcut": "पूर्ववत करें (Ctrl+Z)", + "unpin": "अनपिन करें", + "unpinned": "अनपिन किया गया", + "untitled": "शीर्षकहीन", + "uploadFailed": "{filename} अपलोड करने में विफल", + "view": "नोट देखें" + }, + "pagination": { + "next": "→", + "pageInfo": "पृष्ठ {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "अनौपचारिक", + "expand": "विस्तार करें", + "formal": "औपचारिक", + "improve": "सुधारें", + "shorten": "छोटा करें", + "title": "पाठ सुधार" + }, + "profile": { + "accountSettings": "खाता सेटिंग्स", + "autoDetect": "स्वचालित पता लगाना", + "changePassword": "पासवर्ड बदलें", + "changePasswordDescription": "अपना पासवर्ड अपडेट करें। आपको वर्तमान पासवर्ड की आवश्यकता होगी।", + "confirmPassword": "पासवर्ड की पुष्टि करें", + "currentPassword": "वर्तमान पासवर्ड", + "description": "अपनी व्यक्तिगत जानकारी अपडेट करें", + "displayName": "प्रदर्शन नाम", + "displaySettings": "प्रदर्शन सेटिंग्स", + "displaySettingsDescription": "दिखावट और फ़ॉन्ट आकार को अनुकूलित करें।", + "email": "ईमेल", + "fontSize": "फ़ॉन्ट आकार", + "fontSizeDescription": "बेहतर पठनीयता के लिए फ़ॉन्ट आकार समायोजित करें। यह इंटरफेस के सभी पाठ पर लागू होता है।", + "fontSizeExtraLarge": "बहुत बड़ा", + "fontSizeLarge": "बड़ा", + "fontSizeMedium": "मध्यम", + "fontSizeSmall": "छोटा", + "fontSizeUpdateFailed": "फ़ॉन्ट आकार अपडेट करने में विफल", + "fontSizeUpdateSuccess": "फ़ॉन्ट आकार सफलतापूर्वक अपडेट किया गया", + "languageDescription": "यह भाषा AI-संचालित सुविधाओं, सामग्री विश्लेषण और इंटरफेस पाठ के लिए उपयोग की जाएगी।", + "languagePreferences": "भाषा प्राथमिकताएं", + "languagePreferencesDescription": "AI सुविधाओं और इंटरफेस के लिए अपनी पसंदीदा भाषा चुनें।", + "languageUpdateFailed": "भाषा अपडेट करने में विफल", + "languageUpdateSuccess": "भाषा सफलतापूर्वक अपडेट की गई", + "manageAISettings": "AI सेटिंग्स प्रबंधित करें", + "newPassword": "नया पासवर्ड", + "passwordChangeFailed": "पासवर्ड बदलने में विफल", + "passwordChangeSuccess": "पासवर्ड सफलतापूर्वक बदला गया", + "passwordError": "पासवर्ड अपडेट करने में त्रुटि", + "passwordUpdated": "पासवर्ड अपडेट किया गया", + "preferredLanguage": "पसंदीदा भाषा", + "profileError": "प्रोफ़ाइल अपडेट करने में त्रुटि", + "profileUpdated": "प्रोफ़ाइल अपडेट किया गया", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "फ़ॉन्ट आकार चुनें", + "selectLanguage": "भाषा चुनें", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "प्रोफ़ाइल", + "updateFailed": "प्रोफ़ाइल अपडेट करने में विफल", + "updatePassword": "पासवर्ड अपडेट करें", + "updateSuccess": "प्रोफ़ाइल अपडेट किया गया" + }, + "reminder": { + "cancel": "रद्द करें", + "reminderDate": "रिमाइंडर दिनांक", + "reminderTime": "रिमाइंडर समय", + "removeReminder": "रिमाइंडर हटाएं", + "save": "रिमाइंडर सेट करें", + "setReminder": "रिमाइंडर सेट करें", + "title": "रिमाइंडर" + }, + "resetPassword": { + "confirmNewPassword": "नए पासवर्ड की पुष्टि करें", + "description": "नीचे अपना नया पासवर्ड दर्ज करें।", + "invalidLinkDescription": "यह पासवर्ड रीसेट लिंक अमान्य या समाप्त हो गया है।", + "invalidLinkTitle": "अमान्य लिंक", + "loading": "लोड हो रहा है...", + "newPassword": "नया पासवर्ड", + "passwordMismatch": "पासवर्ड मेल नहीं खाते", + "requestNewLink": "नया लिंक अनुरोध करें", + "resetPassword": "पासवर्ड रीसेट करें", + "resetting": "रीसेट हो रहा है...", + "success": "पासवर्ड सफलतापूर्वक रीसेट किया गया। अब आप लॉगिन कर सकते हैं।", + "title": "पासवर्ड रीसेट करें" + }, + "search": { + "exactMatch": "Exact match", + "noResults": "No results found", + "placeholder": "Search", + "related": "Related", + "resultsFound": "{count} notes found", + "searchPlaceholder": "Search your notes...", + "searching": "Searching...", + "semanticInProgress": "AI search in progress...", + "semanticTooltip": "AI semantic search" }, "semanticSearch": { "exactMatch": "सटीक मेल", "related": "संबंधित", "searching": "खोज रहे हैं..." }, - "paragraphRefactor": { - "title": "पाठ सुधार", - "shorten": "छोटा करें", - "expand": "विस्तार करें", - "improve": "सुधारें", - "formal": "औपचारिक", - "casual": "अनौपचारिक" - }, - "memoryEcho": { - "title": "मैंने कुछ नोटिस किया...", - "description": "आपके नोट्स के बीच सक्रिय कनेक्शन", - "dailyInsight": "अपने नोट्स से दैनिक अंतर्दृष्टि", - "insightReady": "आपकी अंतर्दृष्टि तैयार है!", - "viewConnection": "कनेक्शन देखें", - "helpful": "मददगार", - "notHelpful": "असहायक", - "dismiss": "अभी खारिज करें", - "thanksFeedback": "आपकी प्रतिक्रिया के लिए धन्यवाद!", - "thanksFeedbackImproving": "धन्यवाद! हम इसे सुधार के लिए उपयोग करेंगे।", - "connections": "कनेक्शन", - "connection": "कनेक्शन", - "connectionsBadge": "{count} कनेक्शन", - "fused": "फ्यूज्ड", - "overlay": { - "title": "कनेक्टेड नोट्स", - "searchPlaceholder": "कनेक्शन खोजें...", - "sortBy": "इससे क्रमबद्ध करें:", - "sortSimilarity": "समानता", - "sortRecent": "हालिया", - "sortOldest": "सबसे पुराना", - "viewAll": "सभी को साथ-साथ देखें", - "loading": "लोड हो रहा है...", - "noConnections": "कोई कनेक्शन नहीं मिला" - }, - "comparison": { - "title": "💡 नोट्स की तुलना", - "similarityInfo": "ये नोट्स {similarity}% समानता से कनेक्टेड हैं", - "highSimilarityInsight": "ये नोट्स उच्च समानता के साथ एक ही विषय से संबंधित हैं। इन्हें मर्ज या समेकित किया जा सकता है।", - "untitled": "शीर्षकहीन", - "clickToView": "नोट देखने के लिए क्लिक करें", - "helpfulQuestion": "क्या यह तुलना मददगार है?", - "helpful": "मददगार", - "notHelpful": "असहायक" - }, - "editorSection": { - "title": "⚡ कनेक्टेड नोट्स ({count})", - "loading": "लोड हो रहा है...", - "view": "देखें", - "compare": "तुलना करें", - "merge": "मर्ज करें", - "compareAll": "सभी की तुलना करें", - "mergeAll": "सभी को मर्ज करें" - }, - "fusion": { - "title": "🔗 इंटेलिजेंट फ्यूजन", - "mergeNotes": "{count} नोट मर्ज करें", - "notesToMerge": "📝 मर्ज करने के लिए नोट्स", - "optionalPrompt": "💬 फ्यूजन प्रॉम्प्ट (वैकल्पिक)", - "promptPlaceholder": "AI के लिए वैकल्पिक निर्देश (जैसे, 'नोट 1 की औपचारिक शैली बनाए रखें')...", - "generateFusion": "फ्यूजन उत्पन्न करें", - "generating": "उत्पन्न हो रहा है...", - "previewTitle": "📝 मर्ज किए गए नोट का पूर्वावलोकन", - "edit": "संपादित करें", - "modify": "संशोधित करें", - "finishEditing": "संपादन समाप्त करें", - "optionsTitle": "फ्यूजन विकल्प", - "archiveOriginals": "मूल नोट्स संग्रहित करें", - "keepAllTags": "सभी टैग रखें", - "useLatestTitle": "नवीनतम नोट को शीर्षक के रूप में उपयोग करें", - "createBacklinks": "मूल नोट्स के लिए बैकलिंक बनाएं", - "cancel": "रद्द करें", - "confirmFusion": "फ्यूजन पुष्टि करें", - "success": "नोट्स सफलतापूर्वक मर्ज किए गए!", - "error": "नोट्स मर्ज करने में विफल" - } - }, - "nav": { - "home": "होम", - "notes": "नोट्स", - "notebooks": "नोटबुक", - "generalNotes": "सामान्य नोट्स", - "archive": "संग्रह", - "settings": "सेटिंग्स", - "profile": "प्रोफ़ाइल", - "aiSettings": "AI सेटिंग्स", - "logout": "लॉग आउट", - "login": "लॉग इन", - "adminDashboard": "एडमिन डैशबोर्ड", - "diagnostics": "निदान", - "trash": "कचरा", - "support": "Memento का समर्थन करें ☕", - "reminders": "रिमाइंडर", - "userManagement": "उपयोगकर्ता प्रबंधन", - "accountSettings": "खाता सेटिंग्स", - "manageAISettings": "AI सेटिंग्स प्रबंधित करें", - "configureAI": "अपनी AI-संचालित सुविधाओं, प्रदाता और प्राथमिकताओं को कॉन्फ़िगर करें", - "supportDevelopment": "Memento विकास का समर्थन करें ☕", - "supportDescription": "Memento 100% निःशुल्क और ओपन-सोर्स है। आपका समर्थन इसे ऐसे ही बनाए रखने में मदद करता है।", - "buyMeACoffee": "मुझे कॉफी खरीदें", - "donationDescription": "एक बार का दान करें या मासिक समर्थक बनें।", - "donateOnKofi": "Ko-fi पर दान करें", - "donationNote": "कोई प्लेटफ़ॉर्म शुल्क नहीं • त्वरित भुगतान • सुरक्षित", - "sponsorOnGithub": "GitHub पर प्रायोजित करें", - "sponsorDescription": "मासिक प्रायोजक बनें और मान्यता प्राप्त करें।", - "workspace": "कार्यस्थल", - "quickAccess": "त्वरित पहुँच", - "myLibrary": "मेरी लाइब्रेरी", - "favorites": "पसंदीदा", - "recent": "हालिया", - "proPlan": "प्रो योजना" - }, "settings": { - "title": "सेटिंग्स", - "description": "अपनी सेटिंग्स और प्राथमिकताएं प्रबंधित करें", + "about": "के बारे में", "account": "खाता", "appearance": "दिखावट", - "theme": "थीम", - "themeLight": "लाइट", - "themeDark": "डार्क", - "themeSystem": "सिस्टम", - "notifications": "सूचनाएं", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "अपनी सेटिंग्स और प्राथमिकताएं प्रबंधित करें", "language": "भाषा", - "selectLanguage": "भाषा चुनें", + "languageAuto": "स्वचालित पता लगाना", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "सूचनाएं", "privacy": "गोपनीयता", + "profile": "प्रोफ़ाइल", + "searchNoResults": "कोई मिलान सेटिंग्स नहीं मिली", "security": "सुरक्षा", - "about": "के बारे में", - "version": "संस्करण", - "settingsSaved": "सेटिंग्स सहेजी गई", - "settingsError": "सेटिंग्स सहेजने में त्रुटि" - }, - "profile": { - "title": "प्रोफ़ाइल", - "description": "अपनी व्यक्तिगत जानकारी अपडेट करें", - "displayName": "प्रदर्शन नाम", - "email": "ईमेल", - "changePassword": "पासवर्ड बदलें", - "changePasswordDescription": "अपना पासवर्ड अपडेट करें। आपको वर्तमान पासवर्ड की आवश्यकता होगी।", - "currentPassword": "वर्तमान पासवर्ड", - "newPassword": "नया पासवर्ड", - "confirmPassword": "पासवर्ड की पुष्टि करें", - "updatePassword": "पासवर्ड अपडेट करें", - "passwordChangeSuccess": "पासवर्ड सफलतापूर्वक बदला गया", - "passwordChangeFailed": "पासवर्ड बदलने में विफल", - "passwordUpdated": "पासवर्ड अपडेट किया गया", - "passwordError": "पासवर्ड अपडेट करने में त्रुटि", - "languagePreferences": "भाषा प्राथमिकताएं", - "languagePreferencesDescription": "AI सुविधाओं और इंटरफेस के लिए अपनी पसंदीदा भाषा चुनें।", - "preferredLanguage": "पसंदीदा भाषा", "selectLanguage": "भाषा चुनें", - "languageDescription": "यह भाषा AI-संचालित सुविधाओं, सामग्री विश्लेषण और इंटरफेस पाठ के लिए उपयोग की जाएगी।", - "autoDetect": "स्वचालित पता लगाना", - "updateSuccess": "प्रोफ़ाइल अपडेट किया गया", - "updateFailed": "प्रोफ़ाइल अपडेट करने में विफल", - "languageUpdateSuccess": "भाषा सफलतापूर्वक अपडेट की गई", - "languageUpdateFailed": "भाषा अपडेट करने में विफल", - "profileUpdated": "प्रोफ़ाइल अपडेट किया गया", - "profileError": "प्रोफ़ाइल अपडेट करने में त्रुटि", - "accountSettings": "खाता सेटिंग्स", - "manageAISettings": "AI सेटिंग्स प्रबंधित करें", - "displaySettings": "प्रदर्शन सेटिंग्स", - "displaySettingsDescription": "दिखावट और फ़ॉन्ट आकार को अनुकूलित करें।", - "fontSize": "फ़ॉन्ट आकार", - "selectFontSize": "फ़ॉन्ट आकार चुनें", - "fontSizeSmall": "छोटा", - "fontSizeMedium": "मध्यम", - "fontSizeLarge": "बड़ा", - "fontSizeExtraLarge": "बहुत बड़ा", - "fontSizeDescription": "बेहतर पठनीयता के लिए फ़ॉन्ट आकार समायोजित करें। यह इंटरफेस के सभी पाठ पर लागू होता है।", - "fontSizeUpdateSuccess": "फ़ॉन्ट आकार सफलतापूर्वक अपडेट किया गया", - "fontSizeUpdateFailed": "फ़ॉन्ट आकार अपडेट करने में विफल" + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "सेटिंग्स सहेजने में त्रुटि", + "settingsSaved": "सेटिंग्स सहेजी गई", + "theme": "थीम", + "themeDark": "डार्क", + "themeLight": "लाइट", + "themeSystem": "सिस्टम", + "title": "सेटिंग्स", + "version": "संस्करण" }, - "aiSettings": { - "title": "AI सेटिंग्स", - "description": "अपनी AI-संचालित सुविधाओं और प्राथमिकताओं को कॉन्फ़िगर करें", - "features": "AI सुविधाएं", - "provider": "AI प्रदाता", - "providerAuto": "ऑटो (अनुशंसित)", - "providerOllama": "Ollama (स्थानीय)", - "providerOpenAI": "OpenAI (क्लाउड)", - "frequency": "आवृत्ति", - "frequencyDaily": "दैनिक", - "frequencyWeekly": "साप्ताहिक", - "saving": "सहेज रहे हैं...", - "saved": "सेटिंग अपडेट की गई", - "error": "सेटिंग अपडेट करने में विफल" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" }, - "general": { - "loading": "लोड हो रहा है...", - "save": "सहेजें", - "cancel": "रद्द करें", - "add": "जोड़ें", - "edit": "संपादित करें", - "confirm": "पुष्टि करें", - "close": "बंद करें", - "back": "वापस", - "next": "अगला", - "previous": "पिछला", - "submit": "जमा करें", - "reset": "रीसेट करें", - "apply": "लागू करें", - "clear": "साफ़ करें", - "select": "चुनें", - "tryAgain": "कृपया पुनः प्रयास करें", - "error": "एक त्रुटि हुई", - "operationSuccess": "ऑपरेशन सफल", - "operationFailed": "ऑपरेशन विफल" + "support": { + "aiApiCosts": "AI API लागत:", + "buyMeACoffee": "मुझे कॉफी खरीदें", + "contributeCode": "कोड योगदान करें", + "description": "Memento 100% निःशुल्क और ओपन-सोर्स है। आपका समर्थन इसे ऐसे ही बनाए रखने में मदद करता है।", + "directImpact": "प्रत्यक्ष प्रभाव", + "domainSSL": "डोमेन और SSL:", + "donateOnKofi": "Ko-fi पर दान करें", + "donationDescription": "एक बार का दान करें या मासिक समर्थक बनें।", + "githubDescription": "आवर्ती समर्थन • सार्वजनिक मान्यता • डेवलपर-केंद्रित", + "hostingServers": "होस्टिंग और सर्वर:", + "howSupportHelps": "आपका समर्थन कैसे मदद करता है", + "kofiDescription": "कोई प्लेटफ़ॉर्म शुल्क नहीं • त्वरित भुगतान • सुरक्षित", + "otherWaysTitle": "समर्थन करने के अन्य तरीके", + "reportBug": "बग रिपोर्ट करें", + "shareTwitter": "ट्विटर पर साझा करें", + "sponsorDescription": "मासिक प्रायोजक बनें और मान्यता प्राप्त करें।", + "sponsorOnGithub": "GitHub पर प्रायोजित करें", + "sponsorPerks": "प्रायोजक विशेषाधिकार", + "starGithub": "GitHub पर स्टार करें", + "title": "Memento विकास का समर्थन करें", + "totalExpenses": "कुल व्यय:", + "transparency": "पारदर्शिता", + "transparencyDescription": "मैं पूर्ण पारदर्शिता में विश्वास करता हूं। दान का उपयोग इस प्रकार किया जाता है:" }, - "colors": { - "default": "डिफ़ॉल्ट", - "red": "लाल", - "blue": "नीला", - "green": "हरा", - "yellow": "पीला", - "purple": "बैंगनी", - "pink": "गुलाबी", - "orange": "नारंगी", - "gray": "ग्रे" + "testPages": { + "titleSuggestions": { + "analyzing": "विश्लेषण हो रहा है...", + "contentLabel": "सामग्री (50+ शब्दों की आवश्यकता):", + "error": "त्रुटि:", + "idle": "निष्क्रिय", + "noSuggestions": "अभी तक कोई सुझाव नहीं। 50+ शब्द टाइप करें और 2 सेकंड प्रतीक्षा करें।", + "placeholder": "यहां कम से कम 50 शब्द टाइप करें...", + "status": "स्थिति:", + "suggestions": "सुझाव ({count}):", + "title": "शीर्षक सुझाव परीक्षण", + "wordCount": "शब्द गणना:" + } }, - "reminder": { - "title": "रिमाइंडर", - "setReminder": "रिमाइंडर सेट करें", - "removeReminder": "रिमाइंडर हटाएं", - "reminderDate": "रिमाइंडर दिनांक", - "reminderTime": "रिमाइंडर समय", - "save": "रिमाइंडर सेट करें", - "cancel": "रद्द करें" + "time": { + "daysAgo": "{count} दिन पहले", + "hoursAgo": "{count} घंटे पहले", + "justNow": "अभी", + "minutesAgo": "{count} मिनट पहले", + "today": "आज", + "tomorrow": "कल", + "yesterday": "कल" }, - "notebookSuggestion": { - "title": "{icon} {name} में ले जाएं?", - "description": "यह नोट इस नोटबुक से संबंधित प्रतीत होता है", - "move": "ले जाएं", + "titleSuggestions": { + "available": "शीर्षक सुझाव", "dismiss": "खारिज करें", - "dismissIn": "खारिज करें ({timeLeft}सेकंड में बंद होगा)", - "moveToNotebook": "नोटबुक में ले जाएं", - "generalNotes": "सामान्य नोट्स" + "generating": "उत्पन्न हो रहा है...", + "selectTitle": "शीर्षक चुनें", + "title": "AI सुझाव" + }, + "toast": { + "feedbackFailed": "प्रतिक्रिया भेजने में विफल", + "notesFusionSuccess": "नोट्स सफलतापूर्वक मर्ज किए गए!", + "openConnectionFailed": "कनेक्शन खोलने में विफल", + "openingConnection": "कनेक्शन खोल रहे हैं...", + "operationFailed": "ऑपरेशन विफल", + "operationSuccess": "ऑपरेशन सफल", + "saveFailed": "सेटिंग सहेजने में विफल", + "saved": "सेटिंग सहेजी गई", + "thanksFeedback": "आपकी प्रतिक्रिया के लिए धन्यवाद!", + "thanksFeedbackImproving": "धन्यवाद! हम इसे सुधार के लिए उपयोग करेंगे।" + }, + "trash": { + "deletePermanently": "स्थायी रूप से हटाएं", + "empty": "कचरा खाली है", + "restore": "पुनर्स्थापित करें", + "title": "कचरा" + }, + "ui": { + "close": "बंद करें", + "collapse": "संकुचित करें", + "expand": "विस्तार करें", + "open": "खोलें" } } diff --git a/keep-notes/locales/it.json b/keep-notes/locales/it.json index 6db0c0f..2af6e89 100644 --- a/keep-notes/locales/it.json +++ b/keep-notes/locales/it.json @@ -1,563 +1,1039 @@ { + "about": { + "appDescription": "A powerful note-taking application with AI-powered features", + "appName": "Keep Notes", + "buildDate": "Build Date", + "description": "Information about the application", + "features": { + "description": "AI-powered capabilities", + "dragDrop": "Drag & drop note management", + "labelSystem": "Label system", + "memoryEcho": "Memory Echo daily insights", + "multipleProviders": "Multiple AI providers (OpenAI, Ollama)", + "notebookOrganization": "Notebook organization", + "paragraphReformulation": "Paragraph reformulation", + "semanticSearch": "Semantic search with embeddings", + "title": "Features", + "titleSuggestions": "AI-powered title suggestions" + }, + "platform": "Platform", + "platformWeb": "Web", + "support": { + "description": "Get help and feedback", + "documentation": "Documentation", + "feedback": "Feedback", + "reportIssues": "Report Issues", + "title": "Support" + }, + "technology": { + "ai": "AI", + "authentication": "Authentication", + "backend": "Backend", + "database": "Database", + "description": "Built with modern technologies", + "frontend": "Frontend", + "testing": "Testing", + "title": "Technology Stack", + "ui": "UI" + }, + "title": "About", + "version": "Version" + }, + "admin": { + "ai": { + "apiKey": "API Key", + "baseUrl": "Base URL", + "commonEmbeddingModels": "Common embedding models for OpenAI-compatible APIs", + "commonModelsDescription": "Common models for OpenAI-compatible APIs", + "description": "Configure AI providers for auto-tagging and semantic search. Use different providers for optimal performance.", + "embeddingsDescription": "AI provider for semantic search embeddings. Recommended: OpenAI (best quality).", + "embeddingsProvider": "Embeddings Provider", + "model": "Model", + "modelRecommendations": "gpt-4o-mini = Best value • gpt-4o = Best quality", + "openAIKeyDescription": "Your OpenAI API key from platform.openai.com", + "openTestPanel": "Open AI Test Panel", + "provider": "Provider", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING is required", + "providerTagsRequired": "AI_PROVIDER_TAGS is required", + "saveSettings": "Save AI Settings", + "saving": "Saving...", + "selectEmbeddingModel": "Select an embedding model installed on your system", + "selectOllamaModel": "Select an Ollama model installed on your system", + "tagsGenerationDescription": "AI provider for automatic tag suggestions. Recommended: Ollama (free, local).", + "tagsGenerationProvider": "Tags Generation Provider", + "title": "AI Configuration", + "updateFailed": "Failed to update AI settings", + "updateSuccess": "AI Settings updated successfully" + }, + "aiTest": { + "description": "Test your AI providers for tag generation and semantic search embeddings", + "embeddingDimensions": "Embedding Dimensions:", + "embeddingsTestDescription": "Test the AI provider responsible for semantic search embeddings", + "embeddingsTestTitle": "Embeddings Test", + "error": "Error:", + "first5Values": "First 5 values:", + "generatedTags": "Generated Tags:", + "howItWorksTitle": "How Testing Works", + "model": "Model:", + "provider": "Provider:", + "responseTime": "Response time: {time}ms", + "runTest": "Run Test", + "tagsTestDescription": "Test the AI provider responsible for automatic tag suggestions", + "tagsTestTitle": "Tags Generation Test", + "testError": "Test Error: {error}", + "testFailed": "Test Failed", + "testPassed": "Test Passed", + "testing": "Testing...", + "tipDescription": "Use the AI Test Panel to diagnose configuration issues before testing.", + "tipTitle": "Tip:", + "title": "AI Provider Testing", + "vectorDimensions": "vector dimensions" + }, + "aiTesting": "AI Testing", + "security": { + "allowPublicRegistration": "Allow Public Registration", + "allowPublicRegistrationDescription": "If disabled, new users can only be added by an Administrator via the User Management page.", + "description": "Manage access control and registration policies.", + "title": "Security Settings", + "updateFailed": "Failed to update security settings", + "updateSuccess": "Security Settings updated" + }, + "settings": "Admin Settings", + "smtp": { + "description": "Configure email server for password resets.", + "forceSSL": "Force SSL/TLS (usually for port 465)", + "fromEmail": "From Email", + "host": "Host", + "ignoreCertErrors": "Ignore Certificate Errors (Self-hosted/Dev only)", + "password": "Password", + "port": "Port", + "saveSettings": "Save SMTP Settings", + "sending": "Sending...", + "testEmail": "Test Email", + "testFailed": "Failed: {error}", + "testSuccess": "Test email sent successfully!", + "title": "SMTP Configuration", + "updateFailed": "Failed to update SMTP settings", + "updateSuccess": "SMTP Settings updated", + "username": "Username" + }, + "title": "Admin Dashboard", + "userManagement": "User Management", + "users": { + "addUser": "Add User", + "confirmDelete": "Sei sicuro di voler eliminare questo utente?", + "createFailed": "Failed to create user", + "createSuccess": "User created successfully", + "createUser": "Create User", + "createUserDescription": "Add a new user to the system.", + "deleteFailed": "Failed to delete", + "deleteSuccess": "User deleted", + "demote": "Declassa", + "email": "Email", + "name": "Name", + "password": "Password", + "promote": "Promuovi", + "role": "Role", + "roleUpdateFailed": "Failed to update role", + "roleUpdateSuccess": "User role updated to {role}", + "roles": { + "admin": "Amministratore", + "user": "Utente" + }, + "table": { + "actions": "Actions", + "createdAt": "Created At", + "email": "Email", + "name": "Name", + "role": "Role" + } + } + }, + "ai": { + "analyzing": "AI analyzing...", + "assistant": "AI Assistant", + "autoLabels": { + "analyzing": "Analisi delle tue note per suggerimenti etichette...", + "create": "Crea", + "createNewLabel": "Crea nuova etichetta", + "created": "{count} labels created successfully", + "creating": "Creazione etichette...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(nuovo)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "Suggerimenti Etichette", + "typeContent": "Type content to get label suggestions...", + "typeForSuggestions": "Digita per suggerimenti" + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Applicazione non riuscita", + "applying": "Applying...", + "description": "L'IA analizzerà le tue note e suggerirà di organizzarle in quaderni.", + "error": "Errore nell'organizzazione", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "Nessuna nota selezionata", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Seleziona tutto in", + "selectNote": "Seleziona nota", + "success": "Organizzazione completata", + "title": "Organizzazione batch" + }, + "clarify": "Clarify", + "clickToAddTag": "Click to add this tag", + "generateTitles": "Generate titles", + "generateTitlesTooltip": "Generate titles with AI", + "generating": "Generating...", + "generatingTitles": "Generating titles...", + "ignoreSuggestion": "Ignore this suggestion", + "improveStyle": "Improve style", + "languageDetected": "Language detected", + "notebookSummary": { + "regenerate": "Rigenera Riassunto", + "regenerating": "Rigenerazione riassunto..." + }, + "original": "Original", + "poweredByAI": "Powered by AI", + "processing": "Processing...", + "reformulateText": "Reformulate text", + "reformulated": "Reformulated", + "reformulating": "Reformulating...", + "reformulationApplied": "Reformulated text applied!", + "reformulationComparison": "Reformulation Comparison", + "reformulationError": "Error during reformulation", + "reformulationFailed": "Failed to reformulate text", + "reformulationMaxWords": "Text must have maximum 500 words", + "reformulationMinWords": "Text must have at least 10 words (current: {count} words)", + "reformulationNoText": "Please select text or add content", + "reformulationSelectionTooShort": "Selection too short, using full content", + "shorten": "Shorten", + "tagAdded": "Tag \"{tag}\" added", + "titleApplied": "Title applied!", + "titleGenerateWithAI": "Generate titles with AI", + "titleGenerating": "Generating...", + "titleGenerationError": "Error generating titles", + "titleGenerationFailed": "Failed to generate titles", + "titleGenerationMinWords": "Content must have at least 10 words to generate titles (current: {count} words)", + "titlesGenerated": "💡 {count} titles generated!", + "transformError": "Error during transformation", + "transformMarkdown": "Transform to Markdown", + "transformSuccess": "Text transformed to Markdown successfully!", + "transforming": "Transforming..." + }, + "aiSettings": { + "description": "Configura le funzionalità AI e le preferenze", + "error": "Aggiornamento dell'impostazione non riuscito", + "features": "Funzionalità AI", + "frequency": "Frequenza", + "frequencyDaily": "Giornaliera", + "frequencyWeekly": "Settimanale", + "provider": "Provider AI", + "providerAuto": "Automatico (Consigliato)", + "providerOllama": "Ollama (Locale)", + "providerOpenAI": "OpenAI (Cloud)", + "saved": "Impostazione aggiornata", + "saving": "Salvataggio in corso...", + "title": "Impostazioni AI", + "titleSuggestionsDesc": "Suggerisci titoli per note senza titolo dopo 50+ parole", + "paragraphRefactorDesc": "Opzioni di miglioramento del testo basate sull'AI", + "frequencyDesc": "Frequenza di analisi delle connessioni tra note", + "providerDesc": "Scegli il tuo provider AI preferito", + "providerAutoDesc": "Ollama se disponibile, altrimenti OpenAI", + "providerOllamaDesc": "100% privato, viene eseguito localmente sul tuo dispositivo", + "providerOpenAIDesc": "Più preciso, richiede chiave API" + }, + "appearance": { + "description": "Personalizza l'aspetto dell'app", + "title": "Aspetto" + }, "auth": { - "signIn": "Accedi", - "signUp": "Registrati", + "backToLogin": "Torna al login", + "checkYourEmail": "Controlla la tua email", + "createAccount": "Crea il tuo account", "email": "Email", - "password": "Password", - "name": "Nome", "emailPlaceholder": "Inserisci il tuo indirizzo email", - "passwordPlaceholder": "Inserisci la tua password", + "forgotPassword": "Password dimenticata?", + "forgotPasswordDescription": "Inserisci il tuo indirizzo email e ti invieremo un link per reimpostare la password.", + "forgotPasswordTitle": "Password dimenticata", + "hasAccount": "Hai già un account?", + "name": "Nome", "namePlaceholder": "Inserisci il tuo nome", + "noAccount": "Non hai un account?", + "orContinueWith": "Oppure continua con", + "password": "Password", "passwordMinChars": "Inserisci la password (minimo 6 caratteri)", + "passwordPlaceholder": "Inserisci la tua password", + "rememberMe": "Ricordami", + "resetEmailSent": "Se esiste nel nostro sistema, abbiamo inviato un link per la reimpostazione della password al tuo indirizzo email.", "resetPassword": "Reimposta password", "resetPasswordInstructions": "Inserisci la tua email per reimpostare la password", - "forgotPassword": "Password dimenticata?", - "noAccount": "Non hai un account?", - "hasAccount": "Hai già un account?", - "signInToAccount": "Accedi al tuo account", - "createAccount": "Crea il tuo account", - "rememberMe": "Ricordami", - "orContinueWith": "Oppure continua con", - "checkYourEmail": "Controlla la tua email", - "resetEmailSent": "Se esiste nel nostro sistema, abbiamo inviato un link per la reimpostazione della password al tuo indirizzo email.", "returnToLogin": "Torna al login", - "forgotPasswordTitle": "Password dimenticata", - "forgotPasswordDescription": "Inserisci il tuo indirizzo email e ti invieremo un link per reimpostare la password.", - "sending": "Invio in corso...", "sendResetLink": "Invia link di reimpostazione", - "backToLogin": "Torna al login" - }, - - "notes": { - "title": "Note", - "newNote": "Nuova nota", - "untitled": "Senza titolo", - "placeholder": "Scrivi una nota...", - "markdownPlaceholder": "Scrivi una nota... (Markdown supportato)", - "titlePlaceholder": "Titolo", - "listItem": "Elemento elenco", - "addListItem": "+ Elemento elenco", - "newChecklist": "Nuova checklist", - "add": "Aggiungi", - "adding": "Aggiunta in corso...", - "close": "Chiudi", - "confirmDelete": "Sei sicuro di voler eliminare questa nota?", - "confirmLeaveShare": "Sei sicuro di voler abbandonare questa nota condivisa?", - "sharedBy": "Condivisa da", - "leaveShare": "Abbandona", - "delete": "Elimina", - "archive": "Archivia", - "unarchive": "Rimuovi dall’archivio", - "pin": "Fissa", - "unpin": "Rimuovi fissaggio", - "color": "Colore", - "changeColor": "Cambia colore", - "setReminder": "Imposta promemoria", - "setReminderButton": "Imposta promemoria", - "date": "Data", - "time": "Ora", - "reminderDateTimeRequired": "Inserisci data e ora", - "invalidDateTime": "Data o ora non valide", - "reminderMustBeFuture": "Il promemoria deve essere nel futuro", - "reminderSet": "Promemoria impostato per {datetime}", - "reminderPastError": "Il promemoria deve essere nel futuro", - "reminderRemoved": "Promemoria rimosso", - "addImage": "Aggiungi immagine", - "addLink": "Aggiungi link", - "linkAdded": "Link aggiunto", - "linkMetadataFailed": "Impossibile recuperare i metadati del link", - "linkAddFailed": "Aggiunta del link non riuscita", - "invalidFileType": "Tipo di file non valido: {fileName}. Sono consentiti solo JPEG, PNG, GIF e WebP.", - "fileTooLarge": "File troppo grande: {fileName}. La dimensione massima è {maxSize}.", - "uploadFailed": "Caricamento non riuscito: {filename}", - "contentOrMediaRequired": "Inserisci del contenuto o aggiungi un link/immagine", - "itemOrMediaRequired": "Aggiungi almeno un elemento o un contenuto multimediale", - "noteCreated": "Nota creata con successo", - "noteCreateFailed": "Creazione della nota non riuscita", - "aiAssistant": "Assistente AI", - "changeSize": "Cambia dimensione", - "backgroundOptions": "Opzioni di sfondo", - "moreOptions": "Altre opzioni", - "remindMe": "Ricordamelo", - "markdownMode": "Markdown", - "addCollaborators": "Aggiungi collaboratori", - "duplicate": "Duplica", - "share": "Condividi", - "showCollaborators": "Mostra collaboratori", - "pinned": "Fissate", - "others": "Altre", - "undo": "Annulla", - "redo": "Ripeti", - "noNotes": "Nessuna nota", - "noNotesFound": "Nessuna nota trovata", - "createFirstNote": "Crea la tua prima nota", - "size": "Dimensione", - "small": "Piccola", - "medium": "Media", - "large": "Grande", - "shareWithCollaborators": "Condividi con collaboratori", - "view": "Visualizza nota", - "edit": "Modifica nota", - "readOnly": "Sola lettura", - "preview": "Anteprima", - "noContent": "Nessun contenuto", - "takeNote": "Scrivi una nota...", - "takeNoteMarkdown": "Scrivi una nota... (Markdown supportato)", - "addItem": "Aggiungi elemento", - "sharedReadOnly": "Questa nota è condivisa con te in modalità sola lettura", - "makeCopy": "Crea una copia", - "saving": "Salvataggio in corso...", - "copySuccess": "Nota copiata con successo!", - "copyFailed": "Copia della nota non riuscita", - "copy": "Copia", - "markdownOn": "Markdown ATTIVO", - "markdownOff": "Markdown DISATTIVATO" - }, - - "labels": { - "title": "Etichette", - "filter": "Filtra per etichetta", - "manage": "Gestisci etichette", - "manageTooltip": "Gestisci etichette", - "changeColor": "Cambia colore", - "changeColorTooltip": "Cambia colore", - "delete": "Elimina", - "deleteTooltip": "Elimina etichetta", - "confirmDelete": "Sei sicuro di voler eliminare questa etichetta?", - "newLabelPlaceholder": "Crea nuova etichetta", - "namePlaceholder": "Inserisci nome etichetta", - "addLabel": "Aggiungi etichetta", - "createLabel": "Crea etichetta", - "labelName": "Nome etichetta", - "labelColor": "Colore etichetta", - "manageLabels": "Gestisci etichette", - "manageLabelsDescription": "Aggiungi o rimuovi etichette per questa nota. Clicca su un’etichetta per cambiarne il colore.", - "selectedLabels": "Etichette selezionate", - "allLabels": "Tutte le etichette", - "clearAll": "Cancella tutto", - "filterByLabel": "Filtra per etichetta", - "tagAdded": "Tag \"{tag}\" aggiunto", - "showLess": "Mostra meno", - "showMore": "Mostra di più", - "editLabels": "Modifica etichette", - "editLabelsDescription": "Crea, modifica i colori o elimina le etichette.", - "noLabelsFound": "Nessuna etichetta trovata.", - "loading": "Caricamento...", - "notebookRequired": "⚠️ Le etichette sono disponibili solo nei quaderni. Sposta prima questa nota in un quaderno." - }, - "pagination": { - "previous": "←", - "pageInfo": "Pagina {currentPage} / {totalPages}", - "next": "→" - }, - - "search": { - "placeholder": "Cerca", - "searchPlaceholder": "Cerca nelle tue note...", - "semanticInProgress": "Ricerca AI in corso...", - "semanticTooltip": "Ricerca semantica AI", - "searching": "Ricerca in corso...", - "noResults": "Nessun risultato trovato", - "resultsFound": "{count} note trovate", - "exactMatch": "Corrispondenza esatta", - "related": "Correlate" - }, - - "collaboration": { - "emailPlaceholder": "Inserisci indirizzo email", - "addCollaborator": "Aggiungi collaboratore", - "removeCollaborator": "Rimuovi collaboratore", - "owner": "Proprietario", - "canEdit": "Può modificare", - "canView": "Può visualizzare", - "shareNote": "Condividi nota", - "shareWithCollaborators": "Condividi con collaboratori", - "addCollaboratorDescription": "Aggiungi persone per collaborare a questa nota tramite il loro indirizzo email.", - "viewerDescription": "Hai accesso a questa nota. Solo il proprietario può gestire i collaboratori.", - "emailAddress": "Indirizzo email", - "enterEmailAddress": "Inserisci indirizzo email", - "invite": "Invita", - "peopleWithAccess": "Persone con accesso", - "noCollaborators": "Nessun collaboratore. Aggiungine uno sopra!", - "noCollaboratorsViewer": "Nessun collaboratore.", - "pendingInvite": "Invito in sospeso", - "pending": "In sospeso", - "remove": "Rimuovi", - "unnamedUser": "Utente senza nome", - "done": "Fatto", - "willBeAdded": "{email} sarà aggiunto come collaboratore quando la nota verrà creata", - "alreadyInList": "Questa email è già nella lista", - "nowHasAccess": "{name} ora ha accesso a questa nota", - "accessRevoked": "L’accesso è stato revocato", - "errorLoading": "Errore nel caricamento dei collaboratori", - "failedToAdd": "Impossibile aggiungere il collaboratore", - "failedToRemove": "Impossibile rimuovere il collaboratore" - }, - - "ai": { - "analyzing": "Analisi AI in corso...", - "clickToAddTag": "Clicca per aggiungere questo tag", - "ignoreSuggestion": "Ignora questo suggerimento", - "generatingTitles": "Generazione dei titoli...", - "generateTitlesTooltip": "Genera titoli con l’AI", - "poweredByAI": "Basato su AI", - "languageDetected": "Lingua rilevata", - "processing": "Elaborazione in corso...", - "tagAdded": "Tag \"{tag}\" aggiunto", - "titleGenerating": "Generazione in corso...", - "titleGenerateWithAI": "Genera titoli con l’AI", - "titleGenerationMinWords": "Il contenuto deve avere almeno 10 parole per generare titoli (attuale: {count} parole)", - "titleGenerationError": "Errore nella generazione dei titoli", - "titlesGenerated": "💡 {count} titoli generati!", - "titleGenerationFailed": "Generazione dei titoli non riuscita", - "titleApplied": "Titolo applicato!", - "reformulationNoText": "Seleziona del testo o aggiungi contenuto", - "reformulationSelectionTooShort": "Selezione troppo breve, utilizzo del contenuto completo", - "reformulationMinWords": "Il testo deve avere almeno 10 parole (attuale: {count} parole)", - "reformulationMaxWords": "Il testo deve avere massimo 500 parole", - "reformulationError": "Errore durante la riformulazione", - "reformulationFailed": "Riformulazione del testo non riuscita", - "reformulationApplied": "Testo riformulato applicato!", - "assistant": "Assistente AI", - "generating": "Generazione in corso...", - "generateTitles": "Genera titoli", - "reformulateText": "Riformula testo", - "reformulating": "Riformulazione in corso...", - "clarify": "Chiarisci", - "shorten": "Accorcia", - "improveStyle": "Migliora stile", - "reformulationComparison": "Confronto riformulazione", - "original": "Originale", - "reformulated": "Riformulato" - }, - "batchOrganization": { - "title": "Organizzazione batch", - "error": "Errore nella creazione del piano di organizzazione", - "noNotesSelected": "Nessuna nota selezionata", - "selectNotes": "Seleziona note da organizzare", - "start": "Avvia organizzazione", - "organizing": "Organizzazione in corso...", - "finished": "Organizzazione completata!", - "results": "Risultati", - "totalProcessed": "Elaborate: {total}", - "categorized": "Categorizzate: {count}", - "tagsAdded": "Tag aggiunti: {count}", - "categories": "Categorie", - "noTagsAdded": "Nessun tag aggiunto", - "suggestedTags": "Tag suggeriti", - "suggestedCategories": "Categorie suggerite", - "addTags": "Aggiungi tag", - "addCategories": "Aggiungi categorie", - "reviewChanges": "Rivedi modifiche", - "applyChanges": "Applica modifiche", - "skip": "Salta", - "done": "Fatto", - "close": "Chiudi", - "backToNote": "Torna alla nota" + "sending": "Invio in corso...", + "signIn": "Accedi", + "signInToAccount": "Accedi al tuo account", + "signOut": "Sign out", + "signUp": "Registrati" }, "autoLabels": { - "title": "Auto etichette", - "toggle": "Attiva auto etichette", - "enabled": "Attivato", - "disabled": "Disattivato", - "settings": "Impostazioni", + "aiPowered": "Alimentato da AI", + "analyzing": "Analyzing your notes...", + "applySuggested": "Applica suggerite", + "autoLabelBatchDescription": "Aggiungi automaticamente etichette per le note selezionate", "autoLabelDescription": "Aggiungi automaticamente etichette basate sull'analisi AI", "autoLabelNoteDescription": "Aggiungi automaticamente etichette per questa nota", - "autoLabelBatchDescription": "Aggiungi automaticamente etichette per le note selezionate", - "smartTagging": "Smart tagging", + "confidence": "Fiducia: {score}%", "contentAnalysis": "Analisi contenuto", - "keywordExtraction": "Estrazione parole chiave", - "aiPowered": "Alimentato da AI", - "suggestedLabels": "Etichette suggerite", - "applySuggested": "Applica suggerite", + "createNewLabel": "Create this new label and add it", + "created": "{count} labels created successfully", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "disabled": "Disattivato", "dismissAll": "Ignora tutto", + "enabled": "Attivato", + "error": "Errore auto etichette", "generateMore": "Genera di più", - "settingsDialogTitle": "Impostazioni auto etichette", - "settingsDescription": "Configura preferenze auto etichette", - "minConfidence": "Minima fiducia", - "minConfidenceDescription": "Punteggio minimo (0-100) per suggerimenti AI", - "maxLabels": "Massimo etichette per nota", - "maxLabelsDescription": "Numero massimo di etichette per nota", + "keywordExtraction": "Estrazione parole chiave", "labelCategories": "Categorie etichette", "labelCategoriesDescription": "Seleziona categorie per auto etichettatura", - "saveSettings": "Salva impostazioni", - "settingsSaved": "Impostazioni salvate", - "error": "Errore auto etichette", - "processing": "Elaborazione in corso...", - "noLabelsGenerated": "Nessuna etichetta generata", "labelsApplied": "Etichette applicate", - "confidence": "Fiducia: {score}%", - "learnMore": "Scopri di più" + "learnMore": "Scopri di più", + "maxLabels": "Massimo etichette per nota", + "maxLabelsDescription": "Numero massimo di etichette per nota", + "minConfidence": "Minima fiducia", + "minConfidenceDescription": "Punteggio minimo (0-100) per suggerimenti AI", + "new": "(new)", + "noLabelsGenerated": "Nessuna etichetta generata", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "processing": "Elaborazione in corso...", + "saveSettings": "Salva impostazioni", + "settings": "Impostazioni", + "settingsDescription": "Configura preferenze auto etichette", + "settingsDialogTitle": "Impostazioni auto etichette", + "settingsSaved": "Impostazioni salvate", + "smartTagging": "Smart tagging", + "suggestedLabels": "Etichette suggerite", + "title": "Auto etichette", + "toggle": "Attiva auto etichette", + "typeContent": "Type content to get label suggestions..." }, - - "titleSuggestions": { - "available": "Suggerimenti titolo", - "title": "Suggerimenti AI", - "generating": "Generazione in corso...", - "selectTitle": "Seleziona un titolo", - "dismiss": "Ignora" + "batch": { + "organize": "Organizza", + "organizeWithAI": "Organizza con AI" + }, + "batchOrganization": { + "addCategories": "Aggiungi categorie", + "addTags": "Aggiungi tag", + "analyzing": "Analyzing your notes...", + "apply": "Apply ({count})", + "applyChanges": "Applica modifiche", + "applying": "Applying...", + "backToNote": "Torna alla nota", + "categories": "Categorie", + "categorized": "Categorizzate: {count}", + "close": "Chiudi", + "confidence": "confidence", + "description": "AI will analyze your notes and suggest organizing them into notebooks.", + "done": "Fatto", + "error": "Errore nella creazione del piano di organizzazione", + "finished": "Organizzazione completata!", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "Nessuna nota selezionata", + "noSuggestions": "AI could not find a good way to organize these notes.", + "noTagsAdded": "Nessun tag aggiunto", + "notesToOrganize": "{count} notes to organize", + "organizing": "Organizzazione in corso...", + "results": "Risultati", + "reviewChanges": "Rivedi modifiche", + "selectNotes": "Seleziona note da organizzare", + "selected": "{count} selected", + "skip": "Salta", + "start": "Avvia organizzazione", + "suggestedCategories": "Categorie suggerite", + "suggestedTags": "Tag suggeriti", + "tagsAdded": "Tag aggiunti: {count}", + "title": "Organizzazione batch", + "totalProcessed": "Elaborate: {total}", + "unorganized": "{count} notes couldn't be categorized and will stay in General Notes." + }, + "collaboration": { + "accessRevoked": "L’accesso è stato revocato", + "addCollaborator": "Aggiungi collaboratore", + "addCollaboratorDescription": "Aggiungi persone per collaborare a questa nota tramite il loro indirizzo email.", + "alreadyInList": "Questa email è già nella lista", + "canEdit": "Può modificare", + "canView": "Può visualizzare", + "done": "Fatto", + "emailAddress": "Indirizzo email", + "emailPlaceholder": "Inserisci indirizzo email", + "enterEmailAddress": "Inserisci indirizzo email", + "errorLoading": "Errore nel caricamento dei collaboratori", + "failedToAdd": "Impossibile aggiungere il collaboratore", + "failedToRemove": "Impossibile rimuovere il collaboratore", + "invite": "Invita", + "noCollaborators": "Nessun collaboratore. Aggiungine uno sopra!", + "noCollaboratorsViewer": "Nessun collaboratore.", + "nowHasAccess": "{name} ora ha accesso a questa nota", + "owner": "Proprietario", + "pending": "In sospeso", + "pendingInvite": "Invito in sospeso", + "peopleWithAccess": "Persone con accesso", + "remove": "Rimuovi", + "removeCollaborator": "Rimuovi collaboratore", + "shareNote": "Condividi nota", + "shareWithCollaborators": "Condividi con collaboratori", + "unnamedUser": "Utente senza nome", + "viewerDescription": "Hai accesso a questa nota. Solo il proprietario può gestire i collaboratori.", + "willBeAdded": "{email} sarà aggiunto come collaboratore quando la nota verrà creata" + }, + "colors": { + "blue": "Blu", + "default": "Predefinito", + "gray": "Grigio", + "green": "Verde", + "orange": "Arancione", + "pink": "Rosa", + "purple": "Viola", + "red": "Rosso", + "yellow": "Giallo" + }, + "common": { + "add": "Aggiungi", + "cancel": "Annulla", + "close": "Chiudi", + "confirm": "Conferma", + "delete": "Elimina", + "edit": "Modifica", + "error": "Errore", + "loading": "Caricamento...", + "noResults": "Nessun risultato", + "notAvailable": "Non disponibile", + "optional": "Opzionale", + "remove": "Rimuovi", + "required": "Obbligatorio", + "save": "Salva", + "search": "Cerca", + "success": "Successo", + "unknown": "Sconosciuto" + }, + "connection": { + "clickToView": "Clicca per visualizzare la nota", + "helpful": "Utile", + "isHelpful": "Questa connessione è utile?", + "memoryEchoDiscovery": "Scoperta Memory Echo", + "notHelpful": "Non utile", + "similarityInfo": "Queste note sono collegate da {similarity}% di similarità" + }, + "dataManagement": { + "cleanup": { + "button": "Cleanup", + "description": "Remove labels and connections that reference deleted notes.", + "failed": "Error during cleanup", + "title": "Cleanup Orphaned Data" + }, + "cleanupComplete": "Pulizia completata", + "cleanupError": "Errore nella pulizia", + "dangerZone": "Zona pericolosa", + "dangerZoneDescription": "Queste azioni sono irreversibili", + "delete": { + "button": "Delete All Notes", + "confirm": "Are you sure? This will permanently delete all your notes.", + "description": "Permanently delete all your notes. This action cannot be undone.", + "failed": "Failed to delete notes", + "success": "All notes deleted", + "title": "Delete All Notes" + }, + "deleting": "Eliminazione in corso...", + "export": { + "button": "Export Notes", + "description": "Download all your notes as a JSON file. This includes all content, labels, and metadata.", + "failed": "Failed to export notes", + "success": "Notes exported successfully", + "title": "Export All Notes" + }, + "exporting": "Esportazione in corso...", + "import": { + "button": "Import Notes", + "description": "Upload a JSON file to import notes. This will add to your existing notes, not replace them.", + "failed": "Failed to import notes", + "success": "Imported {count} notes", + "title": "Import Notes" + }, + "importing": "Importazione in corso...", + "indexing": { + "button": "Rebuild Index", + "description": "Regenerate embeddings for all notes to improve semantic search.", + "failed": "Error during indexing", + "success": "Indexing complete: {count} notes processed", + "title": "Rebuild Search Index" + }, + "indexingComplete": "Indicizzazione completata", + "indexingError": "Errore nell'indicizzazione", + "title": "Data Management", + "toolsDescription": "Tools to maintain your database health" + }, + "demoMode": { + "activated": "Modalità demo attivata! Memory Echo funzionerà istantaneamente.", + "createNotesTip": "Crea 2+ note simili e vedi Memory Echo in azione!", + "deactivated": "Modalità demo disattivata. Parametri normali ripristinati.", + "delayBetweenNotes": "Ritardo di 0 giorni tra le note (normalmente 7 giorni)", + "description": "Accelera Memory Echo per i test. Le connessioni appaiono istantaneamente.", + "parametersActive": "Parametri demo attivi:", + "similarityThreshold": "Soglia di similarità del 50% (normalmente 75%)", + "title": "Modalità demo", + "toggleFailed": "Impossibile attivare/disattivare la modalità demo", + "unlimitedInsights": "Insight illimitati (nessun limite di frequenza)" + }, + "diagnostics": { + "apiStatus": "Stato API", + "checking": "Checking...", + "configuredProvider": "Provider configurato", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "Dettagli test:", + "tip1": "Assicurati che Ollama sia in esecuzione (ollama serve)", + "tip2": "Verifica che il modello sia installato (ollama pull llama3)", + "tip3": "Verifica la tua chiave API per OpenAI", + "tip4": "Controlla la connettività di rete", + "title": "Diagnostica", + "troubleshootingTitle": "Suggerimenti per la risoluzione dei problemi:" + }, + "favorites": { + "noFavorites": "Nessun preferito", + "pinToFavorite": "Aggiungi ai preferiti", + "title": "Preferiti", + "toggleSection": "Attiva/disattiva sezione" + }, + "footer": { + "openSource": "Clone open source", + "privacy": "Privacy", + "terms": "Termini" + }, + "general": { + "add": "Aggiungi", + "apply": "Applica", + "back": "Indietro", + "cancel": "Annulla", + "clean": "Clean", + "clear": "Cancella", + "close": "Chiudi", + "confirm": "Conferma", + "edit": "Modifica", + "error": "Si è verificato un errore", + "indexAll": "Index All", + "loading": "Caricamento...", + "next": "Avanti", + "operationFailed": "Operazione non riuscita", + "operationSuccess": "Operazione completata", + "preview": "Anteprima", + "previous": "Precedente", + "reset": "Reimposta", + "save": "Salva", + "select": "Seleziona", + "submit": "Invia", + "testConnection": "Test Connection", + "tryAgain": "Riprova" + }, + "generalSettings": { + "description": "Impostazioni generali dell'applicazione", + "title": "Impostazioni generali" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} etichette", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "Nessuna etichetta", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "Clicca per visualizzare", + "comparison": { + "clickToView": "Click to view note", + "helpful": "Helpful", + "helpfulQuestion": "Is this comparison helpful?", + "highSimilarityInsight": "These notes deal with the same topic with a high degree of similarity. They could be merged or consolidated.", + "notHelpful": "Not Helpful", + "similarityInfo": "These notes are connected by {similarity}% similarity", + "title": "💡 Note Comparison", + "untitled": "Untitled" + }, + "connection": "connection", + "connections": "Connections", + "connectionsBadge": "{count} connection{plural}", + "dailyInsight": "Daily insight from your notes", + "description": "Proactive connections between your notes", + "dismiss": "Dismiss for now", + "editorSection": { + "close": "Chiudi", + "compare": "Compare", + "compareAll": "Compare all", + "loading": "Loading...", + "merge": "Merge", + "mergeAll": "Merge all", + "title": "⚡ Connected Notes ({count})", + "view": "View" + }, + "fused": "Fused", + "fusion": { + "archiveOriginals": "Archive original notes", + "cancel": "Cancel", + "confirmFusion": "Confirm fusion", + "createBacklinks": "Create backlink to original notes", + "edit": "Edit", + "error": "Failed to merge notes", + "finishEditing": "Finish editing", + "generateError": "Failed to generate fusion", + "generateFusion": "Generate the fusion", + "generating": "Generating...", + "keepAllTags": "Keep all tags", + "mergeNotes": "Merge {count} note(s)", + "modify": "Modify", + "noContentReturned": "No fusion content returned from API", + "notesToMerge": "📝 Notes to merge", + "optionalPrompt": "💬 Fusion prompt (optional)", + "optionsTitle": "Fusion options", + "previewTitle": "📝 Preview of merged note", + "promptPlaceholder": "Optional instructions for AI (e.g., 'Keep the formal style of note 1')...", + "success": "Notes merged successfully!", + "title": "🔗 Intelligent Fusion", + "unknownDate": "Unknown date", + "useLatestTitle": "Use latest note as title" + }, + "helpful": "Helpful", + "insightReady": "Your insight is ready!", + "notHelpful": "Not Helpful", + "overlay": { + "error": "Errore", + "loading": "Loading...", + "noConnections": "No connections found", + "searchPlaceholder": "Search connections...", + "sortBy": "Sort by:", + "sortOldest": "Oldest", + "sortRecent": "Recent", + "sortSimilarity": "Similarity", + "title": "Connected Notes", + "viewAll": "View all side by side" + }, + "thanksFeedback": "Thanks for your feedback!", + "thanksFeedbackImproving": "Thanks! We'll use this to improve.", + "title": "I noticed something...", + "viewConnection": "View Connection" + }, + "nav": { + "accountSettings": "Impostazioni account", + "adminDashboard": "Dashboard amministratore", + "aiSettings": "Impostazioni AI", + "archive": "Archivio", + "buyMeACoffee": "Offrimi un caffè", + "configureAI": "Configura le funzionalità AI, il provider e le preferenze", + "diagnostics": "Diagnostica", + "donateOnKofi": "Dona su Ko-fi", + "donationDescription": "Fai una donazione una tantum o diventa un sostenitore mensile.", + "donationNote": "Nessuna commissione • Pagamenti immediati • Sicuro", + "favorites": "Preferiti", + "generalNotes": "General Notes", + "home": "Home", + "login": "Login", + "logout": "Logout", + "manageAISettings": "Gestisci impostazioni AI", + "myLibrary": "La mia libreria", + "notebooks": "Notebooks", + "notes": "Note", + "proPlan": "Piano Pro", + "profile": "Profilo", + "quickAccess": "Accesso rapido", + "recent": "Recenti", + "reminders": "Promemoria", + "settings": "Impostazioni", + "sponsorDescription": "Diventa uno sponsor mensile e ricevi riconoscimento.", + "sponsorOnGithub": "Sponsorizza su GitHub", + "support": "Supporta Memento ☕", + "supportDescription": "Memento è 100% gratuito e open-source. Il tuo supporto aiuta a mantenerlo tale.", + "supportDevelopment": "Supporta lo sviluppo di Memento ☕", + "trash": "Cestino", + "userManagement": "Gestione utenti", + "workspace": "Area di lavoro" + }, + "notebook": { + "cancel": "Annulla", + "create": "Crea notebook", + "createDescription": "Avvia una nuova raccolta per organizzare note, idee e progetti in modo efficiente.", + "createNew": "Crea nuovo notebook", + "creating": "Creazione...", + "delete": "Elimina notebook", + "deleteConfirm": "Elimina", + "deleteWarning": "Sei sicuro di voler eliminare questo notebook? Le note verranno spostate in Note generali.", + "edit": "Modifica notebook", + "editDescription": "Cambia nome, icona e colore del tuo notebook.", + "generating": "Generazione riepilogo...", + "labels": "Labels:", + "name": "Nome del notebook", + "noLabels": "No labels", + "selectColor": "Colore", + "selectIcon": "Icona", + "summary": "Riepilogo notebook", + "summaryDescription": "Genera un riepilogo basato su IA di tutte le note in questo notebook.", + "summaryError": "Errore nella generazione del riepilogo" + }, + "notebookSuggestion": { + "description": "Questa nota sembra appartenere a questo notebook", + "dismiss": "Ignora", + "dismissIn": "Ignora (chiude in {timeLeft}s)", + "generalNotes": "Note generali", + "move": "Sposta", + "moveToNotebook": "Sposta nel notebook", + "title": "Spostare in {icon} {name}?" + }, + "notebooks": { + "allNotebooks": "Tutti i notebook", + "create": "Crea notebook", + "createFirst": "Crea il tuo primo notebook", + "noNotebooks": "Nessun notebook" + }, + "notes": { + "add": "Aggiungi", + "addCollaborators": "Aggiungi collaboratori", + "addImage": "Aggiungi immagine", + "addItem": "Aggiungi elemento", + "addLink": "Aggiungi link", + "addListItem": "+ Elemento elenco", + "addNote": "Aggiungi nota", + "adding": "Aggiunta in corso...", + "aiAssistant": "Assistente AI", + "archive": "Archivia", + "backgroundOptions": "Opzioni di sfondo", + "changeColor": "Cambia colore", + "changeSize": "Cambia dimensione", + "clarifyFailed": "Chiarimento non riuscito", + "close": "Chiudi", + "color": "Colore", + "confirmDelete": "Sei sicuro di voler eliminare questa nota?", + "confirmLeaveShare": "Sei sicuro di voler abbandonare questa nota condivisa?", + "contentOrMediaRequired": "Inserisci del contenuto o aggiungi un link/immagine", + "copy": "Copia", + "copyFailed": "Copia della nota non riuscita", + "copySuccess": "Nota copiata con successo!", + "createFirstNote": "Crea la tua prima nota", + "date": "Data", + "delete": "Elimina", + "dragToReorder": "Trascina per riordinare", + "duplicate": "Duplica", + "edit": "Modifica nota", + "emptyState": "Nessuna nota qui", + "fileTooLarge": "File troppo grande: {fileName}. La dimensione massima è {maxSize}.", + "improveFailed": "Miglioramento non riuscito", + "inNotebook": "Nel notebook", + "invalidDateTime": "Data o ora non valide", + "invalidFileType": "Tipo di file non valido: {fileName}. Sono consentiti solo JPEG, PNG, GIF e WebP.", + "itemOrMediaRequired": "Aggiungi almeno un elemento o un contenuto multimediale", + "large": "Grande", + "leaveShare": "Abbandona", + "linkAddFailed": "Aggiunta del link non riuscita", + "linkAdded": "Link aggiunto", + "linkMetadataFailed": "Impossibile recuperare i metadati del link", + "listItem": "Elemento elenco", + "makeCopy": "Crea una copia", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown DISATTIVATO", + "markdownOn": "Markdown ATTIVO", + "markdownPlaceholder": "Scrivi una nota... (Markdown supportato)", + "medium": "Media", + "more": "Altro", + "moreOptions": "Altre opzioni", + "moveFailed": "Spostamento non riuscito", + "newChecklist": "Nuova checklist", + "newNote": "Nuova nota", + "noContent": "Nessun contenuto", + "noNotes": "Nessuna nota", + "noNotesFound": "Nessuna nota trovata", + "noteCreateFailed": "Creazione della nota non riuscita", + "noteCreated": "Nota creata con successo", + "others": "Altre", + "pin": "Fissa", + "pinned": "Fissate", + "pinnedNotes": "Note fissate", + "placeholder": "Scrivi una nota...", + "preview": "Anteprima", + "readOnly": "Sola lettura", + "recent": "Recenti", + "redo": "Ripeti", + "redoShortcut": "Ripeti (Ctrl+Y)", + "remindMe": "Ricordamelo", + "reminderDateTimeRequired": "Inserisci data e ora", + "reminderMustBeFuture": "Il promemoria deve essere nel futuro", + "reminderPastError": "Il promemoria deve essere nel futuro", + "reminderRemoved": "Promemoria rimosso", + "reminderSet": "Promemoria impostato per {datetime}", + "remove": "Remove", + "saving": "Salvataggio in corso...", + "setReminder": "Imposta promemoria", + "setReminderButton": "Imposta promemoria", + "share": "Condividi", + "shareWithCollaborators": "Condividi con collaboratori", + "sharedBy": "Condivisa da", + "sharedReadOnly": "Questa nota è condivisa con te in modalità sola lettura", + "shortenFailed": "Accorciamento non riuscito", + "showCollaborators": "Mostra collaboratori", + "size": "Dimensione", + "small": "Piccola", + "takeNote": "Scrivi una nota...", + "takeNoteMarkdown": "Scrivi una nota... (Markdown supportato)", + "time": "Ora", + "title": "Note", + "titlePlaceholder": "Titolo", + "transformFailed": "Trasformazione non riuscita", + "unarchive": "Rimuovi dall’archivio", + "undo": "Annulla", + "undoShortcut": "Annulla (Ctrl+Z)", + "unpin": "Rimuovi fissaggio", + "unpinned": "Non fissato", + "untitled": "Senza titolo", + "uploadFailed": "Caricamento non riuscito: {filename}", + "view": "Visualizza nota" + }, + "pagination": { + "next": "→", + "pageInfo": "Pagina {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "Informale", + "expand": "Espandi", + "formal": "Formale", + "improve": "Migliora", + "shorten": "Accorcia", + "title": "Miglioramento del testo" + }, + "profile": { + "accountSettings": "Impostazioni account", + "autoDetect": "Rilevamento automatico", + "changePassword": "Cambia password", + "changePasswordDescription": "Aggiorna la tua password. È necessaria la password attuale.", + "confirmPassword": "Conferma password", + "currentPassword": "Password attuale", + "description": "Aggiorna le tue informazioni personali", + "displayName": "Nome visualizzato", + "displaySettings": "Impostazioni di visualizzazione", + "displaySettingsDescription": "Personalizza l’aspetto e la dimensione del testo.", + "email": "Email", + "fontSize": "Dimensione carattere", + "fontSizeDescription": "Regola la dimensione del testo per una migliore leggibilità.", + "fontSizeExtraLarge": "Molto grande", + "fontSizeLarge": "Grande", + "fontSizeMedium": "Media", + "fontSizeSmall": "Piccola", + "fontSizeUpdateFailed": "Aggiornamento della dimensione del carattere non riuscito", + "fontSizeUpdateSuccess": "Dimensione del carattere aggiornata", + "languageDescription": "Questa lingua sarà usata per le funzionalità AI, l’analisi dei contenuti e l’interfaccia.", + "languagePreferences": "Preferenze lingua", + "languagePreferencesDescription": "Scegli la lingua preferita per le funzionalità AI e l’interfaccia.", + "languageUpdateFailed": "Aggiornamento della lingua non riuscito", + "languageUpdateSuccess": "Lingua aggiornata con successo", + "manageAISettings": "Gestisci impostazioni AI", + "newPassword": "Nuova password", + "passwordChangeFailed": "Cambio password non riuscito", + "passwordChangeSuccess": "Password cambiata con successo", + "passwordError": "Errore nell’aggiornamento della password", + "passwordUpdated": "Password aggiornata", + "preferredLanguage": "Lingua preferita", + "profileError": "Errore nell’aggiornamento del profilo", + "profileUpdated": "Profilo aggiornato", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "Seleziona dimensione carattere", + "selectLanguage": "Seleziona una lingua", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "Profilo", + "updateFailed": "Aggiornamento del profilo non riuscito", + "updatePassword": "Aggiorna password", + "updateSuccess": "Profilo aggiornato" + }, + "reminder": { + "cancel": "Annulla", + "reminderDate": "Data promemoria", + "reminderTime": "Ora promemoria", + "removeReminder": "Rimuovi promemoria", + "save": "Imposta promemoria", + "setReminder": "Imposta promemoria", + "title": "Promemoria" + }, + "resetPassword": { + "confirmNewPassword": "Conferma nuova password", + "description": "Inserisci la tua nuova password qui sotto.", + "invalidLinkDescription": "Questo link per il reset della password non è valido o è scaduto.", + "invalidLinkTitle": "Link non valido", + "loading": "Caricamento...", + "newPassword": "Nuova password", + "passwordMismatch": "Le password non coincidono", + "requestNewLink": "Richiedi nuovo link", + "resetPassword": "Reimposta password", + "resetting": "Reimpostazione...", + "success": "Password reimpostata con successo. Ora puoi accedere.", + "title": "Reimposta password" + }, + "search": { + "exactMatch": "Corrispondenza esatta", + "noResults": "Nessun risultato trovato", + "placeholder": "Cerca", + "related": "Correlate", + "resultsFound": "{count} note trovate", + "searchPlaceholder": "Cerca nelle tue note...", + "searching": "Ricerca in corso...", + "semanticInProgress": "Ricerca AI in corso...", + "semanticTooltip": "Ricerca semantica AI" }, - "semanticSearch": { "exactMatch": "Corrispondenza esatta", "related": "Correlate", "searching": "Ricerca in corso..." }, - - "paragraphRefactor": { - "title": "Miglioramento del testo", - "shorten": "Accorcia", - "expand": "Espandi", - "improve": "Migliora", - "formal": "Formale", - "casual": "Informale" - }, - - "memoryEcho": { - "title": "Promemoria intelligente", - "description": "Revisione periodica delle tue note", - "dailyInsight": "Insight giornaliero dalle tue note", - "insightReady": "Il tuo insight è pronto!", - "viewConnection": "Visualizza connessione", - "helpful": "Utile", - "notHelpful": "Non utile", - "dismiss": "Ignora per ora", - "thanksFeedback": "Grazie per il tuo feedback!", - "thanksFeedbackImproving": "Grazie! Useremo questo per migliorare.", - "connections": "Connessioni", - "connection": "connessione", - "connectionsBadge": "{count} connessione{plural}", - "fused": "Fusione", - "overlay": { - "title": "Note connesse", - "searchPlaceholder": "Cerca connessioni...", - "sortBy": "Ordina per:", - "sortSimilarity": "Similarità", - "sortRecent": "Recenti", - "sortOldest": "Più vecchie", - "viewAll": "Visualizza tutto accanto", - "loading": "Caricamento...", - "noConnections": "Nessuna connessione trovata" - }, - "comparison": { - "title": "💡 Confronto note", - "similarityInfo": "Queste note sono connesse da {similarity}% di similarità", - "highSimilarityInsight": "Queste note trattano lo stesso argomento con un alto grado di similarità. Possono essere fuse o consolidate.", - "untitled": "Senza titolo", - "clickToView": "Clicca per visualizzare la nota", - "helpfulQuestion": "È utile questo confronto?", - "helpful": "Utile", - "notHelpful": "Non utile" - }, - "editorSection": { - "title": "⚡ Note connesse ({count})", - "loading": "Caricamento...", - "view": "Visualizza", - "compare": "Confronta", - "merge": "Unisci", - "compareAll": "Confronta tutto", - "mergeAll": "Unisci tutto" - }, - "fusion": { - "title": "🔗 Fusione intelligente", - "mergeNotes": "Unisci {count} note", - "notesToMerge": "📝 Note da unire", - "optionalPrompt": "💠 Prompt di fusione (opzionale)", - "promptPlaceholder": "Istruzioni opzionali per l'AI (es. 'Mantieni lo stile formale della nota 1')...", - "generateFusion": "Genera fusione", - "generating": "Generazione...", - "previewTitle": "📝 Anteprima nota unita", - "edit": "Modifica", - "modify": "Modifica", - "finishEditing": "Termina modifica", - "optionsTitle": "Opzioni fusione", - "archiveOriginals": "Archivia originali", - "keepAllTags": "Mantieni tutti i tag", - "useLatestTitle": "Usa la nota più recente come titolo", - "createBacklinks": "Crea backlink alle note originali", - "cancel": "Annulla", - "confirmFusion": "Conferma fusione", - "success": "Note unite con successo!", - "error": "Fusione note non riuscita" - }, - "generateError": "Errore generazione fusione", - "noContentReturned": "Nessun contenuto restituito dall'AI", - "unknownDate": "Data sconosciuta" - }, - - "nav": { - "home": "Home", - "notes": "Note", - "archive": "Archivio", - "settings": "Impostazioni", - "profile": "Profilo", - "aiSettings": "Impostazioni AI", - "logout": "Logout", - "login": "Login", - "adminDashboard": "Dashboard amministratore", - "diagnostics": "Diagnostica", - "trash": "Cestino", - "support": "Supporta Memento ☕", - "reminders": "Promemoria", - "userManagement": "Gestione utenti", - "accountSettings": "Impostazioni account", - "manageAISettings": "Gestisci impostazioni AI", - "configureAI": "Configura le funzionalità AI, il provider e le preferenze", - "supportDevelopment": "Supporta lo sviluppo di Memento ☕", - "supportDescription": "Memento è 100% gratuito e open-source. Il tuo supporto aiuta a mantenerlo tale.", - "buyMeACoffee": "Offrimi un caffè", - "donationDescription": "Fai una donazione una tantum o diventa un sostenitore mensile.", - "donateOnKofi": "Dona su Ko-fi", - "donationNote": "Nessuna commissione • Pagamenti immediati • Sicuro", - "sponsorOnGithub": "Sponsorizza su GitHub", - "sponsorDescription": "Diventa uno sponsor mensile e ricevi riconoscimento.", - "workspace": "Area di lavoro", - "quickAccess": "Accesso rapido", - "myLibrary": "La mia libreria", - "favorites": "Preferiti", - "recent": "Recenti", - "proPlan": "Piano Pro" - }, - "settings": { - "title": "Impostazioni", - "description": "Gestisci le tue impostazioni e preferenze", + "about": "About", "account": "Account", - "appearance": "Aspetto", - "theme": "Tema", - "themeLight": "Chiaro", - "themeDark": "Scuro", - "themeSystem": "Sistema", - "notifications": "Notifiche", - "language": "Lingua", - "selectLanguage": "Seleziona lingua", + "appearance": "Appearance", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "Manage your settings and preferences", + "language": "Language", + "languageAuto": "Automatico", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "Notifications", "privacy": "Privacy", - "security": "Sicurezza", - "about": "Informazioni", - "version": "Versione", - "settingsSaved": "Impostazioni salvate", - "settingsError": "Errore nel salvataggio delle impostazioni" + "profile": "Profilo", + "searchNoResults": "Nessun risultato trovato", + "security": "Security", + "selectLanguage": "Select language", + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "Error saving settings", + "settingsSaved": "Settings saved", + "theme": "Theme", + "themeDark": "Dark", + "themeLight": "Light", + "themeSystem": "System", + "title": "Settings", + "version": "Version" }, - - "profile": { - "title": "Profilo", - "description": "Aggiorna le tue informazioni personali", - "displayName": "Nome visualizzato", - "email": "Email", - "changePassword": "Cambia password", - "changePasswordDescription": "Aggiorna la tua password. È necessaria la password attuale.", - "currentPassword": "Password attuale", - "newPassword": "Nuova password", - "confirmPassword": "Conferma password", - "updatePassword": "Aggiorna password", - "passwordChangeSuccess": "Password cambiata con successo", - "passwordChangeFailed": "Cambio password non riuscito", - "passwordUpdated": "Password aggiornata", - "passwordError": "Errore nell’aggiornamento della password", - "languagePreferences": "Preferenze lingua", - "languagePreferencesDescription": "Scegli la lingua preferita per le funzionalità AI e l’interfaccia.", - "preferredLanguage": "Lingua preferita", - "selectLanguage": "Seleziona una lingua", - "languageDescription": "Questa lingua sarà usata per le funzionalità AI, l’analisi dei contenuti e l’interfaccia.", - "autoDetect": "Rilevamento automatico", - "updateSuccess": "Profilo aggiornato", - "updateFailed": "Aggiornamento del profilo non riuscito", - "languageUpdateSuccess": "Lingua aggiornata con successo", - "languageUpdateFailed": "Aggiornamento della lingua non riuscito", - "profileUpdated": "Profilo aggiornato", - "profileError": "Errore nell’aggiornamento del profilo", - "accountSettings": "Impostazioni account", - "manageAISettings": "Gestisci impostazioni AI", - "displaySettings": "Impostazioni di visualizzazione", - "displaySettingsDescription": "Personalizza l’aspetto e la dimensione del testo.", - "fontSize": "Dimensione carattere", - "selectFontSize": "Seleziona dimensione carattere", - "fontSizeSmall": "Piccola", - "fontSizeMedium": "Media", - "fontSizeLarge": "Grande", - "fontSizeExtraLarge": "Molto grande", - "fontSizeDescription": "Regola la dimensione del testo per una migliore leggibilità.", - "fontSizeUpdateSuccess": "Dimensione del carattere aggiornata", - "fontSizeUpdateFailed": "Aggiornamento della dimensione del carattere non riuscito" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" }, - - "aiSettings": { - "title": "Impostazioni AI", - "description": "Configura le funzionalità AI e le preferenze", - "features": "Funzionalità AI", - "provider": "Provider AI", - "providerAuto": "Automatico (Consigliato)", - "providerOllama": "Ollama (Locale)", - "providerOpenAI": "OpenAI (Cloud)", - "frequency": "Frequenza", - "frequencyDaily": "Giornaliera", - "frequencyWeekly": "Settimanale", - "saving": "Salvataggio in corso...", - "saved": "Impostazione aggiornata", - "error": "Aggiornamento dell’impostazione non riuscito" + "support": { + "aiApiCosts": "Costi API AI:", + "buyMeACoffee": "Offrimi un caffè", + "contributeCode": "Contribuisci con il codice", + "description": "Memento è al 100% gratuito e open-source. Il tuo supporto aiuta a mantenerlo tale.", + "directImpact": "Impatto diretto", + "domainSSL": "Dominio e SSL:", + "donateOnKofi": "Dona su Ko-fi", + "donationDescription": "Fai una donazione una tantum o diventa un sostenitore mensile.", + "githubDescription": "Supporto ricorrente • Riconoscimento pubblico • Focalizzato sugli sviluppatori", + "hostingServers": "Hosting e server:", + "howSupportHelps": "Come aiuta il tuo supporto", + "kofiDescription": "Nessuna commissione • Pagamenti immediati • Sicuro", + "otherWaysTitle": "Altri modi per supportare", + "reportBug": "Segnala un bug", + "shareTwitter": "Condividi su Twitter", + "sponsorDescription": "Diventa uno sponsor mensile e ottieni riconoscimento.", + "sponsorOnGithub": "Sponsorizza su GitHub", + "sponsorPerks": "Vantaggi sponsor", + "starGithub": "Metti una stella su GitHub", + "title": "Supporta lo sviluppo di Memento", + "totalExpenses": "Spese totali:", + "transparency": "Trasparenza", + "transparencyDescription": "Credo nella completa trasparenza. Ecco come vengono utilizzate le donazioni:" }, - - "general": { - "loading": "Caricamento...", - "save": "Salva", - "cancel": "Annulla", - "add": "Aggiungi", - "edit": "Modifica", - "confirm": "Conferma", + "testPages": { + "titleSuggestions": { + "analyzing": "Analisi...", + "contentLabel": "Contenuto (servono più di 50 parole):", + "error": "Errore:", + "idle": "Inattivo", + "noSuggestions": "Nessun suggerimento ancora. Scrivi 50+ parole e aspetta 2 secondi.", + "placeholder": "Scrivi almeno 50 parole qui...", + "status": "Stato:", + "suggestions": "Suggerimenti ({count}):", + "title": "Test suggerimenti titolo", + "wordCount": "Conteggio parole:" + } + }, + "time": { + "daysAgo": "{count} giorni fa", + "hoursAgo": "{count} ore fa", + "justNow": "Adesso", + "minutesAgo": "{count} minuti fa", + "today": "Oggi", + "tomorrow": "Domani", + "yesterday": "Ieri" + }, + "titleSuggestions": { + "available": "Suggerimenti titolo", + "dismiss": "Ignora", + "generating": "Generazione in corso...", + "selectTitle": "Seleziona un titolo", + "title": "Suggerimenti AI" + }, + "toast": { + "feedbackFailed": "Impossibile inviare il feedback", + "notesFusionSuccess": "Note unite con successo!", + "openConnectionFailed": "Impossibile aprire la connessione", + "openingConnection": "Apertura connessione...", + "operationFailed": "Operazione fallita", + "operationSuccess": "Operazione riuscita", + "saveFailed": "Impossibile salvare l'impostazione", + "saved": "Impostazione salvata", + "thanksFeedback": "Grazie per il tuo feedback!", + "thanksFeedbackImproving": "Grazie! Lo useremo per migliorare." + }, + "trash": { + "deletePermanently": "Elimina permanentemente", + "empty": "Il cestino è vuoto", + "restore": "Ripristina", + "title": "Cestino" + }, + "ui": { "close": "Chiudi", - "back": "Indietro", - "next": "Avanti", - "previous": "Precedente", - "submit": "Invia", - "reset": "Reimposta", - "apply": "Applica", - "clear": "Cancella", - "select": "Seleziona", - "tryAgain": "Riprova", - "error": "Si è verificato un errore", - "operationSuccess": "Operazione completata", - "operationFailed": "Operazione non riuscita" - }, - - "colors": { - "default": "Predefinito", - "red": "Rosso", - "blue": "Blu", - "green": "Verde", - "yellow": "Giallo", - "purple": "Viola", - "pink": "Rosa", - "orange": "Arancione", - "gray": "Grigio" - }, - - "reminder": { - "title": "Promemoria", - "setReminder": "Imposta promemoria", - "removeReminder": "Rimuovi promemoria", - "reminderDate": "Data promemoria", - "reminderTime": "Ora promemoria", - "save": "Imposta promemoria", - "cancel": "Annulla" - }, - - "notebook": { - "create": "Crea notebook", - "createNew": "Crea nuovo notebook", - "createDescription": "Avvia una nuova raccolta per organizzare note, idee e progetti in modo efficiente.", - "name": "Nome del notebook", - "selectIcon": "Icona", - "selectColor": "Colore", - "cancel": "Annulla", - "creating": "Creazione...", - "edit": "Modifica notebook", - "editDescription": "Cambia nome, icona e colore del tuo notebook.", - "delete": "Elimina notebook", - "deleteWarning": "Sei sicuro di voler eliminare questo notebook? Le note verranno spostate in Note generali.", - "deleteConfirm": "Elimina", - "summary": "Riepilogo notebook", - "summaryDescription": "Genera un riepilogo basato su IA di tutte le note in questo notebook.", - "generating": "Generazione riepilogo...", - "summaryError": "Errore nella generazione del riepilogo" + "collapse": "Comprimi", + "expand": "Espandi", + "open": "Apri" } } diff --git a/keep-notes/locales/ja.json b/keep-notes/locales/ja.json index bb7b513..f5cc8be 100644 --- a/keep-notes/locales/ja.json +++ b/keep-notes/locales/ja.json @@ -1,507 +1,993 @@ { - "auth": { - "signIn": "ログイン", - "signUp": "新規登録", - "email": "メールアドレス", - "password": "パスワード", - "name": "名前", - "emailPlaceholder": "メールアドレスを入力してください", - "passwordPlaceholder": "パスワードを入力してください", - "namePlaceholder": "お名前を入力してください", - "passwordMinChars": "パスワードを入力してください(最小6文字)", - "resetPassword": "パスワードをリセット", - "resetPasswordInstructions": "パスワードをリセットするためメールアドレスを入力してください", - "forgotPassword": "パスワードをお忘れですか?", - "noAccount": "アカウントをお持ちでない方", - "hasAccount": "すでにアカウントをお持ちの方", - "signInToAccount": "アカウントにログイン", - "createAccount": "アカウントを作成", - "rememberMe": "ログイン状態を保持", - "orContinueWith": "または続ける", - "checkYourEmail": "メールをご確認ください", - "resetEmailSent": "システムに登録されている場合、パスワードリセットリンクをメールでお送りしました。", - "returnToLogin": "ログインに戻る", - "forgotPasswordTitle": "パスワードを忘れた場合", - "forgotPasswordDescription": "メールアドレスを入力すると、パスワードリセット用のリンクをお送りします。", - "sending": "送信中...", - "sendResetLink": "リセットリンクを送信", - "backToLogin": "ログインに戻る" + "about": { + "appDescription": "AI機能を備えた強力なメモアプリケーション", + "appName": "Keep Notes", + "buildDate": "ビルド日", + "description": "アプリケーション情報", + "features": { + "description": "AI搭載機能", + "dragDrop": "ドラッグ&ドロップのノート管理", + "labelSystem": "ラベルシステム", + "memoryEcho": "Memory Echo デーリーインサイト", + "multipleProviders": "複数のAIプロバイダー(OpenAI、Ollama)", + "notebookOrganization": "ノートブックの整理", + "paragraphReformulation": "段落の言い換え", + "semanticSearch": "埋め込みによるセマンティック検索", + "title": "機能", + "titleSuggestions": "AI搭載のタイトル提案" + }, + "platform": "プラットフォーム", + "platformWeb": "Web", + "support": { + "description": "ヘルプとフィードバック", + "documentation": "ドキュメント", + "feedback": "フィードバック", + "reportIssues": "問題を報告", + "title": "サポート" + }, + "technology": { + "ai": "AI", + "authentication": "認証", + "backend": "バックエンド", + "database": "データベース", + "description": "最新技術で構築", + "frontend": "フロントエンド", + "testing": "テスト", + "title": "テクノロジースタック", + "ui": "UI" + }, + "title": "について", + "version": "バージョン" }, - "notes": { - "title": "ノート", - "newNote": "新しいノート", - "untitled": "無題", - "placeholder": "ノートを作成...", - "markdownPlaceholder": "ノートを作成...(Markdown対応)", - "titlePlaceholder": "タイトル", - "listItem": "リスト項目", - "addListItem": "+ リスト項目", - "newChecklist": "新しいチェックリスト", - "add": "追加", - "adding": "追加中...", - "close": "閉じる", - "confirmDelete": "このノートを削除してもよろしいですか?", - "confirmLeaveShare": "この共有ノートを退出してもよろしいですか?", - "sharedBy": "共有者", - "leaveShare": "退出", - "delete": "削除", - "archive": "アーカイブ", - "unarchive": "アーカイブを解除", - "pin": "ピン留め", - "unpin": "ピン留め解除", - "color": "色", - "changeColor": "色を変更", - "setReminder": "リマインダーを設定", - "setReminderButton": "リマインダーを設定", - "date": "日付", - "time": "時刻", - "reminderDateTimeRequired": "日付と時刻を入力してください", - "invalidDateTime": "無効な日付または時刻", - "reminderMustBeFuture": "リマインダーは未来の日時に設定してください", - "reminderSet": "リマインダーを{datetime}に設定しました", - "reminderPastError": "リマインダーは未来の日時に設定してください", - "reminderRemoved": "リマインダーを削除しました", - "addImage": "画像を追加", - "addLink": "リンクを追加", - "linkAdded": "リンクを追加しました", - "linkMetadataFailed": "リンクのメタデータを取得できませんでした", - "linkAddFailed": "リンクの追加に失敗しました", - "invalidFileType": "無効なファイルタイプ:{fileName}。JPEG、PNG、GIF、WebPのみ使用可能です。", - "fileTooLarge": "ファイルが大きすぎます:{fileName}。最大サイズは{maxSize}です。", - "uploadFailed": "{filename}のアップロードに失敗しました", - "contentOrMediaRequired": "コンテンツを入力するか、リンク/画像を追加してください", - "itemOrMediaRequired": "少なくとも1つの項目またはメディアを追加してください", - "noteCreated": "ノートを作成しました", - "noteCreateFailed": "ノートの作成に失敗しました", - "aiAssistant": "AIアシスタント", - "changeSize": "サイズを変更", - "backgroundOptions": "背景オプション", - "moreOptions": "その他のオプション", - "remindMe": "リマインド", - "markdownMode": "Markdown", - "addCollaborators": "共同編集者を追加", - "duplicate": "複製", - "share": "共有", - "showCollaborators": "共同編集者を表示", - "pinned": "ピン留め済み", - "others": "その他", - "noNotes": "ノートはありません", - "noNotesFound": "ノートが見つかりませんでした", - "createFirstNote": "最初のノートを作成", - "size": "サイズ", - "small": "小", - "medium": "中", - "large": "大", - "shareWithCollaborators": "共同編集者と共有", - "view": "ノートを表示", - "edit": "ノートを編集", - "readOnly": "読み取り専用", - "preview": "プレビュー", - "noContent": "コンテンツなし", - "takeNote": "ノートを作成...", - "takeNoteMarkdown": "ノートを作成...(Markdown対応)", - "addItem": "項目を追加", - "sharedReadOnly": "このノートは読み取り専用モードで共有されています", - "makeCopy": "コピーを作成", - "saving": "保存中...", - "copySuccess": "ノートをコピーしました!", - "copyFailed": "ノートのコピーに失敗しました", - "copy": "コピー", - "markdownOn": "Markdownオン", - "markdownOff": "Markdownオフ", - "undo": "元に戻す (Ctrl+Z)", - "redo": "やり直し (Ctrl+Y)" - }, - "pagination": { - "previous": "←", - "pageInfo": "{currentPage} / {totalPages} ページ", - "next": "→" - }, - "labels": { - "title": "ラベル", - "filter": "ラベルでフィルタ", - "manage": "ラベルを管理", - "manageTooltip": "ラベルを管理", - "changeColor": "色を変更", - "changeColorTooltip": "色を変更", - "delete": "削除", - "deleteTooltip": "ラベルを削除", - "confirmDelete": "このラベルを削除してもよろしいですか?", - "newLabelPlaceholder": "新しいラベルを作成", - "namePlaceholder": "ラベル名を入力", - "addLabel": "ラベルを追加", - "createLabel": "ラベルを作成", - "labelName": "ラベル名", - "labelColor": "ラベルの色", - "manageLabels": "ラベルを管理", - "manageLabelsDescription": "このノートのラベルを追加または削除します。ラベルをクリックして色を変更できます。", - "selectedLabels": "選択したラベル", - "allLabels": "すべてのラベル", - "clearAll": "すべてクリア", - "filterByLabel": "ラベルでフィルタ", - "tagAdded": "タグ「{tag}」を追加しました", - "showLess": "折りたたむ", - "showMore": "もっと見る", - "editLabels": "ラベルを編集", - "editLabelsDescription": "ラベルの作成、色の編集、または削除を行います。", - "noLabelsFound": "ラベルが見つかりませんでした。", - "loading": "読み込み中..." - }, - "search": { - "placeholder": "検索", - "searchPlaceholder": "ノートを検索...", - "semanticInProgress": "AI検索中...", - "semanticTooltip": "AIセマンティック検索", - "searching": "検索中...", - "noResults": "結果が見つかりませんでした", - "resultsFound": "{count}件のノートが見つかりました", - "exactMatch": "完全一致", - "related": "関連" - }, - "collaboration": { - "emailPlaceholder": "メールアドレスを入力", - "addCollaborator": "共同編集者を追加", - "removeCollaborator": "共同編集者を削除", - "owner": "オーナー", - "canEdit": "編集可能", - "canView": "閲覧可能", - "shareNote": "ノートを共有", - "shareWithCollaborators": "共同編集者と共有", - "addCollaboratorDescription": "メールアドレスでこのノートの共同編集者を追加します。", - "viewerDescription": "このノートへのアクセス権があります。オーナーのみが共同編集者を管理できます。", - "emailAddress": "メールアドレス", - "enterEmailAddress": "メールアドレスを入力", - "invite": "招待", - "peopleWithAccess": "アクセス権のあるユーザー", - "noCollaborators": "まだ共同編集者がいません。上で追加してください!", - "noCollaboratorsViewer": "まだ共同編集者がいません。", - "pendingInvite": "保留中の招待", - "pending": "保留中", - "remove": "削除", - "unnamedUser": "名前のないユーザー", - "done": "完了", - "willBeAdded": "{email}はノート作成時に共同編集者として追加されます", - "alreadyInList": "このメールアドレスはすでにリストにあります", - "nowHasAccess": "{name}がこのノートにアクセスできるようになりました", - "accessRevoked": "アクセス権が取り消されました", - "errorLoading": "共同編集者の読み込みエラー", - "failedToAdd": "共同編集者の追加に失敗しました", - "failedToRemove": "共同編集者の削除に失敗しました" + "admin": { + "ai": { + "apiKey": "APIキー", + "baseUrl": "ベースURL", + "commonEmbeddingModels": "OpenAI互換APIの一般的な埋め込みモデル", + "commonModelsDescription": "OpenAI互換APIの一般的なモデル", + "description": "自動タグ付けとセマンティック検索用のAIプロバイダーを設定します。最適なパフォーマンスのために異なるプロバイダーを使用してください。", + "embeddingsDescription": "セマンティック検索埋め込み用のAIプロバイダー。推奨:OpenAI(最高品質)。", + "embeddingsProvider": "埋め込みプロバイダー", + "model": "モデル", + "modelRecommendations": "gpt-4o-mini = 最高のコスパ • gpt-4o = 最高品質", + "openAIKeyDescription": "platform.openai.comからのOpenAI APIキー", + "openTestPanel": "AIテストパネルを開く", + "provider": "プロバイダー", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDINGは必須です", + "providerTagsRequired": "AI_PROVIDER_TAGSは必須です", + "saveSettings": "AI設定を保存", + "saving": "保存中...", + "selectEmbeddingModel": "システムにインストールされている埋め込みモデルを選択", + "selectOllamaModel": "システムにインストールされているOllamaモデルを選択", + "tagsGenerationDescription": "自動タグ提案用のAIプロバイダー。推奨:Ollama(無料、ローカル)。", + "tagsGenerationProvider": "タグ生成プロバイダー", + "title": "AI設定", + "updateFailed": "AI設定の更新に失敗しました", + "updateSuccess": "AI設定が正常に更新されました" + }, + "aiTest": { + "description": "タグ生成とセマンティック検索埋め込みのAIプロバイダーをテストします", + "embeddingDimensions": "埋め込み次元:", + "embeddingsTestDescription": "セマンティック検索埋め込みを担当するAIプロバイダーをテストします", + "embeddingsTestTitle": "埋め込みテスト", + "error": "エラー:", + "first5Values": "最初の5つの値:", + "generatedTags": "生成されたタグ:", + "howItWorksTitle": "テストの仕組み", + "model": "モデル:", + "provider": "プロバイダー:", + "responseTime": "応答時間:{time}ミリ秒", + "runTest": "テストを実行", + "tagsTestDescription": "自動タグ提案を担当するAIプロバイダーをテストします", + "tagsTestTitle": "タグ生成テスト", + "testError": "テストエラー:{error}", + "testFailed": "テスト失敗", + "testPassed": "テスト合格", + "testing": "テスト中...", + "tipDescription": "テスト前にAIテストパネルを使用して設定の問題を診断してください。", + "tipTitle": "ヒント:", + "title": "AIプロバイダーテスト", + "vectorDimensions": "ベクトル次元" + }, + "aiTesting": "AIテスト", + "security": { + "allowPublicRegistration": "公開登録を許可", + "allowPublicRegistrationDescription": "無効にすると、新しいユーザーは管理者がユーザー管理ページからのみ追加できます。", + "description": "アクセス制御と登録ポリシーを管理します。", + "title": "セキュリティ設定", + "updateFailed": "セキュリティ設定の更新に失敗しました", + "updateSuccess": "セキュリティ設定が更新されました" + }, + "settings": "管理者設定", + "smtp": { + "description": "パスワードリセット用のメールサーバーを設定します。", + "forceSSL": "SSL/TLSを強制(通常はポート465用)", + "fromEmail": "送信元メール", + "host": "ホスト", + "ignoreCertErrors": "証明書エラーを無視(自己ホスト/開発のみ)", + "password": "パスワード", + "port": "ポート", + "saveSettings": "SMTP設定を保存", + "sending": "送信中...", + "testEmail": "テストメール", + "testFailed": "失敗:{error}", + "testSuccess": "テストメールが正常に送信されました!", + "title": "SMTP設定", + "updateFailed": "SMTP設定の更新に失敗しました", + "updateSuccess": "SMTP設定が更新されました", + "username": "ユーザー名" + }, + "title": "管理ダッシュボード", + "userManagement": "ユーザー管理", + "users": { + "addUser": "ユーザーを追加", + "confirmDelete": "Are you sure? This action cannot be undone.", + "createFailed": "ユーザーの作成に失敗しました", + "createSuccess": "ユーザーが正常に作成されました", + "createUser": "ユーザーを作成", + "createUserDescription": "システムに新しいユーザーを追加します。", + "deleteFailed": "削除に失敗しました", + "deleteSuccess": "ユーザーが削除されました", + "demote": "降格", + "email": "メール", + "name": "名前", + "password": "パスワード", + "promote": "昇格", + "role": "役割", + "roleUpdateFailed": "役割の更新に失敗しました", + "roleUpdateSuccess": "ユーザーの役割が{role}に更新されました", + "roles": { + "admin": "管理者", + "user": "ユーザー" + }, + "table": { + "actions": "アクション", + "createdAt": "作成日", + "email": "メール", + "name": "名前", + "role": "役割" + } + } }, "ai": { "analyzing": "AI分析中...", + "assistant": "AIアシスタント", + "autoLabels": { + "analyzing": "ラベル提案のためにノートを分析中...", + "create": "作成", + "createNewLabel": "Create this new label and add it", + "created": "{count} labels created successfully", + "creating": "ラベルを作成中...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(新規)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "ラベルの提案", + "typeContent": "Type content to get label suggestions..." + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Failed to apply organization plan", + "applying": "Applying...", + "description": "AIがノートを分析し、ノートブックに整理することを提案します。", + "error": "Failed to create organization plan", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "No notes selected", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Select all notes in {notebook}", + "selectNote": "Select note: {title}", + "success": "{count} notes moved successfully", + "title": "Organize with AI" + }, + "clarify": "明確にする", "clickToAddTag": "クリックしてこのタグを追加", - "ignoreSuggestion": "この提案を無視", - "generatingTitles": "タイトルを生成中...", + "generateTitles": "タイトルを生成", "generateTitlesTooltip": "AIでタイトルを生成", - "poweredByAI": "AI powered", + "generating": "生成中...", + "generatingTitles": "タイトルを生成中...", + "ignoreSuggestion": "この提案を無視", + "improveStyle": "スタイルを改善", "languageDetected": "検出された言語", + "notebookSummary": { + "regenerate": "概要を再生成", + "regenerating": "概要を再生成中..." + }, + "original": "元のテキスト", + "poweredByAI": "AI powered", "processing": "処理中...", - "tagAdded": "タグ「{tag}」を追加しました", - "titleGenerating": "生成中...", - "titleGenerateWithAI": "AIでタイトルを生成", - "titleGenerationMinWords": "タイトルを生成するにはコンテンツが少なくとも10単語必要です(現在:{count}単語)", - "titleGenerationError": "タイトルの生成エラー", - "titlesGenerated": "💡 {count}個のタイトルを生成しました!", - "titleGenerationFailed": "タイトルの生成に失敗しました", - "titleApplied": "タイトルを適用しました!", - "reformulationNoText": "テキストを選択するかコンテンツを追加してください", - "reformulationSelectionTooShort": "選択が短すぎます。完全なコンテンツを使用します", - "reformulationMinWords": "テキストは少なくとも10単語必要です(現在:{count}単語)", - "reformulationMaxWords": "テキストは最大500単語までです", + "reformulateText": "テキストをリフォーミュレート", + "reformulated": "リフォーミュレート済み", + "reformulating": "リフォーミュレート中...", + "reformulationApplied": "リフォーミュレーションされたテキストを適用しました!", + "reformulationComparison": "リフォーミュレーションの比較", "reformulationError": "リフォーミュレーション中のエラー", "reformulationFailed": "テキストのリフォーミュレーションに失敗しました", - "reformulationApplied": "リフォーミュレーションされたテキストを適用しました!", - "transformMarkdown": "Markdownに変換", - "transforming": "変換中...", - "transformSuccess": "テキストをMarkdownに正常に変換しました!", - "transformError": "変換中のエラー", - "assistant": "AIアシスタント", - "generating": "生成中...", - "generateTitles": "タイトルを生成", - "reformulateText": "テキストをリフォーミュレート", - "reformulating": "リフォーミュレート中...", - "clarify": "明確にする", + "reformulationMaxWords": "テキストは最大500単語までです", + "reformulationMinWords": "テキストは少なくとも10単語必要です(現在:{count}単語)", + "reformulationNoText": "テキストを選択するかコンテンツを追加してください", + "reformulationSelectionTooShort": "選択が短すぎます。完全なコンテンツを使用します", "shorten": "短くする", - "improveStyle": "スタイルを改善", - "reformulationComparison": "リフォーミュレーションの比較", - "original": "元のテキスト", - "reformulated": "リフォーミュレート済み" + "tagAdded": "タグ「{tag}」を追加しました", + "titleApplied": "タイトルを適用しました!", + "titleGenerateWithAI": "AIでタイトルを生成", + "titleGenerating": "生成中...", + "titleGenerationError": "タイトルの生成エラー", + "titleGenerationFailed": "タイトルの生成に失敗しました", + "titleGenerationMinWords": "タイトルを生成するにはコンテンツが少なくとも10単語必要です(現在:{count}単語)", + "titlesGenerated": "💡 {count}個のタイトルを生成しました!", + "transformError": "変換中のエラー", + "transformMarkdown": "Markdownに変換", + "transformSuccess": "テキストをMarkdownに正常に変換しました!", + "transforming": "変換中..." }, - "batchOrganization": { - "error": "組織計画の作成に失敗しました", - "noNotesSelected": "ノートが選択されていません", - "title": "AIで整理", - "description": "AIがノートを分析し、ノートブックに整理することを提案します。", - "analyzing": "ノートを分析中...", - "notesToOrganize": "{count}個のノートを整理", - "selected": "{count}個選択済み", - "noNotebooks": "利用可能なノートブックがありません。まずノートブックを作成してノートを整理してください。", - "noSuggestions": "AIはこれらのノートを整理する良い方法を見つけられませんでした。", - "confidence": "信頼性", - "unorganized": "{count}個のノートを分類できず、「一般ノート」に残ります。", - "applying": "適用中...", - "apply": "適用 ({count})" + "aiSettings": { + "description": "AI機能と設定を構成", + "error": "設定の更新に失敗しました", + "features": "AI機能", + "frequency": "頻度", + "frequencyDaily": "毎日", + "frequencyWeekly": "毎週", + "provider": "AIプロバイダー", + "providerAuto": "自動(推奨)", + "providerOllama": "Ollama(ローカル)", + "providerOpenAI": "OpenAI(クラウド)", + "saved": "設定を更新しました", + "saving": "保存中...", + "title": "AI設定", + "titleSuggestionsDesc": "50語以上でタイトルのないメモにタイトルを提案", + "paragraphRefactorDesc": "AI搭載のテキスト改善オプション", + "frequencyDesc": "メモの接続を分析する頻度", + "providerDesc": "お好みのAIプロバイダーを選択", + "providerAutoDesc": "Ollama優先、OpenAIフォールバック", + "providerOllamaDesc": "100%プライベート、ローカルで実行", + "providerOpenAIDesc": "最も正確、APIキーが必要" + }, + "appearance": { + "description": "アプリの見た目をカスタマイズ", + "title": "外観" + }, + "auth": { + "backToLogin": "ログインに戻る", + "checkYourEmail": "メールをご確認ください", + "createAccount": "アカウントを作成", + "email": "メールアドレス", + "emailPlaceholder": "メールアドレスを入力してください", + "forgotPassword": "パスワードをお忘れですか?", + "forgotPasswordDescription": "メールアドレスを入力すると、パスワードリセット用のリンクをお送りします。", + "forgotPasswordTitle": "パスワードを忘れた場合", + "hasAccount": "すでにアカウントをお持ちの方", + "name": "名前", + "namePlaceholder": "お名前を入力してください", + "noAccount": "アカウントをお持ちでない方", + "orContinueWith": "または続ける", + "password": "パスワード", + "passwordMinChars": "パスワードを入力してください(最小6文字)", + "passwordPlaceholder": "パスワードを入力してください", + "rememberMe": "ログイン状態を保持", + "resetEmailSent": "システムに登録されている場合、パスワードリセットリンクをメールでお送りしました。", + "resetPassword": "パスワードをリセット", + "resetPasswordInstructions": "パスワードをリセットするためメールアドレスを入力してください", + "returnToLogin": "ログインに戻る", + "sendResetLink": "リセットリンクを送信", + "sending": "送信中...", + "signIn": "ログイン", + "signInToAccount": "アカウントにログイン", + "signOut": "Sign out", + "signUp": "新規登録" }, "autoLabels": { - "error": "ラベルの提案を取得できませんでした", - "noLabelsSelected": "ラベルが選択されていません", - "created": "{count}個のラベルが正常に作成されました", "analyzing": "ノートを分析中...", - "title": "新しいラベルの提案", + "createNewLabel": "この新しいラベルを作成して追加", + "created": "{count}個のラベルが正常に作成されました", "description": "「{notebookName}」({totalNotes}個のノート)で繰り返し出现するテーマを検出しました。ラベルを作成しますか?", + "error": "ラベルの提案を取得できませんでした", + "new": "(新規)", + "noLabelsSelected": "ラベルが選択されていません", "note": "ノート", "notes": "ノート", + "title": "新しいラベルの提案", "typeContent": "ラベルの提案を取得するためにコンテンツを入力してください...", - "createNewLabel": "この新しいラベルを作成して追加", - "new": "(新規)" + "typeForSuggestions": "提案を取得するには入力してください..." }, - "titleSuggestions": { - "available": "タイトルの提案", - "title": "AIの提案", - "generating": "生成中...", - "selectTitle": "タイトルを選択", - "dismiss": "無視" + "batch": { + "organize": "整理", + "organizeWithAI": "AIで整理" + }, + "batchOrganization": { + "analyzing": "ノートを分析中...", + "apply": "適用 ({count})", + "applyFailed": "整理の適用に失敗しました", + "applying": "適用中...", + "confidence": "信頼性", + "description": "AIがノートを分析し、ノートブックに整理することを提案します。", + "error": "組織計画の作成に失敗しました", + "noNotebooks": "利用可能なノートブックがありません。まずノートブックを作成してノートを整理してください。", + "noNotesSelected": "ノートが選択されていません", + "noSuggestions": "AIはこれらのノートを整理する良い方法を見つけられませんでした。", + "notesToOrganize": "{count}個のノートを整理", + "selectAllIn": "すべて選択", + "selectNote": "ノートを選択", + "selected": "{count}個選択済み", + "success": "整理成功", + "title": "AIで整理", + "unorganized": "{count}個のノートを分類できず、「一般ノート」に残ります。" + }, + "collaboration": { + "accessRevoked": "アクセス権が取り消されました", + "addCollaborator": "共同編集者を追加", + "addCollaboratorDescription": "メールアドレスでこのノートの共同編集者を追加します。", + "alreadyInList": "このメールアドレスはすでにリストにあります", + "canEdit": "編集可能", + "canView": "閲覧可能", + "done": "完了", + "emailAddress": "メールアドレス", + "emailPlaceholder": "メールアドレスを入力", + "enterEmailAddress": "メールアドレスを入力", + "errorLoading": "共同編集者の読み込みエラー", + "failedToAdd": "共同編集者の追加に失敗しました", + "failedToRemove": "共同編集者の削除に失敗しました", + "invite": "招待", + "noCollaborators": "まだ共同編集者がいません。上で追加してください!", + "noCollaboratorsViewer": "まだ共同編集者がいません。", + "nowHasAccess": "{name}がこのノートにアクセスできるようになりました", + "owner": "オーナー", + "pending": "保留中", + "pendingInvite": "保留中の招待", + "peopleWithAccess": "アクセス権のあるユーザー", + "remove": "削除", + "removeCollaborator": "共同編集者を削除", + "shareNote": "ノートを共有", + "shareWithCollaborators": "共同編集者と共有", + "unnamedUser": "名前のないユーザー", + "viewerDescription": "このノートへのアクセス権があります。オーナーのみが共同編集者を管理できます。", + "willBeAdded": "{email}はノート作成時に共同編集者として追加されます" + }, + "colors": { + "blue": "青", + "default": "デフォルト", + "gray": "グレー", + "green": "緑", + "orange": "オレンジ", + "pink": "ピンク", + "purple": "紫", + "red": "赤", + "yellow": "黄" + }, + "common": { + "add": "追加", + "cancel": "キャンセル", + "close": "閉じる", + "confirm": "確認", + "delete": "削除", + "edit": "編集", + "error": "エラー", + "loading": "読み込み中...", + "noResults": "結果なし", + "notAvailable": "利用不可", + "optional": "任意", + "remove": "削除", + "required": "必須", + "save": "保存", + "search": "検索", + "success": "成功", + "unknown": "不明" + }, + "connection": { + "clickToView": "クリックしてノートを表示", + "helpful": "役に立つ", + "isHelpful": "この接続は役に立ちますか?", + "memoryEchoDiscovery": "Memory Echo 発見", + "notHelpful": "役に立たない", + "similarityInfo": "これらのノートは{similarity}%の類似度で接続されています" + }, + "dataManagement": { + "cleanup": { + "button": "クリーンアップ", + "description": "削除されたノートを参照するラベルと接続を削除します。", + "failed": "クリーンアップ中にエラーが発生しました", + "title": "孤立データをクリーンアップ" + }, + "cleanupComplete": "クリーンアップ完了", + "cleanupError": "クリーンアップエラー", + "dangerZone": "危険区域", + "dangerZoneDescription": "これらの操作は元に戻せません。注意してください", + "delete": { + "button": "すべてのノートを削除", + "confirm": "よろしいですか?これによりすべてのノートが完全に削除されます。", + "description": "すべてのノートを完全に削除します。この操作は元に戻せません。", + "failed": "ノートの削除に失敗しました", + "success": "すべてのノートが削除されました", + "title": "すべてのノートを削除" + }, + "deleting": "削除中...", + "export": { + "button": "ノートをエクスポート", + "description": "すべてのノートをJSONファイルとしてダウンロードします。すべてのコンテンツ、ラベル、メタデータが含まれます。", + "failed": "ノートのエクスポートに失敗しました", + "success": "ノートが正常にエクスポートされました", + "title": "すべてのノートをエクスポート" + }, + "exporting": "エクスポート中...", + "import": { + "button": "ノートをインポート", + "description": "JSONファイルをアップロードしてノートをインポートします。これは既存のノートに追加され、置き換えられません。", + "failed": "ノートのインポートに失敗しました", + "success": "{count}個のノートをインポートしました", + "title": "ノートをインポート" + }, + "importing": "インポート中...", + "indexing": { + "button": "インデックスを再構築", + "description": "セマンティック検索を改善するためにすべてのノートの埋め込みを再生成します。", + "failed": "インデックス作成中にエラーが発生しました", + "success": "インデックス作成完了:{count}個のノートを処理", + "title": "検索インデックスを再構築" + }, + "indexingComplete": "インデックス完了", + "indexingError": "インデックスエラー", + "title": "データ管理", + "toolsDescription": "データベースの健全性を維持するツール" + }, + "demoMode": { + "activated": "デモモードがアクティブになりました!Memory Echoが即座に動作します。", + "createNotesTip": "2つ以上の類似ノートを作成してMemory Echoの動作を確認してください!", + "deactivated": "デモモードが無効になりました。通常のパラメータに戻りました。", + "delayBetweenNotes": "ノート間0日の遅延(通常7日)", + "description": "テスト用にMemory Echoを高速化します。接続が即座に表示されます。", + "parametersActive": "デモパラメータがアクティブ:", + "similarityThreshold": "50% 類似度しきい値(通常75%)", + "title": "デモモード", + "toggleFailed": "デモモードの切り替えに失敗しました", + "unlimitedInsights": "無制限のインサイト(頻度制限なし)" + }, + "diagnostics": { + "apiStatus": "APIステータス", + "checking": "Checking...", + "configuredProvider": "設定されたプロバイダー", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "テスト詳細:", + "tip1": "Ollamaが実行されていることを確認(ollama serve)", + "tip2": "モデルがインストールされていることを確認(ollama pull llama3)", + "tip3": "OpenAIのAPIキーを確認", + "tip4": "ネットワーク接続を確認", + "title": "診断", + "troubleshootingTitle": "トラブルシューティングのヒント:" + }, + "favorites": { + "noFavorites": "お気に入りがありません", + "pinToFavorite": "お気に入りにピン留め", + "title": "お気に入り", + "toggleSection": "お気に入りセクションを切り替え" + }, + "footer": { + "openSource": "オープンソースクローン", + "privacy": "プライバシー", + "terms": "利用規約" + }, + "general": { + "add": "追加", + "apply": "適用", + "back": "戻る", + "cancel": "キャンセル", + "clean": "Clean", + "clear": "クリア", + "close": "閉じる", + "confirm": "確認", + "edit": "編集", + "error": "エラーが発生しました", + "indexAll": "Index All", + "loading": "読み込み中...", + "next": "次へ", + "operationFailed": "操作が失敗しました", + "operationSuccess": "操作が成功しました", + "preview": "プレビュー", + "previous": "前へ", + "reset": "リセット", + "save": "保存", + "select": "選択", + "submit": "送信", + "testConnection": "Test Connection", + "tryAgain": "もう一度お試しください" + }, + "generalSettings": { + "description": "一般的なアプリケーション設定", + "title": "一般設定" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} 個のラベル", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "ラベルがありません", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "クリックしてノートを表示", + "comparison": { + "clickToView": "クリックしてノートを表示", + "helpful": "役に立つ", + "helpfulQuestion": "この比較は役に立ちますか?", + "highSimilarityInsight": "これらのノートは同じトピックについて高水準の類似性で扱っています。統合または統合することができます。", + "notHelpful": "役に立たない", + "similarityInfo": "これらのノートは{similarity}%の類似性でつながっています", + "title": "💡 ノートの比較", + "untitled": "無題" + }, + "connection": "つながり", + "connections": "つながり", + "connectionsBadge": "{count}個のつながり{plural}", + "dailyInsight": "ノートからの毎日の洞察", + "description": "ノート間のプロアクティブなつながり", + "dismiss": "今は無視", + "editorSection": { + "close": "閉じる", + "compare": "比較", + "compareAll": "すべて比較", + "loading": "読み込み中...", + "merge": "マージ", + "mergeAll": "すべてマージ", + "title": "⚡ つながっているノート({count})", + "view": "表示" + }, + "fused": "融合済み", + "fusion": { + "archiveOriginals": "オリジナルのノートをアーカイブ", + "cancel": "キャンセル", + "confirmFusion": "融合を確認", + "createBacklinks": "オリジナルのノートへのバックリンクを作成", + "edit": "編集", + "error": "ノートのマージに失敗しました", + "finishEditing": "編集を終了", + "generateError": "Failed to generate fusion", + "generateFusion": "融合を生成", + "generating": "生成中...", + "keepAllTags": "すべてのタグを保持", + "mergeNotes": "{count}個のノートをマージ", + "modify": "修正", + "noContentReturned": "No fusion content returned from API", + "notesToMerge": "📝 マージするノート", + "optionalPrompt": "💬 融合プロンプト(オプション)", + "optionsTitle": "融合オプション", + "previewTitle": "📝 マージされたノートのプレビュー", + "promptPlaceholder": "AIへのオプションの指示(例:'ノート1のフォーマルなスタイルを維持する')...", + "success": "ノートを正常にマージしました!", + "title": "🔗 インテリジェントな融合", + "unknownDate": "Unknown date", + "useLatestTitle": "最新のノートをタイトルとして使用" + }, + "helpful": "役に立つ", + "insightReady": "洞察の準備ができました!", + "notHelpful": "役に立たない", + "overlay": { + "error": "つながりの読み込みエラー", + "loading": "読み込み中...", + "noConnections": "つながりが見つかりませんでした", + "searchPlaceholder": "つながりを検索...", + "sortBy": "並び替え:", + "sortOldest": "最古", + "sortRecent": "最新", + "sortSimilarity": "類似度", + "title": "つながっているノート", + "viewAll": "すべて並べて表示" + }, + "thanksFeedback": "フィードバックありがとうございます!", + "thanksFeedbackImproving": "ありがとうございます!改善に役立てます。", + "title": "何か気づきました...", + "viewConnection": "つながりを表示" + }, + "nav": { + "accountSettings": "アカウント設定", + "adminDashboard": "管理ダッシュボード", + "aiSettings": "AI設定", + "archive": "アーカイブ", + "buyMeACoffee": "コーヒーをご馳走する", + "configureAI": "AI機能、プロバイダー、設定を構成します", + "diagnostics": "診断", + "donateOnKofi": "Ko-fiで寄付", + "donationDescription": "一回限りの寄付をするか、月次サポーターになってください。", + "donationNote": "プラットフォーム手数料なし • 即時支払い • 安全", + "favorites": "お気に入り", + "generalNotes": "一般ノート", + "home": "ホーム", + "login": "ログイン", + "logout": "ログアウト", + "manageAISettings": "AI設定を管理", + "myLibrary": "マイライブラリ", + "notebooks": "ノートブック", + "notes": "ノート", + "proPlan": "プロプラン", + "profile": "プロフィール", + "quickAccess": "クイックアクセス", + "recent": "最近", + "reminders": "リマインダー", + "settings": "設定", + "sponsorDescription": "月次スポンサーになり、認知されましょう。", + "sponsorOnGithub": "GitHubでスポンサー", + "support": "Mementoをサポート ☕", + "supportDescription": "Mementoは100%無料でオープンソースです。あなたのサポートがこの状態を維持するのに役立ちます。", + "supportDevelopment": "Mementoの開発をサポート ☕", + "trash": "ゴミ箱", + "userManagement": "ユーザー管理", + "workspace": "ワークスペース" + }, + "notebook": { + "cancel": "キャンセル", + "create": "ノートブックを作成", + "createDescription": "新しいコレクションを開始して、ノート、アイデア、プロジェクトを効率的に整理しましょう。", + "createNew": "新しいノートブックを作成", + "creating": "作成中...", + "delete": "ノートブックを削除", + "deleteConfirm": "削除", + "deleteWarning": "このノートブックを削除してもよろしいですか?ノートは一般ノートに移動されます。", + "edit": "ノートブックを編集", + "editDescription": "ノートブックの名前、アイコン、色を変更します。", + "generating": "概要を生成中...", + "labels": "ラベル", + "name": "ノートブック名", + "noLabels": "ラベルがありません", + "selectColor": "色", + "selectIcon": "アイコン", + "summary": "ノートブックの概要", + "summaryDescription": "このノートブックのすべてのノートのAI搭載の概要を生成します。", + "summaryError": "概要の生成エラー" + }, + "notebookSuggestion": { + "description": "このノートはこのノートブックに属しているようです", + "dismiss": "無視", + "dismissIn": "無視({timeLeft}秒で閉じます)", + "generalNotes": "一般ノート", + "move": "移動", + "moveToNotebook": "ノートブックに移動", + "title": "{icon} {name}に移動しますか?" + }, + "notebooks": { + "allNotebooks": "すべてのノートブック", + "create": "ノートブックを作成", + "createFirst": "最初のノートブックを作成", + "noNotebooks": "ノートブックがありません" + }, + "notes": { + "add": "追加", + "addCollaborators": "共同編集者を追加", + "addImage": "画像を追加", + "addItem": "項目を追加", + "addLink": "リンクを追加", + "addListItem": "+ リスト項目", + "addNote": "ノートを追加", + "adding": "追加中...", + "aiAssistant": "AIアシスタント", + "archive": "アーカイブ", + "backgroundOptions": "背景オプション", + "changeColor": "色を変更", + "changeSize": "サイズを変更", + "clarifyFailed": "明確化に失敗しました", + "close": "閉じる", + "color": "色", + "confirmDelete": "このノートを削除してもよろしいですか?", + "confirmLeaveShare": "この共有ノートを退出してもよろしいですか?", + "contentOrMediaRequired": "コンテンツを入力するか、リンク/画像を追加してください", + "copy": "コピー", + "copyFailed": "ノートのコピーに失敗しました", + "copySuccess": "ノートをコピーしました!", + "createFirstNote": "最初のノートを作成", + "date": "日付", + "delete": "削除", + "dragToReorder": "ドラッグして並べ替え", + "duplicate": "複製", + "edit": "ノートを編集", + "emptyState": "ノートがありません", + "fileTooLarge": "ファイルが大きすぎます:{fileName}。最大サイズは{maxSize}です。", + "improveFailed": "改善に失敗しました", + "inNotebook": "ノートブック内", + "invalidDateTime": "無効な日付または時刻", + "invalidFileType": "無効なファイルタイプ:{fileName}。JPEG、PNG、GIF、WebPのみ使用可能です。", + "itemOrMediaRequired": "少なくとも1つの項目またはメディアを追加してください", + "large": "大", + "leaveShare": "退出", + "linkAddFailed": "リンクの追加に失敗しました", + "linkAdded": "リンクを追加しました", + "linkMetadataFailed": "リンクのメタデータを取得できませんでした", + "listItem": "リスト項目", + "makeCopy": "コピーを作成", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdownオフ", + "markdownOn": "Markdownオン", + "markdownPlaceholder": "ノートを作成...(Markdown対応)", + "medium": "中", + "more": "もっと見る", + "moreOptions": "その他のオプション", + "moveFailed": "移動に失敗しました", + "newChecklist": "新しいチェックリスト", + "newNote": "新しいノート", + "noContent": "コンテンツなし", + "noNotes": "ノートはありません", + "noNotesFound": "ノートが見つかりませんでした", + "noteCreateFailed": "ノートの作成に失敗しました", + "noteCreated": "ノートを作成しました", + "others": "その他", + "pin": "ピン留め", + "pinned": "ピン留め済み", + "pinnedNotes": "ピン留めされたノート", + "placeholder": "ノートを作成...", + "preview": "プレビュー", + "readOnly": "読み取り専用", + "recent": "最近", + "redo": "やり直し (Ctrl+Y)", + "redoShortcut": "やり直し (Ctrl+Y)", + "remindMe": "リマインド", + "reminderDateTimeRequired": "日付と時刻を入力してください", + "reminderMustBeFuture": "リマインダーは未来の日時に設定してください", + "reminderPastError": "リマインダーは未来の日時に設定してください", + "reminderRemoved": "リマインダーを削除しました", + "reminderSet": "リマインダーを{datetime}に設定しました", + "remove": "削除", + "saving": "保存中...", + "setReminder": "リマインダーを設定", + "setReminderButton": "リマインダーを設定", + "share": "共有", + "shareWithCollaborators": "共同編集者と共有", + "sharedBy": "共有者", + "sharedReadOnly": "このノートは読み取り専用モードで共有されています", + "shortenFailed": "短縮に失敗しました", + "showCollaborators": "共同編集者を表示", + "size": "サイズ", + "small": "小", + "takeNote": "ノートを作成...", + "takeNoteMarkdown": "ノートを作成...(Markdown対応)", + "time": "時刻", + "title": "ノート", + "titlePlaceholder": "タイトル", + "transformFailed": "変換に失敗しました", + "unarchive": "アーカイブを解除", + "undo": "元に戻す (Ctrl+Z)", + "undoShortcut": "元に戻す (Ctrl+Z)", + "unpin": "ピン留め解除", + "unpinned": "ピン留め解除", + "untitled": "無題", + "uploadFailed": "{filename}のアップロードに失敗しました", + "view": "ノートを表示" + }, + "pagination": { + "next": "→", + "pageInfo": "{currentPage} / {totalPages} ページ", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "カジュアル", + "expand": "拡張する", + "formal": "フォーマル", + "improve": "改善する", + "shorten": "短くする", + "title": "テキストの改善" + }, + "profile": { + "accountSettings": "アカウント設定", + "autoDetect": "自動検出", + "changePassword": "パスワードを変更", + "changePasswordDescription": "パスワードを更新します。現在のパスワードが必要です。", + "confirmPassword": "パスワードを確認", + "currentPassword": "現在のパスワード", + "description": "個人情報を更新", + "displayName": "表示名", + "displaySettings": "表示設定", + "displaySettingsDescription": "外観とフォントサイズをカスタマイズします。", + "email": "メールアドレス", + "fontSize": "フォントサイズ", + "fontSizeDescription": "読みやすくするためにフォントサイズを調整します。これはインターフェースのすべてのテキストに適用されます。", + "fontSizeExtraLarge": "特大", + "fontSizeLarge": "大", + "fontSizeMedium": "中", + "fontSizeSmall": "小", + "fontSizeUpdateFailed": "フォントサイズの更新に失敗しました", + "fontSizeUpdateSuccess": "フォントサイズを更新しました", + "languageDescription": "この言語はAI機能、コンテンツ分析、インターフェーステキストに使用されます。", + "languagePreferences": "言語設定", + "languagePreferencesDescription": "AI機能とインターフェースの優先言語を選択してください。", + "languageUpdateFailed": "言語の更新に失敗しました", + "languageUpdateSuccess": "言語を更新しました", + "manageAISettings": "AI設定を管理", + "newPassword": "新しいパスワード", + "passwordChangeFailed": "パスワードの変更に失敗しました", + "passwordChangeSuccess": "パスワードを変更しました", + "passwordError": "パスワードの更新エラー", + "passwordUpdated": "パスワードを更新しました", + "preferredLanguage": "優先言語", + "profileError": "プロフィールの更新エラー", + "profileUpdated": "プロフィールを更新しました", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "フォントサイズを選択", + "selectLanguage": "言語を選択", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "プロフィール", + "updateFailed": "プロフィールの更新に失敗しました", + "updatePassword": "パスワードを更新", + "updateSuccess": "プロフィールを更新しました" + }, + "reminder": { + "cancel": "キャンセル", + "reminderDate": "リマインダー日付", + "reminderTime": "リマインダー時刻", + "removeReminder": "リマインダーを削除", + "save": "リマインダーを設定", + "setReminder": "リマインダーを設定", + "title": "リマインダー" + }, + "resetPassword": { + "confirmNewPassword": "新しいパスワードを確認", + "description": "以下に新しいパスワードを入力してください。", + "invalidLinkDescription": "このパスワードリセットリンクは無効または期限切れです。", + "invalidLinkTitle": "無効なリンク", + "loading": "読み込み中...", + "newPassword": "新しいパスワード", + "passwordMismatch": "パスワードが一致しません", + "requestNewLink": "新しいリンクをリクエスト", + "resetPassword": "パスワードをリセット", + "resetting": "リセット中...", + "success": "パスワードが正常にリセットされました。ログインできます。", + "title": "パスワードをリセット" + }, + "search": { + "exactMatch": "完全一致", + "noResults": "結果が見つかりませんでした", + "placeholder": "検索", + "related": "関連", + "resultsFound": "{count}件のノートが見つかりました", + "searchPlaceholder": "ノートを検索...", + "searching": "検索中...", + "semanticInProgress": "AI検索中...", + "semanticTooltip": "AIセマンティック検索" }, "semanticSearch": { "exactMatch": "完全一致", "related": "関連", "searching": "検索中..." }, - "paragraphRefactor": { - "title": "テキストの改善", - "shorten": "短くする", - "expand": "拡張する", - "improve": "改善する", - "formal": "フォーマル", - "casual": "カジュアル" - }, - "memoryEcho": { - "title": "何か気づきました...", - "description": "ノート間のプロアクティブなつながり", - "dailyInsight": "ノートからの毎日の洞察", - "insightReady": "洞察の準備ができました!", - "viewConnection": "つながりを表示", - "helpful": "役に立つ", - "notHelpful": "役に立たない", - "dismiss": "今は無視", - "thanksFeedback": "フィードバックありがとうございます!", - "thanksFeedbackImproving": "ありがとうございます!改善に役立てます。", - "connections": "つながり", - "connection": "つながり", - "connectionsBadge": "{count}個のつながり{plural}", - "fused": "融合済み", - "overlay": { - "title": "つながっているノート", - "searchPlaceholder": "つながりを検索...", - "sortBy": "並び替え:", - "sortSimilarity": "類似度", - "sortRecent": "最新", - "sortOldest": "最古", - "viewAll": "すべて並べて表示", - "loading": "読み込み中...", - "noConnections": "つながりが見つかりませんでした" - }, - "comparison": { - "title": "💡 ノートの比較", - "similarityInfo": "これらのノートは{similarity}%の類似性でつながっています", - "highSimilarityInsight": "これらのノートは同じトピックについて高水準の類似性で扱っています。統合または統合することができます。", - "untitled": "無題", - "clickToView": "クリックしてノートを表示", - "helpfulQuestion": "この比較は役に立ちますか?", - "helpful": "役に立つ", - "notHelpful": "役に立たない" - }, - "editorSection": { - "title": "⚡ つながっているノート({count})", - "loading": "読み込み中...", - "view": "表示", - "compare": "比較", - "merge": "マージ", - "compareAll": "すべて比較", - "mergeAll": "すべてマージ" - }, - "fusion": { - "title": "🔗 インテリジェントな融合", - "mergeNotes": "{count}個のノートをマージ", - "notesToMerge": "📝 マージするノート", - "optionalPrompt": "💬 融合プロンプト(オプション)", - "promptPlaceholder": "AIへのオプションの指示(例:'ノート1のフォーマルなスタイルを維持する')...", - "generateFusion": "融合を生成", - "generating": "生成中...", - "previewTitle": "📝 マージされたノートのプレビュー", - "edit": "編集", - "modify": "修正", - "finishEditing": "編集を終了", - "optionsTitle": "融合オプション", - "archiveOriginals": "オリジナルのノートをアーカイブ", - "keepAllTags": "すべてのタグを保持", - "useLatestTitle": "最新のノートをタイトルとして使用", - "createBacklinks": "オリジナルのノートへのバックリンクを作成", - "cancel": "キャンセル", - "confirmFusion": "融合を確認", - "success": "ノートを正常にマージしました!", - "error": "ノートのマージに失敗しました" - } - }, - "nav": { - "home": "ホーム", - "notes": "ノート", - "notebooks": "ノートブック", - "generalNotes": "一般ノート", - "archive": "アーカイブ", - "settings": "設定", - "profile": "プロフィール", - "aiSettings": "AI設定", - "logout": "ログアウト", - "login": "ログイン", - "adminDashboard": "管理ダッシュボード", - "diagnostics": "診断", - "trash": "ゴミ箱", - "support": "Mementoをサポート ☕", - "reminders": "リマインダー", - "userManagement": "ユーザー管理", - "accountSettings": "アカウント設定", - "manageAISettings": "AI設定を管理", - "configureAI": "AI機能、プロバイダー、設定を構成します", - "supportDevelopment": "Mementoの開発をサポート ☕", - "supportDescription": "Mementoは100%無料でオープンソースです。あなたのサポートがこの状態を維持するのに役立ちます。", - "buyMeACoffee": "コーヒーをご馳走する", - "donationDescription": "一回限りの寄付をするか、月次サポーターになってください。", - "donateOnKofi": "Ko-fiで寄付", - "donationNote": "プラットフォーム手数料なし • 即時支払い • 安全", - "sponsorOnGithub": "GitHubでスポンサー", - "sponsorDescription": "月次スポンサーになり、認知されましょう。", - "workspace": "ワークスペース", - "quickAccess": "クイックアクセス", - "myLibrary": "マイライブラリ", - "favorites": "お気に入り", - "recent": "最近", - "proPlan": "プロプラン" - }, "settings": { - "title": "設定", - "description": "設定と環境設定を管理", + "about": "について", "account": "アカウント", "appearance": "外観", - "theme": "テーマ", - "themeLight": "ライト", - "themeDark": "ダーク", - "themeSystem": "システム", - "notifications": "通知", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "設定と環境設定を管理", "language": "言語", - "selectLanguage": "言語を選択", + "languageAuto": "自動検出", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "通知", "privacy": "プライバシー", + "profile": "プロフィール", + "searchNoResults": "一致する設定が見つかりません", "security": "セキュリティ", - "about": "について", - "version": "バージョン", - "settingsSaved": "設定を保存しました", - "settingsError": "設定の保存エラー" - }, - "profile": { - "title": "プロフィール", - "description": "個人情報を更新", - "displayName": "表示名", - "email": "メールアドレス", - "changePassword": "パスワードを変更", - "changePasswordDescription": "パスワードを更新します。現在のパスワードが必要です。", - "currentPassword": "現在のパスワード", - "newPassword": "新しいパスワード", - "confirmPassword": "パスワードを確認", - "updatePassword": "パスワードを更新", - "passwordChangeSuccess": "パスワードを変更しました", - "passwordChangeFailed": "パスワードの変更に失敗しました", - "passwordUpdated": "パスワードを更新しました", - "passwordError": "パスワードの更新エラー", - "languagePreferences": "言語設定", - "languagePreferencesDescription": "AI機能とインターフェースの優先言語を選択してください。", - "preferredLanguage": "優先言語", "selectLanguage": "言語を選択", - "languageDescription": "この言語はAI機能、コンテンツ分析、インターフェーステキストに使用されます。", - "autoDetect": "自動検出", - "updateSuccess": "プロフィールを更新しました", - "updateFailed": "プロフィールの更新に失敗しました", - "languageUpdateSuccess": "言語を更新しました", - "languageUpdateFailed": "言語の更新に失敗しました", - "profileUpdated": "プロフィールを更新しました", - "profileError": "プロフィールの更新エラー", - "accountSettings": "アカウント設定", - "manageAISettings": "AI設定を管理", - "displaySettings": "表示設定", - "displaySettingsDescription": "外観とフォントサイズをカスタマイズします。", - "fontSize": "フォントサイズ", - "selectFontSize": "フォントサイズを選択", - "fontSizeSmall": "小", - "fontSizeMedium": "中", - "fontSizeLarge": "大", - "fontSizeExtraLarge": "特大", - "fontSizeDescription": "読みやすくするためにフォントサイズを調整します。これはインターフェースのすべてのテキストに適用されます。", - "fontSizeUpdateSuccess": "フォントサイズを更新しました", - "fontSizeUpdateFailed": "フォントサイズの更新に失敗しました" + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "設定の保存エラー", + "settingsSaved": "設定を保存しました", + "theme": "テーマ", + "themeDark": "ダーク", + "themeLight": "ライト", + "themeSystem": "システム", + "title": "設定", + "version": "バージョン" }, - "aiSettings": { - "title": "AI設定", - "description": "AI機能と設定を構成", - "features": "AI機能", - "provider": "AIプロバイダー", - "providerAuto": "自動(推奨)", - "providerOllama": "Ollama(ローカル)", - "providerOpenAI": "OpenAI(クラウド)", - "frequency": "頻度", - "frequencyDaily": "毎日", - "frequencyWeekly": "毎週", - "saving": "保存中...", - "saved": "設定を更新しました", - "error": "設定の更新に失敗しました" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" }, - "general": { - "loading": "読み込み中...", - "save": "保存", - "cancel": "キャンセル", - "add": "追加", - "edit": "編集", - "confirm": "確認", - "close": "閉じる", - "back": "戻る", - "next": "次へ", - "previous": "前へ", - "submit": "送信", - "reset": "リセット", - "apply": "適用", - "clear": "クリア", - "select": "選択", - "tryAgain": "もう一度お試しください", - "error": "エラーが発生しました", - "operationSuccess": "操作が成功しました", - "operationFailed": "操作が失敗しました" + "support": { + "aiApiCosts": "AI APIコスト:", + "buyMeACoffee": "コーヒーをご馳走する", + "contributeCode": "コードを貢献", + "description": "Mementoは100%無料でオープンソースです。あなたのサポートがこの状態を維持するのに役立ちます。", + "directImpact": "直接的な影響", + "domainSSL": "ドメイン&SSL:", + "donateOnKofi": "Ko-fiで寄付", + "donationDescription": "一回限りの寄付をするか、月次サポーターになってください。", + "githubDescription": "定期的なサポート • 公開認知 • 開発者向け", + "hostingServers": "ホスティング&サーバー:", + "howSupportHelps": "あなたのサポートがどのように役立つか", + "kofiDescription": "プラットフォーム手数料なし • 即時支払い • 安全", + "otherWaysTitle": "その他のサポート方法", + "reportBug": "バグを報告", + "shareTwitter": "Twitterでシェア", + "sponsorDescription": "月次スポンサーになり、認知されましょう。", + "sponsorOnGithub": "GitHubでスポンサー", + "sponsorPerks": "スポンサー特典", + "starGithub": "GitHubでスターをつける", + "title": "Mementoの開発をサポート", + "totalExpenses": "合計経費:", + "transparency": "透明性", + "transparencyDescription": "私は完全な透明性を信じています。寄付の使い道は以下の通りです:" }, - "colors": { - "default": "デフォルト", - "red": "赤", - "blue": "青", - "green": "緑", - "yellow": "黄", - "purple": "紫", - "pink": "ピンク", - "orange": "オレンジ", - "gray": "グレー" + "testPages": { + "titleSuggestions": { + "analyzing": "分析中...", + "contentLabel": "コンテンツ(50語以上必要):", + "error": "エラー:", + "idle": "アイドル", + "noSuggestions": "まだ提案がありません。50語以上入力して2秒待ってください。", + "placeholder": "ここに少なくとも50語を入力してください...", + "status": "ステータス:", + "suggestions": "提案({count}):", + "title": "タイトル提案をテスト", + "wordCount": "単語数:" + } }, - "reminder": { - "title": "リマインダー", - "setReminder": "リマインダーを設定", - "removeReminder": "リマインダーを削除", - "reminderDate": "リマインダー日付", - "reminderTime": "リマインダー時刻", - "save": "リマインダーを設定", - "cancel": "キャンセル" + "time": { + "daysAgo": "{count}日前", + "hoursAgo": "{count}時間前", + "justNow": "たった今", + "minutesAgo": "{count}分前", + "today": "今日", + "tomorrow": "明日", + "yesterday": "昨日" }, - "notebookSuggestion": { - "title": "{icon} {name}に移動しますか?", - "description": "このノートはこのノートブックに属しているようです", - "move": "移動", + "titleSuggestions": { + "available": "タイトルの提案", "dismiss": "無視", - "dismissIn": "無視({timeLeft}秒で閉じます)", - "moveToNotebook": "ノートブックに移動", - "generalNotes": "一般ノート" + "generating": "生成中...", + "selectTitle": "タイトルを選択", + "title": "AIの提案" + }, + "toast": { + "feedbackFailed": "フィードバックの送信に失敗しました", + "notesFusionSuccess": "ノートが正常にマージされました!", + "openConnectionFailed": "接続を開けませんでした", + "openingConnection": "接続を開いています...", + "operationFailed": "操作が失敗しました", + "operationSuccess": "操作が成功しました", + "saveFailed": "設定の保存に失敗しました", + "saved": "設定が保存されました", + "thanksFeedback": "フィードバックありがとうございます!", + "thanksFeedbackImproving": "ありがとうございます!改善に役立てます。" + }, + "trash": { + "deletePermanently": "完全に削除", + "empty": "ゴミ箱は空です", + "restore": "復元", + "title": "ゴミ箱" + }, + "ui": { + "close": "閉じる", + "collapse": "折りたたむ", + "expand": "展開", + "open": "開く" } } diff --git a/keep-notes/locales/ko.json b/keep-notes/locales/ko.json index 2d7448f..599ec54 100644 --- a/keep-notes/locales/ko.json +++ b/keep-notes/locales/ko.json @@ -1,553 +1,993 @@ { - "auth": { - "signIn": "로그인", - "signUp": "회원가입", - "email": "이메일", - "password": "비밀번호", - "name": "이름", - "emailPlaceholder": "이메일 주소를 입력하세요", - "passwordPlaceholder": "비밀번호를 입력하세요", - "namePlaceholder": "이름을 입력하세요", - "passwordMinChars": "비밀번호 입력 (최소 6자)", - "resetPassword": "비밀번호 재설정", - "resetPasswordInstructions": "비밀번호를 재설정하려면 이메일을 입력하세요", - "forgotPassword": "비밀번호를 잊으셨나요?", - "noAccount": "계정이 없으신가요?", - "hasAccount": "이미 계정이 있으신가요?", - "signInToAccount": "계정에 로그인하세요", - "createAccount": "계정 만들기", - "rememberMe": "로그인 상태 유지", - "orContinueWith": "또는 다음으로 계속", - "checkYourEmail": "이메일을 확인하세요", - "resetEmailSent": "시스템에 이메일이 존재하는 경우 비밀번호 재설정 링크를 보내드렸습니다.", - "returnToLogin": "로그인으로 돌아가기", - "forgotPasswordTitle": "비밀번호 찾기", - "forgotPasswordDescription": "이메일 주소를 입력하시면 비밀번호 재설정 링크를 보내드립니다.", - "sending": "전송 중...", - "sendResetLink": "재설정 링크 전송", - "backToLogin": "로그인으로 돌아가기" - }, - "notes": { - "title": "메모", - "newNote": "새 메모", - "untitled": "제목 없음", - "placeholder": "메모 작성...", - "markdownPlaceholder": "메모 작성... (Markdown 지원)", - "titlePlaceholder": "제목", - "listItem": "목록 항목", - "addListItem": "+ 목록 항목", - "newChecklist": "새 체크리스트", - "add": "추가", - "adding": "추가 중...", - "close": "닫기", - "confirmDelete": "이 메모를 삭제하시겠습니까?", - "confirmLeaveShare": "이 공유 메모를 나가시겠습니까?", - "sharedBy": "공유자", - "leaveShare": "나가기", - "delete": "삭제", - "archive": "보관", - "unarchive": "보관 취소", - "pin": "고정", - "unpin": "고정 해제", - "color": "색상", - "changeColor": "색상 변경", - "setReminder": "알림 설정", - "setReminderButton": "알림 설정", - "date": "날짜", - "time": "시간", - "reminderDateTimeRequired": "날짜와 시간을 입력하세요", - "invalidDateTime": "잘못된 날짜 또는 시간", - "reminderMustBeFuture": "알림은 미래 시간으로 설정해야 합니다", - "reminderSet": "{datetime}에 알림이 설정되었습니다", - "reminderPastError": "알림은 미래 시간으로 설정해야 합니다", - "reminderRemoved": "알림이 제거되었습니다", - "addImage": "이미지 추가", - "addLink": "링크 추가", - "linkAdded": "링크가 추가되었습니다", - "linkMetadataFailed": "링크 메타데이터를 가져올 수 없습니다", - "linkAddFailed": "링크 추가 실패", - "invalidFileType": "잘못된 파일 유형: {fileName}. JPEG, PNG, GIF 및 WebP만 허용됩니다.", - "fileTooLarge": "파일이 너무 큽니다: {fileName}. 최대 크기는 {maxSize}입니다.", - "uploadFailed": "{filename} 업로드 실패", - "contentOrMediaRequired": "내용을 입력하거나 링크/이미지를 추가하세요", - "itemOrMediaRequired": "하나 이상의 항목이나 미디어를 추가하세요", - "noteCreated": "메모가 생성되었습니다", - "noteCreateFailed": "메모 생성 실패", - "aiAssistant": "AI 도우미", - "changeSize": "크기 변경", - "backgroundOptions": "배경 옵션", - "moreOptions": "더 많은 옵션", - "remindMe": "알림", - "markdownMode": "Markdown", - "addCollaborators": "공동 작업자 추가", - "duplicate": "복제", - "share": "공유", - "showCollaborators": "공동 작업자 표시", - "pinned": "고정됨", - "others": "기타", - "noNotes": "메모 없음", - "noNotesFound": "메모를 찾을 수 없습니다", - "createFirstNote": "첫 번째 메모 만들기", - "size": "크기", - "small": "작게", - "medium": "중간", - "large": "크게", - "shareWithCollaborators": "공동 작업자와 공유", - "view": "메모 보기", - "edit": "메모 편집", - "readOnly": "읽기 전용", - "preview": "미리보기", - "noContent": "내용 없음", - "takeNote": "메모 작성...", - "takeNoteMarkdown": "메모 작성... (Markdown 지원)", - "addItem": "항목 추가", - "sharedReadOnly": "이 메모는 읽기 전용 모드로 공유됩니다", - "makeCopy": "사본 만들기", - "saving": "저장 중...", - "copySuccess": "메모가 복사되었습니다!", - "copyFailed": "메모 복사 실패", - "copy": "복사", - "markdownOn": "Markdown 켜기", - "markdownOff": "Markdown 끄기", - "undo": "실행 취소 (Ctrl+Z)", - "redo": "다시 실행 (Ctrl+Y)" - }, - "pagination": { - "previous": "←", - "pageInfo": "Page {currentPage} / {totalPages}", - "next": "→" - }, - "ai": { - "analyzing": "AI 분석 중...", - "clickToAddTag": "클릭하여 이 태그 추가", - "ignoreSuggestion": "이 제안 무시", - "generatingTitles": "제목 생성 중...", - "generateTitlesTooltip": "AI로 제목 생성", - "poweredByAI": "AI 기반", - "languageDetected": "감지된 언어", - "processing": "처리 중...", - "tagAdded": "태그 \"{tag}\"가 추가되었습니다", - "titleGenerating": "생성 중...", - "titleGenerateWithAI": "AI로 제목 생성", - "titleGenerationMinWords": "제목을 생성하려면 내용이 최소 10단어 이상이어야 합니다 (현재: {count}단어)", - "titleGenerationError": "제목 생성 오류", - "titlesGenerated": "💡 {count}개의 제목이 생성되었습니다!", - "titleGenerationFailed": "제목 생성 실패", - "titleApplied": "제목이 적용되었습니다!", - "reformulationNoText": "텍스트를 선택하거나 내용을 추가하세요", - "reformulationSelectionTooShort": "선택 항목이 너무 짧습니다. 전체 내용을 사용합니다", - "reformulationMinWords": "텍스트는 최소 10단어 이상이어야 합니다 (현재: {count}단어)", - "reformulationMaxWords": "텍스트는 최대 500단어까지 가능합니다", - "reformulationError": "재구성 중 오류", - "reformulationFailed": "텍스트 재구성 실패", - "reformulationApplied": "재구성된 텍스트가 적용되었습니다!", - "transformMarkdown": "Markdown으로 변환", - "transforming": "변환 중...", - "transformSuccess": "텍스트가 Markdown으로 성공적으로 변환되었습니다!", - "transformError": "변환 중 오류", - "assistant": "AI 도우미", - "generating": "생성 중...", - "generateTitles": "제목 생성", - "reformulateText": "텍스트 재구성", - "reformulating": "재구성 중...", - "clarify": "명확히 하기", - "shorten": "단축", - "improveStyle": "스타일 개선", - "reformulationComparison": "재구성 비교", - "original": "원본", - "reformulated": "재구성됨", - "batchOrganization": { - "error": "조직화 계획 생성 실패", - "noNotesSelected": "선택된 메모 없음", - "title": "AI로 정리하기", - "description": "AI가 메모를 분석하여 노트북으로 정리할 제안을 드립니다.", - "analyzing": "메모 분석 중...", - "notesToOrganize": "{count}개 메모 정리", - "selected": "{count}개 선택됨", - "noNotebooks": "사용 가능한 노트북이 없습니다. 먼저 노트북을 생성하여 메모를 정리하세요.", - "noSuggestions": "AI가 이 메모들을 정리할 좋은 방법을 찾지 못했습니다.", - "confidence": "신뢰도", - "unorganized": "{count}개 메모는 범주화되지 않아 일반 메모에 남게 됩니다.", - "applying": "적용 중...", - "apply": "적용 ({count})" + "about": { + "appDescription": "AI 기능을 갖춘 강력한 메모 애플리케이션", + "appName": "Keep Notes", + "buildDate": "빌드 날짜", + "description": "애플리케이션 정보", + "features": { + "description": "AI 기반 기능", + "dragDrop": "드래그 앤 드롭 메모 관리", + "labelSystem": "레이블 시스템", + "memoryEcho": "Memory Echo 일일 인사이트", + "multipleProviders": "여러 AI 공급자 (OpenAI, Ollama)", + "notebookOrganization": "노트북 정리", + "paragraphReformulation": "단락 재구성", + "semanticSearch": "임베딩을 사용한 의미 검색", + "title": "기능", + "titleSuggestions": "AI 기반 제목 제안" }, - "autoLabels": { - "error": "레이블 제안 가져오기 실패", - "noLabelsSelected": "선택된 �이블 없음", - "created": "{count}개 레이블이 성공적으로 생성되었습니다", - "analyzing": "메모 분석 중...", - "title": "새 레이블 제안", - "description": "\"{notebookName}\" ({totalNotes}개 메모)에서 반복되는 주제를 감지했습니다. 레이블을 생성하시겠습니까?", - "note": "메모", - "notes": "메모", - "typeContent": "콘텐츠를 입력하여 레이블 제안을 받으세요...", - "createNewLabel": "이 새 레이블을 생성하고 추가", - "new": "(새로운)" + "platform": "플랫폼", + "platformWeb": "웹", + "support": { + "description": "도움말 및 피드백", + "documentation": "문서", + "feedback": "피드백", + "reportIssues": "문제 보고", + "title": "지원" + }, + "technology": { + "ai": "AI", + "authentication": "인증", + "backend": "백엔드", + "database": "데이터베이스", + "description": "최신 기술로 구축", + "frontend": "프론트엔드", + "testing": "테스트", + "title": "기술 스택", + "ui": "UI" + }, + "title": "정보", + "version": "버전" + }, + "admin": { + "ai": { + "apiKey": "API 키", + "baseUrl": "기본 URL", + "commonEmbeddingModels": "OpenAI 호환 API의 일반적인 임베딩 모델", + "commonModelsDescription": "OpenAI 호환 API의 일반적인 모델", + "description": "자동 태그 지정 및 의미 검색을 위한 AI 공급자를 구성합니다. 최적의 성능을 위해 다른 공급자를 사용하세요.", + "embeddingsDescription": "의미 검색 임베딩을 위한 AI 공급자. 권장: OpenAI (최고 품질).", + "embeddingsProvider": "임베딩 공급자", + "model": "모델", + "modelRecommendations": "gpt-4o-mini = 최고의 가성비 • gpt-4o = 최고 품질", + "openAIKeyDescription": "platform.openai.com의 OpenAI API 키", + "openTestPanel": "AI 테스트 패널 열기", + "provider": "공급자", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING이 필요합니다", + "providerTagsRequired": "AI_PROVIDER_TAGS가 필요합니다", + "saveSettings": "AI 설정 저장", + "saving": "저장 중...", + "selectEmbeddingModel": "시스템에 설치된 임베딩 모델 선택", + "selectOllamaModel": "시스템에 설치된 Ollama 모델 선택", + "tagsGenerationDescription": "자동 태그 제안을 위한 AI 공급자. 권장: Ollama (무료, 로컬).", + "tagsGenerationProvider": "태그 생성 공급자", + "title": "AI 구성", + "updateFailed": "AI 설정 업데이트 실패", + "updateSuccess": "AI 설정이 성공적으로 업데이트되었습니다" + }, + "aiTest": { + "description": "태그 생성 및 의미 검색 임베딩을 위한 AI 공급자 테스트", + "embeddingDimensions": "임베딩 차원:", + "embeddingsTestDescription": "의미 검색 임베딩을 담당하는 AI 공급자 테스트", + "embeddingsTestTitle": "임베딩 테스트", + "error": "오류:", + "first5Values": "처음 5개 값:", + "generatedTags": "생성된 태그:", + "howItWorksTitle": "테스트 작동 방식", + "model": "모델:", + "provider": "공급자:", + "responseTime": "응답 시간: {time}ms", + "runTest": "테스트 실행", + "tagsTestDescription": "자동 태그 제안을 담당하는 AI 공급자 테스트", + "tagsTestTitle": "태그 생성 테스트", + "testError": "테스트 오류: {error}", + "testFailed": "테스트 실패", + "testPassed": "테스트 통과", + "testing": "테스트 중...", + "tipDescription": "테스트 전에 AI 테스트 패널을 사용하여 구성 문제를 진단하세요.", + "tipTitle": "팁:", + "title": "AI 공급자 테스트", + "vectorDimensions": "벡터 차원" + }, + "aiTesting": "AI 테스트", + "security": { + "allowPublicRegistration": "공개 등록 허용", + "allowPublicRegistrationDescription": "비활성화하면 새 사용자는 관리자가 사용자 관리 페이지를 통해서만 추가할 수 있습니다.", + "description": "액세스 제어 및 등록 정책을 관리합니다.", + "title": "보안 설정", + "updateFailed": "보안 설정 업데이트 실패", + "updateSuccess": "보안 설정이 업데이트되었습니다" + }, + "settings": "관리자 설정", + "smtp": { + "description": "비밀번호 재설정을 위한 이메일 서버를 구성합니다.", + "forceSSL": "SSL/TLS 강제 (일반적으로 포트 465)", + "fromEmail": "보내는 사람 이메일", + "host": "호스트", + "ignoreCertErrors": "인증서 오류 무시 (자체 호스팅/개발만)", + "password": "비밀번호", + "port": "포트", + "saveSettings": "SMTP 설정 저장", + "sending": "전송 중...", + "testEmail": "테스트 이메일", + "testFailed": "실패: {error}", + "testSuccess": "테스트 이메일이 성공적으로 전송되었습니다!", + "title": "SMTP 구성", + "updateFailed": "SMTP 설정 업데이트 실패", + "updateSuccess": "SMTP 설정이 업데이트되었습니다", + "username": "사용자 이름" + }, + "title": "관리자 대시보드", + "userManagement": "사용자 관리", + "users": { + "addUser": "사용자 추가", + "confirmDelete": "Are you sure? This action cannot be undone.", + "createFailed": "사용자 생성 실패", + "createSuccess": "사용자가 성공적으로 생성되었습니다", + "createUser": "사용자 생성", + "createUserDescription": "시스템에 새 사용자를 추가합니다.", + "deleteFailed": "삭제 실패", + "deleteSuccess": "사용자가 삭제되었습니다", + "demote": "강등", + "email": "이메일", + "name": "이름", + "password": "비밀번호", + "promote": "승격", + "role": "역할", + "roleUpdateFailed": "역할 업데이트 실패", + "roleUpdateSuccess": "사용자 역할이 {role}(으)로 업데이트되었습니다", + "roles": { + "admin": "관리자", + "user": "사용자" + }, + "table": { + "actions": "작업", + "createdAt": "생성일", + "email": "이메일", + "name": "이름", + "role": "역할" + } } }, - "memoryEcho.fusion": { - "generateError": "융합 생성 실패", - "noContentReturned": "API에서 융합 콘텐츠가 반환되지 않았습니다", - "unknownDate": "알 수 없는 날짜" - }, - "labels": { - "title": "레이블", - "filter": "레이블로 필터", - "manage": "레이블 관리", - "manageTooltip": "레이블 관리", - "changeColor": "색상 변경", - "changeColorTooltip": "색상 변경", - "delete": "삭제", - "deleteTooltip": "레이블 삭제", - "confirmDelete": "이 레이블을 삭제하시겠습니까?", - "newLabelPlaceholder": "새 레이블 만들기", - "namePlaceholder": "레이블 이름 입력", - "addLabel": "레이블 추가", - "createLabel": "레이블 만들기", - "labelName": "레이블 이름", - "labelColor": "레이블 색상", - "manageLabels": "레이블 관리", - "manageLabelsDescription": "이 메모의 레이블을 추가하거나 제거하세요. 레이블을 클릭하여 색상을 변경할 수 있습니다.", - "selectedLabels": "선택된 레이블", - "allLabels": "모든 레이블", - "clearAll": "모두 지우기", - "filterByLabel": "레이블로 필터", - "tagAdded": "태그 \"{tag}\"가 추가되었습니다", - "showLess": "간단히 보기", - "showMore": "더 보기", - "editLabels": "레이블 편집", - "editLabelsDescription": "레이블을 만들고, 색상을 편집하고, 삭제합니다.", - "noLabelsFound": "레이블을 찾을 수 없습니다.", - "loading": "로딩 중...", - "notebookRequired": "⚠️ 레이블은 노트북에서만 사용할 수 있습니다. 이 메모를 먼저 노트북으로 이동하세요." - }, - "search": { - "placeholder": "검색", - "searchPlaceholder": "메모 검색...", - "semanticInProgress": "AI 검색 중...", - "semanticTooltip": "AI 의미 검색", - "searching": "검색 중...", - "noResults": "결과를 찾을 수 없습니다", - "resultsFound": "{count}개의 메모를 찾았습니다", - "exactMatch": "정확히 일치", - "related": "관련" - }, - "collaboration": { - "emailPlaceholder": "이메일 주소 입력", - "addCollaborator": "공동 작업자 추가", - "removeCollaborator": "공동 작업자 제거", - "owner": "소유자", - "canEdit": "편집 가능", - "canView": "조회 가능", - "shareNote": "메모 공유", - "shareWithCollaborators": "공동 작업자와 공유", - "addCollaboratorDescription": "이메일 주소로 이 메모의 공동 작업자를 추가하세요.", - "viewerDescription": "이 메모에 액세스할 수 있습니다. 소유자만 공동 작업자를 관리할 수 있습니다.", - "emailAddress": "이메일 주소", - "enterEmailAddress": "이메일 주소 입력", - "invite": "초대", - "peopleWithAccess": "액세스 권한이 있는 사람", - "noCollaborators": "아직 공동 작업자가 없습니다. 위에서 추가하세요!", - "noCollaboratorsViewer": "아직 공동 작업자가 없습니다.", - "pendingInvite": "보류 중인 초대", - "pending": "보류 중", - "remove": "제거", - "unnamedUser": "이름 없는 사용자", - "done": "완료", - "willBeAdded": "{email}은(는) 메모 생성 시 공동 작업자로 추가됩니다", - "alreadyInList": "이 이메일은 이미 목록에 있습니다", - "nowHasAccess": "{name}님께서 이제 이 메모에 액세스할 수 있습니다", - "accessRevoked": "액세스가 취소되었습니다", - "errorLoading": "공동 작업자 로드 오류", - "failedToAdd": "공동 작업자 추가 실패", - "failedToRemove": "공동 작업자 제거 실패" - }, "ai": { "analyzing": "AI 분석 중...", + "assistant": "AI 도우미", + "autoLabels": { + "analyzing": "라벨 제안을 위해 메모 분석 중...", + "create": "생성", + "createNewLabel": "Create this new label and add it", + "created": "{count} labels created successfully", + "creating": "라벨 생성 중...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(새로운)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "라벨 제안", + "typeContent": "Type content to get label suggestions..." + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Failed to apply organization plan", + "applying": "Applying...", + "description": "AI가 메모를 분석하여 노트북으로 정리할 것을 제안합니다.", + "error": "Failed to create organization plan", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "No notes selected", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Select all notes in {notebook}", + "selectNote": "Select note: {title}", + "success": "{count} notes moved successfully", + "title": "Organize with AI" + }, + "clarify": "명확히 하기", "clickToAddTag": "클릭하여 이 태그 추가", - "ignoreSuggestion": "이 제안 무시", - "generatingTitles": "제목 생성 중...", + "generateTitles": "제목 생성", "generateTitlesTooltip": "AI로 제목 생성", - "poweredByAI": "AI 기반", + "generating": "생성 중...", + "generatingTitles": "제목 생성 중...", + "ignoreSuggestion": "이 제안 무시", + "improveStyle": "스타일 개선", "languageDetected": "감지된 언어", + "notebookSummary": { + "regenerate": "요약 다시 생성", + "regenerating": "요약 다시 생성 중..." + }, + "original": "원본", + "poweredByAI": "AI 기반", "processing": "처리 중...", - "tagAdded": "태그 \"{tag}\"가 추가되었습니다", - "titleGenerating": "생성 중...", - "titleGenerateWithAI": "AI로 제목 생성", - "titleGenerationMinWords": "제목을 생성하려면 내용이 최소 10단어 이상이어야 합니다 (현재: {count}단어)", - "titleGenerationError": "제목 생성 오류", - "titlesGenerated": "💡 {count}개의 제목이 생성되었습니다!", - "titleGenerationFailed": "제목 생성 실패", - "titleApplied": "제목이 적용되었습니다!", - "reformulationNoText": "텍스트를 선택하거나 내용을 추가하세요", - "reformulationSelectionTooShort": "선택 항목이 너무 짧습니다. 전체 내용을 사용합니다", - "reformulationMinWords": "텍스트는 최소 10단어 이상이어야 합니다 (현재: {count}단어)", - "reformulationMaxWords": "텍스트는 최대 500단어까지 가능합니다", + "reformulateText": "텍스트 재구성", + "reformulated": "재구성됨", + "reformulating": "재구성 중...", + "reformulationApplied": "재구성된 텍스트가 적용되었습니다!", + "reformulationComparison": "재구성 비교", "reformulationError": "재구성 중 오류", "reformulationFailed": "텍스트 재구성 실패", - "reformulationApplied": "재구성된 텍스트가 적용되었습니다!", - "transformMarkdown": "Markdown으로 변환", - "transforming": "변환 중...", - "transformSuccess": "텍스트가 Markdown으로 성공적으로 변환되었습니다!", - "transformError": "변환 중 오류", - "assistant": "AI 도우미", - "generating": "생성 중...", - "generateTitles": "제목 생성", - "reformulateText": "텍스트 재구성", - "reformulating": "재구성 중...", - "clarify": "명확히 하기", + "reformulationMaxWords": "텍스트는 최대 500단어까지 가능합니다", + "reformulationMinWords": "텍스트는 최소 10단어 이상이어야 합니다 (현재: {count}단어)", + "reformulationNoText": "텍스트를 선택하거나 내용을 추가하세요", + "reformulationSelectionTooShort": "선택 항목이 너무 짧습니다. 전체 내용을 사용합니다", "shorten": "단축", - "improveStyle": "스타일 개선", - "reformulationComparison": "재구성 비교", - "original": "원본", - "reformulated": "재구성됨" + "tagAdded": "태그 \"{tag}\"가 추가되었습니다", + "titleApplied": "제목이 적용되었습니다!", + "titleGenerateWithAI": "AI로 제목 생성", + "titleGenerating": "생성 중...", + "titleGenerationError": "제목 생성 오류", + "titleGenerationFailed": "제목 생성 실패", + "titleGenerationMinWords": "제목을 생성하려면 내용이 최소 10단어 이상이어야 합니다 (현재: {count}단어)", + "titlesGenerated": "💡 {count}개의 제목이 생성되었습니다!", + "transformError": "변환 중 오류", + "transformMarkdown": "Markdown으로 변환", + "transformSuccess": "텍스트가 Markdown으로 성공적으로 변환되었습니다!", + "transforming": "변환 중..." }, - "titleSuggestions": { - "available": "제목 제안", - "title": "AI 제안", - "generating": "생성 중...", - "selectTitle": "제목 선택", - "dismiss": "무시" + "aiSettings": { + "description": "AI 기반 기능 및 환경설정 구성", + "error": "설정 업데이트 실패", + "features": "AI 기능", + "frequency": "빈도", + "frequencyDaily": "매일", + "frequencyWeekly": "매주", + "provider": "AI 공급자", + "providerAuto": "자동 (권장)", + "providerOllama": "Ollama (로컬)", + "providerOpenAI": "OpenAI (클라우드)", + "saved": "설정이 업데이트되었습니다", + "saving": "저장 중...", + "title": "AI 설정", + "titleSuggestionsDesc": "50단어 이상에서 제목 없는 노트에 제목 제안", + "paragraphRefactorDesc": "AI 기반 텍스트 개선 옵션", + "frequencyDesc": "노트 연결 분석 빈도", + "providerDesc": "선호하는 AI 공급자 선택", + "providerAutoDesc": "Ollama 우선, OpenAI 대체", + "providerOllamaDesc": "100% 프라이빗, 로컬에서 실행", + "providerOpenAIDesc": "가장 정확, API 키 필요" + }, + "appearance": { + "description": "앱의 모양 사용자 지정", + "title": "모양" + }, + "auth": { + "backToLogin": "로그인으로 돌아가기", + "checkYourEmail": "이메일을 확인하세요", + "createAccount": "계정 만들기", + "email": "이메일", + "emailPlaceholder": "이메일 주소를 입력하세요", + "forgotPassword": "비밀번호를 잊으셨나요?", + "forgotPasswordDescription": "이메일 주소를 입력하시면 비밀번호 재설정 링크를 보내드립니다.", + "forgotPasswordTitle": "비밀번호 찾기", + "hasAccount": "이미 계정이 있으신가요?", + "name": "이름", + "namePlaceholder": "이름을 입력하세요", + "noAccount": "계정이 없으신가요?", + "orContinueWith": "또는 다음으로 계속", + "password": "비밀번호", + "passwordMinChars": "비밀번호 입력 (최소 6자)", + "passwordPlaceholder": "비밀번호를 입력하세요", + "rememberMe": "로그인 상태 유지", + "resetEmailSent": "시스템에 이메일이 존재하는 경우 비밀번호 재설정 링크를 보내드렸습니다.", + "resetPassword": "비밀번호 재설정", + "resetPasswordInstructions": "비밀번호를 재설정하려면 이메일을 입력하세요", + "returnToLogin": "로그인으로 돌아가기", + "sendResetLink": "재설정 링크 전송", + "sending": "전송 중...", + "signIn": "로그인", + "signInToAccount": "계정에 로그인하세요", + "signOut": "Sign out", + "signUp": "회원가입" + }, + "autoLabels": { + "analyzing": "메모 분석 중...", + "createNewLabel": "이 새 레이블을 생성하고 추가", + "created": "{count}개 레이블이 성공적으로 생성되었습니다", + "description": "\"{notebookName}\" ({totalNotes}개 메모)에서 반복되는 주제를 감지했습니다. 레이블을 생성하시겠습니까?", + "error": "레이블 제안 가져오기 실패", + "new": "(새로운)", + "noLabelsSelected": "선택된 레이블 없음", + "note": "메모", + "notes": "메모", + "title": "새 레이블 제안", + "typeContent": "콘텐츠를 입력하여 레이블 제안을 받으세요...", + "typeForSuggestions": "제안을 받으려면 입력하세요..." + }, + "batch": { + "organize": "정리", + "organizeWithAI": "AI로 정리하기" + }, + "batchOrganization": { + "analyzing": "메모 분석 중...", + "apply": "적용 ({count})", + "applyFailed": "정리 적용 실패", + "applying": "적용 중...", + "confidence": "신뢰도", + "description": "AI가 메모를 분석하여 노트북으로 정리할 제안을 드립니다.", + "error": "조직화 계획 생성 실패", + "noNotebooks": "사용 가능한 노트북이 없습니다. 먼저 노트북을 생성하여 메모를 정리하세요.", + "noNotesSelected": "선택된 메모 없음", + "noSuggestions": "AI가 이 메모들을 정리할 좋은 방법을 찾지 못했습니다.", + "notesToOrganize": "{count}개 메모 정리", + "selectAllIn": "모두 선택", + "selectNote": "메모 선택", + "selected": "{count}개 선택됨", + "success": "정리 성공", + "title": "AI로 정리하기", + "unorganized": "{count}개 메모는 범주화되지 않아 일반 메모에 남게 됩니다." + }, + "collaboration": { + "accessRevoked": "Access has been revoked", + "addCollaborator": "Add collaborator", + "addCollaboratorDescription": "Add people to collaborate on this note by their email address.", + "alreadyInList": "This email is already in the list", + "canEdit": "Can edit", + "canView": "Can view", + "done": "Done", + "emailAddress": "Email address", + "emailPlaceholder": "Enter email address", + "enterEmailAddress": "Enter email address", + "errorLoading": "Error loading collaborators", + "failedToAdd": "Failed to add collaborator", + "failedToRemove": "Failed to remove collaborator", + "invite": "Invite", + "noCollaborators": "No collaborators yet. Add someone above!", + "noCollaboratorsViewer": "No collaborators yet.", + "nowHasAccess": "{name} now has access to this note", + "owner": "Owner", + "pending": "Pending", + "pendingInvite": "Pending Invite", + "peopleWithAccess": "People with access", + "remove": "Remove", + "removeCollaborator": "Remove collaborator", + "shareNote": "Share note", + "shareWithCollaborators": "Share with collaborators", + "unnamedUser": "Unnamed User", + "viewerDescription": "You have access to this note. Only the owner can manage collaborators.", + "willBeAdded": "{email} will be added as collaborator when note is created" + }, + "colors": { + "blue": "파란색", + "default": "기본값", + "gray": "회색", + "green": "초록색", + "orange": "주황색", + "pink": "분홍색", + "purple": "보라색", + "red": "빨간색", + "yellow": "노란색" + }, + "common": { + "add": "추가", + "cancel": "취소", + "close": "닫기", + "confirm": "확인", + "delete": "삭제", + "edit": "편집", + "error": "오류", + "loading": "로딩 중...", + "noResults": "결과 없음", + "notAvailable": "사용 불가", + "optional": "선택", + "remove": "제거", + "required": "필수", + "save": "저장", + "search": "검색", + "success": "성공", + "unknown": "알 수 없음" + }, + "connection": { + "clickToView": "클릭하여 메모 보기", + "helpful": "도움이 됨", + "isHelpful": "이 연결이 도움이 되나요?", + "memoryEchoDiscovery": "Memory Echo 발견", + "notHelpful": "도움이 안 됨", + "similarityInfo": "이 메모들은 {similarity}% 유사성으로 연결되어 있습니다" + }, + "dataManagement": { + "cleanup": { + "button": "정리", + "description": "삭제된 메모를 참조하는 레이블과 연결을 제거합니다.", + "failed": "정리 중 오류 발생", + "title": "고아 데이터 정리" + }, + "cleanupComplete": "정리 완료", + "cleanupError": "정리 오류", + "dangerZone": "위험 구역", + "dangerZoneDescription": "이러한 작업은 되돌릴 수 없습니다. 주의하세요", + "delete": { + "button": "모든 메모 삭제", + "confirm": "확실합니까? 모든 메모가 영구적으로 삭제됩니다.", + "description": "모든 메모를 영구적으로 삭제합니다. 이 작업은 취소할 수 없습니다.", + "failed": "메모 삭제 실패", + "success": "모든 메모가 삭제되었습니다", + "title": "모든 메모 삭제" + }, + "deleting": "삭제하는 중...", + "export": { + "button": "메모 내보내기", + "description": "모든 메모를 JSON 파일로 다운로드합니다. 모든 콘텐츠, 레이블 및 메타데이터가 포함됩니다.", + "failed": "메모 내보내기 실패", + "success": "메모 내보내기 성공", + "title": "모든 메모 내보내기" + }, + "exporting": "내보내는 중...", + "import": { + "button": "메모 가져오기", + "description": "JSON 파일을 업로드하여 메모를 가져옵니다. 기존 메모에 추가되며 교체되지 않습니다.", + "failed": "메모 가져오기 실패", + "success": "{count}개의 메모를 가져왔습니다", + "title": "메모 가져오기" + }, + "importing": "가져오는 중...", + "indexing": { + "button": "인덱스 재구축", + "description": "의미 검색을 개선하기 위해 모든 메모의 임베딩을 재생성합니다.", + "failed": "인덱싱 중 오류 발생", + "success": "인덱싱 완료: {count}개의 메모 처리됨", + "title": "검색 인덱스 재구축" + }, + "indexingComplete": "인덱싱 완료", + "indexingError": "인덱싱 오류", + "title": "데이터 관리", + "toolsDescription": "데이터베이스 상태를 유지하는 도구" + }, + "demoMode": { + "activated": "데모 모드가 활성화되었습니다! Memory Echo가 즉시 작동합니다.", + "createNotesTip": "2개 이상의 유사한 메모를 만들어 Memory Echo가 작동하는 것을 확인하세요!", + "deactivated": "데모 모드가 비활성화되었습니다. 정상 매개변수로 복원되었습니다.", + "delayBetweenNotes": "메모 간 0일 지연 (일반적으로 7일)", + "description": "테스트를 위해 Memory Echo를 가속화합니다. 연결이 즉시 나타납니다.", + "parametersActive": "데모 매개변수 활성화:", + "similarityThreshold": "50% 유사성 임계값 (일반적으로 75%)", + "title": "데모 모드", + "toggleFailed": "데모 모드 전환 실패", + "unlimitedInsights": "무제한 인사이트 (빈도 제한 없음)" + }, + "diagnostics": { + "apiStatus": "API 상태", + "checking": "Checking...", + "configuredProvider": "구성된 공급자", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "테스트 세부 정보:", + "tip1": "Ollama가 실행 중인지 확인 (ollama serve)", + "tip2": "모델이 설치되어 있는지 확인 (ollama pull llama3)", + "tip3": "OpenAI API 키 확인", + "tip4": "네트워크 연결 확인", + "title": "진단", + "troubleshootingTitle": "문제 해결 팁:" + }, + "favorites": { + "noFavorites": "즐겨찾기 없음", + "pinToFavorite": "즐겨찾기에 고정", + "title": "즐겨찾기", + "toggleSection": "즐겨찾기 섹션 전환" + }, + "footer": { + "openSource": "오픈 소스 클론", + "privacy": "개인정보", + "terms": "이용약관" + }, + "general": { + "add": "추가", + "apply": "적용", + "back": "뒤로", + "cancel": "취소", + "clean": "Clean", + "clear": "지우기", + "close": "닫기", + "confirm": "확인", + "edit": "편집", + "error": "오류가 발생했습니다", + "indexAll": "Index All", + "loading": "로딩 중...", + "next": "다음", + "operationFailed": "작업 실패", + "operationSuccess": "작업 성공", + "preview": "미리보기", + "previous": "이전", + "reset": "재설정", + "save": "저장", + "select": "선택", + "submit": "제출", + "testConnection": "Test Connection", + "tryAgain": "다시 시도하세요" + }, + "generalSettings": { + "description": "일반 애플리케이션 설정", + "title": "일반 설정" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} labels", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "No labels", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "클릭하여 메모 보기", + "comparison": { + "clickToView": "클릭하여 메모 보기", + "helpful": "도움이 됨", + "helpfulQuestion": "이 비교가 도움이 되나요?", + "highSimilarityInsight": "이 메모는 높은 유사성으로 동일한 주제를 다룹니다. 병합하거나 통합할 수 있습니다.", + "notHelpful": "도움이 안 됨", + "similarityInfo": "이 메모는 {similarity}% 유사성으로 연결되어 있습니다", + "title": "💡 메모 비교", + "untitled": "제목 없음" + }, + "connection": "연결", + "connections": "연결", + "connectionsBadge": "{count}개 연결{plural}", + "dailyInsight": "메모에서 매일 인사이트 얻기", + "description": "메모 간의 능동적 연결", + "dismiss": "지금은 무시", + "editorSection": { + "close": "닫기", + "compare": "비교", + "compareAll": "모두 비교", + "loading": "로딩 중...", + "merge": "병합", + "mergeAll": "모두 병합", + "title": "⚡ 연결된 메모 ({count})", + "view": "보기" + }, + "fused": "병합됨", + "fusion": { + "archiveOriginals": "원본 메모 보관", + "cancel": "취소", + "confirmFusion": "병합 확인", + "createBacklinks": "원본 메모에 대한 백링크 만들기", + "edit": "편집", + "error": "메모 병합 실패", + "finishEditing": "편집 완료", + "generateError": "Failed to generate fusion", + "generateFusion": "병합 생성", + "generating": "생성 중...", + "keepAllTags": "모든 태그 유지", + "mergeNotes": "{count}개 메모 병합", + "modify": "수정", + "noContentReturned": "No fusion content returned from API", + "notesToMerge": "📝 병합할 메모", + "optionalPrompt": "💬 병합 프롬프트 (선택 사항)", + "optionsTitle": "병합 옵션", + "previewTitle": "📝 병합된 메모 미리보기", + "promptPlaceholder": "AI에 대한 선택적 지침 (예: '메모 1의 격식적인 스타일 유지')...", + "success": "메모가 성공적으로 병합되었습니다!", + "title": "🔗 지능형 병합", + "unknownDate": "Unknown date", + "useLatestTitle": "최신 메모를 제목으로 사용" + }, + "helpful": "도움이 됨", + "insightReady": "인사이트가 준비되었습니다!", + "notHelpful": "도움이 안 됨", + "overlay": { + "error": "연결 로드 오류", + "loading": "로딩 중...", + "noConnections": "연결을 찾을 수 없습니다", + "searchPlaceholder": "연결 검색...", + "sortBy": "정렬 기준:", + "sortOldest": "오래됨", + "sortRecent": "최근", + "sortSimilarity": "유사성", + "title": "연결된 메모", + "viewAll": "모두 나란히 보기" + }, + "thanksFeedback": "피드백해 주셔서 감사합니다!", + "thanksFeedbackImproving": "감사합니다! 개선하는 데 활용하겠습니다.", + "title": "무언가를 발견했습니다...", + "viewConnection": "연결 보기" + }, + "nav": { + "accountSettings": "계정 설정", + "adminDashboard": "관리자 대시보드", + "aiSettings": "AI 설정", + "archive": "보관함", + "buyMeACoffee": "커피를 사주세요", + "configureAI": "AI 기반 기능, 공급자 및 환경설정을 구성하세요", + "diagnostics": "진단", + "donateOnKofi": "Ko-fi에서 기부하기", + "donationDescription": "일회성 기부를 하거나 월간 서포터가 되세요.", + "donationNote": "플랫폼 수수료 없음 • 즉시 지급 • 안전", + "favorites": "즐겨찾기", + "generalNotes": "일반 메모", + "home": "홈", + "login": "로그인", + "logout": "로그아웃", + "manageAISettings": "AI 설정 관리", + "myLibrary": "내 라이브러리", + "notebooks": "노트북", + "notes": "메모", + "proPlan": "프로 플랜", + "profile": "프로필", + "quickAccess": "빠른 접근", + "recent": "최근", + "reminders": "알림", + "settings": "설정", + "sponsorDescription": "월간 후원자가 되어 인정을 받으세요.", + "sponsorOnGithub": "GitHub에서 후원", + "support": "Memento 지원하기 ☕", + "supportDescription": "Memento는 100% 무료이며 오픈 소스입니다. 여러분의 지원으로 이 상태를 유지할 수 있습니다.", + "supportDevelopment": "Memento 개발 지원하기 ☕", + "trash": "휴지통", + "userManagement": "사용자 관리", + "workspace": "작업 공간" + }, + "notebook": { + "cancel": "취소", + "create": "노트북 만들기", + "createDescription": "메모, 아이디어, 프로젝트를 효율적으로 정리할 새 컬렉션을 시작하세요.", + "createNew": "새 노트북 만들기", + "creating": "생성 중...", + "delete": "노트북 삭제", + "deleteConfirm": "삭제", + "deleteWarning": "이 노트북을 삭제하시겠습니까? 메모는 일반 메모로 이동됩니다.", + "edit": "노트북 편집", + "editDescription": "노트북의 이름, 아이콘, 색상을 변경합니다.", + "generating": "요약 생성 중...", + "labels": "레이블", + "name": "노트북 이름", + "noLabels": "레이블 없음", + "selectColor": "색상", + "selectIcon": "아이콘", + "summary": "노트북 요약", + "summaryDescription": "이 노트북의 모든 메모에 대한 AI 요약을 생성합니다.", + "summaryError": "요약 생성 오류" + }, + "notebookSuggestion": { + "description": "이 메모는 이 노트북에 속하는 것 같습니다", + "dismiss": "무시", + "dismissIn": "무시 ({timeLeft}초 후 닫힘)", + "generalNotes": "일반 메모", + "move": "이동", + "moveToNotebook": "노트북으로 이동", + "title": "{icon} {name}(으)로 이동하시겠습니까?" + }, + "notebooks": { + "allNotebooks": "모든 노트북", + "create": "노트북 만들기", + "createFirst": "첫 번째 노트북 만들기", + "noNotebooks": "노트북 없음" + }, + "notes": { + "add": "추가", + "addCollaborators": "공동 작업자 추가", + "addImage": "이미지 추가", + "addItem": "항목 추가", + "addLink": "링크 추가", + "addListItem": "+ 목록 항목", + "addNote": "메모 추가", + "adding": "추가 중...", + "aiAssistant": "AI 도우미", + "archive": "보관", + "backgroundOptions": "배경 옵션", + "changeColor": "색상 변경", + "changeSize": "크기 변경", + "clarifyFailed": "명확화 실패", + "close": "닫기", + "color": "색상", + "confirmDelete": "이 메모를 삭제하시겠습니까?", + "confirmLeaveShare": "이 공유 메모를 나가시겠습니까?", + "contentOrMediaRequired": "내용을 입력하거나 링크/이미지를 추가하세요", + "copy": "복사", + "copyFailed": "메모 복사 실패", + "copySuccess": "메모가 복사되었습니다!", + "createFirstNote": "첫 번째 메모 만들기", + "date": "날짜", + "delete": "삭제", + "dragToReorder": "드래그하여 재정렬", + "duplicate": "복제", + "edit": "메모 편집", + "emptyState": "메모가 없습니다", + "fileTooLarge": "파일이 너무 큽니다: {fileName}. 최대 크기는 {maxSize}입니다.", + "improveFailed": "개선 실패", + "inNotebook": "노트북에서", + "invalidDateTime": "잘못된 날짜 또는 시간", + "invalidFileType": "잘못된 파일 유형: {fileName}. JPEG, PNG, GIF 및 WebP만 허용됩니다.", + "itemOrMediaRequired": "하나 이상의 항목이나 미디어를 추가하세요", + "large": "크게", + "leaveShare": "나가기", + "linkAddFailed": "링크 추가 실패", + "linkAdded": "링크가 추가되었습니다", + "linkMetadataFailed": "링크 메타데이터를 가져올 수 없습니다", + "listItem": "목록 항목", + "makeCopy": "사본 만들기", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown 끄기", + "markdownOn": "Markdown 켜기", + "markdownPlaceholder": "메모 작성... (Markdown 지원)", + "medium": "중간", + "more": "더 보기", + "moreOptions": "더 많은 옵션", + "moveFailed": "이동 실패", + "newChecklist": "새 체크리스트", + "newNote": "새 메모", + "noContent": "내용 없음", + "noNotes": "메모 없음", + "noNotesFound": "메모를 찾을 수 없습니다", + "noteCreateFailed": "메모 생성 실패", + "noteCreated": "메모가 생성되었습니다", + "others": "기타", + "pin": "고정", + "pinned": "고정됨", + "pinnedNotes": "고정된 메모", + "placeholder": "메모 작성...", + "preview": "미리보기", + "readOnly": "읽기 전용", + "recent": "최근", + "redo": "다시 실행 (Ctrl+Y)", + "redoShortcut": "다시 실행 (Ctrl+Y)", + "remindMe": "알림", + "reminderDateTimeRequired": "날짜와 시간을 입력하세요", + "reminderMustBeFuture": "알림은 미래 시간으로 설정해야 합니다", + "reminderPastError": "알림은 미래 시간으로 설정해야 합니다", + "reminderRemoved": "알림이 제거되었습니다", + "reminderSet": "{datetime}에 알림이 설정되었습니다", + "remove": "제거", + "saving": "저장 중...", + "setReminder": "알림 설정", + "setReminderButton": "알림 설정", + "share": "공유", + "shareWithCollaborators": "공동 작업자와 공유", + "sharedBy": "공유자", + "sharedReadOnly": "이 메모는 읽기 전용 모드로 공유됩니다", + "shortenFailed": "단축 실패", + "showCollaborators": "공동 작업자 표시", + "size": "크기", + "small": "작게", + "takeNote": "메모 작성...", + "takeNoteMarkdown": "메모 작성... (Markdown 지원)", + "time": "시간", + "title": "메모", + "titlePlaceholder": "제목", + "transformFailed": "변환 실패", + "unarchive": "보관 취소", + "undo": "실행 취소 (Ctrl+Z)", + "undoShortcut": "실행 취소 (Ctrl+Z)", + "unpin": "고정 해제", + "unpinned": "고정 해제됨", + "untitled": "제목 없음", + "uploadFailed": "{filename} 업로드 실패", + "view": "메모 보기" + }, + "pagination": { + "next": "→", + "pageInfo": "Page {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "비격식", + "expand": "확장", + "formal": "격식", + "improve": "개선", + "shorten": "단축", + "title": "텍스트 개선" + }, + "profile": { + "accountSettings": "계정 설정", + "autoDetect": "자동 감지", + "changePassword": "비밀번호 변경", + "changePasswordDescription": "비밀번호를 업데이트하세요. 현재 비밀번호가 필요합니다.", + "confirmPassword": "비밀번호 확인", + "currentPassword": "현재 비밀번호", + "description": "개인정보 업데이트", + "displayName": "표시 이름", + "displaySettings": "표시 설정", + "displaySettingsDescription": "모양과 글꼴 크기를 사용자 지정합니다.", + "email": "이메일", + "fontSize": "글꼴 크기", + "fontSizeDescription": "가독성을 향상시키기 위해 글꼴 크기를 조정하세요. 이는 인터페이스의 모든 텍스트에 적용됩니다.", + "fontSizeExtraLarge": "매우 크게", + "fontSizeLarge": "크게", + "fontSizeMedium": "중간", + "fontSizeSmall": "작게", + "fontSizeUpdateFailed": "글꼴 크기 업데이트 실패", + "fontSizeUpdateSuccess": "글꼴 크기가 업데이트되었습니다", + "languageDescription": "이 언어는 AI 기능, 콘텐츠 분석 및 인터페이스 텍스트에 사용됩니다.", + "languagePreferences": "언어 환경설정", + "languagePreferencesDescription": "AI 기능 및 인터페이스의 선호 언어를 선택하세요.", + "languageUpdateFailed": "언어 업데이트 실패", + "languageUpdateSuccess": "언어가 업데이트되었습니다", + "manageAISettings": "AI 설정 관리", + "newPassword": "새 비밀번호", + "passwordChangeFailed": "비밀번호 변경 실패", + "passwordChangeSuccess": "비밀번호가 변경되었습니다", + "passwordError": "비밀번호 업데이트 오류", + "passwordUpdated": "비밀번호가 업데이트되었습니다", + "preferredLanguage": "선호 언어", + "profileError": "프로필 업데이트 오류", + "profileUpdated": "프로필이 업데이트되었습니다", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "글꼴 크기 선택", + "selectLanguage": "언어 선택", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "프로필", + "updateFailed": "프로필 업데이트 실패", + "updatePassword": "비밀번호 업데이트", + "updateSuccess": "프로필이 업데이트되었습니다" + }, + "reminder": { + "cancel": "취소", + "reminderDate": "알림 날짜", + "reminderTime": "알림 시간", + "removeReminder": "알림 제거", + "save": "알림 설정", + "setReminder": "알림 설정", + "title": "알림" + }, + "resetPassword": { + "confirmNewPassword": "새 비밀번호 확인", + "description": "아래에 새 비밀번호를 입력하세요.", + "invalidLinkDescription": "이 비밀번호 재설정 링크는 유효하지 않거나 만료되었습니다.", + "invalidLinkTitle": "잘못된 링크", + "loading": "로딩 중...", + "newPassword": "새 비밀번호", + "passwordMismatch": "비밀번호가 일치하지 않습니다", + "requestNewLink": "새 링크 요청", + "resetPassword": "비밀번호 재설정", + "resetting": "재설정 중...", + "success": "비밀번호가 성공적으로 재설정되었습니다. 이제 로그인할 수 있습니다.", + "title": "비밀번호 재설정" + }, + "search": { + "exactMatch": "Exact match", + "noResults": "No results found", + "placeholder": "Search", + "related": "Related", + "resultsFound": "{count} notes found", + "searchPlaceholder": "Search your notes...", + "searching": "Searching...", + "semanticInProgress": "AI search in progress...", + "semanticTooltip": "AI semantic search" }, "semanticSearch": { "exactMatch": "정확히 일치", "related": "관련", "searching": "검색 중..." }, - "paragraphRefactor": { - "title": "텍스트 개선", - "shorten": "단축", - "expand": "확장", - "improve": "개선", - "formal": "격식", - "casual": "비격식" - }, - "memoryEcho": { - "title": "무언가를 발견했습니다...", - "description": "메모 간의 능동적 연결", - "dailyInsight": "메모에서 매일 인사이트 얻기", - "insightReady": "인사이트가 준비되었습니다!", - "viewConnection": "연결 보기", - "helpful": "도움이 됨", - "notHelpful": "도움이 안 됨", - "dismiss": "지금은 무시", - "thanksFeedback": "피드백해 주셔서 감사합니다!", - "thanksFeedbackImproving": "감사합니다! 개선하는 데 활용하겠습니다.", - "connections": "연결", - "connection": "연결", - "connectionsBadge": "{count}개 연결{plural}", - "fused": "병합됨", - "overlay": { - "title": "연결된 메모", - "searchPlaceholder": "연결 검색...", - "sortBy": "정렬 기준:", - "sortSimilarity": "유사성", - "sortRecent": "최근", - "sortOldest": "오래됨", - "viewAll": "모두 나란히 보기", - "loading": "로딩 중...", - "noConnections": "연결을 찾을 수 없습니다" - }, - "comparison": { - "title": "💡 메모 비교", - "similarityInfo": "이 메모는 {similarity}% 유사성으로 연결되어 있습니다", - "highSimilarityInsight": "이 메모는 높은 유사성으로 동일한 주제를 다룹니다. 병합하거나 통합할 수 있습니다.", - "untitled": "제목 없음", - "clickToView": "클릭하여 메모 보기", - "helpfulQuestion": "이 비교가 도움이 되나요?", - "helpful": "도움이 됨", - "notHelpful": "도움이 안 됨" - }, - "editorSection": { - "title": "⚡ 연결된 메모 ({count})", - "loading": "로딩 중...", - "view": "보기", - "compare": "비교", - "merge": "병합", - "compareAll": "모두 비교", - "mergeAll": "모두 병합" - }, - "fusion": { - "title": "🔗 지능형 병합", - "mergeNotes": "{count}개 메모 병합", - "notesToMerge": "📝 병합할 메모", - "optionalPrompt": "💬 병합 프롬프트 (선택 사항)", - "promptPlaceholder": "AI에 대한 선택적 지침 (예: '메모 1의 격식적인 스타일 유지')...", - "generateFusion": "병합 생성", - "generating": "생성 중...", - "previewTitle": "📝 병합된 메모 미리보기", - "edit": "편집", - "modify": "수정", - "finishEditing": "편집 완료", - "optionsTitle": "병합 옵션", - "archiveOriginals": "원본 메모 보관", - "keepAllTags": "모든 태그 유지", - "useLatestTitle": "최신 메모를 제목으로 사용", - "createBacklinks": "원본 메모에 대한 백링크 만들기", - "cancel": "취소", - "confirmFusion": "병합 확인", - "success": "메모가 성공적으로 병합되었습니다!", - "error": "메모 병합 실패" - } - }, - "nav": { - "home": "홈", - "notes": "메모", - "notebooks": "노트북", - "generalNotes": "일반 메모", - "archive": "보관함", - "settings": "설정", - "profile": "프로필", - "aiSettings": "AI 설정", - "logout": "로그아웃", - "login": "로그인", - "adminDashboard": "관리자 대시보드", - "diagnostics": "진단", - "trash": "휴지통", - "support": "Memento 지원하기 ☕", - "reminders": "알림", - "userManagement": "사용자 관리", - "accountSettings": "계정 설정", - "manageAISettings": "AI 설정 관리", - "configureAI": "AI 기반 기능, 공급자 및 환경설정을 구성하세요", - "supportDevelopment": "Memento 개발 지원하기 ☕", - "supportDescription": "Memento는 100% 무료이며 오픈 소스입니다. 여러분의 지원으로 이 상태를 유지할 수 있습니다.", - "buyMeACoffee": "커피를 사주세요", - "donationDescription": "일회성 기부를 하거나 월간 서포터가 되세요.", - "donateOnKofi": "Ko-fi에서 기부하기", - "donationNote": "플랫폼 수수료 없음 • 즉시 지급 • 안전", - "sponsorOnGithub": "GitHub에서 후원", - "sponsorDescription": "월간 후원자가 되어 인정을 받으세요.", - "workspace": "작업 공간", - "quickAccess": "빠른 접근", - "myLibrary": "내 라이브러리", - "favorites": "즐겨찾기", - "recent": "최근", - "proPlan": "프로 플랜" - }, "settings": { - "title": "설정", - "description": "설정 및 환경설정 관리", + "about": "정보", "account": "계정", "appearance": "모양", - "theme": "테마", - "themeLight": "밝게", - "themeDark": "어둡게", - "themeSystem": "시스템", - "notifications": "알림", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "설정 및 환경설정 관리", "language": "언어", - "selectLanguage": "언어 선택", + "languageAuto": "자동 감지", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "알림", "privacy": "개인정보 보호", + "profile": "프로필", + "searchNoResults": "일치하는 설정을 찾을 수 없습니다", "security": "보안", - "about": "정보", - "version": "버전", - "settingsSaved": "설정이 저장되었습니다", - "settingsError": "설정 저장 오류" - }, - "profile": { - "title": "프로필", - "description": "개인정보 업데이트", - "displayName": "표시 이름", - "email": "이메일", - "changePassword": "비밀번호 변경", - "changePasswordDescription": "비밀번호를 업데이트하세요. 현재 비밀번호가 필요합니다.", - "currentPassword": "현재 비밀번호", - "newPassword": "새 비밀번호", - "confirmPassword": "비밀번호 확인", - "updatePassword": "비밀번호 업데이트", - "passwordChangeSuccess": "비밀번호가 변경되었습니다", - "passwordChangeFailed": "비밀번호 변경 실패", - "passwordUpdated": "비밀번호가 업데이트되었습니다", - "passwordError": "비밀번호 업데이트 오류", - "languagePreferences": "언어 환경설정", - "languagePreferencesDescription": "AI 기능 및 인터페이스의 선호 언어를 선택하세요.", - "preferredLanguage": "선호 언어", "selectLanguage": "언어 선택", - "languageDescription": "이 언어는 AI 기능, 콘텐츠 분석 및 인터페이스 텍스트에 사용됩니다.", - "autoDetect": "자동 감지", - "updateSuccess": "프로필이 업데이트되었습니다", - "updateFailed": "프로필 업데이트 실패", - "languageUpdateSuccess": "언어가 업데이트되었습니다", - "languageUpdateFailed": "언어 업데이트 실패", - "profileUpdated": "프로필이 업데이트되었습니다", - "profileError": "프로필 업데이트 오류", - "accountSettings": "계정 설정", - "manageAISettings": "AI 설정 관리", - "displaySettings": "표시 설정", - "displaySettingsDescription": "모양과 글꼴 크기를 사용자 지정합니다.", - "fontSize": "글꼴 크기", - "selectFontSize": "글꼴 크기 선택", - "fontSizeSmall": "작게", - "fontSizeMedium": "중간", - "fontSizeLarge": "크게", - "fontSizeExtraLarge": "매우 크게", - "fontSizeDescription": "가독성을 향상시키기 위해 글꼴 크기를 조정하세요. 이는 인터페이스의 모든 텍스트에 적용됩니다.", - "fontSizeUpdateSuccess": "글꼴 크기가 업데이트되었습니다", - "fontSizeUpdateFailed": "글꼴 크기 업데이트 실패" + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "설정 저장 오류", + "settingsSaved": "설정이 저장되었습니다", + "theme": "테마", + "themeDark": "어둡게", + "themeLight": "밝게", + "themeSystem": "시스템", + "title": "설정", + "version": "버전" }, - "aiSettings": { - "title": "AI 설정", - "description": "AI 기반 기능 및 환경설정 구성", - "features": "AI 기능", - "provider": "AI 공급자", - "providerAuto": "자동 (권장)", - "providerOllama": "Ollama (로컬)", - "providerOpenAI": "OpenAI (클라우드)", - "frequency": "빈도", - "frequencyDaily": "매일", - "frequencyWeekly": "매주", - "saving": "저장 중...", - "saved": "설정이 업데이트되었습니다", - "error": "설정 업데이트 실패" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" }, - "general": { - "loading": "로딩 중...", - "save": "저장", - "cancel": "취소", - "add": "추가", - "edit": "편집", - "confirm": "확인", - "close": "닫기", - "back": "뒤로", - "next": "다음", - "previous": "이전", - "submit": "제출", - "reset": "재설정", - "apply": "적용", - "clear": "지우기", - "select": "선택", - "tryAgain": "다시 시도하세요", - "error": "오류가 발생했습니다", - "operationSuccess": "작업 성공", - "operationFailed": "작업 실패" + "support": { + "aiApiCosts": "AI API 비용:", + "buyMeACoffee": "커피를 사주세요", + "contributeCode": "코드 기여", + "description": "Memento는 100% 무료이며 오픈 소스입니다. 여러분의 지원으로 이 상태를 유지할 수 있습니다.", + "directImpact": "직접적인 영향", + "domainSSL": "도메인 및 SSL:", + "donateOnKofi": "Ko-fi에서 기부하기", + "donationDescription": "일회성 기부를 하거나 월간 서포터가 되세요.", + "githubDescription": "정기 후원 • 공개 인정 • 개발자 중심", + "hostingServers": "호스팅 및 서버:", + "howSupportHelps": "여러분의 지원이 어떻게 도움이 되는지", + "kofiDescription": "플랫폼 수수료 없음 • 즉시 지급 • 안전", + "otherWaysTitle": "기타 지원 방법", + "reportBug": "버그 보고", + "shareTwitter": "Twitter에서 공유", + "sponsorDescription": "월간 후원자가 되어 인정을 받으세요.", + "sponsorOnGithub": "GitHub에서 후원", + "sponsorPerks": "후원자 특전", + "starGithub": "GitHub에서 스타 주기", + "title": "Memento 개발 지원하기", + "totalExpenses": "총 지출:", + "transparency": "투명성", + "transparencyDescription": "저는 완전한 투명성을 믿습니다. 기부금 사용처는 다음과 같습니다:" }, - "colors": { - "default": "기본값", - "red": "빨간색", - "blue": "파란색", - "green": "초록색", - "yellow": "노란색", - "purple": "보라색", - "pink": "분홍색", - "orange": "주황색", - "gray": "회색" + "testPages": { + "titleSuggestions": { + "analyzing": "분석 중...", + "contentLabel": "콘텐츠 (50단어 이상 필요):", + "error": "오류:", + "idle": "대기 중", + "noSuggestions": "아직 제안이 없습니다. 50단어 이상 입력하고 2초 기다리세요.", + "placeholder": "여기에 최소 50단어를 입력하세요...", + "status": "상태:", + "suggestions": "제안 ({count}):", + "title": "제목 제안 테스트", + "wordCount": "단어 수:" + } }, - "reminder": { - "title": "알림", - "setReminder": "알림 설정", - "removeReminder": "알림 제거", - "reminderDate": "알림 날짜", - "reminderTime": "알림 시간", - "save": "알림 설정", - "cancel": "취소" + "time": { + "daysAgo": "{count}일 전", + "hoursAgo": "{count}시간 전", + "justNow": "방금", + "minutesAgo": "{count}분 전", + "today": "오늘", + "tomorrow": "내일", + "yesterday": "어제" }, - "notebookSuggestion": { - "title": "{icon} {name}(으)로 이동하시겠습니까?", - "description": "이 메모는 이 노트북에 속하는 것 같습니다", - "move": "이동", + "titleSuggestions": { + "available": "제목 제안", "dismiss": "무시", - "dismissIn": "무시 ({timeLeft}초 후 닫힘)", - "moveToNotebook": "노트북으로 이동", - "generalNotes": "일반 메모" + "generating": "생성 중...", + "selectTitle": "제목 선택", + "title": "AI 제안" + }, + "toast": { + "feedbackFailed": "피드백 제출 실패", + "notesFusionSuccess": "메모가 성공적으로 병합되었습니다!", + "openConnectionFailed": "연결 열기 실패", + "openingConnection": "연결을 여는 중...", + "operationFailed": "작업 실패", + "operationSuccess": "작업 성공", + "saveFailed": "설정 저장 실패", + "saved": "설정이 저장되었습니다", + "thanksFeedback": "피드백 감사합니다!", + "thanksFeedbackImproving": "감사합니다! 개선에 활용하겠습니다." + }, + "trash": { + "deletePermanently": "영구 삭제", + "empty": "휴지통이 비어 있습니다", + "restore": "복원", + "title": "휴지통" + }, + "ui": { + "close": "닫기", + "collapse": "접기", + "expand": "펼치기", + "open": "열기" } } diff --git a/keep-notes/locales/nl.json b/keep-notes/locales/nl.json index d1bca39..e1dfce9 100644 --- a/keep-notes/locales/nl.json +++ b/keep-notes/locales/nl.json @@ -1,539 +1,1039 @@ { - "auth": { - "signIn": "Inloggen", - "signUp": "Registreren", - "email": "E-mail", - "password": "Wachtwoord", - "name": "Naam", - "emailPlaceholder": "Voer uw e-mailadres in", - "passwordPlaceholder": "Voer uw wachtwoord in", - "namePlaceholder": "Voer uw naam in", - "passwordMinChars": "Voer wachtwoord in (min. 6 tekens)", - "resetPassword": "Wachtwoord opnieuw instellen", - "resetPasswordInstructions": "Voer uw e-mail in om uw wachtwoord opnieuw in te stellen", - "forgotPassword": "Wachtwoord vergeten?", - "noAccount": "Heeft u geen account?", - "hasAccount": "Heeft u al een account?", - "signInToAccount": "Log in op uw account", - "createAccount": "Maak uw account", - "rememberMe": "Onthoud mij", - "orContinueWith": "Of doorgaan met", - "checkYourEmail": "Controleer uw e-mail", - "resetEmailSent": "We hebben een link om uw wachtwoord opnieuw in te stellen naar uw e-mailadres gestuurd als deze bestaat in ons systeem.", - "returnToLogin": "Terug naar inloggen", - "forgotPasswordTitle": "Wachtwoord vergeten", - "forgotPasswordDescription": "Voer uw e-mailadres in en we sturen u een link om uw wachtwoord opnieuw in te stellen.", - "sending": "Verzenden...", - "sendResetLink": "Link opnieuw instellen verzenden", - "backToLogin": "Terug naar inloggen" + "about": { + "appDescription": "Een krachtige notitie-applicatie met AI-ondersteunde functies", + "appName": "Keep Notes", + "buildDate": "Bouwdatum", + "description": "Informatie over de applicatie", + "features": { + "description": "AI-ondersteunde mogelijkheden", + "dragDrop": "Drag & drop notitiebeheer", + "labelSystem": "Labelsysteem", + "memoryEcho": "Memory Echo dagelijkse inzichten", + "multipleProviders": "Meerdere AI-providers (OpenAI, Ollama)", + "notebookOrganization": "Notitieboek organisatie", + "paragraphReformulation": "Alinea herformulering", + "semanticSearch": "Semantisch zoeken met embeddings", + "title": "Functies", + "titleSuggestions": "AI-ondersteunde titelsuggesties" + }, + "platform": "Platform", + "platformWeb": "Web", + "support": { + "description": "Hulp en feedback krijgen", + "documentation": "Documentatie", + "feedback": "Feedback", + "reportIssues": "Problemen melden", + "title": "Ondersteuning" + }, + "technology": { + "ai": "AI", + "authentication": "Authenticatie", + "backend": "Backend", + "database": "Database", + "description": "Gebouwd met moderne technologieën", + "frontend": "Frontend", + "testing": "Testen", + "title": "Technologiestack", + "ui": "UI" + }, + "title": "Over", + "version": "Versie" }, - "notes": { - "title": "Notities", - "newNote": "Nieuwe notitie", - "untitled": "Naamloos", - "placeholder": "Maak een notitie...", - "markdownPlaceholder": "Maak een notitie... (Markdown ondersteund)", - "titlePlaceholder": "Titel", - "listItem": "Lijstitem", - "addListItem": "+ Lijstitem", - "newChecklist": "Nieuwe checklist", - "add": "Toevoegen", - "adding": "Toevoegen...", - "close": "Sluiten", - "confirmDelete": "Weet u zeker dat u deze notitie wilt verwijderen?", - "confirmLeaveShare": "Weet u zeker dat u deze gedeelde notitie wilt verlaten?", - "sharedBy": "Gedeeld door", - "leaveShare": "Verlaten", - "delete": "Verwijderen", - "archive": "Archiveren", - "unarchive": "Dearchiveren", - "pin": "Vastzetten", - "unpin": "Losmaken", - "color": "Kleur", - "changeColor": "Kleur wijzigen", - "setReminder": "Herinnering instellen", - "setReminderButton": "Herinnering instellen", - "date": "Datum", - "time": "Tijd", - "reminderDateTimeRequired": "Voer datum en tijd in", - "invalidDateTime": "Ongeldige datum of tijd", - "reminderMustBeFuture": "Herinnering moet in de toekomst liggen", - "reminderSet": "Herinnering ingesteld op {datetime}", - "reminderPastError": "Herinnering moet in de toekomst liggen", - "reminderRemoved": "Herinnering verwijderd", - "addImage": "Afbeelding toevoegen", - "addLink": "Link toevoegen", - "linkAdded": "Link toegevoegd", - "linkMetadataFailed": "Kon linkmetadata niet ophalen", - "linkAddFailed": "Link toevoegen mislukt", - "invalidFileType": "Ongeldig bestandstype: {fileName}. Alleen JPEG, PNG, GIF en WebP zijn toegestaan.", - "fileTooLarge": "Bestand te groot: {fileName}. Maximale grootte is {maxSize}.", - "uploadFailed": "Uploaden van {filename} mislukt", - "contentOrMediaRequired": "Voer inhoud in of voeg een link/afbeelding toe", - "itemOrMediaRequired": "Voeg ten minste één item of media toe", - "noteCreated": "Notitie succesvol aangemaakt", - "noteCreateFailed": "Notitie aanmaken mislukt", - "aiAssistant": "AI-assistent", - "changeSize": "Grootte wijzigen", - "backgroundOptions": "Achtergrondopties", - "moreOptions": "Meer opties", - "remindMe": "Herinner mij", - "markdownMode": "Markdown", - "addCollaborators": "Medewerkers toevoegen", - "duplicate": "Dupliceren", - "share": "Delen", - "showCollaborators": "Medewerkers weergeven", - "pinned": "Vastgezet", - "others": "Overig", - "undo": "Ongedaan maken", - "redo": "Opnieuw uitvoeren", - "noNotes": "Geen notities", - "noNotesFound": "Geen notities gevonden", - "createFirstNote": "Maak uw eerste notitie", - "size": "Grootte", - "small": "Klein", - "medium": "Middel", - "large": "Groot", - "shareWithCollaborators": "Delen met medewerkers", - "view": "Notitie bekijken", - "edit": "Notitie bewerken", - "readOnly": "Alleen-lezen", - "preview": "Voorbeeld", - "noContent": "Geen inhoud", - "takeNote": "Maak een notitie...", - "takeNoteMarkdown": "Maak een notitie... (Markdown ondersteund)", - "addItem": "Item toevoegen", - "sharedReadOnly": "Deze notitie is met u gedeeld in alleen-lezen modus", - "makeCopy": "Kopie maken", - "saving": "Opslaan...", - "copySuccess": "Notitie succesvol gekopieerd!", - "copyFailed": "Notitie kopiëren mislukt", - "copy": "Kopiëren", - "markdownOn": "Markdown AAN", - "markdownOff": "Markdown UIT" - }, - "labels": { - "title": "Labels", - "filter": "Filteren op label", - "manage": "Labels beheren", - "manageTooltip": "Labels beheren", - "changeColor": "Kleur wijzigen", - "changeColorTooltip": "Kleur wijzigen", - "delete": "Verwijderen", - "deleteTooltip": "Label verwijderen", - "confirmDelete": "Weet u zeker dat u dit label wilt verwijderen?", - "newLabelPlaceholder": "Nieuw label maken", - "namePlaceholder": "Voer labelnaam in", - "addLabel": "Label toevoegen", - "createLabel": "Label maken", - "labelName": "Labelnaam", - "labelColor": "Labelkleur", - "manageLabels": "Labels beheren", - "manageLabelsDescription": "Voeg labels toe aan of verwijder ze uit deze notitie. Klik op een label om de kleur te wijzigen.", - "selectedLabels": "Geselecteerde labels", - "allLabels": "Alle labels", - "clearAll": "Alles wissen", - "filterByLabel": "Filteren op label", - "tagAdded": "Label \"{tag}\" toegevoegd", - "showLess": "Minder weergeven", - "showMore": "Meer weergeven", - "editLabels": "Labels bewerken", - "editLabelsDescription": "Maak labels aan, bewerk kleuren of verwijder labels.", - "noLabelsFound": "Geen labels gevonden.", - "loading": "Laden...", - "notebookRequired": "⚠️ Labels zijn alleen beschikbaar in notitieboeken. Verplaats deze notitie eerst naar een notitieboek." - }, - "pagination": { - "previous": "←", - "pageInfo": "Pagina {currentPage} / {totalPages}", - "next": "→" - }, - "search": { - "placeholder": "Zoeken", - "searchPlaceholder": "Doorzoek uw notities...", - "semanticInProgress": "AI-zoeken bezig...", - "semanticTooltip": "AI semantisch zoeken", - "searching": "Zoeken...", - "noResults": "Geen resultaten gevonden", - "resultsFound": "{count} notities gevonden", - "exactMatch": "Exacte overeenkomst", - "related": "Gerelateerd" - }, - "collaboration": { - "emailPlaceholder": "Voer e-mailadres in", - "addCollaborator": "Medewerker toevoegen", - "removeCollaborator": "Medewerker verwijderen", - "owner": "Eigenaar", - "canEdit": "Kan bewerken", - "canView": "Kan bekijken", - "shareNote": "Notitie delen", - "shareWithCollaborators": "Delen met medewerkers", - "addCollaboratorDescription": "Voeg mensen toe om aan deze notitie samen te werken via hun e-mailadres.", - "viewerDescription": "U heeft toegang tot deze notitie. Alleen de eigenaar kan medewerkers beheren.", - "emailAddress": "E-mailadres", - "enterEmailAddress": "Voer e-mailadres in", - "invite": "Uitnodigen", - "peopleWithAccess": "Mensen met toegang", - "noCollaborators": "Nog geen medewerkers. Voeg iemand hierboven toe!", - "noCollaboratorsViewer": "Nog geen medewerkers.", - "pendingInvite": "Uitnodiging in afwachting", - "pending": "In afwachting", - "remove": "Verwijderen", - "unnamedUser": "Naamloze gebruiker", - "done": "Klaar", - "willBeAdded": "{email} wordt toegevoegd als medewerker wanneer de notitie wordt aangemaakt", - "alreadyInList": "Dit e-mailadres staat al in de lijst", - "nowHasAccess": "{name} heeft nu toegang tot deze notitie", - "accessRevoked": "Toegang ingetrokken", - "errorLoading": "Fout bij laden van medewerkers", - "failedToAdd": "Medewerker toevoegen mislukt", - "failedToRemove": "Medewerker verwijderen mislukt" + "admin": { + "ai": { + "apiKey": "API Key", + "baseUrl": "Base URL", + "commonEmbeddingModels": "Common embedding models for OpenAI-compatible APIs", + "commonModelsDescription": "Common models for OpenAI-compatible APIs", + "description": "Configure AI providers for auto-tagging and semantic search. Use different providers for optimal performance.", + "embeddingsDescription": "AI provider for semantic search embeddings. Recommended: OpenAI (best quality).", + "embeddingsProvider": "Embeddings Provider", + "model": "Model", + "modelRecommendations": "gpt-4o-mini = Best value • gpt-4o = Best quality", + "openAIKeyDescription": "Your OpenAI API key from platform.openai.com", + "openTestPanel": "Open AI Test Panel", + "provider": "Provider", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING is required", + "providerTagsRequired": "AI_PROVIDER_TAGS is required", + "saveSettings": "Save AI Settings", + "saving": "Saving...", + "selectEmbeddingModel": "Select an embedding model installed on your system", + "selectOllamaModel": "Select an Ollama model installed on your system", + "tagsGenerationDescription": "AI provider for automatic tag suggestions. Recommended: Ollama (free, local).", + "tagsGenerationProvider": "Tags Generation Provider", + "title": "AI Configuration", + "updateFailed": "Failed to update AI settings", + "updateSuccess": "AI Settings updated successfully" + }, + "aiTest": { + "description": "Test your AI providers for tag generation and semantic search embeddings", + "embeddingDimensions": "Embedding Dimensions:", + "embeddingsTestDescription": "Test the AI provider responsible for semantic search embeddings", + "embeddingsTestTitle": "Embeddings Test", + "error": "Error:", + "first5Values": "First 5 values:", + "generatedTags": "Generated Tags:", + "howItWorksTitle": "How Testing Works", + "model": "Model:", + "provider": "Provider:", + "responseTime": "Response time: {time}ms", + "runTest": "Run Test", + "tagsTestDescription": "Test the AI provider responsible for automatic tag suggestions", + "tagsTestTitle": "Tags Generation Test", + "testError": "Test Error: {error}", + "testFailed": "Test Failed", + "testPassed": "Test Passed", + "testing": "Testing...", + "tipDescription": "Use the AI Test Panel to diagnose configuration issues before testing.", + "tipTitle": "Tip:", + "title": "AI Provider Testing", + "vectorDimensions": "vector dimensions" + }, + "aiTesting": "AI Testing", + "security": { + "allowPublicRegistration": "Allow Public Registration", + "allowPublicRegistrationDescription": "If disabled, new users can only be added by an Administrator via the User Management page.", + "description": "Manage access control and registration policies.", + "title": "Security Settings", + "updateFailed": "Failed to update security settings", + "updateSuccess": "Security Settings updated" + }, + "settings": "Admin Settings", + "smtp": { + "description": "Configure email server for password resets.", + "forceSSL": "Force SSL/TLS (usually for port 465)", + "fromEmail": "From Email", + "host": "Host", + "ignoreCertErrors": "Ignore Certificate Errors (Self-hosted/Dev only)", + "password": "Password", + "port": "Port", + "saveSettings": "Save SMTP Settings", + "sending": "Sending...", + "testEmail": "Test Email", + "testFailed": "Failed: {error}", + "testSuccess": "Test email sent successfully!", + "title": "SMTP Configuration", + "updateFailed": "Failed to update SMTP settings", + "updateSuccess": "SMTP Settings updated", + "username": "Username" + }, + "title": "Admin Dashboard", + "userManagement": "User Management", + "users": { + "addUser": "Add User", + "confirmDelete": "Weet u zeker dat u deze gebruiker wilt verwijderen?", + "createFailed": "Failed to create user", + "createSuccess": "User created successfully", + "createUser": "Create User", + "createUserDescription": "Add a new user to the system.", + "deleteFailed": "Failed to delete", + "deleteSuccess": "User deleted", + "demote": "Degraderen", + "email": "Email", + "name": "Name", + "password": "Password", + "promote": "Bevorderen", + "role": "Role", + "roleUpdateFailed": "Failed to update role", + "roleUpdateSuccess": "User role updated to {role}", + "roles": { + "admin": "Beheerder", + "user": "Gebruiker" + }, + "table": { + "actions": "Actions", + "createdAt": "Created At", + "email": "Email", + "name": "Name", + "role": "Role" + } + } }, "ai": { - "analyzing": "AI analyseert...", - "clickToAddTag": "Klik om dit label toe te voegen", - "ignoreSuggestion": "Negeer deze suggestie", - "generatingTitles": "Titels genereren...", - "generateTitlesTooltip": "Titels genereren met AI", + "analyzing": "AI analyzing...", + "assistant": "AI Assistant", + "autoLabels": { + "analyzing": "Uw notities analyseren voor labelsuggesties...", + "create": "Maken", + "createNewLabel": "Nieuw label maken", + "created": "{count} labels created successfully", + "creating": "Labels maken...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(nieuw)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "Labelsuggesties", + "typeContent": "Type content to get label suggestions...", + "typeForSuggestions": "Typ voor suggesties" + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Toepassen mislukt", + "applying": "Applying...", + "description": "AI zal uw notities analyseren en voorstellen om ze in notitieboeken te organiseren.", + "error": "Fout bij organisatie", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "Geen notities geselecteerd", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Alles selecteren in", + "selectNote": "Notitie selecteren", + "success": "Organisatie voltooid", + "title": "Batch organisatie" + }, + "clarify": "Clarify", + "clickToAddTag": "Click to add this tag", + "generateTitles": "Generate titles", + "generateTitlesTooltip": "Generate titles with AI", + "generating": "Generating...", + "generatingTitles": "Generating titles...", + "ignoreSuggestion": "Ignore this suggestion", + "improveStyle": "Improve style", + "languageDetected": "Language detected", + "notebookSummary": { + "regenerate": "Samenvatting Opnieuw Genereren", + "regenerating": "Samenvatting opnieuw genereren..." + }, + "original": "Original", "poweredByAI": "Powered by AI", - "languageDetected": "Taal gedetecteerd", - "processing": "Verwerken...", - "tagAdded": "Label \"{tag}\" toegevoegd", - "titleGenerating": "Genereren...", - "titleGenerateWithAI": "Titels genereren met AI", - "titleGenerationMinWords": "De inhoud moet minimaal 10 woorden bevatten om titels te genereren (huidig: {count} woorden)", - "titleGenerationError": "Fout bij genereren titels", - "titlesGenerated": "💡 {count} titels gegenereerd!", - "titleGenerationFailed": "Titels genereren mislukt", - "titleApplied": "Titel toegepast!", - "reformulationNoText": "Selecteer tekst of voeg inhoud toe", - "reformulationSelectionTooShort": "Selectie te kort, volledige inhoud wordt gebruikt", - "reformulationMinWords": "Tekst moet minimaal 10 woorden bevatten (huidig: {count} woorden)", - "reformulationMaxWords": "Tekst mag maximaal 500 woorden bevatten", - "reformulationError": "Fout bij herformulering", - "reformulationFailed": "Tekst herformuleren mislukt", - "reformulationApplied": "Geherformuleerde tekst toegepast!", - "transformMarkdown": "Transformeren naar Markdown", - "transforming": "Transformeren...", - "transformSuccess": "Tekst succesvol getransformeerd naar Markdown!", - "transformError": "Fout bij transformatie", - "assistant": "AI-assistent", - "generating": "Genereren...", - "generateTitles": "Titels genereren", - "reformulateText": "Tekst herformuleren", - "reformulating": "Herformuleren...", - "clarify": "Verduidelijken", - "shorten": "Inkorten", - "improveStyle": "Stijl verbeteren", - "reformulationComparison": "Herformulering vergelijking", - "original": "Origineel", - "reformulated": "Geherformuleerd" + "processing": "Processing...", + "reformulateText": "Reformulate text", + "reformulated": "Reformulated", + "reformulating": "Reformulating...", + "reformulationApplied": "Reformulated text applied!", + "reformulationComparison": "Reformulation Comparison", + "reformulationError": "Error during reformulation", + "reformulationFailed": "Failed to reformulate text", + "reformulationMaxWords": "Text must have maximum 500 words", + "reformulationMinWords": "Text must have at least 10 words (current: {count} words)", + "reformulationNoText": "Please select text or add content", + "reformulationSelectionTooShort": "Selection too short, using full content", + "shorten": "Shorten", + "tagAdded": "Tag \"{tag}\" added", + "titleApplied": "Title applied!", + "titleGenerateWithAI": "Generate titles with AI", + "titleGenerating": "Generating...", + "titleGenerationError": "Error generating titles", + "titleGenerationFailed": "Failed to generate titles", + "titleGenerationMinWords": "Content must have at least 10 words to generate titles (current: {count} words)", + "titlesGenerated": "💡 {count} titles generated!", + "transformError": "Error during transformation", + "transformMarkdown": "Transform to Markdown", + "transformSuccess": "Text transformed to Markdown successfully!", + "transforming": "Transforming..." }, - "batchOrganization": { - "title": "Batch organisatie", - "error": "Fout bij aanmaken organisatieplan", - "noNotesSelected": "Geen notities geselecteerd", - "selectNotes": "Selecteer notities om te organiseren", - "start": "Organisatie starten", - "organizing": "Organiseren...", - "finished": "Organisatie voltooid!", - "results": "Resultaten", - "totalProcessed": "Verwerkt: {total}", - "categorized": "Gecategoriseerd: {count}", - "tagsAdded": "Tags toegevoegd: {count}", - "categories": "Categorieën", - "noTagsAdded": "Geen tags toegevoegd", - "suggestedTags": "Suggestie voor tags", - "suggestedCategories": "Suggestie voor categorieën", - "addTags": "Tags toevoegen", - "addCategories": "Categorieën toevoegen", - "reviewChanges": "Wijzigingen bekijken", - "applyChanges": "Wijzigingen toepassen", - "skip": "Overslaan", - "done": "Klaar", - "close": "Sluiten", - "backToNote": "Terug naar notitie" + "aiSettings": { + "description": "Configureer uw AI-aangedreven functies en voorkeuren", + "error": "Instelling bijwerken mislukt", + "features": "AI-functies", + "frequency": "Frequentie", + "frequencyDaily": "Dagelijks", + "frequencyWeekly": "Wekelijks", + "provider": "AI-provider", + "providerAuto": "Auto (Aanbevolen)", + "providerOllama": "Ollama (Lokaal)", + "providerOpenAI": "OpenAI (Cloud)", + "saved": "Instelling bijgewerkt", + "saving": "Opslaan...", + "title": "AI-instellingen", + "titleSuggestionsDesc": "Titels suggereren voor notities zonder titel na 50+ woorden", + "paragraphRefactorDesc": "AI-ondersteunde tekstverbeteringsopties", + "frequencyDesc": "Hoe vaak notitieverbindingen analyseren", + "providerDesc": "Kies uw voorkeurs AI-provider", + "providerAutoDesc": "Ollama indien beschikbaar, OpenAI als terugval", + "providerOllamaDesc": "100% privé, draait lokaal op uw machine", + "providerOpenAIDesc": "Meest nauwkeurig, vereist API-sleutel" + }, + "appearance": { + "description": "Pas aan hoe de app eruit ziet", + "title": "Weergave" + }, + "auth": { + "backToLogin": "Terug naar inloggen", + "checkYourEmail": "Controleer uw e-mail", + "createAccount": "Maak uw account", + "email": "E-mail", + "emailPlaceholder": "Voer uw e-mailadres in", + "forgotPassword": "Wachtwoord vergeten?", + "forgotPasswordDescription": "Voer uw e-mailadres in en we sturen u een link om uw wachtwoord opnieuw in te stellen.", + "forgotPasswordTitle": "Wachtwoord vergeten", + "hasAccount": "Heeft u al een account?", + "name": "Naam", + "namePlaceholder": "Voer uw naam in", + "noAccount": "Heeft u geen account?", + "orContinueWith": "Of doorgaan met", + "password": "Wachtwoord", + "passwordMinChars": "Voer wachtwoord in (min. 6 tekens)", + "passwordPlaceholder": "Voer uw wachtwoord in", + "rememberMe": "Onthoud mij", + "resetEmailSent": "We hebben een link om uw wachtwoord opnieuw in te stellen naar uw e-mailadres gestuurd als deze bestaat in ons systeem.", + "resetPassword": "Wachtwoord opnieuw instellen", + "resetPasswordInstructions": "Voer uw e-mail in om uw wachtwoord opnieuw in te stellen", + "returnToLogin": "Terug naar inloggen", + "sendResetLink": "Link opnieuw instellen verzenden", + "sending": "Verzenden...", + "signIn": "Inloggen", + "signInToAccount": "Log in op uw account", + "signOut": "Sign out", + "signUp": "Registreren" }, "autoLabels": { - "title": "Auto labels", - "toggle": "Auto labels inschakelen", - "enabled": "Ingeschakeld", - "disabled": "Uitgeschakeld", - "settings": "Instellingen", + "aiPowered": "AI-gestuurd", + "analyzing": "Analyzing your notes...", + "applySuggested": "Suggestie toepassen", + "autoLabelBatchDescription": "Automatisch labels toevoegen voor geselecteerde notities", "autoLabelDescription": "Automatisch labels toevoegen op basis van AI-analyse", "autoLabelNoteDescription": "Automatisch labels toevoegen voor deze notitie", - "autoLabelBatchDescription": "Automatisch labels toevoegen voor geselecteerde notities", - "smartTagging": "Slim taggen", + "confidence": "Vertrouwen: {score}%", "contentAnalysis": "Content analyse", - "keywordExtraction": "Sleutelwoorden extraheren", - "aiPowered": "AI-gestuurd", - "suggestedLabels": "Suggestie voor labels", - "applySuggested": "Suggestie toepassen", + "createNewLabel": "Create this new label and add it", + "created": "{count} labels created successfully", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "disabled": "Uitgeschakeld", "dismissAll": "Alles negeren", + "enabled": "Ingeschakeld", + "error": "Fout bij auto labels", "generateMore": "Meer genereren", - "settingsDialogTitle": "Auto labels instellingen", - "settingsDescription": "Configureer auto label preferenties", - "minConfidence": "Minimaal vertrouwen", - "minConfidenceDescription": "Minimale score (0-100) voor AI-suggesties", - "maxLabels": "Max labels per notitie", - "maxLabelsDescription": "Maximum aantal labels per notitie", + "keywordExtraction": "Sleutelwoorden extraheren", "labelCategories": "Label categorieën", "labelCategoriesDescription": "Selecteer categorieën voor auto labeling", - "saveSettings": "Instellingen opslaan", - "settingsSaved": "Instellingen opgeslagen", - "error": "Fout bij auto labels", - "processing": "Verwerken...", - "noLabelsGenerated": "Geen labels gegenereerd", "labelsApplied": "Labels toegepast", - "confidence": "Vertrouwen: {score}%", - "learnMore": "Meer informatie" + "learnMore": "Meer informatie", + "maxLabels": "Max labels per notitie", + "maxLabelsDescription": "Maximum aantal labels per notitie", + "minConfidence": "Minimaal vertrouwen", + "minConfidenceDescription": "Minimale score (0-100) voor AI-suggesties", + "new": "(new)", + "noLabelsGenerated": "Geen labels gegenereerd", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "processing": "Verwerken...", + "saveSettings": "Instellingen opslaan", + "settings": "Instellingen", + "settingsDescription": "Configureer auto label preferenties", + "settingsDialogTitle": "Auto labels instellingen", + "settingsSaved": "Instellingen opgeslagen", + "smartTagging": "Slim taggen", + "suggestedLabels": "Suggestie voor labels", + "title": "Auto labels", + "toggle": "Auto labels inschakelen", + "typeContent": "Type content to get label suggestions..." }, - "titleSuggestions": { - "available": "Titelsuggesties", - "title": "AI-suggesties", - "generating": "Genereren...", - "selectTitle": "Selecteer een titel", - "dismiss": "Negeren" + "batch": { + "organize": "Organiseren", + "organizeWithAI": "Organiseren met AI" + }, + "batchOrganization": { + "addCategories": "Categorieën toevoegen", + "addTags": "Tags toevoegen", + "analyzing": "Analyzing your notes...", + "apply": "Apply ({count})", + "applyChanges": "Wijzigingen toepassen", + "applying": "Applying...", + "backToNote": "Terug naar notitie", + "categories": "Categorieën", + "categorized": "Gecategoriseerd: {count}", + "close": "Sluiten", + "confidence": "confidence", + "description": "AI will analyze your notes and suggest organizing them into notebooks.", + "done": "Klaar", + "error": "Fout bij aanmaken organisatieplan", + "finished": "Organisatie voltooid!", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "Geen notities geselecteerd", + "noSuggestions": "AI could not find a good way to organize these notes.", + "noTagsAdded": "Geen tags toegevoegd", + "notesToOrganize": "{count} notes to organize", + "organizing": "Organiseren...", + "results": "Resultaten", + "reviewChanges": "Wijzigingen bekijken", + "selectNotes": "Selecteer notities om te organiseren", + "selected": "{count} selected", + "skip": "Overslaan", + "start": "Organisatie starten", + "suggestedCategories": "Suggestie voor categorieën", + "suggestedTags": "Suggestie voor tags", + "tagsAdded": "Tags toegevoegd: {count}", + "title": "Batch organisatie", + "totalProcessed": "Verwerkt: {total}", + "unorganized": "{count} notes couldn't be categorized and will stay in General Notes." + }, + "collaboration": { + "accessRevoked": "Toegang ingetrokken", + "addCollaborator": "Medewerker toevoegen", + "addCollaboratorDescription": "Voeg mensen toe om aan deze notitie samen te werken via hun e-mailadres.", + "alreadyInList": "Dit e-mailadres staat al in de lijst", + "canEdit": "Kan bewerken", + "canView": "Kan bekijken", + "done": "Klaar", + "emailAddress": "E-mailadres", + "emailPlaceholder": "Voer e-mailadres in", + "enterEmailAddress": "Voer e-mailadres in", + "errorLoading": "Fout bij laden van medewerkers", + "failedToAdd": "Medewerker toevoegen mislukt", + "failedToRemove": "Medewerker verwijderen mislukt", + "invite": "Uitnodigen", + "noCollaborators": "Nog geen medewerkers. Voeg iemand hierboven toe!", + "noCollaboratorsViewer": "Nog geen medewerkers.", + "nowHasAccess": "{name} heeft nu toegang tot deze notitie", + "owner": "Eigenaar", + "pending": "In afwachting", + "pendingInvite": "Uitnodiging in afwachting", + "peopleWithAccess": "Mensen met toegang", + "remove": "Verwijderen", + "removeCollaborator": "Medewerker verwijderen", + "shareNote": "Notitie delen", + "shareWithCollaborators": "Delen met medewerkers", + "unnamedUser": "Naamloze gebruiker", + "viewerDescription": "U heeft toegang tot deze notitie. Alleen de eigenaar kan medewerkers beheren.", + "willBeAdded": "{email} wordt toegevoegd als medewerker wanneer de notitie wordt aangemaakt" + }, + "colors": { + "blue": "Blauw", + "default": "Standaard", + "gray": "Grijs", + "green": "Groen", + "orange": "Oranje", + "pink": "Roze", + "purple": "Paars", + "red": "Rood", + "yellow": "Geel" + }, + "common": { + "add": "Toevoegen", + "cancel": "Annuleren", + "close": "Sluiten", + "confirm": "Bevestigen", + "delete": "Verwijderen", + "edit": "Bewerken", + "error": "Fout", + "loading": "Laden...", + "noResults": "Geen resultaten", + "notAvailable": "Niet beschikbaar", + "optional": "Optioneel", + "remove": "Verwijderen", + "required": "Vereist", + "save": "Opslaan", + "search": "Zoeken", + "success": "Succes", + "unknown": "Onbekend" + }, + "connection": { + "clickToView": "Klik om notitie te bekijken", + "helpful": "Nuttig", + "isHelpful": "Is deze verbinding nuttig?", + "memoryEchoDiscovery": "Memory Echo Ontdekking", + "notHelpful": "Niet nuttig", + "similarityInfo": "Deze notities zijn verbonden door {similarity}% overeenkomst" + }, + "dataManagement": { + "cleanup": { + "button": "Cleanup", + "description": "Remove labels and connections that reference deleted notes.", + "failed": "Error during cleanup", + "title": "Cleanup Orphaned Data" + }, + "cleanupComplete": "Opruimen voltooid", + "cleanupError": "Fout bij opruimen", + "dangerZone": "Gevaarlijke zone", + "dangerZoneDescription": "Deze acties zijn onomkeerbaar", + "delete": { + "button": "Delete All Notes", + "confirm": "Are you sure? This will permanently delete all your notes.", + "description": "Permanently delete all your notes. This action cannot be undone.", + "failed": "Failed to delete notes", + "success": "All notes deleted", + "title": "Delete All Notes" + }, + "deleting": "Verwijderen...", + "export": { + "button": "Export Notes", + "description": "Download all your notes as a JSON file. This includes all content, labels, and metadata.", + "failed": "Failed to export notes", + "success": "Notes exported successfully", + "title": "Export All Notes" + }, + "exporting": "Exporteren...", + "import": { + "button": "Import Notes", + "description": "Upload a JSON file to import notes. This will add to your existing notes, not replace them.", + "failed": "Failed to import notes", + "success": "Imported {count} notes", + "title": "Import Notes" + }, + "importing": "Importeren...", + "indexing": { + "button": "Rebuild Index", + "description": "Regenerate embeddings for all notes to improve semantic search.", + "failed": "Error during indexing", + "success": "Indexing complete: {count} notes processed", + "title": "Rebuild Search Index" + }, + "indexingComplete": "Indexering voltooid", + "indexingError": "Fout bij indexering", + "title": "Data Management", + "toolsDescription": "Tools to maintain your database health" + }, + "demoMode": { + "activated": "Demomodus geactiveerd! Memory Echo werkt nu direct.", + "createNotesTip": "Maak 2+ vergelijkbare notities en zie Memory Echo in actie!", + "deactivated": "Demomodus uitgeschakeld. Normale parameters hersteld.", + "delayBetweenNotes": "0-dagen vertraging tussen notities (normaal 7 dagen)", + "description": "Versnelt Memory Echo voor testen. Verbindingen verschijnen direct.", + "parametersActive": "Demoparameters actief:", + "similarityThreshold": "50% overeenkomst drempel (normaal 75%)", + "title": "Demomodus", + "toggleFailed": "Schakelen van demomodus mislukt", + "unlimitedInsights": "Onbeperkte inzichten (geen frequentielimieten)" + }, + "diagnostics": { + "apiStatus": "API-status", + "checking": "Checking...", + "configuredProvider": "Geconfigureerde provider", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "Testdetails:", + "tip1": "Zorg ervoor dat Ollama draait (ollama serve)", + "tip2": "Controleer dat het model is geïnstalleerd (ollama pull llama3)", + "tip3": "Verifieer uw API-sleutel voor OpenAI", + "tip4": "Controleer netwerkverbinding", + "title": "Diagnostiek", + "troubleshootingTitle": "Tips voor probleemoplossing:" + }, + "favorites": { + "noFavorites": "Geen favorieten", + "pinToFavorite": "Toevoegen aan favorieten", + "title": "Favorieten", + "toggleSection": "Sectie in-/uitschakelen" + }, + "footer": { + "openSource": "Open Source Kloon", + "privacy": "Privacy", + "terms": "Voorwaarden" + }, + "general": { + "add": "Toevoegen", + "apply": "Toepassen", + "back": "Terug", + "cancel": "Annuleren", + "clean": "Clean", + "clear": "Wissen", + "close": "Sluiten", + "confirm": "Bevestigen", + "edit": "Bewerken", + "error": "Er is een fout opgetreden", + "indexAll": "Index All", + "loading": "Laden...", + "next": "Volgende", + "operationFailed": "Operatie mislukt", + "operationSuccess": "Operatie geslaagd", + "preview": "Voorbeeld", + "previous": "Vorige", + "reset": "Resetten", + "save": "Opslaan", + "select": "Selecteren", + "submit": "Indienen", + "testConnection": "Test Connection", + "tryAgain": "Probeer het opnieuw" + }, + "generalSettings": { + "description": "Algemene applicatie-instellingen", + "title": "Algemene instellingen" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} labels", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "Geen labels", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "Klik om te bekijken", + "comparison": { + "clickToView": "Click to view note", + "helpful": "Helpful", + "helpfulQuestion": "Is this comparison helpful?", + "highSimilarityInsight": "These notes deal with the same topic with a high degree of similarity. They could be merged or consolidated.", + "notHelpful": "Not Helpful", + "similarityInfo": "These notes are connected by {similarity}% similarity", + "title": "💡 Note Comparison", + "untitled": "Untitled" + }, + "connection": "connection", + "connections": "Connections", + "connectionsBadge": "{count} connection{plural}", + "dailyInsight": "Daily insight from your notes", + "description": "Proactive connections between your notes", + "dismiss": "Dismiss for now", + "editorSection": { + "close": "Sluiten", + "compare": "Compare", + "compareAll": "Compare all", + "loading": "Loading...", + "merge": "Merge", + "mergeAll": "Merge all", + "title": "⚡ Connected Notes ({count})", + "view": "View" + }, + "fused": "Fused", + "fusion": { + "archiveOriginals": "Archive original notes", + "cancel": "Cancel", + "confirmFusion": "Confirm fusion", + "createBacklinks": "Create backlink to original notes", + "edit": "Edit", + "error": "Failed to merge notes", + "finishEditing": "Finish editing", + "generateError": "Failed to generate fusion", + "generateFusion": "Generate the fusion", + "generating": "Generating...", + "keepAllTags": "Keep all tags", + "mergeNotes": "Merge {count} note(s)", + "modify": "Modify", + "noContentReturned": "No fusion content returned from API", + "notesToMerge": "📝 Notes to merge", + "optionalPrompt": "💬 Fusion prompt (optional)", + "optionsTitle": "Fusion options", + "previewTitle": "📝 Preview of merged note", + "promptPlaceholder": "Optional instructions for AI (e.g., 'Keep the formal style of note 1')...", + "success": "Notes merged successfully!", + "title": "🔗 Intelligent Fusion", + "unknownDate": "Unknown date", + "useLatestTitle": "Use latest note as title" + }, + "helpful": "Helpful", + "insightReady": "Your insight is ready!", + "notHelpful": "Not Helpful", + "overlay": { + "error": "Fout", + "loading": "Loading...", + "noConnections": "No connections found", + "searchPlaceholder": "Search connections...", + "sortBy": "Sort by:", + "sortOldest": "Oldest", + "sortRecent": "Recent", + "sortSimilarity": "Similarity", + "title": "Connected Notes", + "viewAll": "View all side by side" + }, + "thanksFeedback": "Thanks for your feedback!", + "thanksFeedbackImproving": "Thanks! We'll use this to improve.", + "title": "I noticed something...", + "viewConnection": "View Connection" + }, + "nav": { + "accountSettings": "Accountinstellingen", + "adminDashboard": "Beheerdashboard", + "aiSettings": "AI-instellingen", + "archive": "Archief", + "buyMeACoffee": "Trakteer me op een koffie", + "configureAI": "Configureer uw AI-aangedreven functies, provider en voorkeuren", + "diagnostics": "Diagnostiek", + "donateOnKofi": "Doneren op Ko-fi", + "donationDescription": "Doneer eenmalig of word maandelijkse supporter.", + "donationNote": "Geen platformkosten • Directe uitbetalingen • Veilig", + "favorites": "Favorieten", + "generalNotes": "Algemene notities", + "home": "Home", + "login": "Inloggen", + "logout": "Uitloggen", + "manageAISettings": "AI-instellingen beheren", + "myLibrary": "Mijn bibliotheek", + "notebooks": "Notitieboeken", + "notes": "Notities", + "proPlan": "Pro Plan", + "profile": "Profiel", + "quickAccess": "Snelle toegang", + "recent": "Recent", + "reminders": "Herinneringen", + "settings": "Instellingen", + "sponsorDescription": "Word maandelijkse sponsor en krijg erkenning.", + "sponsorOnGithub": "Sponsoren op GitHub", + "support": "Memento ondersteunen ☕", + "supportDescription": "Memento is 100% gratis en open-source. Uw ondersteuning helpt dit zo te houden.", + "supportDevelopment": "Memento-ontwikkeling ondersteunen ☕", + "trash": "Prullenbak", + "userManagement": "Gebruikersbeheer", + "workspace": "Werkruimte" + }, + "notebook": { + "cancel": "Annuleren", + "create": "Notitieboek maken", + "createDescription": "Start een nieuwe verzameling om uw notities, ideeën en projecten efficiënt te organiseren.", + "createNew": "Nieuw notitieboek maken", + "creating": "Maken...", + "delete": "Notitieboek verwijderen", + "deleteConfirm": "Verwijderen", + "deleteWarning": "Weet u zeker dat u dit notitieboek wilt verwijderen? Notities worden verplaatst naar Algemene notities.", + "edit": "Notitieboek bewerken", + "editDescription": "Wijzig de naam, het pictogram en de kleur van uw notitieboek.", + "generating": "Samenvatting genereren...", + "labels": "Labels:", + "name": "Naam van notitieboek", + "noLabels": "No labels", + "selectColor": "Kleur", + "selectIcon": "Icoon", + "summary": "Samenvatting van notitieboek", + "summaryDescription": "Genereer een AI-ondersteunde samenvatting van alle notities in dit notitieboek.", + "summaryError": "Fout bij genereren samenvatting" + }, + "notebookSuggestion": { + "description": "Deze notitie lijkt bij dit notitieboek te horen", + "dismiss": "Negeren", + "dismissIn": "Negeren (sluit over {timeLeft}s)", + "generalNotes": "Algemene notities", + "move": "Verplaatsen", + "moveToNotebook": "Naar notitieboek verplaatsen", + "title": "Verplaatsen naar {icon} {name}?" + }, + "notebooks": { + "allNotebooks": "Alle notitieboeken", + "create": "Notitieboek maken", + "createFirst": "Maak uw eerste notitieboek", + "noNotebooks": "Geen notitieboeken" + }, + "notes": { + "add": "Toevoegen", + "addCollaborators": "Medewerkers toevoegen", + "addImage": "Afbeelding toevoegen", + "addItem": "Item toevoegen", + "addLink": "Link toevoegen", + "addListItem": "+ Lijstitem", + "addNote": "Notitie toevoegen", + "adding": "Toevoegen...", + "aiAssistant": "AI-assistent", + "archive": "Archiveren", + "backgroundOptions": "Achtergrondopties", + "changeColor": "Kleur wijzigen", + "changeSize": "Grootte wijzigen", + "clarifyFailed": "Verduidelijken mislukt", + "close": "Sluiten", + "color": "Kleur", + "confirmDelete": "Weet u zeker dat u deze notitie wilt verwijderen?", + "confirmLeaveShare": "Weet u zeker dat u deze gedeelde notitie wilt verlaten?", + "contentOrMediaRequired": "Voer inhoud in of voeg een link/afbeelding toe", + "copy": "Kopiëren", + "copyFailed": "Notitie kopiëren mislukt", + "copySuccess": "Notitie succesvol gekopieerd!", + "createFirstNote": "Maak uw eerste notitie", + "date": "Datum", + "delete": "Verwijderen", + "dragToReorder": "Sleep om te herschikken", + "duplicate": "Dupliceren", + "edit": "Notitie bewerken", + "emptyState": "Geen notities hier", + "fileTooLarge": "Bestand te groot: {fileName}. Maximale grootte is {maxSize}.", + "improveFailed": "Verbeteren mislukt", + "inNotebook": "In notitieboek", + "invalidDateTime": "Ongeldige datum of tijd", + "invalidFileType": "Ongeldig bestandstype: {fileName}. Alleen JPEG, PNG, GIF en WebP zijn toegestaan.", + "itemOrMediaRequired": "Voeg ten minste één item of media toe", + "large": "Groot", + "leaveShare": "Verlaten", + "linkAddFailed": "Link toevoegen mislukt", + "linkAdded": "Link toegevoegd", + "linkMetadataFailed": "Kon linkmetadata niet ophalen", + "listItem": "Lijstitem", + "makeCopy": "Kopie maken", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown UIT", + "markdownOn": "Markdown AAN", + "markdownPlaceholder": "Maak een notitie... (Markdown ondersteund)", + "medium": "Middel", + "more": "Meer", + "moreOptions": "Meer opties", + "moveFailed": "Verplaatsen mislukt", + "newChecklist": "Nieuwe checklist", + "newNote": "Nieuwe notitie", + "noContent": "Geen inhoud", + "noNotes": "Geen notities", + "noNotesFound": "Geen notities gevonden", + "noteCreateFailed": "Notitie aanmaken mislukt", + "noteCreated": "Notitie succesvol aangemaakt", + "others": "Overig", + "pin": "Vastzetten", + "pinned": "Vastgezet", + "pinnedNotes": "Vastgezette notities", + "placeholder": "Maak een notitie...", + "preview": "Voorbeeld", + "readOnly": "Alleen-lezen", + "recent": "Recent", + "redo": "Opnieuw uitvoeren", + "redoShortcut": "Opnieuw (Ctrl+Y)", + "remindMe": "Herinner mij", + "reminderDateTimeRequired": "Voer datum en tijd in", + "reminderMustBeFuture": "Herinnering moet in de toekomst liggen", + "reminderPastError": "Herinnering moet in de toekomst liggen", + "reminderRemoved": "Herinnering verwijderd", + "reminderSet": "Herinnering ingesteld op {datetime}", + "remove": "Remove", + "saving": "Opslaan...", + "setReminder": "Herinnering instellen", + "setReminderButton": "Herinnering instellen", + "share": "Delen", + "shareWithCollaborators": "Delen met medewerkers", + "sharedBy": "Gedeeld door", + "sharedReadOnly": "Deze notitie is met u gedeeld in alleen-lezen modus", + "shortenFailed": "Inkorten mislukt", + "showCollaborators": "Medewerkers weergeven", + "size": "Grootte", + "small": "Klein", + "takeNote": "Maak een notitie...", + "takeNoteMarkdown": "Maak een notitie... (Markdown ondersteund)", + "time": "Tijd", + "title": "Notities", + "titlePlaceholder": "Titel", + "transformFailed": "Transformeren mislukt", + "unarchive": "Dearchiveren", + "undo": "Ongedaan maken", + "undoShortcut": "Ongedaan maken (Ctrl+Z)", + "unpin": "Losmaken", + "unpinned": "Losgemaakt", + "untitled": "Naamloos", + "uploadFailed": "Uploaden van {filename} mislukt", + "view": "Notitie bekijken" + }, + "pagination": { + "next": "→", + "pageInfo": "Pagina {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "Informeel", + "expand": "Uitbreiden", + "formal": "Formeel", + "improve": "Verbeteren", + "shorten": "Inkorten", + "title": "Tekstverbetering" + }, + "profile": { + "accountSettings": "Accountinstellingen", + "autoDetect": "Automatisch detecteren", + "changePassword": "Wachtwoord wijzigen", + "changePasswordDescription": "Werk uw wachtwoord bij. U heeft uw huidige wachtwoord nodig.", + "confirmPassword": "Wachtwoord bevestigen", + "currentPassword": "Huidige wachtwoord", + "description": "Werk uw persoonlijke informatie bij", + "displayName": "Weergavenaam", + "displaySettings": "Weergave-instellingen", + "displaySettingsDescription": "Pas de weergave en lettergrootte aan.", + "email": "E-mail", + "fontSize": "Lettergrootte", + "fontSizeDescription": "Pas de lettergrootte aan voor betere leesbaarheid. Dit is van toepassing op alle tekst in de interface.", + "fontSizeExtraLarge": "Extra groot", + "fontSizeLarge": "Groot", + "fontSizeMedium": "Middel", + "fontSizeSmall": "Klein", + "fontSizeUpdateFailed": "Lettergrootte bijwerken mislukt", + "fontSizeUpdateSuccess": "Lettergrootte succesvol bijgewerkt", + "languageDescription": "Deze taal wordt gebruikt voor AI-functies, inhoudsanalyse en interfacetekst.", + "languagePreferences": "Taalvoorkeuren", + "languagePreferencesDescription": "Kies uw voorkeurstaal voor AI-functies en interface.", + "languageUpdateFailed": "Taal bijwerken mislukt", + "languageUpdateSuccess": "Taal succesvol bijgewerkt", + "manageAISettings": "AI-instellingen beheren", + "newPassword": "Nieuw wachtwoord", + "passwordChangeFailed": "Wachtwoord wijzigen mislukt", + "passwordChangeSuccess": "Wachtwoord succesvol gewijzigd", + "passwordError": "Fout bij bijwerken wachtwoord", + "passwordUpdated": "Wachtwoord bijgewerkt", + "preferredLanguage": "Voorkeurstaal", + "profileError": "Fout bij bijwerken profiel", + "profileUpdated": "Profiel bijgewerkt", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "Lettergrootte selecteren", + "selectLanguage": "Selecteer een taal", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "Profiel", + "updateFailed": "Profiel bijwerken mislukt", + "updatePassword": "Wachtwoord bijwerken", + "updateSuccess": "Profiel bijgewerkt" + }, + "reminder": { + "cancel": "Annuleren", + "reminderDate": "Herinneringsdatum", + "reminderTime": "Herinneringstijd", + "removeReminder": "Herinnering verwijderen", + "save": "Herinnering instellen", + "setReminder": "Herinnering instellen", + "title": "Herinnering" + }, + "resetPassword": { + "confirmNewPassword": "Bevestig nieuw wachtwoord", + "description": "Voer hieronder uw nieuwe wachtwoord in.", + "invalidLinkDescription": "Deze wachtwoordresetlink is ongeldig of verlopen.", + "invalidLinkTitle": "Ongeldige link", + "loading": "Laden...", + "newPassword": "Nieuw wachtwoord", + "passwordMismatch": "Wachtwoorden komen niet overeen", + "requestNewLink": "Nieuwe link aanvragen", + "resetPassword": "Wachtwoord opnieuw instellen", + "resetting": "Opnieuw instellen...", + "success": "Wachtwoord succesvol opnieuw ingesteld. U kunt nu inloggen.", + "title": "Wachtwoord opnieuw instellen" + }, + "search": { + "exactMatch": "Exacte overeenkomst", + "noResults": "Geen resultaten gevonden", + "placeholder": "Zoeken", + "related": "Gerelateerd", + "resultsFound": "{count} notities gevonden", + "searchPlaceholder": "Doorzoek uw notities...", + "searching": "Zoeken...", + "semanticInProgress": "AI-zoeken bezig...", + "semanticTooltip": "AI semantisch zoeken" }, "semanticSearch": { "exactMatch": "Exacte overeenkomst", "related": "Gerelateerd", "searching": "Zoeken..." }, - "paragraphRefactor": { - "title": "Tekstverbetering", - "shorten": "Inkorten", - "expand": "Uitbreiden", - "improve": "Verbeteren", - "formal": "Formeel", - "casual": "Informeel" + "settings": { + "about": "About", + "account": "Account", + "appearance": "Appearance", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "Manage your settings and preferences", + "language": "Language", + "languageAuto": "Automatisch", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "Notifications", + "privacy": "Privacy", + "profile": "Profiel", + "searchNoResults": "Geen resultaten gevonden", + "security": "Security", + "selectLanguage": "Select language", + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "Error saving settings", + "settingsSaved": "Settings saved", + "theme": "Theme", + "themeDark": "Dark", + "themeLight": "Light", + "themeSystem": "System", + "title": "Settings", + "version": "Version" }, - "memoryEcho": { - "title": "Ik heb iets opgemerkt...", - "description": "Proactieve verbindingen tussen uw notities", - "dailyInsight": "Dagelijkse inzichten uit uw notities", - "insightReady": "Uw inzicht is klaar!", - "viewConnection": "Verbinding bekijken", - "helpful": "Nuttig", - "notHelpful": "Niet nuttig", - "dismiss": "Negeren voor nu", - "thanksFeedback": "Bedankt voor uw feedback!", - "thanksFeedbackImproving": "Bedankt! We zullen dit gebruiken om te verbeteren.", - "connections": "Verbindingen", - "connection": "verbinding", - "connectionsBadge": "{count} verbinding{plural}", - "fused": "Samengevoegd", - "overlay": { - "title": "Verbonden notities", - "searchPlaceholder": "Verbindingen zoeken...", - "sortBy": "Sorteren op:", - "sortSimilarity": "Overeenkomst", - "sortRecent": "Recent", - "sortOldest": "Oudst", - "viewAll": "Alles naast elkaar bekijken", - "loading": "Laden...", - "noConnections": "Geen verbindingen gevonden" - }, - "comparison": { - "title": "💡 Notitievergelijking", - "similarityInfo": "Deze notities zijn verbonden door {similarity}% overeenkomst", - "highSimilarityInsight": "Deze notities behandelen hetzelfde onderwerp met een hoge mate van overeenkomst. Ze kunnen worden samengevoegd of geconsolideerd.", - "untitled": "Naamloos", - "clickToView": "Klik om notitie te bekijken", - "helpfulQuestion": "Is deze vergelijking nuttig?", - "helpful": "Nuttig", - "notHelpful": "Niet nuttig" - }, - "editorSection": { - "title": "⚡ Verbonden notities ({count})", - "loading": "Laden...", - "view": "Bekijken", - "compare": "Vergelijken", - "merge": "Samenvoegen", - "compareAll": "Alles vergelijken", - "mergeAll": "Alles samenvoegen" - }, - "fusion": { - "title": "🔗 Intelligente fusie", - "mergeNotes": "{count} notitie(s) samenvoegen", - "notesToMerge": "📝 Samen te voegen notities", - "optionalPrompt": "💬 Fusie-prompt (optioneel)", - "promptPlaceholder": "Optionele instructies voor AI (bijv. 'De formele stijl van notitie 1 behouden')...", - "generateFusion": "Fusie genereren", - "generating": "Genereren...", - "previewTitle": "📝 Voorbeeld van samengevoegde notitie", - "edit": "Bewerken", - "modify": "Wijzigen", - "finishEditing": "Bewerken voltooien", - "optionsTitle": "Fusie-opties", - "archiveOriginals": "Originelen archiveren", - "keepAllTags": "Alle labels behouden", - "useLatestTitle": "Nieuwste notitie als titel gebruiken", - "createBacklinks": "Backlink naar originele notities maken", - "cancel": "Annuleren", - "confirmFusion": "Fusie bevestigen", - "success": "Notities succesvol samengevoegd!", - "error": "Notities samenvoegen mislukt" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" + }, + "support": { + "aiApiCosts": "AI API kosten:", + "buyMeACoffee": "Trakteer me op een koffie", + "contributeCode": "Draag code bij", + "description": "Memento is 100% gratis en open-source. Uw ondersteuning helpt dit zo te houden.", + "directImpact": "Directe impact", + "domainSSL": "Domein & SSL:", + "donateOnKofi": "Doneren op Ko-fi", + "donationDescription": "Doneer eenmalig of word maandelijkse supporter.", + "githubDescription": "Terugkerende steun • Publieke erkenning • Gericht op ontwikkelaars", + "hostingServers": "Hosting & servers:", + "howSupportHelps": "Hoe uw steun helpt", + "kofiDescription": "Geen platformkosten • Directe uitbetalingen • Veilig", + "otherWaysTitle": "Andere manieren om te steunen", + "reportBug": "Meld een bug", + "shareTwitter": "Delen op Twitter", + "sponsorDescription": "Word maandelijkse sponsor en krijg erkenning.", + "sponsorOnGithub": "Sponsoren op GitHub", + "sponsorPerks": "Sponsorvoordelen", + "starGithub": "Ster op GitHub", + "title": "Memento-ontwikkeling ondersteunen", + "totalExpenses": "Totale uitgaven:", + "transparency": "Transparantie", + "transparencyDescription": "Ik geloof in volledige transparantie. Hier is hoe donaties worden gebruikt:" + }, + "testPages": { + "titleSuggestions": { + "analyzing": "Analyseren...", + "contentLabel": "Inhoud (50+ woorden nodig):", + "error": "Fout:", + "idle": "Inactief", + "noSuggestions": "Nog geen suggesties. Typ 50+ woorden en wacht 2 seconden.", + "placeholder": "Typ hier minimaal 50 woorden...", + "status": "Status:", + "suggestions": "Suggesties ({count}):", + "title": "Test titelsuggesties", + "wordCount": "Aantal woorden:" } }, - "nav": { - "home": "Home", - "notes": "Notities", - "notebooks": "Notitieboeken", - "generalNotes": "Algemene notities", - "archive": "Archief", - "settings": "Instellingen", - "profile": "Profiel", - "aiSettings": "AI-instellingen", - "logout": "Uitloggen", - "login": "Inloggen", - "adminDashboard": "Beheerdashboard", - "diagnostics": "Diagnostiek", - "trash": "Prullenbak", - "support": "Memento ondersteunen ☕", - "reminders": "Herinneringen", - "userManagement": "Gebruikersbeheer", - "accountSettings": "Accountinstellingen", - "manageAISettings": "AI-instellingen beheren", - "configureAI": "Configureer uw AI-aangedreven functies, provider en voorkeuren", - "supportDevelopment": "Memento-ontwikkeling ondersteunen ☕", - "supportDescription": "Memento is 100% gratis en open-source. Uw ondersteuning helpt dit zo te houden.", - "buyMeACoffee": "Trakteer me op een koffie", - "donationDescription": "Doneer eenmalig of word maandelijkse supporter.", - "donateOnKofi": "Doneren op Ko-fi", - "donationNote": "Geen platformkosten • Directe uitbetalingen • Veilig", - "sponsorOnGithub": "Sponsoren op GitHub", - "sponsorDescription": "Word maandelijkse sponsor en krijg erkenning.", - "workspace": "Werkruimte", - "quickAccess": "Snelle toegang", - "myLibrary": "Mijn bibliotheek", - "favorites": "Favorieten", - "recent": "Recent", - "proPlan": "Pro Plan" + "time": { + "daysAgo": "{count} dagen geleden", + "hoursAgo": "{count} uur geleden", + "justNow": "Zojuist", + "minutesAgo": "{count} minuten geleden", + "today": "Vandaag", + "tomorrow": "Morgen", + "yesterday": "Gisteren" }, - "settings": { - "title": "Instellingen", - "description": "Beheer uw instellingen en voorkeuren", - "account": "Account", - "appearance": "Weergave", - "theme": "Thema", - "themeLight": "Licht", - "themeDark": "Donker", - "themeSystem": "Systeem", - "notifications": "Meldingen", - "language": "Taal", - "selectLanguage": "Taal selecteren", - "privacy": "Privacy", - "security": "Beveiliging", - "about": "Over", - "version": "Versie", - "settingsSaved": "Instellingen opgeslagen", - "settingsError": "Fout bij opslaan instellingen" - }, - "profile": { - "title": "Profiel", - "description": "Werk uw persoonlijke informatie bij", - "displayName": "Weergavenaam", - "email": "E-mail", - "changePassword": "Wachtwoord wijzigen", - "changePasswordDescription": "Werk uw wachtwoord bij. U heeft uw huidige wachtwoord nodig.", - "currentPassword": "Huidige wachtwoord", - "newPassword": "Nieuw wachtwoord", - "confirmPassword": "Wachtwoord bevestigen", - "updatePassword": "Wachtwoord bijwerken", - "passwordChangeSuccess": "Wachtwoord succesvol gewijzigd", - "passwordChangeFailed": "Wachtwoord wijzigen mislukt", - "passwordUpdated": "Wachtwoord bijgewerkt", - "passwordError": "Fout bij bijwerken wachtwoord", - "languagePreferences": "Taalvoorkeuren", - "languagePreferencesDescription": "Kies uw voorkeurstaal voor AI-functies en interface.", - "preferredLanguage": "Voorkeurstaal", - "selectLanguage": "Selecteer een taal", - "languageDescription": "Deze taal wordt gebruikt voor AI-functies, inhoudsanalyse en interfacetekst.", - "autoDetect": "Automatisch detecteren", - "updateSuccess": "Profiel bijgewerkt", - "updateFailed": "Profiel bijwerken mislukt", - "languageUpdateSuccess": "Taal succesvol bijgewerkt", - "languageUpdateFailed": "Taal bijwerken mislukt", - "profileUpdated": "Profiel bijgewerkt", - "profileError": "Fout bij bijwerken profiel", - "accountSettings": "Accountinstellingen", - "manageAISettings": "AI-instellingen beheren", - "displaySettings": "Weergave-instellingen", - "displaySettingsDescription": "Pas de weergave en lettergrootte aan.", - "fontSize": "Lettergrootte", - "selectFontSize": "Lettergrootte selecteren", - "fontSizeSmall": "Klein", - "fontSizeMedium": "Middel", - "fontSizeLarge": "Groot", - "fontSizeExtraLarge": "Extra groot", - "fontSizeDescription": "Pas de lettergrootte aan voor betere leesbaarheid. Dit is van toepassing op alle tekst in de interface.", - "fontSizeUpdateSuccess": "Lettergrootte succesvol bijgewerkt", - "fontSizeUpdateFailed": "Lettergrootte bijwerken mislukt" - }, - "aiSettings": { - "title": "AI-instellingen", - "description": "Configureer uw AI-aangedreven functies en voorkeuren", - "features": "AI-functies", - "provider": "AI-provider", - "providerAuto": "Auto (Aanbevolen)", - "providerOllama": "Ollama (Lokaal)", - "providerOpenAI": "OpenAI (Cloud)", - "frequency": "Frequentie", - "frequencyDaily": "Dagelijks", - "frequencyWeekly": "Wekelijks", - "saving": "Opslaan...", - "saved": "Instelling bijgewerkt", - "error": "Instelling bijwerken mislukt" - }, - "general": { - "loading": "Laden...", - "save": "Opslaan", - "cancel": "Annuleren", - "add": "Toevoegen", - "edit": "Bewerken", - "confirm": "Bevestigen", - "close": "Sluiten", - "back": "Terug", - "next": "Volgende", - "previous": "Vorige", - "submit": "Indienen", - "reset": "Resetten", - "apply": "Toepassen", - "clear": "Wissen", - "select": "Selecteren", - "tryAgain": "Probeer het opnieuw", - "error": "Er is een fout opgetreden", - "operationSuccess": "Operatie geslaagd", - "operationFailed": "Operatie mislukt" - }, - "colors": { - "default": "Standaard", - "red": "Rood", - "blue": "Blauw", - "green": "Groen", - "yellow": "Geel", - "purple": "Paars", - "pink": "Roze", - "orange": "Oranje", - "gray": "Grijs" - }, - "reminder": { - "title": "Herinnering", - "setReminder": "Herinnering instellen", - "removeReminder": "Herinnering verwijderen", - "reminderDate": "Herinneringsdatum", - "reminderTime": "Herinneringstijd", - "save": "Herinnering instellen", - "cancel": "Annuleren" - }, - "notebookSuggestion": { - "title": "Verplaatsen naar {icon} {name}?", - "description": "Deze notitie lijkt bij dit notitieboek te horen", - "move": "Verplaatsen", + "titleSuggestions": { + "available": "Titelsuggesties", "dismiss": "Negeren", - "dismissIn": "Negeren (sluit over {timeLeft}s)", - "moveToNotebook": "Naar notitieboek verplaatsen", - "generalNotes": "Algemene notities" + "generating": "Genereren...", + "selectTitle": "Selecteer een titel", + "title": "AI-suggesties" + }, + "toast": { + "feedbackFailed": "Indienen van feedback mislukt", + "notesFusionSuccess": "Notities succesvol samengevoegd!", + "openConnectionFailed": "Verbinding openen mislukt", + "openingConnection": "Verbinding openen...", + "operationFailed": "Operatie mislukt", + "operationSuccess": "Operatie geslaagd", + "saveFailed": "Opslaan van instelling mislukt", + "saved": "Instelling opgeslagen", + "thanksFeedback": "Bedankt voor uw feedback!", + "thanksFeedbackImproving": "Bedankt! We zullen dit gebruiken om te verbeteren." + }, + "trash": { + "deletePermanently": "Permanent verwijderen", + "empty": "De prullenbak is leeg", + "restore": "Herstellen", + "title": "Prullenbak" + }, + "ui": { + "close": "Sluiten", + "collapse": "Inklappen", + "expand": "Uitvouwen", + "open": "Openen" } } diff --git a/keep-notes/locales/pl.json b/keep-notes/locales/pl.json index d5b6d97..097244e 100644 --- a/keep-notes/locales/pl.json +++ b/keep-notes/locales/pl.json @@ -1,542 +1,1061 @@ { - "auth": { - "signIn": "Zaloguj się", - "signUp": "Zarejestruj się", - "email": "E-mail", - "password": "Hasło", - "name": "Imię", - "emailPlaceholder": "Wprowadź swój adres e-mail", - "passwordPlaceholder": "Wprowadź swoje hasło", - "namePlaceholder": "Wprowadź swoje imię", - "passwordMinChars": "Wprowadź hasło (min. 6 znaków)", - "resetPassword": "Zresetuj hasło", - "resetPasswordInstructions": "Wprowadź swój e-mail, aby zresetować hasło", - "forgotPassword": "Zapomniałeś hasła?", - "noAccount": "Nie masz konta?", - "hasAccount": "Masz już konto?", - "signInToAccount": "Zaloguj się na swoje konto", - "createAccount": "Utwórz swoje konto", - "rememberMe": "Zapamiętaj mnie", - "orContinueWith": "Kontynuuj za pomocą", - "checkYourEmail": "Sprawdź swoją skrzynkę odbiorczą", - "resetEmailSent": "Wysłaliśmy link do resetowania hasła na Twój adres e-mail, jeśli istnieje w naszym systemie.", - "returnToLogin": "Powrót do logowania", - "forgotPasswordTitle": "Zapomniane hasło", - "forgotPasswordDescription": "Wprowadź swój adres e-mail, a wyślemy Ci link do resetowania hasła.", - "sending": "Wysyłanie...", - "sendResetLink": "Wyślij link resetowania", - "backToLogin": "Powrót do logowania" + "about": { + "appDescription": "Potężna aplikacja do notatek z funkcjami AI", + "appName": "Keep Notes", + "buildDate": "Data kompilacji", + "description": "Informacje o aplikacji", + "features": { + "description": "Możliwości wspomagane przez AI", + "dragDrop": "Zarządzanie notatkami metodą przeciągnij i upuść", + "labelSystem": "System etykiet", + "memoryEcho": "Codzienne spostrzeżenia Memory Echo", + "multipleProviders": "Wielu dostawców AI (OpenAI, Ollama)", + "notebookOrganization": "Organizacja notatników", + "paragraphReformulation": "Reformulowanie akapitów", + "semanticSearch": "Wyszukiwanie semantyczne z embeddingami", + "title": "Funkcje", + "titleSuggestions": "Sugestie tytułów wspomagane przez AI" + }, + "platform": "Platforma", + "platformWeb": "Web", + "support": { + "description": "Uzyskaj pomoc i przekaż opinie", + "documentation": "Dokumentacja", + "feedback": "Opinie", + "reportIssues": "Zgłoś problemy", + "title": "Wsparcie" + }, + "technology": { + "ai": "AI", + "authentication": "Uwierzytelnianie", + "backend": "Backend", + "database": "Baza danych", + "description": "Zbudowane z nowoczesnych technologii", + "frontend": "Frontend", + "testing": "Testowanie", + "title": "Stos technologiczny", + "ui": "UI" + }, + "title": "O nas", + "version": "Wersja" }, - "notes": { - "title": "Notatki", - "newNote": "Nowa notatka", - "untitled": "Bez tytułu", - "placeholder": "Zrób notatkę...", - "markdownPlaceholder": "Zrób notatkę... (Markdown obsługiwany)", - "titlePlaceholder": "Tytuł", - "listItem": "Element listy", - "addListItem": "+ Element listy", - "newChecklist": "Nowa lista kontrolna", - "add": "Dodaj", - "adding": "Dodawanie...", - "close": "Zamknij", - "confirmDelete": "Czy na pewno chcesz usunąć tę notatkę?", - "confirmLeaveShare": "Czy na pewno chcesz opuścić tę udostępnioną notatkę?", - "sharedBy": "Udostępnione przez", - "leaveShare": "Opuść", - "delete": "Usuń", - "archive": "Archiwizuj", - "unarchive": "Przywróć z archiwum", - "pin": "Przypnij", - "unpin": "Odepnij", - "color": "Kolor", - "changeColor": "Zmień kolor", - "setReminder": "Ustaw przypomnienie", - "setReminderButton": "Ustaw przypomnienie", - "date": "Data", - "time": "Czas", - "reminderDateTimeRequired": "Proszę wprowadzić datę i czas", - "invalidDateTime": "Nieprawidłowa data lub czas", - "reminderMustBeFuture": "Przypomnienie musi być w przyszłości", - "reminderSet": "Przypomnienie ustawione na {datetime}", - "reminderPastError": "Przypomnienie musi być w przyszłości", - "reminderRemoved": "Przypomnienie usunięte", - "addImage": "Dodaj obraz", - "addLink": "Dodaj link", - "linkAdded": "Link dodany", - "linkMetadataFailed": "Nie udało się pobrać metadanych linku", - "linkAddFailed": "Nie udało się dodać linku", - "invalidFileType": "Nieprawidłowy typ pliku: {fileName}. Dozwolone są tylko JPEG, PNG, GIF i WebP.", - "fileTooLarge": "Plik jest za duży: {fileName}. Maksymalny rozmiar to {maxSize}.", - "uploadFailed": "Nie udało się przesłać {filename}", - "contentOrMediaRequired": "Proszę wprowadzić treść lub dodać link/obraz", - "itemOrMediaRequired": "Proszę dodać przynajmniej jeden element lub media", - "noteCreated": "Notatka utworzona pomyślnie", - "noteCreateFailed": "Nie udało się utworzyć notatki", - "aiAssistant": "Asystent AI", - "changeSize": "Zmień rozmiar", - "backgroundOptions": "Opcje tła", - "moreOptions": "Więcej opcji", - "remindMe": "Przypomnij mi", - "markdownMode": "Markdown", - "addCollaborators": "Dodaj współpracowników", - "duplicate": "Duplikuj", - "share": "Udostępnij", - "showCollaborators": "Pokaż współpracowników", - "pinned": "Przypięte", - "others": "Inne", - "undo": "Cofnij", - "redo": "Ponów", - "noNotes": "Brak notatek", - "noNotesFound": "Nie znaleziono notatek", - "createFirstNote": "Utwórz swoją pierwszą notatkę", - "size": "Rozmiar", - "small": "Mały", - "medium": "Średni", - "large": "Duży", - "shareWithCollaborators": "Udostępnij współpracownikom", - "view": "Wyświetl notatkę", - "edit": "Edytuj notatkę", - "readOnly": "Tylko do odczytu", - "preview": "Podgląd", - "noContent": "Brak treści", - "takeNote": "Zrób notatkę...", - "takeNoteMarkdown": "Zrób notatkę... (Markdown obsługiwany)", - "addItem": "Dodaj element", - "sharedReadOnly": "Ta notatka jest udostępniona Ci w trybie tylko do odczytu", - "makeCopy": "Utwórz kopię", - "saving": "Zapisywanie...", - "copySuccess": "Notatka skopiowana pomyślnie!", - "copyFailed": "Nie udało się skopiować notatki", - "copy": "Kopiuj", - "markdownOn": "Markdown WŁĄCZONY", - "markdownOff": "Markdown WYŁĄCZONY" - }, - "labels": { - "title": "Etykiety", - "filter": "Filtruj według etykiety", - "manage": "Zarządzaj etykietami", - "manageTooltip": "Zarządzaj etykietami", - "changeColor": "Zmień kolor", - "changeColorTooltip": "Zmień kolor", - "delete": "Usuń", - "deleteTooltip": "Usuń etykietę", - "confirmDelete": "Czy na pewno chcesz usunąć tę etykietę?", - "newLabelPlaceholder": "Utwórz nową etykietę", - "namePlaceholder": "Wprowadź nazwę etykiety", - "addLabel": "Dodaj etykietę", - "createLabel": "Utwórz etykietę", - "labelName": "Nazwa etykiety", - "labelColor": "Kolor etykiety", - "manageLabels": "Zarządzaj etykietami", - "manageLabelsDescription": "Dodaj lub usuń etykiety dla tej notatki. Kliknij etykietę, aby zmienić jej kolor.", - "selectedLabels": "Wybrane etykiety", - "allLabels": "Wszystkie etykiety", - "clearAll": "Wyczyść wszystko", - "filterByLabel": "Filtruj według etykiety", - "tagAdded": "Tag \"{tag}\" dodany", - "showLess": "Pokaż mniej", - "showMore": "Pokaż więcej", - "editLabels": "Edytuj etykiety", - "editLabelsDescription": "Utwórz, edytuj kolory lub usuń etykiety.", - "noLabelsFound": "Nie znaleziono etykiet.", - "loading": "Ładowanie...", - "notebookRequired": "⚠️ Etykiety są dostępne tylko w notatnikach. Najpierw przenieś tę notatkę do notatnika." - }, - "pagination": { - "previous": "←", - "pageInfo": "Strona {currentPage} / {totalPages}", - "next": "→" - }, - "search": { - "placeholder": "Szukaj", - "searchPlaceholder": "Przeszukaj swoje notatki...", - "semanticInProgress": "Wyszukiwanie semantyczne AI...", - "semanticTooltip": "Wyszukiwanie semantyczne AI", - "searching": "Wyszukiwanie...", - "noResults": "Nie znaleziono wyników", - "resultsFound": "Znaleziono {count} notatek", - "exactMatch": "Dokładne dopasowanie", - "related": "Powiązane" - }, - "collaboration": { - "emailPlaceholder": "Wprowadź adres e-mail", - "addCollaborator": "Dodaj współpracownika", - "removeCollaborator": "Usuń współpracownika", - "owner": "Właściciel", - "canEdit": "Może edytować", - "canView": "Może przeglądać", - "shareNote": "Udostępnij notatkę", - "shareWithCollaborators": "Udostępnij współpracownikom", - "addCollaboratorDescription": "Dodaj osoby do współpracy nad tą notatką za pomocą adresu e-mail.", - "viewerDescription": "Masz dostęp do tej notatki. Tylko właściciel może zarządzać współpracownikami.", - "emailAddress": "Adres e-mail", - "enterEmailAddress": "Wprowadź adres e-mail", - "invite": "Zaproś", - "peopleWithAccess": "Osoby z dostępem", - "noCollaborators": "Brak współpracowników. Dodaj kogoś powyżej!", - "noCollaboratorsViewer": "Brak współpracowników.", - "pendingInvite": "Oczekujące zaproszenie", - "pending": "Oczekujące", - "remove": "Usuń", - "unnamedUser": "Nienazwany użytkownik", - "done": "Gotowe", - "willBeAdded": "{email} zostanie dodany jako współpracownik po utworzeniu notatki", - "alreadyInList": "Ten e-mail jest już na liście", - "nowHasAccess": "{name} ma teraz dostęp do tej notatki", - "accessRevoked": "Dostęp został cofnięty", - "errorLoading": "Błąd ładowania współpracowników", - "failedToAdd": "Nie udało się dodać współpracownika", - "failedToRemove": "Nie udało się usunąć współpracownika" + "admin": { + "ai": { + "apiKey": "API Key", + "baseUrl": "Base URL", + "commonEmbeddingModels": "Common embedding models for OpenAI-compatible APIs", + "commonModelsDescription": "Common models for OpenAI-compatible APIs", + "description": "Configure AI providers for auto-tagging and semantic search. Use different providers for optimal performance.", + "embeddingsDescription": "AI provider for semantic search embeddings. Recommended: OpenAI (best quality).", + "embeddingsProvider": "Embeddings Provider", + "model": "Model", + "modelRecommendations": "gpt-4o-mini = Best value • gpt-4o = Best quality", + "openAIKeyDescription": "Your OpenAI API key from platform.openai.com", + "openTestPanel": "Open AI Test Panel", + "provider": "Provider", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING is required", + "providerTagsRequired": "AI_PROVIDER_TAGS is required", + "saveSettings": "Save AI Settings", + "saving": "Saving...", + "selectEmbeddingModel": "Select an embedding model installed on your system", + "selectOllamaModel": "Select an Ollama model installed on your system", + "tagsGenerationDescription": "AI provider for automatic tag suggestions. Recommended: Ollama (free, local).", + "tagsGenerationProvider": "Tags Generation Provider", + "title": "AI Configuration", + "updateFailed": "Failed to update AI settings", + "updateSuccess": "AI Settings updated successfully" + }, + "aiTest": { + "description": "Test your AI providers for tag generation and semantic search embeddings", + "embeddingDimensions": "Embedding Dimensions:", + "embeddingsTestDescription": "Test the AI provider responsible for semantic search embeddings", + "embeddingsTestTitle": "Embeddings Test", + "error": "Error:", + "first5Values": "First 5 values:", + "generatedTags": "Generated Tags:", + "howItWorksTitle": "How Testing Works", + "model": "Model:", + "provider": "Provider:", + "responseTime": "Response time: {time}ms", + "runTest": "Run Test", + "tagsTestDescription": "Test the AI provider responsible for automatic tag suggestions", + "tagsTestTitle": "Tags Generation Test", + "testError": "Test Error: {error}", + "testFailed": "Test Failed", + "testPassed": "Test Passed", + "testing": "Testing...", + "tipDescription": "Use the AI Test Panel to diagnose configuration issues before testing.", + "tipTitle": "Tip:", + "title": "AI Provider Testing", + "vectorDimensions": "vector dimensions" + }, + "aiTesting": "AI Testing", + "security": { + "allowPublicRegistration": "Allow Public Registration", + "allowPublicRegistrationDescription": "If disabled, new users can only be added by an Administrator via the User Management page.", + "description": "Manage access control and registration policies.", + "title": "Security Settings", + "updateFailed": "Failed to update security settings", + "updateSuccess": "Security Settings updated" + }, + "settings": "Admin Settings", + "smtp": { + "description": "Configure email server for password resets.", + "forceSSL": "Force SSL/TLS (usually for port 465)", + "fromEmail": "From Email", + "host": "Host", + "ignoreCertErrors": "Ignore Certificate Errors (Self-hosted/Dev only)", + "password": "Password", + "port": "Port", + "saveSettings": "Save SMTP Settings", + "sending": "Sending...", + "testEmail": "Test Email", + "testFailed": "Failed: {error}", + "testSuccess": "Test email sent successfully!", + "title": "SMTP Configuration", + "updateFailed": "Failed to update SMTP settings", + "updateSuccess": "SMTP Settings updated", + "username": "Username" + }, + "title": "Admin Dashboard", + "userManagement": "User Management", + "users": { + "addUser": "Add User", + "confirmDelete": "Czy na pewno chcesz usunąć tego użytkownika?", + "createFailed": "Failed to create user", + "createSuccess": "User created successfully", + "createUser": "Create User", + "createUserDescription": "Add a new user to the system.", + "deleteFailed": "Failed to delete", + "deleteSuccess": "User deleted", + "demote": "Zdegraduj", + "email": "Email", + "name": "Name", + "password": "Password", + "promote": "Awansuj", + "role": "Role", + "roleUpdateFailed": "Failed to update role", + "roleUpdateSuccess": "User role updated to {role}", + "roles": { + "admin": "Administrator", + "user": "Użytkownik" + }, + "table": { + "actions": "Actions", + "createdAt": "Created At", + "email": "Email", + "name": "Name", + "role": "Role" + } + } }, "ai": { - "analyzing": "AI analizuje...", - "clickToAddTag": "Kliknij, aby dodać ten tag", - "ignoreSuggestion": "Zignoruj tę sugestię", - "generatingTitles": "Generowanie tytułów...", - "generateTitlesTooltip": "Generuj tytuły za pomocą AI", + "analyzing": "AI analyzing...", + "assistant": "AI Assistant", + "autoLabels": { + "analyzing": "Analizowanie Twoich notatek pod kątem sugestii etykiet...", + "create": "Utwórz", + "createNewLabel": "Utwórz nową etykietę", + "created": "{count} labels created successfully", + "creating": "Tworzenie etykiet...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(nowa)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "Sugestie Etykiet", + "typeContent": "Type content to get label suggestions...", + "typeForSuggestions": "Wpisz, aby uzyskać sugestie" + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Zastosowanie nie powiodło się", + "applying": "Applying...", + "description": "AI przeanalizuje Twoje notatki i zasugeruje zorganizowanie ich w notatnikach.", + "error": "Błąd organizacji", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "Nie wybrano notatek", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Wybierz wszystko w", + "selectNote": "Wybierz notatkę", + "success": "Organizacja zakończona", + "title": "Organizacja wsadowa" + }, + "clarify": "Clarify", + "clickToAddTag": "Click to add this tag", + "generateTitles": "Generate titles", + "generateTitlesTooltip": "Generate titles with AI", + "generating": "Generating...", + "generatingTitles": "Generating titles...", + "ignoreSuggestion": "Ignore this suggestion", + "improveStyle": "Improve style", + "languageDetected": "Language detected", + "notebookSummary": { + "regenerate": "Wygeneruj Ponownie Podsumowanie", + "regenerating": "Ponowne generowanie podsumowania..." + }, + "original": "Original", "poweredByAI": "Powered by AI", - "languageDetected": "Wykryto język", - "processing": "Przetwarzanie...", - "tagAdded": "Tag \"{tag}\" dodany", - "titleGenerating": "Generowanie...", - "titleGenerateWithAI": "Generuj tytuły za pomocą AI", - "titleGenerationMinWords": "Treść musi zawierać co najmniej 10 słów, aby wygenerować tytuły (obecnie: {count} słów)", - "titleGenerationError": "Błąd podczas generowania tytułów", - "titlesGenerated": "💡 Wygenerowano {count} tytułów!", - "titleGenerationFailed": "Nie udało się wygenerować tytułów", - "titleApplied": "Tytuł zastosowany!", - "reformulationNoText": "Proszę zaznaczyć tekst lub dodać treść", - "reformulationSelectionTooShort": "Zaznaczenie za krótkie, użyto pełnej treści", - "reformulationMinWords": "Tekst musi zawierać co najmniej 10 słów (obecnie: {count} słów)", - "reformulationMaxWords": "Tekst może zawierać maksymalnie 500 słów", - "reformulationError": "Błąd podczas reformulowania", - "reformulationFailed": "Nie udało się zreformulować tekstu", - "reformulationApplied": "Zreformulowany tekst zastosowany!", - "transformMarkdown": "Przekształć na Markdown", - "transforming": "Przekształcanie...", - "transformSuccess": "Tekst pomyślnie przekształcony na Markdown!", - "transformError": "Błąd podczas przekształcania", - "assistant": "Asystent AI", - "generating": "Generowanie...", - "generateTitles": "Generuj tytuły", - "reformulateText": "Zreformuluj tekst", - "reformulating": "Reformulowanie...", - "clarify": "Uściślij", - "shorten": "Skróć", - "improveStyle": "Popraw styl", - "reformulationComparison": "Porównanie reformulacji", - "original": "Oryginał", - "reformulated": "Zreformulowane" + "processing": "Processing...", + "reformulateText": "Reformulate text", + "reformulated": "Reformulated", + "reformulating": "Reformulating...", + "reformulationApplied": "Reformulated text applied!", + "reformulationComparison": "Reformulation Comparison", + "reformulationError": "Error during reformulation", + "reformulationFailed": "Failed to reformulate text", + "reformulationMaxWords": "Text must have maximum 500 words", + "reformulationMinWords": "Text must have at least 10 words (current: {count} words)", + "reformulationNoText": "Please select text or add content", + "reformulationSelectionTooShort": "Selection too short, using full content", + "shorten": "Shorten", + "tagAdded": "Tag \"{tag}\" added", + "titleApplied": "Title applied!", + "titleGenerateWithAI": "Generate titles with AI", + "titleGenerating": "Generating...", + "titleGenerationError": "Error generating titles", + "titleGenerationFailed": "Failed to generate titles", + "titleGenerationMinWords": "Content must have at least 10 words to generate titles (current: {count} words)", + "titlesGenerated": "💡 {count} titles generated!", + "transformError": "Error during transformation", + "transformMarkdown": "Transform to Markdown", + "transformSuccess": "Text transformed to Markdown successfully!", + "transforming": "Transforming..." }, - "batchOrganization": { - "title": "Organizacja wsadowa", - "error": "Błąd tworzenia planu organizacji", - "noNotesSelected": "Nie wybrano notatek", - "selectNotes": "Wybierz notatki do zorganizowania", - "start": "Rozpocznij organizację", - "organizing": "Organizowanie...", - "finished": "Organizacja zakończona!", - "results": "Wyniki", - "totalProcessed": "Przetworzono: {total}", - "categorized": "Zakategoryzowano: {count}", - "tagsAdded": "Dodano tagów: {count}", - "categories": "Kategorie", - "noTagsAdded": "Nie dodano tagów", - "suggestedTags": "Sugerowane tagi", - "suggestedCategories": "Sugerowane kategorie", - "addTags": "Dodaj tagi", - "addCategories": "Dodaj kategorie", - "reviewChanges": "Przejrzyj zmiany", - "applyChanges": "Zastosuj zmiany", - "skip": "Pomiń", - "done": "Gotowe", - "close": "Zamknij", - "backToNote": "Powrót do notatki" + "aiSettings": { + "description": "Skonfiguruj swoje funkcje AI i preferencje", + "error": "Nie udało się zaktualizować ustawienia", + "features": "Funkcje AI", + "frequency": "Częstotliwość", + "frequencyDaily": "Codziennie", + "frequencyWeekly": "Co tydzień", + "provider": "Dostawca AI", + "providerAuto": "Auto (Zalecane)", + "providerOllama": "Ollama (Lokalny)", + "providerOpenAI": "OpenAI (Chmura)", + "saved": "Ustawienie zaktualizowane", + "saving": "Zapisywanie...", + "title": "Ustawienia AI", + "titleSuggestionsDesc": "Sugeruj tytuły dla notatek bez tytułu po 50+ słowach", + "paragraphRefactorDesc": "Opcje poprawy tekstu wspomagane przez AI", + "frequencyDesc": "Jak często analizować połączenia notatek", + "providerDesc": "Wybierz preferowanego dostawcę AI", + "providerAutoDesc": "Ollama gdy dostępny, OpenAI jako alternatywa", + "providerOllamaDesc": "100% prywatny, działa lokalnie na twoim urządzeniu", + "providerOpenAIDesc": "Najdokładniejszy, wymaga klucza API" + }, + "appearance": { + "description": "Dostosuj wygląd aplikacji", + "title": "Wygląd" + }, + "auth": { + "backToLogin": "Powrót do logowania", + "checkYourEmail": "Sprawdź swoją skrzynkę odbiorczą", + "createAccount": "Utwórz swoje konto", + "email": "E-mail", + "emailPlaceholder": "Wprowadź swój adres e-mail", + "forgotPassword": "Zapomniałeś hasła?", + "forgotPasswordDescription": "Wprowadź swój adres e-mail, a wyślemy Ci link do resetowania hasła.", + "forgotPasswordTitle": "Zapomniane hasło", + "hasAccount": "Masz już konto?", + "name": "Imię", + "namePlaceholder": "Wprowadź swoje imię", + "noAccount": "Nie masz konta?", + "orContinueWith": "Kontynuuj za pomocą", + "password": "Hasło", + "passwordMinChars": "Wprowadź hasło (min. 6 znaków)", + "passwordPlaceholder": "Wprowadź swoje hasło", + "rememberMe": "Zapamiętaj mnie", + "resetEmailSent": "Wysłaliśmy link do resetowania hasła na Twój adres e-mail, jeśli istnieje w naszym systemie.", + "resetPassword": "Zresetuj hasło", + "resetPasswordInstructions": "Wprowadź swój e-mail, aby zresetować hasło", + "returnToLogin": "Powrót do logowania", + "sendResetLink": "Wyślij link resetowania", + "sending": "Wysyłanie...", + "signIn": "Zaloguj się", + "signInToAccount": "Zaloguj się na swoje konto", + "signOut": "Sign out", + "signUp": "Zarejestruj się" }, "autoLabels": { - "title": "Autoetykiety", - "toggle": "Włącz autoetykiety", - "enabled": "Włączone", - "disabled": "Wyłączone", - "settings": "Ustawienia", + "aiPowered": "Wspierane przez AI", + "analyzing": "Analyzing your notes...", + "applySuggested": "Zastosuj sugerowane", + "autoLabelBatchDescription": "Automatyczne dodanie etykiet dla wybranych notatek", "autoLabelDescription": "Automatyczne dodawanie etykiet na podstawie analizy AI", "autoLabelNoteDescription": "Automatyczne dodanie etykiet dla tej notatki", - "autoLabelBatchDescription": "Automatyczne dodanie etykiet dla wybranych notatek", - "smartTagging": "Inteligentne tagowanie", + "confidence": "Zaufanie: {score}%", "contentAnalysis": "Analiza treści", - "keywordExtraction": "Ekstrakcja słów kluczowych", - "aiPowered": "Wspierane przez AI", - "suggestedLabels": "Sugerowane etykiety", - "applySuggested": "Zastosuj sugerowane", + "createNewLabel": "Create this new label and add it", + "created": "{count} labels created successfully", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "disabled": "Wyłączone", "dismissAll": "Odrzuć wszystkie", + "enabled": "Włączone", + "error": "Błąd autoetykiet", "generateMore": "Wygeneruj więcej", - "settingsDialogTitle": "Ustawienia autoetykiet", - "settingsDescription": "Skonfiguruj preferencje autoetykiet", - "minConfidence": "Minimalne zaufanie", - "minConfidenceDescription": "Minimalny wynik (0-100) dla sugestii AI", - "maxLabels": "Maksymalna liczba etykiet na notatkę", - "maxLabelsDescription": "Maksymalna liczba etykiet na notatkę", + "keywordExtraction": "Ekstrakcja słów kluczowych", "labelCategories": "Kategorie etykiet", "labelCategoriesDescription": "Wybierz kategorie dla automatycznego tagowania", - "saveSettings": "Zapisz ustawienia", - "settingsSaved": "Ustawienia zapisane", - "error": "Błąd autoetykiet", - "processing": "Przetwarzanie...", - "noLabelsGenerated": "Nie wygenerowano etykiet", "labelsApplied": "Etykiety zastosowane", - "confidence": "Zaufanie: {score}%", - "learnMore": "Dowiedz się więcej" + "learnMore": "Dowiedz się więcej", + "maxLabels": "Maksymalna liczba etykiet na notatkę", + "maxLabelsDescription": "Maksymalna liczba etykiet na notatkę", + "minConfidence": "Minimalne zaufanie", + "minConfidenceDescription": "Minimalny wynik (0-100) dla sugestii AI", + "new": "(new)", + "noLabelsGenerated": "Nie wygenerowano etykiet", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "processing": "Przetwarzanie...", + "saveSettings": "Zapisz ustawienia", + "settings": "Ustawienia", + "settingsDescription": "Skonfiguruj preferencje autoetykiet", + "settingsDialogTitle": "Ustawienia autoetykiet", + "settingsSaved": "Ustawienia zapisane", + "smartTagging": "Inteligentne tagowanie", + "suggestedLabels": "Sugerowane etykiety", + "title": "Autoetykiety", + "toggle": "Włącz autoetykiety", + "typeContent": "Type content to get label suggestions..." }, - "titleSuggestions": { - "available": "Sugestie tytułów", - "title": "Sugestie AI", + "batch": { + "organize": "Organizuj", + "organizeWithAI": "Organizuj z AI" + }, + "batchOrganization": { + "addCategories": "Dodaj kategorie", + "addTags": "Dodaj tagi", + "analyzing": "Analyzing your notes...", + "apply": "Apply ({count})", + "applyChanges": "Zastosuj zmiany", + "applying": "Applying...", + "backToNote": "Powrót do notatki", + "categories": "Kategorie", + "categorized": "Zakategoryzowano: {count}", + "close": "Zamknij", + "confidence": "confidence", + "description": "AI will analyze your notes and suggest organizing them into notebooks.", + "done": "Gotowe", + "error": "Błąd tworzenia planu organizacji", + "finished": "Organizacja zakończona!", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "Nie wybrano notatek", + "noSuggestions": "AI could not find a good way to organize these notes.", + "noTagsAdded": "Nie dodano tagów", + "notesToOrganize": "{count} notes to organize", + "organizing": "Organizowanie...", + "results": "Wyniki", + "reviewChanges": "Przejrzyj zmiany", + "selectNotes": "Wybierz notatki do zorganizowania", + "selected": "{count} selected", + "skip": "Pomiń", + "start": "Rozpocznij organizację", + "suggestedCategories": "Sugerowane kategorie", + "suggestedTags": "Sugerowane tagi", + "tagsAdded": "Dodano tagów: {count}", + "title": "Organizacja wsadowa", + "totalProcessed": "Przetworzono: {total}", + "unorganized": "{count} notes couldn't be categorized and will stay in General Notes." + }, + "collaboration": { + "accessRevoked": "Dostęp został cofnięty", + "addCollaborator": "Dodaj współpracownika", + "addCollaboratorDescription": "Dodaj osoby do współpracy nad tą notatką za pomocą adresu e-mail.", + "alreadyInList": "Ten e-mail jest już na liście", + "canEdit": "Może edytować", + "canView": "Może przeglądać", + "done": "Gotowe", + "emailAddress": "Adres e-mail", + "emailPlaceholder": "Wprowadź adres e-mail", + "enterEmailAddress": "Wprowadź adres e-mail", + "errorLoading": "Błąd ładowania współpracowników", + "failedToAdd": "Nie udało się dodać współpracownika", + "failedToRemove": "Nie udało się usunąć współpracownika", + "invite": "Zaproś", + "noCollaborators": "Brak współpracowników. Dodaj kogoś powyżej!", + "noCollaboratorsViewer": "Brak współpracowników.", + "nowHasAccess": "{name} ma teraz dostęp do tej notatki", + "owner": "Właściciel", + "pending": "Oczekujące", + "pendingInvite": "Oczekujące zaproszenie", + "peopleWithAccess": "Osoby z dostępem", + "remove": "Usuń", + "removeCollaborator": "Usuń współpracownika", + "shareNote": "Udostępnij notatkę", + "shareWithCollaborators": "Udostępnij współpracownikom", + "unnamedUser": "Nienazwany użytkownik", + "viewerDescription": "Masz dostęp do tej notatki. Tylko właściciel może zarządzać współpracownikami.", + "willBeAdded": "{email} zostanie dodany jako współpracownik po utworzeniu notatki" + }, + "colors": { + "blue": "Niebieski", + "default": "Domyślny", + "gray": "Szary", + "green": "Zielony", + "orange": "Pomarańczowy", + "pink": "Różowy", + "purple": "Fioletowy", + "red": "Czerwony", + "yellow": "Żółty" + }, + "common": { + "add": "Dodaj", + "cancel": "Anuluj", + "close": "Zamknij", + "confirm": "Potwierdź", + "delete": "Usuń", + "edit": "Edytuj", + "error": "Błąd", + "loading": "Ładowanie...", + "noResults": "Brak wyników", + "notAvailable": "Niedostępne", + "optional": "Opcjonalne", + "remove": "Usuń", + "required": "Wymagane", + "save": "Zapisz", + "search": "Szukaj", + "success": "Sukces", + "unknown": "Nieznany" + }, + "connection": { + "clickToView": "Kliknij, aby wyświetlić notatkę", + "helpful": "Pomocne", + "isHelpful": "Czy to połączenie jest pomocne?", + "memoryEchoDiscovery": "Odkrycie Memory Echo", + "notHelpful": "Niepomocne", + "similarityInfo": "Te notatki są połączone przez {similarity}% podobieństwa" + }, + "dataManagement": { + "cleanup": { + "button": "Cleanup", + "description": "Remove labels and connections that reference deleted notes.", + "failed": "Error during cleanup", + "title": "Cleanup Orphaned Data" + }, + "cleanupComplete": "Czyszczenie zakończone", + "cleanupError": "Błąd czyszczenia", + "dangerZone": "Strefa zagrożenia", + "dangerZoneDescription": "Te akcje są nieodwracalne", + "delete": { + "button": "Delete All Notes", + "confirm": "Are you sure? This will permanently delete all your notes.", + "description": "Permanently delete all your notes. This action cannot be undone.", + "failed": "Failed to delete notes", + "success": "All notes deleted", + "title": "Delete All Notes" + }, + "deleting": "Usuwanie...", + "export": { + "button": "Export Notes", + "description": "Download all your notes as a JSON file. This includes all content, labels, and metadata.", + "failed": "Failed to export notes", + "success": "Notes exported successfully", + "title": "Export All Notes" + }, + "exporting": "Eksportowanie...", + "import": { + "button": "Import Notes", + "description": "Upload a JSON file to import notes. This will add to your existing notes, not replace them.", + "failed": "Failed to import notes", + "success": "Imported {count} notes", + "title": "Import Notes" + }, + "importing": "Importowanie...", + "indexing": { + "button": "Rebuild Index", + "description": "Regenerate embeddings for all notes to improve semantic search.", + "failed": "Error during indexing", + "success": "Indexing complete: {count} notes processed", + "title": "Rebuild Search Index" + }, + "indexingComplete": "Indeksowanie zakończone", + "indexingError": "Błąd indeksowania", + "title": "Data Management", + "toolsDescription": "Tools to maintain your database health" + }, + "demoMode": { + "activated": "Tryb demonstracyjny aktywowany! Memory Echo będzie teraz działać natychmiastowo.", + "createNotesTip": "Utwórz 2+ podobne notatki i zobacz Memory Echo w akcji!", + "deactivated": "Tryb demonstracyjny wyłączony. Przywrócono normalne parametry.", + "delayBetweenNotes": "Opóźnienie 0 dni między notatkami (normalnie 7 dni)", + "description": "Przyspiesza Memory Echo do testowania. Połączenia pojawiają się natychmiast.", + "parametersActive": "Parametry demonstracyjne aktywne:", + "similarityThreshold": "Próg podobieństwa 50% (normalnie 75%)", + "title": "Tryb demonstracyjny", + "toggleFailed": "Przełączenie trybu demonstracyjnego nie powiodło się", + "unlimitedInsights": "Nieograniczone spostrzeżenia (bez limitów częstotliwości)" + }, + "diagnostics": { + "apiStatus": "Status API", + "checking": "Checking...", + "configuredProvider": "Skonfigurowany dostawca", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "Szczegóły testu:", + "tip1": "Upewnij się, że Ollama działa (ollama serve)", + "tip2": "Sprawdź, czy model jest zainstalowany (ollama pull llama3)", + "tip3": "Zweryfikuj swój klucz API dla OpenAI", + "tip4": "Sprawdź połączenie sieciowe", + "title": "Diagnostyka", + "troubleshootingTitle": "Wskazówki rozwiązywania problemów:" + }, + "favorites": { + "noFavorites": "Brak ulubionych", + "pinToFavorite": "Dodaj do ulubionych", + "title": "Ulubione", + "toggleSection": "Przełącz sekcję" + }, + "footer": { + "openSource": "Klon Open Source", + "privacy": "Prywatność", + "terms": "Warunki" + }, + "fusion": { + "archiveOriginals": "Archiwizuj oryginały", + "cancel": "Anuluj", + "confirmFusion": "Potwierdź połączenie", + "createBacklinks": "Utwórz linki zwrotne do oryginalnych notatek", + "edit": "Edytuj", + "error": "Nie udało się połączyć notatek", + "finishEditing": "Zakończ edycję", + "generateFusion": "Wygeneruj połączenie", "generating": "Generowanie...", - "selectTitle": "Wybierz tytuł", - "dismiss": "Odrzuć" + "keepAllTags": "Zachowaj wszystkie tagi", + "mergeNotes": "Połącz {count} notatek", + "modify": "Zmodyfikuj", + "notesToMerge": "📝 Notatki do połączenia", + "optionalPrompt": "💬 Prompt łączenia (opcjonalny)", + "optionsTitle": "Opcje łączenia", + "previewTitle": "📝 Podgląd połączonej notatki", + "promptPlaceholder": "Opcjonalne instrukcje dla AI (np. 'Zachowaj formalny styl notatki 1')...", + "success": "Notatki połączone pomyślnie!", + "title": "🔗 Inteligentne łączenie", + "useLatestTitle": "Użyj najnowszej notatki jako tytułu" + }, + "general": { + "add": "Dodaj", + "apply": "Zastosuj", + "back": "Wstecz", + "cancel": "Anuluj", + "clean": "Clean", + "clear": "Wyczyść", + "close": "Zamknij", + "confirm": "Potwierdź", + "edit": "Edytuj", + "error": "Wystąpił błąd", + "indexAll": "Index All", + "loading": "Ładowanie...", + "next": "Dalej", + "operationFailed": "Operacja nieudana", + "operationSuccess": "Operacja udana", + "preview": "Podgląd", + "previous": "Wstecz", + "reset": "Resetuj", + "save": "Zapisz", + "select": "Wybierz", + "submit": "Wyślij", + "testConnection": "Test Connection", + "tryAgain": "Proszę spróbuj ponownie" + }, + "generalSettings": { + "description": "Ogólne ustawienia aplikacji", + "title": "Ustawienia ogólne" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} etykiet", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "Brak etykiet", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "Kliknij, aby wyświetlić", + "comparison": { + "clickToView": "Click to view note", + "helpful": "Helpful", + "helpfulQuestion": "Is this comparison helpful?", + "highSimilarityInsight": "These notes deal with the same topic with a high degree of similarity. They could be merged or consolidated.", + "notHelpful": "Not Helpful", + "similarityInfo": "These notes are connected by {similarity}% similarity", + "title": "💡 Note Comparison", + "untitled": "Untitled" + }, + "connection": "connection", + "connections": "Connections", + "connectionsBadge": "{count} connection{plural}", + "dailyInsight": "Daily insight from your notes", + "description": "Proactive connections between your notes", + "dismiss": "Dismiss for now", + "editorSection": { + "close": "Zamknij", + "compare": "Compare", + "compareAll": "Compare all", + "loading": "Loading...", + "merge": "Merge", + "mergeAll": "Merge all", + "title": "⚡ Connected Notes ({count})", + "view": "View" + }, + "fused": "Fused", + "fusion": { + "archiveOriginals": "Archive original notes", + "cancel": "Cancel", + "confirmFusion": "Confirm fusion", + "createBacklinks": "Create backlink to original notes", + "edit": "Edit", + "error": "Failed to merge notes", + "finishEditing": "Finish editing", + "generateError": "Failed to generate fusion", + "generateFusion": "Generate the fusion", + "generating": "Generating...", + "keepAllTags": "Keep all tags", + "mergeNotes": "Merge {count} note(s)", + "modify": "Modify", + "noContentReturned": "No fusion content returned from API", + "notesToMerge": "📝 Notes to merge", + "optionalPrompt": "💬 Fusion prompt (optional)", + "optionsTitle": "Fusion options", + "previewTitle": "📝 Preview of merged note", + "promptPlaceholder": "Optional instructions for AI (e.g., 'Keep the formal style of note 1')...", + "success": "Notes merged successfully!", + "title": "🔗 Intelligent Fusion", + "unknownDate": "Unknown date", + "useLatestTitle": "Use latest note as title" + }, + "helpful": "Helpful", + "insightReady": "Your insight is ready!", + "notHelpful": "Not Helpful", + "overlay": { + "error": "Błąd", + "loading": "Loading...", + "noConnections": "No connections found", + "searchPlaceholder": "Search connections...", + "sortBy": "Sort by:", + "sortOldest": "Oldest", + "sortRecent": "Recent", + "sortSimilarity": "Similarity", + "title": "Connected Notes", + "viewAll": "View all side by side" + }, + "thanksFeedback": "Thanks for your feedback!", + "thanksFeedbackImproving": "Thanks! We'll use this to improve.", + "title": "I noticed something...", + "viewConnection": "View Connection" + }, + "nav": { + "accountSettings": "Ustawienia konta", + "adminDashboard": "Panel administracyjny", + "aiSettings": "Ustawienia AI", + "archive": "Archiwum", + "buyMeACoffee": "Postaw mi kawę", + "configureAI": "Skonfiguruj swoje funkcje AI, dostawcę i preferencje", + "diagnostics": "Diagnostyka", + "donateOnKofi": "Wspomóż na Ko-fi", + "donationDescription": "Wpłać jednorazową darowiznę lub zostań comiesięcznym wspierającym.", + "donationNote": "Bez opłat platformowych • Natychmiastowe wypłaty • Bezpieczne", + "favorites": "Ulubione", + "generalNotes": "Notatki ogólne", + "home": "Strona główna", + "login": "Zaloguj", + "logout": "Wyloguj", + "manageAISettings": "Zarządzaj ustawieniami AI", + "myLibrary": "Moja biblioteka", + "notebooks": "Notatniki", + "notes": "Notatki", + "proPlan": "Plan Pro", + "profile": "Profil", + "quickAccess": "Szybki dostęp", + "recent": "Ostatnie", + "reminders": "Przypomnienia", + "settings": "Ustawienia", + "sponsorDescription": "Zostań comiesięcznym sponsorem i zyskaj uznanie.", + "sponsorOnGithub": "Zostań sponsorem na GitHub", + "support": "Wspomóż Memento ☕", + "supportDescription": "Memento jest w 100% darmowe i open-source. Twoje wsparcie pomaga utrzymać ten stan.", + "supportDevelopment": "Wspomóż rozwój Memento ☕", + "trash": "Kosz", + "userManagement": "Zarządzanie użytkownikami", + "workspace": "Przestrzeń robocza" + }, + "notebook": { + "cancel": "Anuluj", + "create": "Utwórz notatnik", + "createDescription": "Rozpocznij nową kolekcję, aby efektywnie organizować swoje notatki, pomysły i projekty.", + "createNew": "Utwórz nowy notatnik", + "creating": "Tworzenie...", + "delete": "Usuń notatnik", + "deleteConfirm": "Usuń", + "deleteWarning": "Czy na pewno chcesz usunąć ten notatnik? Notatki zostaną przeniesione do Notatek ogólnych.", + "edit": "Edytuj notatnik", + "editDescription": "Zmień nazwę, ikonę i kolor swojego notatnika.", + "generating": "Generowanie podsumowania...", + "labels": "Labels:", + "name": "Nazwa notatnika", + "noLabels": "No labels", + "selectColor": "Kolor", + "selectIcon": "Ikona", + "summary": "Podsumowanie notatnika", + "summaryDescription": "Wygeneruj podsumowanie wszystkich notatek w tym notatniku z pomocą AI.", + "summaryError": "Błąd generowania podsumowania" + }, + "notebookSuggestion": { + "description": "Ta notatka wydaje się należeć do tego notatnika", + "dismiss": "Odrzuć", + "dismissIn": "Odrzuć (zamknie się za {timeLeft}s)", + "generalNotes": "Notatki ogólne", + "move": "Przenieś", + "moveToNotebook": "Przenieś do notatnika", + "title": "Przenieść do {icon} {name}?" + }, + "notebooks": { + "allNotebooks": "Wszystkie notatniki", + "create": "Utwórz notatnik", + "createFirst": "Utwórz swój pierwszy notatnik", + "noNotebooks": "Brak notatników" + }, + "notes": { + "add": "Dodaj", + "addCollaborators": "Dodaj współpracowników", + "addImage": "Dodaj obraz", + "addItem": "Dodaj element", + "addLink": "Dodaj link", + "addListItem": "+ Element listy", + "addNote": "Dodaj notatkę", + "adding": "Dodawanie...", + "aiAssistant": "Asystent AI", + "archive": "Archiwizuj", + "backgroundOptions": "Opcje tła", + "changeColor": "Zmień kolor", + "changeSize": "Zmień rozmiar", + "clarifyFailed": "Uściślenie nie powiodło się", + "close": "Zamknij", + "color": "Kolor", + "confirmDelete": "Czy na pewno chcesz usunąć tę notatkę?", + "confirmLeaveShare": "Czy na pewno chcesz opuścić tę udostępnioną notatkę?", + "contentOrMediaRequired": "Proszę wprowadzić treść lub dodać link/obraz", + "copy": "Kopiuj", + "copyFailed": "Nie udało się skopiować notatki", + "copySuccess": "Notatka skopiowana pomyślnie!", + "createFirstNote": "Utwórz swoją pierwszą notatkę", + "date": "Data", + "delete": "Usuń", + "dragToReorder": "Przeciągnij, aby zmienić kolejność", + "duplicate": "Duplikuj", + "edit": "Edytuj notatkę", + "emptyState": "Brak notatek tutaj", + "fileTooLarge": "Plik jest za duży: {fileName}. Maksymalny rozmiar to {maxSize}.", + "improveFailed": "Ulepszenie nie powiodło się", + "inNotebook": "W notatniku", + "invalidDateTime": "Nieprawidłowa data lub czas", + "invalidFileType": "Nieprawidłowy typ pliku: {fileName}. Dozwolone są tylko JPEG, PNG, GIF i WebP.", + "itemOrMediaRequired": "Proszę dodać przynajmniej jeden element lub media", + "large": "Duży", + "leaveShare": "Opuść", + "linkAddFailed": "Nie udało się dodać linku", + "linkAdded": "Link dodany", + "linkMetadataFailed": "Nie udało się pobrać metadanych linku", + "listItem": "Element listy", + "makeCopy": "Utwórz kopię", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown WYŁĄCZONY", + "markdownOn": "Markdown WŁĄCZONY", + "markdownPlaceholder": "Zrób notatkę... (Markdown obsługiwany)", + "medium": "Średni", + "more": "Więcej", + "moreOptions": "Więcej opcji", + "moveFailed": "Przenoszenie nie powiodło się", + "newChecklist": "Nowa lista kontrolna", + "newNote": "Nowa notatka", + "noContent": "Brak treści", + "noNotes": "Brak notatek", + "noNotesFound": "Nie znaleziono notatek", + "noteCreateFailed": "Nie udało się utworzyć notatki", + "noteCreated": "Notatka utworzona pomyślnie", + "others": "Inne", + "pin": "Przypnij", + "pinned": "Przypięte", + "pinnedNotes": "Przypięte notatki", + "placeholder": "Zrób notatkę...", + "preview": "Podgląd", + "readOnly": "Tylko do odczytu", + "recent": "Ostatnie", + "redo": "Ponów", + "redoShortcut": "Ponów (Ctrl+Y)", + "remindMe": "Przypomnij mi", + "reminderDateTimeRequired": "Proszę wprowadzić datę i czas", + "reminderMustBeFuture": "Przypomnienie musi być w przyszłości", + "reminderPastError": "Przypomnienie musi być w przyszłości", + "reminderRemoved": "Przypomnienie usunięte", + "reminderSet": "Przypomnienie ustawione na {datetime}", + "remove": "Remove", + "saving": "Zapisywanie...", + "setReminder": "Ustaw przypomnienie", + "setReminderButton": "Ustaw przypomnienie", + "share": "Udostępnij", + "shareWithCollaborators": "Udostępnij współpracownikom", + "sharedBy": "Udostępnione przez", + "sharedReadOnly": "Ta notatka jest udostępniona Ci w trybie tylko do odczytu", + "shortenFailed": "Skrócenie nie powiodło się", + "showCollaborators": "Pokaż współpracowników", + "size": "Rozmiar", + "small": "Mały", + "takeNote": "Zrób notatkę...", + "takeNoteMarkdown": "Zrób notatkę... (Markdown obsługiwany)", + "time": "Czas", + "title": "Notatki", + "titlePlaceholder": "Tytuł", + "transformFailed": "Przekształcenie nie powiodło się", + "unarchive": "Przywróć z archiwum", + "undo": "Cofnij", + "undoShortcut": "Cofnij (Ctrl+Z)", + "unpin": "Odepnij", + "unpinned": "Odepnięta", + "untitled": "Bez tytułu", + "uploadFailed": "Nie udało się przesłać {filename}", + "view": "Wyświetl notatkę" + }, + "pagination": { + "next": "→", + "pageInfo": "Strona {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "Nieformalny", + "expand": "Rozszerz", + "formal": "Formalny", + "improve": "Ulepsz", + "shorten": "Skróć", + "title": "Ulepszanie tekstu" + }, + "profile": { + "accountSettings": "Ustawienia konta", + "autoDetect": "Automatyczne wykrywanie", + "changePassword": "Zmień hasło", + "changePasswordDescription": "Zaktualizuj swoje hasło. Będziesz potrzebować swojego obecnego hasła.", + "confirmPassword": "Potwierdź hasło", + "currentPassword": "Obecne hasło", + "description": "Zaktualizuj swoje dane osobowe", + "displayName": "Nazwa wyświetlana", + "displaySettings": "Ustawienia wyświetlania", + "displaySettingsDescription": "Dostosuj wygląd i rozmiar czcionki.", + "email": "E-mail", + "fontSize": "Rozmiar czcionki", + "fontSizeDescription": "Dostosuj rozmiar czcionki dla lepszej czytelności. Dotyczy to całego tekstu w interfejsie.", + "fontSizeExtraLarge": "Bardzo duży", + "fontSizeLarge": "Duży", + "fontSizeMedium": "Średni", + "fontSizeSmall": "Mały", + "fontSizeUpdateFailed": "Nie udało się zaktualizować rozmiaru czcionki", + "fontSizeUpdateSuccess": "Rozmiar czcionki zaktualizowany pomyślnie", + "languageDescription": "Ten język będzie używany do funkcji AI, analizy treści i tekstu interfejsu.", + "languagePreferences": "Preferencje językowe", + "languagePreferencesDescription": "Wybierz preferowany język dla funkcji AI i interfejsu.", + "languageUpdateFailed": "Nie udało się zaktualizować języka", + "languageUpdateSuccess": "Język zaktualizowany pomyślnie", + "manageAISettings": "Zarządzaj ustawieniami AI", + "newPassword": "Nowe hasło", + "passwordChangeFailed": "Nie udało się zmienić hasła", + "passwordChangeSuccess": "Hasło zmienione pomyślnie", + "passwordError": "Błąd aktualizacji hasła", + "passwordUpdated": "Hasło zaktualizowane", + "preferredLanguage": "Preferowany język", + "profileError": "Błąd aktualizacji profilu", + "profileUpdated": "Profil zaktualizowany", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "Wybierz rozmiar czcionki", + "selectLanguage": "Wybierz język", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "Profil", + "updateFailed": "Nie udało się zaktualizować profilu", + "updatePassword": "Zaktualizuj hasło", + "updateSuccess": "Profil zaktualizowany" + }, + "reminder": { + "cancel": "Anuluj", + "reminderDate": "Data przypomnienia", + "reminderTime": "Czas przypomnienia", + "removeReminder": "Usuń przypomnienie", + "save": "Ustaw przypomnienie", + "setReminder": "Ustaw przypomnienie", + "title": "Przypomnienie" + }, + "resetPassword": { + "confirmNewPassword": "Potwierdź nowe hasło", + "description": "Wprowadź nowe hasło poniżej.", + "invalidLinkDescription": "Ten link do resetowania hasła jest nieprawidłowy lub wygasł.", + "invalidLinkTitle": "Nieprawidłowy link", + "loading": "Ładowanie...", + "newPassword": "Nowe hasło", + "passwordMismatch": "Hasła nie są zgodne", + "requestNewLink": "Poproś o nowy link", + "resetPassword": "Resetuj hasło", + "resetting": "Resetowanie...", + "success": "Hasło zresetowane pomyślnie. Możesz się teraz zalogować.", + "title": "Resetuj hasło" + }, + "search": { + "exactMatch": "Dokładne dopasowanie", + "noResults": "Nie znaleziono wyników", + "placeholder": "Szukaj", + "related": "Powiązane", + "resultsFound": "Znaleziono {count} notatek", + "searchPlaceholder": "Przeszukaj swoje notatki...", + "searching": "Wyszukiwanie...", + "semanticInProgress": "Wyszukiwanie semantyczne AI...", + "semanticTooltip": "Wyszukiwanie semantyczne AI" }, "semanticSearch": { "exactMatch": "Dokładne dopasowanie", "related": "Powiązane", "searching": "Wyszukiwanie..." }, - "paragraphRefactor": { - "title": "Ulepszanie tekstu", - "shorten": "Skróć", - "expand": "Rozszerz", - "improve": "Ulepsz", - "formal": "Formalny", - "casual": "Nieformalny" - }, - "memoryEcho": { - "title": "Zauważyłem coś...", - "description": "Proaktywne połączenia między Twoimi notatkami", - "dailyInsight": "Codzienne spostrzeżenia z Twoich notatek", - "insightReady": "Twoje spostrzeżenie jest gotowe!", - "viewConnection": "Wyświetl połączenie", - "helpful": "Pomocne", - "notHelpful": "Niepomocne", - "dismiss": "Odrzuć na razie", - "thanksFeedback": "Dziękujemy za opinię!", - "thanksFeedbackImproving": "Dziękujemy! Użyjemy tego do ulepszeń.", - "connections": "Połączenia", - "connection": "połączenie", - "connectionsBadge": "{count} połączenie{plural}", - "fused": "Połączone", - "overlay": { - "title": "Połączone notatki", - "searchPlaceholder": "Szukaj połączeń...", - "sortBy": "Sortuj wg:", - "sortSimilarity": "Podobieństwo", - "sortRecent": "Najnowsze", - "sortOldest": "Najstarsze", - "viewAll": "Wyświetl wszystko obok siebie", - "loading": "Ładowanie...", - "noConnections": "Nie znaleziono połączeń" - }, - "comparison": { - "title": "💡 Porównanie notatek", - "similarityInfo": "Te notatki są połączone przez {similarity}% podobieństwa", - "highSimilarityInsight": "Te notatki dotyczą tego samego tematu z wysokim stopniem podobieństwa. Mogą zostać połączone lub skonsolidowane.", - "untitled": "Bez tytułu", - "clickToView": "Kliknij, aby wyświetlić notatkę", - "helpfulQuestion": "Czy to porównanie jest pomocne?", - "helpful": "Pomocne", - "notHelpful": "Niepomocne" - }, - "editorSection": { - "title": "⚡ Połączone notatki ({count})", - "loading": "Ładowanie...", - "view": "Wyświetl", - "compare": "Porównaj", - "merge": "Połącz", - "compareAll": "Porównaj wszystko", - "mergeAll": "Połącz wszystko" - }, - "generateError": "Błąd generowania fuzji", - "noContentReturned": "AI nie zwróciło treści", - "unknownDate": "Nieznana data" - }, - "fusion": { - "title": "🔗 Inteligentne łączenie", - "mergeNotes": "Połącz {count} notatek", - "notesToMerge": "📝 Notatki do połączenia", - "optionalPrompt": "💬 Prompt łączenia (opcjonalny)", - "promptPlaceholder": "Opcjonalne instrukcje dla AI (np. 'Zachowaj formalny styl notatki 1')...", - "generateFusion": "Wygeneruj połączenie", - "generating": "Generowanie...", - "previewTitle": "📝 Podgląd połączonej notatki", - "edit": "Edytuj", - "modify": "Zmodyfikuj", - "finishEditing": "Zakończ edycję", - "optionsTitle": "Opcje łączenia", - "archiveOriginals": "Archiwizuj oryginały", - "keepAllTags": "Zachowaj wszystkie tagi", - "useLatestTitle": "Użyj najnowszej notatki jako tytułu", - "createBacklinks": "Utwórz linki zwrotne do oryginalnych notatek", - "cancel": "Anuluj", - "confirmFusion": "Potwierdź połączenie", - "success": "Notatki połączone pomyślnie!", - "error": "Nie udało się połączyć notatek" - }, - "nav": { - "home": "Strona główna", - "notes": "Notatki", - "notebooks": "Notatniki", - "generalNotes": "Notatki ogólne", - "archive": "Archiwum", - "settings": "Ustawienia", - "profile": "Profil", - "aiSettings": "Ustawienia AI", - "logout": "Wyloguj", - "login": "Zaloguj", - "adminDashboard": "Panel administracyjny", - "diagnostics": "Diagnostyka", - "trash": "Kosz", - "support": "Wspomóż Memento ☕", - "reminders": "Przypomnienia", - "userManagement": "Zarządzanie użytkownikami", - "accountSettings": "Ustawienia konta", - "manageAISettings": "Zarządzaj ustawieniami AI", - "configureAI": "Skonfiguruj swoje funkcje AI, dostawcę i preferencje", - "supportDevelopment": "Wspomóż rozwój Memento ☕", - "supportDescription": "Memento jest w 100% darmowe i open-source. Twoje wsparcie pomaga utrzymać ten stan.", - "buyMeACoffee": "Postaw mi kawę", - "donationDescription": "Wpłać jednorazową darowiznę lub zostań comiesięcznym wspierającym.", - "donateOnKofi": "Wspomóż na Ko-fi", - "donationNote": "Bez opłat platformowych • Natychmiastowe wypłaty • Bezpieczne", - "sponsorOnGithub": "Zostań sponsorem na GitHub", - "sponsorDescription": "Zostań comiesięcznym sponsorem i zyskaj uznanie.", - "workspace": "Przestrzeń robocza", - "quickAccess": "Szybki dostęp", - "myLibrary": "Moja biblioteka", - "favorites": "Ulubione", - "recent": "Ostatnie", - "proPlan": "Plan Pro" - }, "settings": { - "title": "Ustawienia", - "description": "Zarządzaj swoimi ustawieniami i preferencjami", - "account": "Konto", - "appearance": "Wygląd", - "theme": "Motyw", - "themeLight": "Jasny", - "themeDark": "Ciemny", - "themeSystem": "Systemowy", - "notifications": "Powiadomienia", - "language": "Język", - "selectLanguage": "Wybierz język", - "privacy": "Prywatność", - "security": "Bezpieczeństwo", - "about": "O nas", - "version": "Wersja", - "settingsSaved": "Ustawienia zapisane", - "settingsError": "Błąd zapisywania ustawień" + "about": "About", + "account": "Account", + "appearance": "Appearance", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "Manage your settings and preferences", + "language": "Language", + "languageAuto": "Automatyczny", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "Notifications", + "privacy": "Privacy", + "profile": "Profil", + "searchNoResults": "Nie znaleziono wyników", + "security": "Security", + "selectLanguage": "Select language", + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "Error saving settings", + "settingsSaved": "Settings saved", + "theme": "Theme", + "themeDark": "Dark", + "themeLight": "Light", + "themeSystem": "System", + "title": "Settings", + "version": "Version" }, - "profile": { - "title": "Profil", - "description": "Zaktualizuj swoje dane osobowe", - "displayName": "Nazwa wyświetlana", - "email": "E-mail", - "changePassword": "Zmień hasło", - "changePasswordDescription": "Zaktualizuj swoje hasło. Będziesz potrzebować swojego obecnego hasła.", - "currentPassword": "Obecne hasło", - "newPassword": "Nowe hasło", - "confirmPassword": "Potwierdź hasło", - "updatePassword": "Zaktualizuj hasło", - "passwordChangeSuccess": "Hasło zmienione pomyślnie", - "passwordChangeFailed": "Nie udało się zmienić hasła", - "passwordUpdated": "Hasło zaktualizowane", - "passwordError": "Błąd aktualizacji hasła", - "languagePreferences": "Preferencje językowe", - "languagePreferencesDescription": "Wybierz preferowany język dla funkcji AI i interfejsu.", - "preferredLanguage": "Preferowany język", - "selectLanguage": "Wybierz język", - "languageDescription": "Ten język będzie używany do funkcji AI, analizy treści i tekstu interfejsu.", - "autoDetect": "Automatyczne wykrywanie", - "updateSuccess": "Profil zaktualizowany", - "updateFailed": "Nie udało się zaktualizować profilu", - "languageUpdateSuccess": "Język zaktualizowany pomyślnie", - "languageUpdateFailed": "Nie udało się zaktualizować języka", - "profileUpdated": "Profil zaktualizowany", - "profileError": "Błąd aktualizacji profilu", - "accountSettings": "Ustawienia konta", - "manageAISettings": "Zarządzaj ustawieniami AI", - "displaySettings": "Ustawienia wyświetlania", - "displaySettingsDescription": "Dostosuj wygląd i rozmiar czcionki.", - "fontSize": "Rozmiar czcionki", - "selectFontSize": "Wybierz rozmiar czcionki", - "fontSizeSmall": "Mały", - "fontSizeMedium": "Średni", - "fontSizeLarge": "Duży", - "fontSizeExtraLarge": "Bardzo duży", - "fontSizeDescription": "Dostosuj rozmiar czcionki dla lepszej czytelności. Dotyczy to całego tekstu w interfejsie.", - "fontSizeUpdateSuccess": "Rozmiar czcionki zaktualizowany pomyślnie", - "fontSizeUpdateFailed": "Nie udało się zaktualizować rozmiaru czcionki" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" }, - "aiSettings": { - "title": "Ustawienia AI", - "description": "Skonfiguruj swoje funkcje AI i preferencje", - "features": "Funkcje AI", - "provider": "Dostawca AI", - "providerAuto": "Auto (Zalecane)", - "providerOllama": "Ollama (Lokalny)", - "providerOpenAI": "OpenAI (Chmura)", - "frequency": "Częstotliwość", - "frequencyDaily": "Codziennie", - "frequencyWeekly": "Co tydzień", - "saving": "Zapisywanie...", - "saved": "Ustawienie zaktualizowane", - "error": "Nie udało się zaktualizować ustawienia" + "support": { + "aiApiCosts": "Koszty API AI:", + "buyMeACoffee": "Postaw mi kawę", + "contributeCode": "Wnieś kod", + "description": "Memento jest w 100% darmowe i open-source. Twoje wsparcie pomaga utrzymać ten stan.", + "directImpact": "Bezpośredni wpływ", + "domainSSL": "Domena i SSL:", + "donateOnKofi": "Wspomóż na Ko-fi", + "donationDescription": "Wpłać jednorazową darowiznę lub zostań comiesięcznym wspierającym.", + "githubDescription": "Cykliczne wsparcie • Publiczne uznanie • Skupione na deweloperach", + "hostingServers": "Hosting i serwery:", + "howSupportHelps": "Jak Twoje wsparcie pomaga", + "kofiDescription": "Bez opłat platformowych • Natychmiastowe wypłaty • Bezpieczne", + "otherWaysTitle": "Inne sposoby wsparcia", + "reportBug": "Zgłoś błąd", + "shareTwitter": "Udostępnij na Twitterze", + "sponsorDescription": "Zostań comiesięcznym sponsorem i zyskaj uznanie.", + "sponsorOnGithub": "Zostań sponsorem na GitHub", + "sponsorPerks": "Korzyści sponsora", + "starGithub": "Gwiazdka na GitHub", + "title": "Wspomóż rozwój Memento", + "totalExpenses": "Całkowite wydatki:", + "transparency": "Przejrzystość", + "transparencyDescription": "Wierzę w pełną przejrzystość. Oto jak wykorzystywane są darowizny:" }, - "general": { - "loading": "Ładowanie...", - "save": "Zapisz", - "cancel": "Anuluj", - "add": "Dodaj", - "edit": "Edytuj", - "confirm": "Potwierdź", - "close": "Zamknij", - "back": "Wstecz", - "next": "Dalej", - "previous": "Wstecz", - "submit": "Wyślij", - "reset": "Resetuj", - "apply": "Zastosuj", - "clear": "Wyczyść", - "select": "Wybierz", - "tryAgain": "Proszę spróbuj ponownie", - "error": "Wystąpił błąd", - "operationSuccess": "Operacja udana", - "operationFailed": "Operacja nieudana" + "testPages": { + "titleSuggestions": { + "analyzing": "Analizowanie...", + "contentLabel": "Treść (wymagane 50+ słów):", + "error": "Błąd:", + "idle": "Bezczynny", + "noSuggestions": "Brak sugestii. Wpisz 50+ słów i poczekaj 2 sekundy.", + "placeholder": "Wpisz tutaj co najmniej 50 słów...", + "status": "Status:", + "suggestions": "Sugestie ({count}):", + "title": "Testuj sugestie tytułów", + "wordCount": "Liczba słów:" + } }, - "colors": { - "default": "Domyślny", - "red": "Czerwony", - "blue": "Niebieski", - "green": "Zielony", - "yellow": "Żółty", - "purple": "Fioletowy", - "pink": "Różowy", - "orange": "Pomarańczowy", - "gray": "Szary" + "time": { + "daysAgo": "{count} dni temu", + "hoursAgo": "{count} godzin temu", + "justNow": "Przed chwilą", + "minutesAgo": "{count} minut temu", + "today": "Dzisiaj", + "tomorrow": "Jutro", + "yesterday": "Wczoraj" }, - "reminder": { - "title": "Przypomnienie", - "setReminder": "Ustaw przypomnienie", - "removeReminder": "Usuń przypomnienie", - "reminderDate": "Data przypomnienia", - "reminderTime": "Czas przypomnienia", - "save": "Ustaw przypomnienie", - "cancel": "Anuluj" - }, - "notebookSuggestion": { - "title": "Przenieść do {icon} {name}?", - "description": "Ta notatka wydaje się należeć do tego notatnika", - "move": "Przenieś", + "titleSuggestions": { + "available": "Sugestie tytułów", "dismiss": "Odrzuć", - "dismissIn": "Odrzuć (zamknie się za {timeLeft}s)", - "moveToNotebook": "Przenieś do notatnika", - "generalNotes": "Notatki ogólne" + "generating": "Generowanie...", + "selectTitle": "Wybierz tytuł", + "title": "Sugestie AI" + }, + "toast": { + "feedbackFailed": "Przesłanie opinii nie powiodło się", + "notesFusionSuccess": "Notatki połączone pomyślnie!", + "openConnectionFailed": "Otwarcie połączenia nie powiodło się", + "openingConnection": "Otwieranie połączenia...", + "operationFailed": "Operacja nieudana", + "operationSuccess": "Operacja udana", + "saveFailed": "Zapisanie ustawienia nie powiodło się", + "saved": "Ustawienie zapisane", + "thanksFeedback": "Dziękujemy za opinię!", + "thanksFeedbackImproving": "Dziękujemy! Wykorzystamy to do ulepszeń." + }, + "trash": { + "deletePermanently": "Usuń trwale", + "empty": "Kosz jest pusty", + "restore": "Przywróć", + "title": "Kosz" + }, + "ui": { + "close": "Zamknij", + "collapse": "Zwiń", + "expand": "Rozwiń", + "open": "Otwórz" } } diff --git a/keep-notes/locales/pt.json b/keep-notes/locales/pt.json index 21e8a94..e804084 100644 --- a/keep-notes/locales/pt.json +++ b/keep-notes/locales/pt.json @@ -1,511 +1,989 @@ { - "auth": { - "signIn": "Entrar", - "signUp": "Cadastrar-se", - "email": "E-mail", - "password": "Senha", - "name": "Nome", - "emailPlaceholder": "Digite seu endereço de e-mail", - "passwordPlaceholder": "Digite sua senha", - "namePlaceholder": "Digite seu nome", - "passwordMinChars": "Digite a senha (mínimo 6 caracteres)", - "resetPassword": "Redefinir senha", - "resetPasswordInstructions": "Digite seu e-mail para redefinir sua senha", - "forgotPassword": "Esqueceu sua senha?", - "noAccount": "Não tem uma conta?", - "hasAccount": "Já tem uma conta?", - "signInToAccount": "Entre na sua conta", - "createAccount": "Crie sua conta", - "rememberMe": "Lembrar-me", - "orContinueWith": "Ou continuar com", - "checkYourEmail": "Verifique seu e-mail", - "resetEmailSent": "Enviamos um link de redefinição de senha para seu endereço de e-mail se ele existir em nosso sistema.", - "returnToLogin": "Voltar ao login", - "forgotPasswordTitle": "Esqueci minha senha", - "forgotPasswordDescription": "Digite seu endereço de e-mail e enviaremos um link para redefinir sua senha.", - "sending": "Enviando...", - "sendResetLink": "Enviar link de redefinição", - "backToLogin": "Voltar ao login" + "about": { + "appDescription": "Um poderoso aplicativo de notas com recursos baseados em IA", + "appName": "Keep Notes", + "buildDate": "Data de compilação", + "description": "Informações sobre o aplicativo", + "features": { + "description": "Capacidades baseadas em IA", + "dragDrop": "Gerenciamento de notas com arrastar e soltar", + "labelSystem": "Sistema de etiquetas", + "memoryEcho": "Insights diários do Memory Echo", + "multipleProviders": "Múltiplos provedores de IA (OpenAI, Ollama)", + "notebookOrganization": "Organização por cadernos", + "paragraphReformulation": "Reformulação de parágrafos", + "semanticSearch": "Pesquisa semântica com embeddings", + "title": "Recursos", + "titleSuggestions": "Sugestões de título com IA" + }, + "platform": "Plataforma", + "platformWeb": "Web", + "support": { + "description": "Obtenha ajuda e feedback", + "documentation": "Documentação", + "feedback": "Feedback", + "reportIssues": "Reportar problemas", + "title": "Suporte" + }, + "technology": { + "ai": "IA", + "authentication": "Autenticação", + "backend": "Backend", + "database": "Banco de dados", + "description": "Construído com tecnologias modernas", + "frontend": "Frontend", + "testing": "Testes", + "title": "Stack de tecnologia", + "ui": "UI" + }, + "title": "Sobre", + "version": "Versão" }, - "notes": { - "title": "Notas", - "newNote": "Nova nota", - "untitled": "Sem título", - "placeholder": "Faça uma nota...", - "markdownPlaceholder": "Faça uma nota... (Markdown suportado)", - "titlePlaceholder": "Título", - "listItem": "Item da lista", - "addListItem": "+ Item da lista", - "newChecklist": "Nova lista de verificação", - "add": "Adicionar", - "adding": "Adicionando...", - "close": "Fechar", - "confirmDelete": "Tem certeza de que deseja excluir esta nota?", - "confirmLeaveShare": "Tem certeza de que deseja sair desta nota compartilhada?", - "sharedBy": "Compartilhado por", - "leaveShare": "Sair", - "delete": "Excluir", - "archive": "Arquivar", - "unarchive": "Desarquivar", - "pin": "Fixar", - "unpin": "Desafixar", - "color": "Cor", - "changeColor": "Alterar cor", - "setReminder": "Definir lembrete", - "setReminderButton": "Definir Lembrete", - "date": "Data", - "time": "Hora", - "reminderDateTimeRequired": "Por favor, insira data e hora", - "invalidDateTime": "Data ou hora inválida", - "reminderMustBeFuture": "O lembrete deve estar no futuro", - "reminderSet": "Lembrete definido para {datetime}", - "reminderPastError": "O lembrete deve estar no futuro", - "reminderRemoved": "Lembrete removido", - "addImage": "Adicionar imagem", - "addLink": "Adicionar link", - "linkAdded": "Link adicionado", - "linkMetadataFailed": "Não foi possível obter metadados do link", - "linkAddFailed": "Falha ao adicionar link", - "invalidFileType": "Tipo de arquivo inválido: {fileName}. Apenas JPEG, PNG, GIF e WebP são permitidos.", - "fileTooLarge": "Arquivo muito grande: {fileName}. O tamanho máximo é {maxSize}.", - "uploadFailed": "Falha ao fazer upload de {filename}", - "contentOrMediaRequired": "Por favor, insira algum conteúdo ou adicione um link/imagem", - "itemOrMediaRequired": "Por favor, adicione pelo menos um item ou mídia", - "noteCreated": "Nota criada com sucesso", - "noteCreateFailed": "Falha ao criar nota", - "aiAssistant": "Assistente IA", - "changeSize": "Alterar tamanho", - "backgroundOptions": "Opções de fundo", - "moreOptions": "Mais opções", - "remindMe": "Lembrar-me", - "markdownMode": "Markdown", - "addCollaborators": "Adicionar colaboradores", - "duplicate": "Duplicar", - "share": "Compartilhar", - "showCollaborators": "Mostrar colaboradores", - "pinned": "Fixadas", - "others": "Outros", - "noNotes": "Sem notas", - "noNotesFound": "Nenhuma nota encontrada", - "createFirstNote": "Crie sua primeira nota", - "size": "Tamanho", - "small": "Pequeno", - "medium": "Médio", - "large": "Grande", - "shareWithCollaborators": "Compartilhar com colaboradores", - "view": "Ver nota", - "edit": "Editar nota", - "readOnly": "Somente leitura", - "preview": "Visualizar", - "noContent": "Sem conteúdo", - "takeNote": "Faça uma nota...", - "takeNoteMarkdown": "Faça uma nota... (Markdown suportado)", - "addItem": "Adicionar item", - "sharedReadOnly": "Esta nota é compartilhada com você no modo somente leitura", - "makeCopy": "Fazer uma cópia", - "saving": "Salvando...", - "copySuccess": "Nota copiada com sucesso!", - "copyFailed": "Falha ao copiar nota", - "copy": "Copiar", - "markdownOn": "Markdown LIGADO", - "markdownOff": "Markdown DESLIGADO", - "undo": "Desfazer (Ctrl+Z)", - "redo": "Refazer (Ctrl+Y)" - }, - "pagination": { - "previous": "←", - "pageInfo": "Página {currentPage} / {totalPages}", - "next": "→" - }, - "labels": { - "title": "Etiquetas", - "filter": "Filtrar por etiqueta", - "manage": "Gerenciar etiquetas", - "manageTooltip": "Gerenciar etiquetas", - "changeColor": "Alterar cor", - "changeColorTooltip": "Alterar cor", - "delete": "Excluir", - "deleteTooltip": "Excluir etiqueta", - "confirmDelete": "Tem certeza de que deseja excluir esta etiqueta?", - "newLabelPlaceholder": "Criar nova etiqueta", - "namePlaceholder": "Digite o nome da etiqueta", - "addLabel": "Adicionar etiqueta", - "createLabel": "Criar etiqueta", - "labelName": "Nome da etiqueta", - "labelColor": "Cor da etiqueta", - "manageLabels": "Gerenciar etiquetas", - "manageLabelsDescription": "Adicione ou remova etiquetas para esta nota. Clique em uma etiqueta para alterar sua cor.", - "selectedLabels": "Etiquetas selecionadas", - "allLabels": "Todas as etiquetas", - "clearAll": "Limpar tudo", - "filterByLabel": "Filtrar por etiqueta", - "tagAdded": "Tag \"{tag}\" adicionada", - "showLess": "Mostrar menos", - "showMore": "Mostrar mais", - "editLabels": "Editar etiquetas", - "editLabelsDescription": "Crie, edite cores ou exclua etiquetas.", - "noLabelsFound": "Nenhuma etiqueta encontrada.", - "loading": "Carregando...", - "notebookRequired": "⚠️ Etiquetas só estão disponíveis em cadernos. Mova esta nota para um caderno primeiro." - }, - "search": { - "placeholder": "Pesquisar", - "searchPlaceholder": "Pesquise suas notas...", - "semanticInProgress": "Pesquisa semântica em andamento...", - "semanticTooltip": "Pesquisa semântica com IA", - "searching": "Pesquisando...", - "noResults": "Nenhum resultado encontrado", - "resultsFound": "{count} notas encontradas", - "exactMatch": "Correspondência exata", - "related": "Relacionado" - }, - "collaboration": { - "emailPlaceholder": "Digite o endereço de e-mail", - "addCollaborator": "Adicionar colaborador", - "removeCollaborator": "Remover colaborador", - "owner": "Proprietário", - "canEdit": "Pode editar", - "canView": "Pode visualizar", - "shareNote": "Compartilhar nota", - "shareWithCollaborators": "Compartilhar com colaboradores", - "addCollaboratorDescription": "Adicione pessoas para colaborar nesta nota através do endereço de e-mail.", - "viewerDescription": "Você tem acesso a esta nota. Apenas o proprietário pode gerenciar colaboradores.", - "emailAddress": "Endereço de e-mail", - "enterEmailAddress": "Digite o endereço de e-mail", - "invite": "Convidar", - "peopleWithAccess": "Pessoas com acesso", - "noCollaborators": "Ainda não há colaboradores. Adicione alguém acima!", - "noCollaboratorsViewer": "Ainda não há colaboradores.", - "pendingInvite": "Convite pendente", - "pending": "Pendente", - "remove": "Remover", - "unnamedUser": "Usuário sem nome", - "done": "Concluído", - "willBeAdded": "{email} será adicionado como colaborador quando a nota for criada", - "alreadyInList": "Este e-mail já está na lista", - "nowHasAccess": "{name} agora tem acesso a esta nota", - "accessRevoked": "O acesso foi revogado", - "errorLoading": "Erro ao carregar colaboradores", - "failedToAdd": "Falha ao adicionar colaborador", - "failedToRemove": "Falha ao remover colaborador" + "admin": { + "ai": { + "apiKey": "API Key", + "baseUrl": "Base URL", + "commonEmbeddingModels": "Common embedding models for OpenAI-compatible APIs", + "commonModelsDescription": "Common models for OpenAI-compatible APIs", + "description": "Configure AI providers for auto-tagging and semantic search. Use different providers for optimal performance.", + "embeddingsDescription": "AI provider for semantic search embeddings. Recommended: OpenAI (best quality).", + "embeddingsProvider": "Embeddings Provider", + "model": "Model", + "modelRecommendations": "gpt-4o-mini = Best value • gpt-4o = Best quality", + "openAIKeyDescription": "Your OpenAI API key from platform.openai.com", + "openTestPanel": "Open AI Test Panel", + "provider": "Provider", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING is required", + "providerTagsRequired": "AI_PROVIDER_TAGS is required", + "saveSettings": "Save AI Settings", + "saving": "Saving...", + "selectEmbeddingModel": "Select an embedding model installed on your system", + "selectOllamaModel": "Select an Ollama model installed on your system", + "tagsGenerationDescription": "AI provider for automatic tag suggestions. Recommended: Ollama (free, local).", + "tagsGenerationProvider": "Tags Generation Provider", + "title": "AI Configuration", + "updateFailed": "Failed to update AI settings", + "updateSuccess": "AI Settings updated successfully" + }, + "aiTest": { + "description": "Test your AI providers for tag generation and semantic search embeddings", + "embeddingDimensions": "Embedding Dimensions:", + "embeddingsTestDescription": "Test the AI provider responsible for semantic search embeddings", + "embeddingsTestTitle": "Embeddings Test", + "error": "Error:", + "first5Values": "First 5 values:", + "generatedTags": "Generated Tags:", + "howItWorksTitle": "How Testing Works", + "model": "Model:", + "provider": "Provider:", + "responseTime": "Response time: {time}ms", + "runTest": "Run Test", + "tagsTestDescription": "Test the AI provider responsible for automatic tag suggestions", + "tagsTestTitle": "Tags Generation Test", + "testError": "Test Error: {error}", + "testFailed": "Test Failed", + "testPassed": "Test Passed", + "testing": "Testing...", + "tipDescription": "Use the AI Test Panel to diagnose configuration issues before testing.", + "tipTitle": "Tip:", + "title": "AI Provider Testing", + "vectorDimensions": "vector dimensions" + }, + "aiTesting": "AI Testing", + "security": { + "allowPublicRegistration": "Allow Public Registration", + "allowPublicRegistrationDescription": "If disabled, new users can only be added by an Administrator via the User Management page.", + "description": "Manage access control and registration policies.", + "title": "Security Settings", + "updateFailed": "Failed to update security settings", + "updateSuccess": "Security Settings updated" + }, + "settings": "Admin Settings", + "smtp": { + "description": "Configure email server for password resets.", + "forceSSL": "Force SSL/TLS (usually for port 465)", + "fromEmail": "From Email", + "host": "Host", + "ignoreCertErrors": "Ignore Certificate Errors (Self-hosted/Dev only)", + "password": "Password", + "port": "Port", + "saveSettings": "Save SMTP Settings", + "sending": "Sending...", + "testEmail": "Test Email", + "testFailed": "Failed: {error}", + "testSuccess": "Test email sent successfully!", + "title": "SMTP Configuration", + "updateFailed": "Failed to update SMTP settings", + "updateSuccess": "SMTP Settings updated", + "username": "Username" + }, + "title": "Admin Dashboard", + "userManagement": "User Management", + "users": { + "addUser": "Add User", + "confirmDelete": "Tem certeza de que deseja excluir este usuário?", + "createFailed": "Failed to create user", + "createSuccess": "User created successfully", + "createUser": "Create User", + "createUserDescription": "Add a new user to the system.", + "deleteFailed": "Failed to delete", + "deleteSuccess": "User deleted", + "demote": "Rebaixar", + "email": "Email", + "name": "Name", + "password": "Password", + "promote": "Promover", + "role": "Role", + "roleUpdateFailed": "Failed to update role", + "roleUpdateSuccess": "User role updated to {role}", + "roles": { + "admin": "Administrador", + "user": "Usuário" + }, + "table": { + "actions": "Actions", + "createdAt": "Created At", + "email": "Email", + "name": "Name", + "role": "Role" + } + } }, "ai": { - "analyzing": "IA analisando...", - "clickToAddTag": "Clique para adicionar esta tag", - "ignoreSuggestion": "Ignorar esta sugestão", - "generatingTitles": "Gerando títulos...", - "generateTitlesTooltip": "Gerar títulos com IA", - "poweredByAI": "Powered by IA", - "languageDetected": "Idioma detectado", - "processing": "Processando...", - "tagAdded": "Tag \"{tag}\" adicionada", - "titleGenerating": "Gerando...", - "titleGenerateWithAI": "Gerar títulos com IA", - "titleGenerationMinWords": "O conteúdo deve ter pelo menos 10 palavras para gerar títulos (atual: {count} palavras)", - "titleGenerationError": "Erro ao gerar títulos", - "titlesGenerated": "💡 {count} títulos gerados!", - "titleGenerationFailed": "Falha ao gerar títulos", - "titleApplied": "Título aplicado!", - "reformulationNoText": "Por favor, selecione o texto ou adicione conteúdo", - "reformulationSelectionTooShort": "Seleção muito curta, usando conteúdo completo", - "reformulationMinWords": "O texto deve ter pelo menos 10 palavras (atual: {count} palavras)", - "reformulationMaxWords": "O texto deve ter no máximo 500 palavras", - "reformulationError": "Erro durante a reformulação", - "reformulationFailed": "Falha ao reformular texto", - "reformulationApplied": "Texto reformulado aplicado!", - "transformMarkdown": "Transformar em Markdown", - "transforming": "Transformando...", - "transformSuccess": "Texto transformado em Markdown com sucesso!", - "transformError": "Erro durante a transformação", - "assistant": "Assistente IA", - "generating": "Gerando...", - "generateTitles": "Gerar títulos", - "reformulateText": "Reformular texto", - "reformulating": "Reformulando...", - "clarify": "Esclarecer", - "shorten": "Encurtar", - "improveStyle": "Melhorar estilo", - "reformulationComparison": "Comparação de reformulação", + "analyzing": "AI analyzing...", + "assistant": "AI Assistant", + "autoLabels": { + "analyzing": "Analisando suas notas para sugestões de rótulos...", + "create": "Criar", + "createNewLabel": "Criar nova etiqueta", + "created": "{count} labels created successfully", + "creating": "Criando rótulos...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(novo)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "Sugestões de Rótulos", + "typeContent": "Type content to get label suggestions...", + "typeForSuggestions": "Digite para sugestões" + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Falha ao aplicar", + "applying": "Applying...", + "description": "A IA analisará suas notas e sugerirá organizá-las em cadernos.", + "error": "Erro na organização", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "Nenhuma nota selecionada", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Selecionar tudo em", + "selectNote": "Selecionar nota", + "success": "Organização concluída", + "title": "Organização em lote" + }, + "clarify": "Clarify", + "clickToAddTag": "Click to add this tag", + "generateTitles": "Generate titles", + "generateTitlesTooltip": "Generate titles with AI", + "generating": "Generating...", + "generatingTitles": "Generating titles...", + "ignoreSuggestion": "Ignore this suggestion", + "improveStyle": "Improve style", + "languageDetected": "Language detected", + "notebookSummary": { + "regenerate": "Regenerar Resumo", + "regenerating": "Regenerando resumo..." + }, "original": "Original", - "reformulated": "Reformulado" + "poweredByAI": "Powered by AI", + "processing": "Processing...", + "reformulateText": "Reformulate text", + "reformulated": "Reformulated", + "reformulating": "Reformulating...", + "reformulationApplied": "Reformulated text applied!", + "reformulationComparison": "Reformulation Comparison", + "reformulationError": "Error during reformulation", + "reformulationFailed": "Failed to reformulate text", + "reformulationMaxWords": "Text must have maximum 500 words", + "reformulationMinWords": "Text must have at least 10 words (current: {count} words)", + "reformulationNoText": "Please select text or add content", + "reformulationSelectionTooShort": "Selection too short, using full content", + "shorten": "Shorten", + "tagAdded": "Tag \"{tag}\" added", + "titleApplied": "Title applied!", + "titleGenerateWithAI": "Generate titles with AI", + "titleGenerating": "Generating...", + "titleGenerationError": "Error generating titles", + "titleGenerationFailed": "Failed to generate titles", + "titleGenerationMinWords": "Content must have at least 10 words to generate titles (current: {count} words)", + "titlesGenerated": "💡 {count} titles generated!", + "transformError": "Error during transformation", + "transformMarkdown": "Transform to Markdown", + "transformSuccess": "Text transformed to Markdown successfully!", + "transforming": "Transforming..." }, - "batchOrganization": { - "error": "Falha ao criar o plano de organização", - "noNotesSelected": "Nenhuma nota selecionada", - "title": "Organizar com IA", - "description": "A IA analisará suas notas e sugerirá organizá-las em cadernos.", - "analyzing": "Analisando suas notas...", - "notesToOrganize": "{count} notas para organizar", - "selected": "{count} selecionado", - "noNotebooks": "Nenhum caderno disponível. Crie primeiro cadernos para organizar suas notas.", - "noSuggestions": "A IA não encontrou uma boa maneira de organizar estas notas.", - "confidence": "confiança", - "unorganized": "{count} notas não puderam ser categorizadas e permanecerão em Notas Gerais.", - "applying": "Aplicando...", - "apply": "Aplicar ({count})" + "aiSettings": { + "description": "Configure seus recursos e preferências com IA", + "error": "Falha ao atualizar configuração", + "features": "Recursos de IA", + "frequency": "Frequência", + "frequencyDaily": "Diariamente", + "frequencyWeekly": "Semanalmente", + "provider": "Provedor de IA", + "providerAuto": "Automático (Recomendado)", + "providerOllama": "Ollama (Local)", + "providerOpenAI": "OpenAI (Nuvem)", + "saved": "Configuração atualizada", + "saving": "Salvando...", + "title": "Configurações de IA", + "titleSuggestionsDesc": "Sugerir títulos para notas sem título após 50+ palavras", + "paragraphRefactorDesc": "Opções de melhoria de texto com IA", + "frequencyDesc": "Com que frequência analisar conexões entre notas", + "providerDesc": "Escolha seu provedor de IA preferido", + "providerAutoDesc": "Ollama quando disponível, OpenAI como alternativa", + "providerOllamaDesc": "100% privado, roda localmente na sua máquina", + "providerOpenAIDesc": "Mais preciso, requer chave de API" + }, + "appearance": { + "description": "Personalize a aparência do aplicativo", + "title": "Aparência" + }, + "auth": { + "backToLogin": "Voltar ao login", + "checkYourEmail": "Verifique seu e-mail", + "createAccount": "Crie sua conta", + "email": "E-mail", + "emailPlaceholder": "Digite seu endereço de e-mail", + "forgotPassword": "Esqueceu sua senha?", + "forgotPasswordDescription": "Digite seu endereço de e-mail e enviaremos um link para redefinir sua senha.", + "forgotPasswordTitle": "Esqueci minha senha", + "hasAccount": "Já tem uma conta?", + "name": "Nome", + "namePlaceholder": "Digite seu nome", + "noAccount": "Não tem uma conta?", + "orContinueWith": "Ou continuar com", + "password": "Senha", + "passwordMinChars": "Digite a senha (mínimo 6 caracteres)", + "passwordPlaceholder": "Digite sua senha", + "rememberMe": "Lembrar-me", + "resetEmailSent": "Enviamos um link de redefinição de senha para seu endereço de e-mail se ele existir em nosso sistema.", + "resetPassword": "Redefinir senha", + "resetPasswordInstructions": "Digite seu e-mail para redefinir sua senha", + "returnToLogin": "Voltar ao login", + "sendResetLink": "Enviar link de redefinição", + "sending": "Enviando...", + "signIn": "Entrar", + "signInToAccount": "Entre na sua conta", + "signOut": "Sign out", + "signUp": "Cadastrar-se" }, "autoLabels": { - "error": "Falha ao obter sugestões de etiquetas", - "noLabelsSelected": "Nenhuma etiqueta selecionada", - "created": "{count} etiquetas criadas com sucesso", "analyzing": "Analisando suas notas...", - "title": "Novas sugestões de etiquetas", + "createNewLabel": "Criar esta nova etiqueta e adicioná-la", + "created": "{count} etiquetas criadas com sucesso", "description": "Detectei temas recorrentes em \"{notebookName}\" ({totalNotes} notas). Criar etiquetas para eles?", + "error": "Falha ao obter sugestões de etiquetas", + "new": "(novo)", + "noLabelsSelected": "Nenhuma etiqueta selecionada", "note": "nota", "notes": "notas", - "typeContent": "Digite o conteúdo para obter sugestões de etiquetas...", - "createNewLabel": "Criar esta nova etiqueta e adicioná-la", - "new": "(novo)" + "title": "Novas sugestões de etiquetas", + "typeContent": "Digite o conteúdo para obter sugestões de etiquetas..." }, - "titleSuggestions": { - "available": "Sugestões de título", - "title": "Sugestões de IA", - "generating": "Gerando...", - "selectTitle": "Selecione um título", - "dismiss": "Descartar" + "batch": { + "organize": "Organizar", + "organizeWithAI": "Organizar com IA" + }, + "batchOrganization": { + "analyzing": "Analisando suas notas...", + "apply": "Aplicar ({count})", + "applying": "Aplicando...", + "confidence": "confiança", + "description": "A IA analisará suas notas e sugerirá organizá-las em cadernos.", + "error": "Falha ao criar o plano de organização", + "noNotebooks": "Nenhum caderno disponível. Crie primeiro cadernos para organizar suas notas.", + "noNotesSelected": "Nenhuma nota selecionada", + "noSuggestions": "A IA não encontrou uma boa maneira de organizar estas notas.", + "notesToOrganize": "{count} notas para organizar", + "selected": "{count} selecionado", + "title": "Organizar com IA", + "unorganized": "{count} notas não puderam ser categorizadas e permanecerão em Notas Gerais." + }, + "collaboration": { + "accessRevoked": "O acesso foi revogado", + "addCollaborator": "Adicionar colaborador", + "addCollaboratorDescription": "Adicione pessoas para colaborar nesta nota através do endereço de e-mail.", + "alreadyInList": "Este e-mail já está na lista", + "canEdit": "Pode editar", + "canView": "Pode visualizar", + "done": "Concluído", + "emailAddress": "Endereço de e-mail", + "emailPlaceholder": "Digite o endereço de e-mail", + "enterEmailAddress": "Digite o endereço de e-mail", + "errorLoading": "Erro ao carregar colaboradores", + "failedToAdd": "Falha ao adicionar colaborador", + "failedToRemove": "Falha ao remover colaborador", + "invite": "Convidar", + "noCollaborators": "Ainda não há colaboradores. Adicione alguém acima!", + "noCollaboratorsViewer": "Ainda não há colaboradores.", + "nowHasAccess": "{name} agora tem acesso a esta nota", + "owner": "Proprietário", + "pending": "Pendente", + "pendingInvite": "Convite pendente", + "peopleWithAccess": "Pessoas com acesso", + "remove": "Remover", + "removeCollaborator": "Remover colaborador", + "shareNote": "Compartilhar nota", + "shareWithCollaborators": "Compartilhar com colaboradores", + "unnamedUser": "Usuário sem nome", + "viewerDescription": "Você tem acesso a esta nota. Apenas o proprietário pode gerenciar colaboradores.", + "willBeAdded": "{email} será adicionado como colaborador quando a nota for criada" + }, + "colors": { + "blue": "Azul", + "default": "Padrão", + "gray": "Cinza", + "green": "Verde", + "orange": "Laranja", + "pink": "Rosa", + "purple": "Roxo", + "red": "Vermelho", + "yellow": "Amarelo" + }, + "common": { + "add": "Adicionar", + "cancel": "Cancelar", + "close": "Fechar", + "confirm": "Confirmar", + "delete": "Excluir", + "edit": "Editar", + "error": "Erro", + "loading": "Carregando...", + "noResults": "Sem resultados", + "notAvailable": "Não disponível", + "optional": "Opcional", + "remove": "Remover", + "required": "Obrigatório", + "save": "Salvar", + "search": "Pesquisar", + "success": "Sucesso", + "unknown": "Desconhecido" + }, + "connection": { + "clickToView": "Clique para ver a nota", + "helpful": "Útil", + "isHelpful": "Esta conexão é útil?", + "memoryEchoDiscovery": "Descoberta Memory Echo", + "notHelpful": "Não útil", + "similarityInfo": "Estas notas estão conectadas por {similarity}% de similaridade" + }, + "dataManagement": { + "cleanup": { + "button": "Cleanup", + "description": "Remove labels and connections that reference deleted notes.", + "failed": "Error during cleanup", + "title": "Cleanup Orphaned Data" + }, + "cleanupComplete": "Limpeza concluída", + "cleanupError": "Erro na limpeza", + "dangerZone": "Zona de perigo", + "dangerZoneDescription": "Estas ações são irreversíveis", + "delete": { + "button": "Delete All Notes", + "confirm": "Are you sure? This will permanently delete all your notes.", + "description": "Permanently delete all your notes. This action cannot be undone.", + "failed": "Failed to delete notes", + "success": "All notes deleted", + "title": "Delete All Notes" + }, + "deleting": "Excluindo...", + "export": { + "button": "Export Notes", + "description": "Download all your notes as a JSON file. This includes all content, labels, and metadata.", + "failed": "Failed to export notes", + "success": "Notes exported successfully", + "title": "Export All Notes" + }, + "exporting": "Exportando...", + "import": { + "button": "Import Notes", + "description": "Upload a JSON file to import notes. This will add to your existing notes, not replace them.", + "failed": "Failed to import notes", + "success": "Imported {count} notes", + "title": "Import Notes" + }, + "importing": "Importando...", + "indexing": { + "button": "Rebuild Index", + "description": "Regenerate embeddings for all notes to improve semantic search.", + "failed": "Error during indexing", + "success": "Indexing complete: {count} notes processed", + "title": "Rebuild Search Index" + }, + "indexingComplete": "Indexação concluída", + "indexingError": "Erro na indexação", + "title": "Data Management", + "toolsDescription": "Tools to maintain your database health" + }, + "demoMode": { + "activated": "Modo demonstração ativado! Memory Echo funcionará instantaneamente.", + "createNotesTip": "Crie 2+ notas similares e veja Memory Echo em ação!", + "deactivated": "Modo demonstração desativado. Parâmetros normais restaurados.", + "delayBetweenNotes": "Atraso de 0 dias entre notas (normalmente 7 dias)", + "description": "Acelera Memory Echo para testes. Conexões aparecem instantaneamente.", + "parametersActive": "Parâmetros de demonstração ativos:", + "similarityThreshold": "Limite de similaridade de 50% (normalmente 75%)", + "title": "Modo demonstração", + "toggleFailed": "Falha ao alternar modo demonstração", + "unlimitedInsights": "Insights ilimitados (sem limites de frequência)" + }, + "diagnostics": { + "apiStatus": "Status da API", + "checking": "Checking...", + "configuredProvider": "Provedor configurado", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "Detalhes do teste:", + "tip1": "Certifique-se de que o Ollama está rodando (ollama serve)", + "tip2": "Verifique se o modelo está instalado (ollama pull llama3)", + "tip3": "Verifique sua chave API para OpenAI", + "tip4": "Verifique a conectividade de rede", + "title": "Diagnósticos", + "troubleshootingTitle": "Dicas de solução de problemas:" + }, + "favorites": { + "noFavorites": "Sem favoritos", + "pinToFavorite": "Adicionar aos favoritos", + "title": "Favoritos", + "toggleSection": "Alternar seção" + }, + "footer": { + "openSource": "Clone de código aberto", + "privacy": "Privacidade", + "terms": "Termos" + }, + "general": { + "add": "Adicionar", + "apply": "Aplicar", + "back": "Voltar", + "cancel": "Cancelar", + "clean": "Clean", + "clear": "Limpar", + "close": "Fechar", + "confirm": "Confirmar", + "edit": "Editar", + "error": "Ocorreu um erro", + "indexAll": "Index All", + "loading": "Carregando...", + "next": "Próximo", + "operationFailed": "Operação falhou", + "operationSuccess": "Operação bem-sucedida", + "preview": "Visualizar", + "previous": "Anterior", + "reset": "Redefinir", + "save": "Salvar", + "select": "Selecionar", + "submit": "Enviar", + "testConnection": "Test Connection", + "tryAgain": "Por favor, tente novamente" + }, + "generalSettings": { + "description": "Configurações gerais do aplicativo", + "title": "Configurações gerais" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} etiquetas", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "Sem etiquetas", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "Clique para visualizar", + "comparison": { + "clickToView": "Click to view note", + "helpful": "Helpful", + "helpfulQuestion": "Is this comparison helpful?", + "highSimilarityInsight": "These notes deal with the same topic with a high degree of similarity. They could be merged or consolidated.", + "notHelpful": "Not Helpful", + "similarityInfo": "These notes are connected by {similarity}% similarity", + "title": "💡 Note Comparison", + "untitled": "Untitled" + }, + "connection": "connection", + "connections": "Connections", + "connectionsBadge": "{count} connection{plural}", + "dailyInsight": "Daily insight from your notes", + "description": "Proactive connections between your notes", + "dismiss": "Dismiss for now", + "editorSection": { + "close": "Fechar", + "compare": "Compare", + "compareAll": "Compare all", + "loading": "Loading...", + "merge": "Merge", + "mergeAll": "Merge all", + "title": "⚡ Connected Notes ({count})", + "view": "View" + }, + "fused": "Fused", + "fusion": { + "archiveOriginals": "Archive original notes", + "cancel": "Cancel", + "confirmFusion": "Confirm fusion", + "createBacklinks": "Create backlink to original notes", + "edit": "Edit", + "error": "Failed to merge notes", + "finishEditing": "Finish editing", + "generateError": "Failed to generate fusion", + "generateFusion": "Generate the fusion", + "generating": "Generating...", + "keepAllTags": "Keep all tags", + "mergeNotes": "Merge {count} note(s)", + "modify": "Modify", + "noContentReturned": "No fusion content returned from API", + "notesToMerge": "📝 Notes to merge", + "optionalPrompt": "💬 Fusion prompt (optional)", + "optionsTitle": "Fusion options", + "previewTitle": "📝 Preview of merged note", + "promptPlaceholder": "Optional instructions for AI (e.g., 'Keep the formal style of note 1')...", + "success": "Notes merged successfully!", + "title": "🔗 Intelligent Fusion", + "unknownDate": "Unknown date", + "useLatestTitle": "Use latest note as title" + }, + "helpful": "Helpful", + "insightReady": "Your insight is ready!", + "notHelpful": "Not Helpful", + "overlay": { + "error": "Erro", + "loading": "Loading...", + "noConnections": "No connections found", + "searchPlaceholder": "Search connections...", + "sortBy": "Sort by:", + "sortOldest": "Oldest", + "sortRecent": "Recent", + "sortSimilarity": "Similarity", + "title": "Connected Notes", + "viewAll": "View all side by side" + }, + "thanksFeedback": "Thanks for your feedback!", + "thanksFeedbackImproving": "Thanks! We'll use this to improve.", + "title": "I noticed something...", + "viewConnection": "View Connection" + }, + "nav": { + "accountSettings": "Configurações da conta", + "adminDashboard": "Painel de administração", + "aiSettings": "Configurações de IA", + "archive": "Arquivo", + "buyMeACoffee": "Me pague um café", + "configureAI": "Configure seus recursos com IA, provedor e preferências", + "diagnostics": "Diagnósticos", + "donateOnKofi": "Doar no Ko-fi", + "donationDescription": "Faça uma doação única ou torne-se um apoiador mensal.", + "donationNote": "Sem taxas de plataforma • Pagamentos instantâneos • Seguro", + "favorites": "Favoritos", + "generalNotes": "Notas gerais", + "home": "Início", + "login": "Entrar", + "logout": "Sair", + "manageAISettings": "Gerenciar configurações de IA", + "myLibrary": "Minha biblioteca", + "notebooks": "Cadernos", + "notes": "Notas", + "proPlan": "Pro Plan", + "profile": "Perfil", + "quickAccess": "Acesso rápido", + "recent": "Recentes", + "reminders": "Lembretes", + "settings": "Configurações", + "sponsorDescription": "Torne-se um apoiador mensal e receba reconhecimento.", + "sponsorOnGithub": "Apoiar no GitHub", + "support": "Apoie o Memento ☕", + "supportDescription": "Memento é 100% gratuito e de código aberto. Seu apoio ajuda a mantê-lo assim.", + "supportDevelopment": "Apoie o desenvolvimento do Memento ☕", + "trash": "Lixeira", + "userManagement": "Gerenciamento de usuários", + "workspace": "Espaço de trabalho" + }, + "notebook": { + "cancel": "Cancelar", + "create": "Criar caderno", + "createDescription": "Inicie uma nova coleção para organizar suas notas, ideias e projetos de forma eficiente.", + "createNew": "Criar novo caderno", + "creating": "Criando...", + "delete": "Excluir caderno", + "deleteConfirm": "Excluir", + "deleteWarning": "Tem certeza de que deseja excluir este caderno? As notas serão movidas para Notas Gerais.", + "edit": "Editar caderno", + "editDescription": "Mude o nome, ícone e cor do seu caderno.", + "generating": "Gerando resumo...", + "labels": "Etiquetas", + "name": "Nome do caderno", + "noLabels": "Sem etiquetas", + "selectColor": "Cor", + "selectIcon": "Ícone", + "summary": "Resumo do caderno", + "summaryDescription": "Gere um resumo baseado em IA de todas as notas neste caderno.", + "summaryError": "Erro ao gerar resumo" + }, + "notebookSuggestion": { + "description": "Esta nota parece pertencer a este caderno", + "dismiss": "Descartar", + "dismissIn": "Descartar (fecha em {timeLeft}s)", + "generalNotes": "Notas gerais", + "move": "Mover", + "moveToNotebook": "Mover para caderno", + "title": "Mover para {icon} {name}?" + }, + "notebooks": { + "allNotebooks": "Todos os cadernos", + "create": "Criar caderno", + "createFirst": "Crie seu primeiro caderno", + "noNotebooks": "Nenhum caderno" + }, + "notes": { + "add": "Adicionar", + "addCollaborators": "Adicionar colaboradores", + "addImage": "Adicionar imagem", + "addItem": "Adicionar item", + "addLink": "Adicionar link", + "addListItem": "+ Item da lista", + "addNote": "Adicionar nota", + "adding": "Adicionando...", + "aiAssistant": "Assistente IA", + "archive": "Arquivar", + "backgroundOptions": "Opções de fundo", + "changeColor": "Alterar cor", + "changeSize": "Alterar tamanho", + "clarifyFailed": "Falha ao esclarecer", + "close": "Fechar", + "color": "Cor", + "confirmDelete": "Tem certeza de que deseja excluir esta nota?", + "confirmLeaveShare": "Tem certeza de que deseja sair desta nota compartilhada?", + "contentOrMediaRequired": "Por favor, insira algum conteúdo ou adicione um link/imagem", + "copy": "Copiar", + "copyFailed": "Falha ao copiar nota", + "copySuccess": "Nota copiada com sucesso!", + "createFirstNote": "Crie sua primeira nota", + "date": "Data", + "delete": "Excluir", + "dragToReorder": "Arraste para reordenar", + "duplicate": "Duplicar", + "edit": "Editar nota", + "emptyState": "Nenhuma nota aqui", + "fileTooLarge": "Arquivo muito grande: {fileName}. O tamanho máximo é {maxSize}.", + "improveFailed": "Falha ao melhorar", + "inNotebook": "No caderno", + "invalidDateTime": "Data ou hora inválida", + "invalidFileType": "Tipo de arquivo inválido: {fileName}. Apenas JPEG, PNG, GIF e WebP são permitidos.", + "itemOrMediaRequired": "Por favor, adicione pelo menos um item ou mídia", + "large": "Grande", + "leaveShare": "Sair", + "linkAddFailed": "Falha ao adicionar link", + "linkAdded": "Link adicionado", + "linkMetadataFailed": "Não foi possível obter metadados do link", + "listItem": "Item da lista", + "makeCopy": "Fazer uma cópia", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown DESLIGADO", + "markdownOn": "Markdown LIGADO", + "markdownPlaceholder": "Faça uma nota... (Markdown suportado)", + "medium": "Médio", + "more": "Mais", + "moreOptions": "Mais opções", + "moveFailed": "Falha ao mover", + "newChecklist": "Nova lista de verificação", + "newNote": "Nova nota", + "noContent": "Sem conteúdo", + "noNotes": "Sem notas", + "noNotesFound": "Nenhuma nota encontrada", + "noteCreateFailed": "Falha ao criar nota", + "noteCreated": "Nota criada com sucesso", + "others": "Outros", + "pin": "Fixar", + "pinned": "Fixadas", + "pinnedNotes": "Notas fixadas", + "placeholder": "Faça uma nota...", + "preview": "Visualizar", + "readOnly": "Somente leitura", + "recent": "Recentes", + "redo": "Refazer (Ctrl+Y)", + "redoShortcut": "Refazer (Ctrl+Y)", + "remindMe": "Lembrar-me", + "reminderDateTimeRequired": "Por favor, insira data e hora", + "reminderMustBeFuture": "O lembrete deve estar no futuro", + "reminderPastError": "O lembrete deve estar no futuro", + "reminderRemoved": "Lembrete removido", + "reminderSet": "Lembrete definido para {datetime}", + "remove": "Remove", + "saving": "Salvando...", + "setReminder": "Definir lembrete", + "setReminderButton": "Definir Lembrete", + "share": "Compartilhar", + "shareWithCollaborators": "Compartilhar com colaboradores", + "sharedBy": "Compartilhado por", + "sharedReadOnly": "Esta nota é compartilhada com você no modo somente leitura", + "shortenFailed": "Falha ao encurtar", + "showCollaborators": "Mostrar colaboradores", + "size": "Tamanho", + "small": "Pequeno", + "takeNote": "Faça uma nota...", + "takeNoteMarkdown": "Faça uma nota... (Markdown suportado)", + "time": "Hora", + "title": "Notas", + "titlePlaceholder": "Título", + "transformFailed": "Falha ao transformar", + "unarchive": "Desarquivar", + "undo": "Desfazer (Ctrl+Z)", + "undoShortcut": "Desfazer (Ctrl+Z)", + "unpin": "Desafixar", + "unpinned": "Desafixado", + "untitled": "Sem título", + "uploadFailed": "Falha ao fazer upload de {filename}", + "view": "Ver nota" + }, + "pagination": { + "next": "→", + "pageInfo": "Página {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "Informal", + "expand": "Expandir", + "formal": "Formal", + "improve": "Melhorar", + "shorten": "Encurtar", + "title": "Melhoria de texto" + }, + "profile": { + "accountSettings": "Configurações da conta", + "autoDetect": "Detecção automática", + "changePassword": "Alterar senha", + "changePasswordDescription": "Atualize sua senha. Você precisará da sua senha atual.", + "confirmPassword": "Confirmar senha", + "currentPassword": "Senha atual", + "description": "Atualize suas informações pessoais", + "displayName": "Nome de exibição", + "displaySettings": "Configurações de exibição", + "displaySettingsDescription": "Personalize a aparência e o tamanho da fonte.", + "email": "E-mail", + "fontSize": "Tamanho da fonte", + "fontSizeDescription": "Ajuste o tamanho da fonte para melhor legibilidade. Isso se aplica a todos os textos da interface.", + "fontSizeExtraLarge": "Extra grande", + "fontSizeLarge": "Grande", + "fontSizeMedium": "Médio", + "fontSizeSmall": "Pequeno", + "fontSizeUpdateFailed": "Falha ao atualizar tamanho da fonte", + "fontSizeUpdateSuccess": "Tamanho da fonte atualizado com sucesso", + "languageDescription": "Este idioma será usado para recursos com IA, análise de conteúdo e texto da interface.", + "languagePreferences": "Preferências de idioma", + "languagePreferencesDescription": "Escolha seu idioma preferido para recursos de IA e interface.", + "languageUpdateFailed": "Falha ao atualizar idioma", + "languageUpdateSuccess": "Idioma atualizado com sucesso", + "manageAISettings": "Gerenciar configurações de IA", + "newPassword": "Nova senha", + "passwordChangeFailed": "Falha ao alterar senha", + "passwordChangeSuccess": "Senha alterada com sucesso", + "passwordError": "Erro ao atualizar senha", + "passwordUpdated": "Senha atualizada", + "preferredLanguage": "Idioma preferido", + "profileError": "Erro ao atualizar perfil", + "profileUpdated": "Perfil atualizado", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "Selecionar tamanho da fonte", + "selectLanguage": "Selecione um idioma", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "Perfil", + "updateFailed": "Falha ao atualizar perfil", + "updatePassword": "Atualizar senha", + "updateSuccess": "Perfil atualizado" + }, + "reminder": { + "cancel": "Cancelar", + "reminderDate": "Data do lembrete", + "reminderTime": "Hora do lembrete", + "removeReminder": "Remover lembrete", + "save": "Definir lembrete", + "setReminder": "Definir lembrete", + "title": "Lembrete" + }, + "resetPassword": { + "confirmNewPassword": "Confirmar nova senha", + "description": "Digite sua nova senha abaixo.", + "invalidLinkDescription": "Este link de redefinição de senha é inválido ou expirou.", + "invalidLinkTitle": "Link inválido", + "loading": "Carregando...", + "newPassword": "Nova senha", + "passwordMismatch": "As senhas não coincidem", + "requestNewLink": "Solicitar novo link", + "resetPassword": "Redefinir senha", + "resetting": "Redefinindo...", + "success": "Senha redefinida com sucesso. Você pode fazer login agora.", + "title": "Redefinir senha" + }, + "search": { + "exactMatch": "Correspondência exata", + "noResults": "Nenhum resultado encontrado", + "placeholder": "Pesquisar", + "related": "Relacionado", + "resultsFound": "{count} notas encontradas", + "searchPlaceholder": "Pesquise suas notas...", + "searching": "Pesquisando...", + "semanticInProgress": "Pesquisa semântica em andamento...", + "semanticTooltip": "Pesquisa semântica com IA" }, "semanticSearch": { "exactMatch": "Correspondência exata", "related": "Relacionado", "searching": "Pesquisando..." }, - "paragraphRefactor": { - "title": "Melhoria de texto", - "shorten": "Encurtar", - "expand": "Expandir", - "improve": "Melhorar", - "formal": "Formal", - "casual": "Informal" + "settings": { + "about": "About", + "account": "Account", + "appearance": "Appearance", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "Manage your settings and preferences", + "language": "Language", + "languageAuto": "Automático", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "Notifications", + "privacy": "Privacy", + "profile": "Perfil", + "searchNoResults": "Nenhum resultado encontrado", + "security": "Security", + "selectLanguage": "Select language", + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "Error saving settings", + "settingsSaved": "Settings saved", + "theme": "Theme", + "themeDark": "Dark", + "themeLight": "Light", + "themeSystem": "System", + "title": "Settings", + "version": "Version" }, - "memoryEcho": { - "title": "Notei algo...", - "description": "Conexões proativas entre suas notas", - "dailyInsight": "Percepção diária das suas notas", - "insightReady": "Sua percepção está pronta!", - "viewConnection": "Ver conexão", - "helpful": "Útil", - "notHelpful": "Não útil", - "dismiss": "Descartar por enquanto", - "thanksFeedback": "Obrigado pelo seu feedback!", - "thanksFeedbackImproving": "Obrigado! Usaremos isso para melhorar.", - "connections": "Conexões", - "connection": "conexão", - "connectionsBadge": "{count} conexão{plural}", - "fused": "Fundido", - "overlay": { - "title": "Notas conectadas", - "searchPlaceholder": "Pesquisar conexões...", - "sortBy": "Ordenar por:", - "sortSimilarity": "Similaridade", - "sortRecent": "Recente", - "sortOldest": "Mais antigo", - "viewAll": "Ver todas lado a lado", - "loading": "Carregando...", - "noConnections": "Nenhuma conexão encontrada" - }, - "comparison": { - "title": "💡 Comparação de notas", - "similarityInfo": "Estas notas estão conectadas por {similarity}% de similaridade", - "highSimilarityInsight": "Estas notas tratam do mesmo assunto com alto grau de similaridade. Podem ser mescladas ou consolidadas.", - "untitled": "Sem título", - "clickToView": "Clique para ver a nota", - "helpfulQuestion": "Esta comparação é útil?", - "helpful": "Útil", - "notHelpful": "Não útil" - }, - "editorSection": { - "title": "⚡ Notas conectadas ({count})", - "loading": "Carregando...", - "view": "Ver", - "compare": "Comparar", - "merge": "Mesclar", - "compareAll": "Comparar todas", - "mergeAll": "Mesclar todas" - }, - "fusion": { - "title": "🔗 Fusão inteligente", - "mergeNotes": "Mesclar {count} nota(s)", - "notesToMerge": "📝 Notas para mesclar", - "optionalPrompt": "💬 Prompt de fusão (opcional)", - "promptPlaceholder": "Instruções opcionais para IA (ex: 'Manter o estilo formal da nota 1')...", - "generateFusion": "Gerar a fusão", - "generating": "Gerando...", - "previewTitle": "📝 Visualização da nota mesclada", - "edit": "Editar", - "modify": "Modificar", - "finishEditing": "Concluir edição", - "optionsTitle": "Opções de fusão", - "archiveOriginals": "Arquivar notas originais", - "keepAllTags": "Manter todas as tags", - "useLatestTitle": "Usar a nota mais recente como título", - "createBacklinks": "Criar backlink para notas originais", - "cancel": "Cancelar", - "confirmFusion": "Confirmar fusão", - "success": "Notas mescladas com sucesso!", - "error": "Falha ao mesclar notas", - "generateError": "Falha ao gerar fusão", - "noContentReturned": "Nenhum conteúdo de fusão retornado da API", - "unknownDate": "Data desconhecida" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" + }, + "support": { + "aiApiCosts": "Custos de API de IA:", + "buyMeACoffee": "Me pague um café", + "contributeCode": "Contribuir com código", + "description": "Memento é 100% gratuito e de código aberto. Seu apoio ajuda a mantê-lo assim.", + "directImpact": "Impacto direto", + "domainSSL": "Domínio e SSL:", + "donateOnKofi": "Doar no Ko-fi", + "donationDescription": "Faça uma doação única ou torne-se um apoiador mensal.", + "githubDescription": "Apoio recorrente • Reconhecimento público • Focado em desenvolvedores", + "hostingServers": "Hospedagem e servidores:", + "howSupportHelps": "Como seu apoio ajuda", + "kofiDescription": "Sem taxas de plataforma • Pagamentos instantâneos • Seguro", + "otherWaysTitle": "Outras formas de apoiar", + "reportBug": "Reportar um bug", + "shareTwitter": "Compartilhar no Twitter", + "sponsorDescription": "Torne-se um patrocinador mensal e obtenha reconhecimento.", + "sponsorOnGithub": "Patrocine no GitHub", + "sponsorPerks": "Benefícios do patrocínio", + "starGithub": "Estrela no GitHub", + "title": "Apoie o desenvolvimento do Memento", + "totalExpenses": "Despesas totais:", + "transparency": "Transparência", + "transparencyDescription": "Acredito em total transparência. Veja como as doações são usadas:" + }, + "testPages": { + "titleSuggestions": { + "analyzing": "Analisando...", + "contentLabel": "Conteúdo (precisa de mais de 50 palavras):", + "error": "Erro:", + "idle": "Inativo", + "noSuggestions": "Sem sugestões ainda. Digite 50+ palavras e espere 2 segundos.", + "placeholder": "Digite pelo menos 50 palavras aqui...", + "status": "Status:", + "suggestions": "Sugestões ({count}):", + "title": "Testar sugestões de título", + "wordCount": "Contagem de palavras:" } }, - "nav": { - "home": "Início", - "notes": "Notas", - "notebooks": "Cadernos", - "generalNotes": "Notas gerais", - "archive": "Arquivo", - "settings": "Configurações", - "profile": "Perfil", - "aiSettings": "Configurações de IA", - "logout": "Sair", - "login": "Entrar", - "adminDashboard": "Painel de administração", - "diagnostics": "Diagnósticos", - "trash": "Lixeira", - "support": "Apoie o Memento ☕", - "reminders": "Lembretes", - "userManagement": "Gerenciamento de usuários", - "accountSettings": "Configurações da conta", - "manageAISettings": "Gerenciar configurações de IA", - "configureAI": "Configure seus recursos com IA, provedor e preferências", - "supportDevelopment": "Apoie o desenvolvimento do Memento ☕", - "supportDescription": "Memento é 100% gratuito e de código aberto. Seu apoio ajuda a mantê-lo assim.", - "buyMeACoffee": "Me pague um café", - "donationDescription": "Faça uma doação única ou torne-se um apoiador mensal.", - "donateOnKofi": "Doar no Ko-fi", - "donationNote": "Sem taxas de plataforma • Pagamentos instantâneos • Seguro", - "sponsorOnGithub": "Apoiar no GitHub", - "sponsorDescription": "Torne-se um apoiador mensal e receba reconhecimento.", - "workspace": "Espaço de trabalho", - "quickAccess": "Acesso rápido", - "myLibrary": "Minha biblioteca", - "favorites": "Favoritos", - "recent": "Recentes", - "proPlan": "Pro Plan" + "time": { + "daysAgo": "{count} dias atrás", + "hoursAgo": "{count} horas atrás", + "justNow": "Agora", + "minutesAgo": "{count} minutos atrás", + "today": "Hoje", + "tomorrow": "Amanhã", + "yesterday": "Ontem" }, - "settings": { - "title": "Configurações", - "description": "Gerencie suas configurações e preferências", - "account": "Conta", - "appearance": "Aparência", - "theme": "Tema", - "themeLight": "Claro", - "themeDark": "Escuro", - "themeSystem": "Sistema", - "notifications": "Notificações", - "language": "Idioma", - "selectLanguage": "Selecionar idioma", - "privacy": "Privacidade", - "security": "Segurança", - "about": "Sobre", - "version": "Versão", - "settingsSaved": "Configurações salvas", - "settingsError": "Erro ao salvar configurações" - }, - "profile": { - "title": "Perfil", - "description": "Atualize suas informações pessoais", - "displayName": "Nome de exibição", - "email": "E-mail", - "changePassword": "Alterar senha", - "changePasswordDescription": "Atualize sua senha. Você precisará da sua senha atual.", - "currentPassword": "Senha atual", - "newPassword": "Nova senha", - "confirmPassword": "Confirmar senha", - "updatePassword": "Atualizar senha", - "passwordChangeSuccess": "Senha alterada com sucesso", - "passwordChangeFailed": "Falha ao alterar senha", - "passwordUpdated": "Senha atualizada", - "passwordError": "Erro ao atualizar senha", - "languagePreferences": "Preferências de idioma", - "languagePreferencesDescription": "Escolha seu idioma preferido para recursos de IA e interface.", - "preferredLanguage": "Idioma preferido", - "selectLanguage": "Selecione um idioma", - "languageDescription": "Este idioma será usado para recursos com IA, análise de conteúdo e texto da interface.", - "autoDetect": "Detecção automática", - "updateSuccess": "Perfil atualizado", - "updateFailed": "Falha ao atualizar perfil", - "languageUpdateSuccess": "Idioma atualizado com sucesso", - "languageUpdateFailed": "Falha ao atualizar idioma", - "profileUpdated": "Perfil atualizado", - "profileError": "Erro ao atualizar perfil", - "accountSettings": "Configurações da conta", - "manageAISettings": "Gerenciar configurações de IA", - "displaySettings": "Configurações de exibição", - "displaySettingsDescription": "Personalize a aparência e o tamanho da fonte.", - "fontSize": "Tamanho da fonte", - "selectFontSize": "Selecionar tamanho da fonte", - "fontSizeSmall": "Pequeno", - "fontSizeMedium": "Médio", - "fontSizeLarge": "Grande", - "fontSizeExtraLarge": "Extra grande", - "fontSizeDescription": "Ajuste o tamanho da fonte para melhor legibilidade. Isso se aplica a todos os textos da interface.", - "fontSizeUpdateSuccess": "Tamanho da fonte atualizado com sucesso", - "fontSizeUpdateFailed": "Falha ao atualizar tamanho da fonte" - }, - "aiSettings": { - "title": "Configurações de IA", - "description": "Configure seus recursos e preferências com IA", - "features": "Recursos de IA", - "provider": "Provedor de IA", - "providerAuto": "Automático (Recomendado)", - "providerOllama": "Ollama (Local)", - "providerOpenAI": "OpenAI (Nuvem)", - "frequency": "Frequência", - "frequencyDaily": "Diariamente", - "frequencyWeekly": "Semanalmente", - "saving": "Salvando...", - "saved": "Configuração atualizada", - "error": "Falha ao atualizar configuração" - }, - "general": { - "loading": "Carregando...", - "save": "Salvar", - "cancel": "Cancelar", - "add": "Adicionar", - "edit": "Editar", - "confirm": "Confirmar", - "close": "Fechar", - "back": "Voltar", - "next": "Próximo", - "previous": "Anterior", - "submit": "Enviar", - "reset": "Redefinir", - "apply": "Aplicar", - "clear": "Limpar", - "select": "Selecionar", - "tryAgain": "Por favor, tente novamente", - "error": "Ocorreu um erro", - "operationSuccess": "Operação bem-sucedida", - "operationFailed": "Operação falhou" - }, - "colors": { - "default": "Padrão", - "red": "Vermelho", - "blue": "Azul", - "green": "Verde", - "yellow": "Amarelo", - "purple": "Roxo", - "pink": "Rosa", - "orange": "Laranja", - "gray": "Cinza" - }, - "reminder": { - "title": "Lembrete", - "setReminder": "Definir lembrete", - "removeReminder": "Remover lembrete", - "reminderDate": "Data do lembrete", - "reminderTime": "Hora do lembrete", - "save": "Definir lembrete", - "cancel": "Cancelar" - }, - "notebookSuggestion": { - "title": "Mover para {icon} {name}?", - "description": "Esta nota parece pertencer a este caderno", - "move": "Mover", + "titleSuggestions": { + "available": "Sugestões de título", "dismiss": "Descartar", - "dismissIn": "Descartar (fecha em {timeLeft}s)", - "moveToNotebook": "Mover para caderno", - "generalNotes": "Notas gerais" + "generating": "Gerando...", + "selectTitle": "Selecione um título", + "title": "Sugestões de IA" + }, + "toast": { + "feedbackFailed": "Falha ao enviar feedback", + "notesFusionSuccess": "Notas mescladas com sucesso!", + "openConnectionFailed": "Falha ao abrir conexão", + "openingConnection": "Abrindo conexão...", + "operationFailed": "Operação falhou", + "operationSuccess": "Operação bem-sucedida", + "saveFailed": "Falha ao salvar configuração", + "saved": "Configuração salva", + "thanksFeedback": "Obrigado pelo seu feedback!", + "thanksFeedbackImproving": "Obrigado! Usaremos isso para melhorar." + }, + "trash": { + "deletePermanently": "Excluir permanentemente", + "empty": "A lixeira está vazia", + "restore": "Restaurar", + "title": "Lixeira" + }, + "ui": { + "close": "Fechar", + "collapse": "Recolher", + "expand": "Expandir", + "open": "Abrir" } } diff --git a/keep-notes/locales/ru.json b/keep-notes/locales/ru.json index 4a45347..25335ba 100644 --- a/keep-notes/locales/ru.json +++ b/keep-notes/locales/ru.json @@ -1,511 +1,989 @@ { - "auth": { - "signIn": "Войти", - "signUp": "Зарегистрироваться", - "email": "Эл. почта", - "password": "Пароль", - "name": "Имя", - "emailPlaceholder": "Введите адрес электронной почты", - "passwordPlaceholder": "Введите пароль", - "namePlaceholder": "Введите ваше имя", - "passwordMinChars": "Введите пароль (минимум 6 символов)", - "resetPassword": "Сбросить пароль", - "resetPasswordInstructions": "Введите вашу почту для сброса пароля", - "forgotPassword": "Забыли пароль?", - "noAccount": "Нет аккаунта?", - "hasAccount": "Уже есть аккаунт?", - "signInToAccount": "Войдите в свой аккаунт", - "createAccount": "Создайте свой аккаунт", - "rememberMe": "Запомнить меня", - "orContinueWith": "Или продолжить с", - "checkYourEmail": "Проверьте вашу почту", - "resetEmailSent": "Мы отправили ссылку для сброса пароля на вашу почту, если она существует в нашей системе.", - "returnToLogin": "Вернуться ко входу", - "forgotPasswordTitle": "Забыли пароль", - "forgotPasswordDescription": "Введите адрес электронной почты, и мы отправим вам ссылку для сброса пароля.", - "sending": "Отправка...", - "sendResetLink": "Отправить ссылку для сброса", - "backToLogin": "Вернуться ко входу" + "about": { + "appDescription": "Мощное приложение для заметок с функциями на базе ИИ", + "appName": "Keep Notes", + "buildDate": "Дата сборки", + "description": "Информация о приложении", + "features": { + "description": "Возможности на базе ИИ", + "dragDrop": "Управление заметками перетаскиванием", + "labelSystem": "Система меток", + "memoryEcho": "Ежедневные идеи Memory Echo", + "multipleProviders": "Несколько провайдеров ИИ (OpenAI, Ollama)", + "notebookOrganization": "Организация по блокнотам", + "paragraphReformulation": "Реформулировка абзацев", + "semanticSearch": "Семантический поиск с эмбеддингами", + "title": "Функции", + "titleSuggestions": "Предложения заголовков с ИИ" + }, + "platform": "Платформа", + "platformWeb": "Веб", + "support": { + "description": "Получите помощь и оставьте отзыв", + "documentation": "Документация", + "feedback": "Отзыв", + "reportIssues": "Сообщить о проблемах", + "title": "Поддержка" + }, + "technology": { + "ai": "ИИ", + "authentication": "Аутентификация", + "backend": "Бэкенд", + "database": "База данных", + "description": "Создано с использованием современных технологий", + "frontend": "Фронтенд", + "testing": "Тестирование", + "title": "Технологический стек", + "ui": "UI" + }, + "title": "О программе", + "version": "Версия" }, - "notes": { - "title": "Заметки", - "newNote": "Новая заметка", - "untitled": "Без названия", - "placeholder": "Сделайте заметку...", - "markdownPlaceholder": "Сделайте заметку... (Поддерживается Markdown)", - "titlePlaceholder": "Заголовок", - "listItem": "Элемент списка", - "addListItem": "+ Элемент списка", - "newChecklist": "Новый контрольный список", - "add": "Добавить", - "adding": "Добавление...", - "close": "Закрыть", - "confirmDelete": "Вы уверены, что хотите удалить эту заметку?", - "confirmLeaveShare": "Вы уверены, что хотите покинуть эту общую заметку?", - "sharedBy": "Поделился", - "leaveShare": "Покинуть", - "delete": "Удалить", - "archive": "Архивировать", - "unarchive": "Разархивировать", - "pin": "Закрепить", - "unpin": "Открепить", - "color": "Цвет", - "changeColor": "Изменить цвет", - "setReminder": "Установить напоминание", - "setReminderButton": "Установить напоминание", - "date": "Дата", - "time": "Время", - "reminderDateTimeRequired": "Пожалуйста, введите дату и время", - "invalidDateTime": "Недействительная дата или время", - "reminderMustBeFuture": "Напоминание должно быть в будущем", - "reminderSet": "Напоминание установлено на {datetime}", - "reminderPastError": "Напоминание должно быть в будущем", - "reminderRemoved": "Напоминание удалено", - "addImage": "Добавить изображение", - "addLink": "Добавить ссылку", - "linkAdded": "Ссылка добавлена", - "linkMetadataFailed": "Не удалось получить метаданные ссылки", - "linkAddFailed": "Не удалось добавить ссылку", - "invalidFileType": "Недопустимый тип файла: {fileName}. Разрешены только JPEG, PNG, GIF и WebP.", - "fileTooLarge": "Файл слишком большой: {fileName}. Максимальный размер - {maxSize}.", - "uploadFailed": "Не удалось загрузить {filename}", - "contentOrMediaRequired": "Пожалуйста, введите содержимое или добавьте ссылку/изображение", - "itemOrMediaRequired": "Пожалуйста, добавьте хотя бы один элемент или медиа", - "noteCreated": "Заметка успешно создана", - "noteCreateFailed": "Не удалось создать заметку", - "aiAssistant": "ИИ-помощник", - "changeSize": "Изменить размер", - "backgroundOptions": "Параметры фона", - "moreOptions": "Больше параметров", - "remindMe": "Напомнить мне", - "markdownMode": "Markdown", - "addCollaborators": "Добавить соавторов", - "duplicate": "Дублировать", - "share": "Поделиться", - "showCollaborators": "Показать соавторов", - "pinned": "Закреплённые", - "others": "Другие", - "noNotes": "Нет заметок", - "noNotesFound": "Заметки не найдены", - "createFirstNote": "Создайте свою первую заметку", - "size": "Размер", - "small": "Маленький", - "medium": "Средний", - "large": "Большой", - "shareWithCollaborators": "Поделиться с соавторами", - "view": "Просмотреть заметку", - "edit": "Редактировать заметку", - "readOnly": "Только чтение", - "preview": "Предпросмотр", - "noContent": "Нет содержимого", - "takeNote": "Сделайте заметку...", - "takeNoteMarkdown": "Сделайте заметку... (Поддерживается Markdown)", - "addItem": "Добавить элемент", - "sharedReadOnly": "Эта заметка предоставлена вам в режиме только для чтения", - "makeCopy": "Сделать копию", - "saving": "Сохранение...", - "copySuccess": "Заметка успешно скопирована!", - "copyFailed": "Не удалось скопировать заметку", - "copy": "Копировать", - "markdownOn": "Markdown ВКЛ", - "markdownOff": "Markdown ВЫКЛ", - "undo": "Отменить (Ctrl+Z)", - "redo": "Повторить (Ctrl+Y)" - }, - "pagination": { - "previous": "←", - "pageInfo": "Страница {currentPage} / {totalPages}", - "next": "→" - }, - "labels": { - "title": "Метки", - "filter": "Фильтр по метке", - "manage": "Управление метками", - "manageTooltip": "Управление метками", - "changeColor": "Изменить цвет", - "changeColorTooltip": "Изменить цвет", - "delete": "Удалить", - "deleteTooltip": "Удалить метку", - "confirmDelete": "Вы уверены, что хотите удалить эту метку?", - "newLabelPlaceholder": "Создать новую метку", - "namePlaceholder": "Введите название метки", - "addLabel": "Добавить метку", - "createLabel": "Создать метку", - "labelName": "Название метки", - "labelColor": "Цвет метки", - "manageLabels": "Управление метками", - "manageLabelsDescription": "Добавьте или удалите метки для этой заметки. Нажмите на метку, чтобы изменить её цвет.", - "selectedLabels": "Выбранные метки", - "allLabels": "Все метки", - "clearAll": "Очистить всё", - "filterByLabel": "Фильтр по метке", - "tagAdded": "Тег \"{tag}\" добавлен", - "showLess": "Показать меньше", - "showMore": "Показать больше", - "editLabels": "Редактировать метки", - "editLabelsDescription": "Создавайте, редактируйте цвета или удаляйте метки.", - "noLabelsFound": "Метки не найдены.", - "loading": "Загрузка...", - "notebookRequired": "⚠️ Метки доступны только в блокнотах. Сначала переместите эту заметку в блокнот." - }, - "search": { - "placeholder": "Поиск", - "searchPlaceholder": "Поиск в заметках...", - "semanticInProgress": "ИИ-поиск...", - "semanticTooltip": "Семантический поиск с ИИ", - "searching": "Поиск...", - "noResults": "Результаты не найдены", - "resultsFound": "Найдено заметок: {count}", - "exactMatch": "Точное совпадение", - "related": "Связанные" - }, - "collaboration": { - "emailPlaceholder": "Введите адрес электронной почты", - "addCollaborator": "Добавить соавтора", - "removeCollaborator": "Удалить соавтора", - "owner": "Владелец", - "canEdit": "Может редактировать", - "canView": "Может просматривать", - "shareNote": "Поделиться заметкой", - "shareWithCollaborators": "Поделиться с соавторами", - "addCollaboratorDescription": "Добавьте людей для совместной работы над этой заметкой по их адресу электронной почты.", - "viewerDescription": "У вас есть доступ к этой заметке. Только владелец может управлять соавторами.", - "emailAddress": "Адрес электронной почты", - "enterEmailAddress": "Введите адрес электронной почты", - "invite": "Пригласить", - "peopleWithAccess": "Люди с доступом", - "noCollaborators": "Соавторов пока нет. Добавьте кого-нибудь выше!", - "noCollaboratorsViewer": "Соавторов пока нет.", - "pendingInvite": "Ожидающее приглашение", - "pending": "Ожидает", - "remove": "Удалить", - "unnamedUser": "Безымянный пользователь", - "done": "Готово", - "willBeAdded": "{email} будет добавлен как соавтор при создании заметки", - "alreadyInList": "Этот адрес уже в списке", - "nowHasAccess": "{name} теперь имеет доступ к этой заметке", - "accessRevoked": "Доступ был отозван", - "errorLoading": "Ошибка загрузки соавторов", - "failedToAdd": "Не удалось добавить соавтора", - "failedToRemove": "Не удалось удалить соавтора" + "admin": { + "ai": { + "apiKey": "API Key", + "baseUrl": "Base URL", + "commonEmbeddingModels": "Common embedding models for OpenAI-compatible APIs", + "commonModelsDescription": "Common models for OpenAI-compatible APIs", + "description": "Configure AI providers for auto-tagging and semantic search. Use different providers for optimal performance.", + "embeddingsDescription": "AI provider for semantic search embeddings. Recommended: OpenAI (best quality).", + "embeddingsProvider": "Embeddings Provider", + "model": "Model", + "modelRecommendations": "gpt-4o-mini = Best value • gpt-4o = Best quality", + "openAIKeyDescription": "Your OpenAI API key from platform.openai.com", + "openTestPanel": "Open AI Test Panel", + "provider": "Provider", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING is required", + "providerTagsRequired": "AI_PROVIDER_TAGS is required", + "saveSettings": "Save AI Settings", + "saving": "Saving...", + "selectEmbeddingModel": "Select an embedding model installed on your system", + "selectOllamaModel": "Select an Ollama model installed on your system", + "tagsGenerationDescription": "AI provider for automatic tag suggestions. Recommended: Ollama (free, local).", + "tagsGenerationProvider": "Tags Generation Provider", + "title": "AI Configuration", + "updateFailed": "Failed to update AI settings", + "updateSuccess": "AI Settings updated successfully" + }, + "aiTest": { + "description": "Test your AI providers for tag generation and semantic search embeddings", + "embeddingDimensions": "Embedding Dimensions:", + "embeddingsTestDescription": "Test the AI provider responsible for semantic search embeddings", + "embeddingsTestTitle": "Embeddings Test", + "error": "Error:", + "first5Values": "First 5 values:", + "generatedTags": "Generated Tags:", + "howItWorksTitle": "How Testing Works", + "model": "Model:", + "provider": "Provider:", + "responseTime": "Response time: {time}ms", + "runTest": "Run Test", + "tagsTestDescription": "Test the AI provider responsible for automatic tag suggestions", + "tagsTestTitle": "Tags Generation Test", + "testError": "Test Error: {error}", + "testFailed": "Test Failed", + "testPassed": "Test Passed", + "testing": "Testing...", + "tipDescription": "Use the AI Test Panel to diagnose configuration issues before testing.", + "tipTitle": "Tip:", + "title": "AI Provider Testing", + "vectorDimensions": "vector dimensions" + }, + "aiTesting": "AI Testing", + "security": { + "allowPublicRegistration": "Allow Public Registration", + "allowPublicRegistrationDescription": "If disabled, new users can only be added by an Administrator via the User Management page.", + "description": "Manage access control and registration policies.", + "title": "Security Settings", + "updateFailed": "Failed to update security settings", + "updateSuccess": "Security Settings updated" + }, + "settings": "Admin Settings", + "smtp": { + "description": "Configure email server for password resets.", + "forceSSL": "Force SSL/TLS (usually for port 465)", + "fromEmail": "From Email", + "host": "Host", + "ignoreCertErrors": "Ignore Certificate Errors (Self-hosted/Dev only)", + "password": "Password", + "port": "Port", + "saveSettings": "Save SMTP Settings", + "sending": "Sending...", + "testEmail": "Test Email", + "testFailed": "Failed: {error}", + "testSuccess": "Test email sent successfully!", + "title": "SMTP Configuration", + "updateFailed": "Failed to update SMTP settings", + "updateSuccess": "SMTP Settings updated", + "username": "Username" + }, + "title": "Admin Dashboard", + "userManagement": "User Management", + "users": { + "addUser": "Add User", + "confirmDelete": "Вы уверены, что хотите удалить этого пользователя?", + "createFailed": "Failed to create user", + "createSuccess": "User created successfully", + "createUser": "Create User", + "createUserDescription": "Add a new user to the system.", + "deleteFailed": "Failed to delete", + "deleteSuccess": "User deleted", + "demote": "Понизить", + "email": "Email", + "name": "Name", + "password": "Password", + "promote": "Повысить", + "role": "Role", + "roleUpdateFailed": "Failed to update role", + "roleUpdateSuccess": "User role updated to {role}", + "roles": { + "admin": "Администратор", + "user": "Пользователь" + }, + "table": { + "actions": "Actions", + "createdAt": "Created At", + "email": "Email", + "name": "Name", + "role": "Role" + } + } }, "ai": { - "analyzing": "ИИ анализирует...", - "clickToAddTag": "Нажмите, чтобы добавить этот тег", - "ignoreSuggestion": "Игнорировать это предложение", - "generatingTitles": "Генерация заголовков...", - "generateTitlesTooltip": "Генерировать заголовки с помощью ИИ", - "poweredByAI": "Работает на ИИ", - "languageDetected": "Язык обнаружен", - "processing": "Обработка...", - "tagAdded": "Тег \"{tag}\" добавлен", - "titleGenerating": "Генерация...", - "titleGenerateWithAI": "Генерировать заголовки с помощью ИИ", - "titleGenerationMinWords": "Содержимое должно содержать минимум 10 слов для генерации заголовков (текущее: {count} слов)", - "titleGenerationError": "Ошибка при генерации заголовков", - "titlesGenerated": "💡 Сгенерировано заголовков: {count}!", - "titleGenerationFailed": "Не удалось сгенерировать заголовки", - "titleApplied": "Заголовок применён!", - "reformulationNoText": "Пожалуйста, выделите текст или добавьте содержимое", - "reformulationSelectionTooShort": "Выделение слишком короткое, используется полное содержимое", - "reformulationMinWords": "Текст должен содержать минимум 10 слов (текущее: {count} слов)", - "reformulationMaxWords": "Текст должен содержать максимум 500 слов", - "reformulationError": "Ошибка при реформулировании", - "reformulationFailed": "Не удалось реформулировать текст", - "reformulationApplied": "Реформулированный текст применён!", - "transformMarkdown": "Преобразовать в Markdown", - "transforming": "Преобразование...", - "transformSuccess": "Текст успешно преобразован в Markdown!", - "transformError": "Ошибка при преобразовании", - "assistant": "ИИ-помощник", - "generating": "Генерация...", - "generateTitles": "Генерировать заголовки", - "reformulateText": "Реформулировать текст", - "reformulating": "Реформирование...", - "clarify": "Уточнить", - "shorten": "Сократить", - "improveStyle": "Улучшить стиль", - "reformulationComparison": "Сравнение реформулирования", - "original": "Оригинал", - "reformulated": "Реформулировано" + "analyzing": "AI analyzing...", + "assistant": "AI Assistant", + "autoLabels": { + "analyzing": "Анализ ваших заметок для предложений меток...", + "create": "Создать", + "createNewLabel": "Создать новую метку", + "created": "{count} labels created successfully", + "creating": "Создание меток...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(новая)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "Предложения Меток", + "typeContent": "Type content to get label suggestions...", + "typeForSuggestions": "Введите для предложений" + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Ошибка применения", + "applying": "Applying...", + "description": "ИИ проанализирует ваши заметки и предложит организовать их в блокноты.", + "error": "Ошибка организации", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "Нет выбранных заметок", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Выбрать всё в", + "selectNote": "Выбрать заметку", + "success": "Организация завершена", + "title": "Пакетная организация" + }, + "clarify": "Clarify", + "clickToAddTag": "Click to add this tag", + "generateTitles": "Generate titles", + "generateTitlesTooltip": "Generate titles with AI", + "generating": "Generating...", + "generatingTitles": "Generating titles...", + "ignoreSuggestion": "Ignore this suggestion", + "improveStyle": "Improve style", + "languageDetected": "Language detected", + "notebookSummary": { + "regenerate": "Перегенерировать Сводку", + "regenerating": "Перегенерация сводки..." + }, + "original": "Original", + "poweredByAI": "Powered by AI", + "processing": "Processing...", + "reformulateText": "Reformulate text", + "reformulated": "Reformulated", + "reformulating": "Reformulating...", + "reformulationApplied": "Reformulated text applied!", + "reformulationComparison": "Reformulation Comparison", + "reformulationError": "Error during reformulation", + "reformulationFailed": "Failed to reformulate text", + "reformulationMaxWords": "Text must have maximum 500 words", + "reformulationMinWords": "Text must have at least 10 words (current: {count} words)", + "reformulationNoText": "Please select text or add content", + "reformulationSelectionTooShort": "Selection too short, using full content", + "shorten": "Shorten", + "tagAdded": "Tag \"{tag}\" added", + "titleApplied": "Title applied!", + "titleGenerateWithAI": "Generate titles with AI", + "titleGenerating": "Generating...", + "titleGenerationError": "Error generating titles", + "titleGenerationFailed": "Failed to generate titles", + "titleGenerationMinWords": "Content must have at least 10 words to generate titles (current: {count} words)", + "titlesGenerated": "💡 {count} titles generated!", + "transformError": "Error during transformation", + "transformMarkdown": "Transform to Markdown", + "transformSuccess": "Text transformed to Markdown successfully!", + "transforming": "Transforming..." }, - "batchOrganization": { - "error": "Не удалось создать план организации", - "noNotesSelected": "Нет выбранных заметок", - "title": "Организовать с ИИ", - "description": "ИИ проанализирует ваши заметки и предложит организовать их в блокноты.", - "analyzing": "Анализ ваших заметок...", - "notesToOrganize": "{count} заметок для организации", - "selected": "{count} выбрано", - "noNotebooks": "Нет доступных блокнотов. Создайте сначала блокноты для организации ваших заметок.", - "noSuggestions": "ИИ не нашел хорошего способа организации этих заметок.", - "confidence": "уверенность", - "unorganized": "{count} заметок не удалось категоризовать и останутся в общих заметках.", - "applying": "Применение...", - "apply": "Применить ({count})" + "aiSettings": { + "description": "Настройте функции и предпочтения на базе ИИ", + "error": "Не удалось обновить настройку", + "features": "Функции ИИ", + "frequency": "Частота", + "frequencyDaily": "Ежедневно", + "frequencyWeekly": "Еженедельно", + "provider": "Провайдер ИИ", + "providerAuto": "Авто (Рекомендуется)", + "providerOllama": "Ollama (Локальный)", + "providerOpenAI": "OpenAI (Облачный)", + "saved": "Настройка обновлена", + "saving": "Сохранение...", + "title": "Настройки ИИ", + "titleSuggestionsDesc": "Предлагать заголовки для заметок без названия после 50+ слов", + "paragraphRefactorDesc": "Параметры улучшения текста с помощью ИИ", + "frequencyDesc": "Как часто анализировать связи между заметками", + "providerDesc": "Выберите предпочитаемого провайдера ИИ", + "providerAutoDesc": "Ollama при наличии, иначе OpenAI", + "providerOllamaDesc": "100% приватно, работает локально на вашем устройстве", + "providerOpenAIDesc": "Наиболее точно, требует API-ключ" + }, + "appearance": { + "description": "Настройте внешний вид приложения", + "title": "Внешний вид" + }, + "auth": { + "backToLogin": "Вернуться ко входу", + "checkYourEmail": "Проверьте вашу почту", + "createAccount": "Создайте свой аккаунт", + "email": "Эл. почта", + "emailPlaceholder": "Введите адрес электронной почты", + "forgotPassword": "Забыли пароль?", + "forgotPasswordDescription": "Введите адрес электронной почты, и мы отправим вам ссылку для сброса пароля.", + "forgotPasswordTitle": "Забыли пароль", + "hasAccount": "Уже есть аккаунт?", + "name": "Имя", + "namePlaceholder": "Введите ваше имя", + "noAccount": "Нет аккаунта?", + "orContinueWith": "Или продолжить с", + "password": "Пароль", + "passwordMinChars": "Введите пароль (минимум 6 символов)", + "passwordPlaceholder": "Введите пароль", + "rememberMe": "Запомнить меня", + "resetEmailSent": "Мы отправили ссылку для сброса пароля на вашу почту, если она существует в нашей системе.", + "resetPassword": "Сбросить пароль", + "resetPasswordInstructions": "Введите вашу почту для сброса пароля", + "returnToLogin": "Вернуться ко входу", + "sendResetLink": "Отправить ссылку для сброса", + "sending": "Отправка...", + "signIn": "Войти", + "signInToAccount": "Войдите в свой аккаунт", + "signOut": "Sign out", + "signUp": "Зарегистрироваться" }, "autoLabels": { - "error": "Не удалось получить предложения меток", - "noLabelsSelected": "Меток не выбраны", - "created": "Меток успешно создано: {count}", "analyzing": "Анализ ваших заметок...", - "title": "Новые предложения меток", + "createNewLabel": "Создать эту новую метку и добавить ее", + "created": "Меток успешно создано: {count}", "description": "Я обнаружил повторяющиеся темы в \"{notebookName}\" ({totalNotes} заметок). Создать метки для них?", + "error": "Не удалось получить предложения меток", + "new": "(новая)", + "noLabelsSelected": "Меток не выбраны", "note": "заметка", "notes": "заметки", - "typeContent": "Введите контент для получения предложений меток...", - "createNewLabel": "Создать эту новую метку и добавить ее", - "new": "(новая)" + "title": "Новые предложения меток", + "typeContent": "Введите контент для получения предложений меток..." }, - "titleSuggestions": { - "available": "Предложения заголовков", - "title": "Предложения ИИ", - "generating": "Генерация...", - "selectTitle": "Выберите заголовок", - "dismiss": "Отклонить" + "batch": { + "organize": "Организовать", + "organizeWithAI": "Организовать с ИИ" + }, + "batchOrganization": { + "analyzing": "Анализ ваших заметок...", + "apply": "Применить ({count})", + "applying": "Применение...", + "confidence": "уверенность", + "description": "ИИ проанализирует ваши заметки и предложит организовать их в блокноты.", + "error": "Не удалось создать план организации", + "noNotebooks": "Нет доступных блокнотов. Создайте сначала блокноты для организации ваших заметок.", + "noNotesSelected": "Нет выбранных заметок", + "noSuggestions": "ИИ не нашел хорошего способа организации этих заметок.", + "notesToOrganize": "{count} заметок для организации", + "selected": "{count} выбрано", + "title": "Организовать с ИИ", + "unorganized": "{count} заметок не удалось категоризовать и останутся в общих заметках." + }, + "collaboration": { + "accessRevoked": "Доступ был отозван", + "addCollaborator": "Добавить соавтора", + "addCollaboratorDescription": "Добавьте людей для совместной работы над этой заметкой по их адресу электронной почты.", + "alreadyInList": "Этот адрес уже в списке", + "canEdit": "Может редактировать", + "canView": "Может просматривать", + "done": "Готово", + "emailAddress": "Адрес электронной почты", + "emailPlaceholder": "Введите адрес электронной почты", + "enterEmailAddress": "Введите адрес электронной почты", + "errorLoading": "Ошибка загрузки соавторов", + "failedToAdd": "Не удалось добавить соавтора", + "failedToRemove": "Не удалось удалить соавтора", + "invite": "Пригласить", + "noCollaborators": "Соавторов пока нет. Добавьте кого-нибудь выше!", + "noCollaboratorsViewer": "Соавторов пока нет.", + "nowHasAccess": "{name} теперь имеет доступ к этой заметке", + "owner": "Владелец", + "pending": "Ожидает", + "pendingInvite": "Ожидающее приглашение", + "peopleWithAccess": "Люди с доступом", + "remove": "Удалить", + "removeCollaborator": "Удалить соавтора", + "shareNote": "Поделиться заметкой", + "shareWithCollaborators": "Поделиться с соавторами", + "unnamedUser": "Безымянный пользователь", + "viewerDescription": "У вас есть доступ к этой заметке. Только владелец может управлять соавторами.", + "willBeAdded": "{email} будет добавлен как соавтор при создании заметки" + }, + "colors": { + "blue": "Синий", + "default": "По умолчанию", + "gray": "Серый", + "green": "Зелёный", + "orange": "Оранжевый", + "pink": "Розовый", + "purple": "Фиолетовый", + "red": "Красный", + "yellow": "Жёлтый" + }, + "common": { + "add": "Добавить", + "cancel": "Отмена", + "close": "Закрыть", + "confirm": "Подтвердить", + "delete": "Удалить", + "edit": "Редактировать", + "error": "Ошибка", + "loading": "Загрузка...", + "noResults": "Нет результатов", + "notAvailable": "Недоступно", + "optional": "Необязательно", + "remove": "Удалить", + "required": "Обязательно", + "save": "Сохранить", + "search": "Поиск", + "success": "Успешно", + "unknown": "Неизвестно" + }, + "connection": { + "clickToView": "Нажмите для просмотра заметки", + "helpful": "Полезно", + "isHelpful": "Эта связь полезна?", + "memoryEchoDiscovery": "Обнаружение Memory Echo", + "notHelpful": "Не полезно", + "similarityInfo": "Эти заметки связаны на {similarity}% сходства" + }, + "dataManagement": { + "cleanup": { + "button": "Cleanup", + "description": "Remove labels and connections that reference deleted notes.", + "failed": "Error during cleanup", + "title": "Cleanup Orphaned Data" + }, + "cleanupComplete": "Очистка завершена", + "cleanupError": "Ошибка очистки", + "dangerZone": "Опасная зона", + "dangerZoneDescription": "Эти действия необратимы", + "delete": { + "button": "Delete All Notes", + "confirm": "Are you sure? This will permanently delete all your notes.", + "description": "Permanently delete all your notes. This action cannot be undone.", + "failed": "Failed to delete notes", + "success": "All notes deleted", + "title": "Delete All Notes" + }, + "deleting": "Удаление...", + "export": { + "button": "Export Notes", + "description": "Download all your notes as a JSON file. This includes all content, labels, and metadata.", + "failed": "Failed to export notes", + "success": "Notes exported successfully", + "title": "Export All Notes" + }, + "exporting": "Экспорт...", + "import": { + "button": "Import Notes", + "description": "Upload a JSON file to import notes. This will add to your existing notes, not replace them.", + "failed": "Failed to import notes", + "success": "Imported {count} notes", + "title": "Import Notes" + }, + "importing": "Импорт...", + "indexing": { + "button": "Rebuild Index", + "description": "Regenerate embeddings for all notes to improve semantic search.", + "failed": "Error during indexing", + "success": "Indexing complete: {count} notes processed", + "title": "Rebuild Search Index" + }, + "indexingComplete": "Индексация завершена", + "indexingError": "Ошибка индексации", + "title": "Data Management", + "toolsDescription": "Tools to maintain your database health" + }, + "demoMode": { + "activated": "Демо-режим активирован! Memory Echo будет работать мгновенно.", + "createNotesTip": "Создайте 2+ похожие заметки и увидьте Memory Echo в действии!", + "deactivated": "Демо-режим деактивирован. Обычные параметры восстановлены.", + "delayBetweenNotes": "Задержка 0 дней между заметками (обычно 7 дней)", + "description": "Ускоряет Memory Echo для тестирования. Связи появляются мгновенно.", + "parametersActive": "Активные демо-параметры:", + "similarityThreshold": "Порог сходства 50% (обычно 75%)", + "title": "Демо-режим", + "toggleFailed": "Ошибка переключения демо-режима", + "unlimitedInsights": "Неограниченные идеи (без ограничений частоты)" + }, + "diagnostics": { + "apiStatus": "Статус API", + "checking": "Checking...", + "configuredProvider": "Настроенный провайдер", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "Детали теста:", + "tip1": "Убедитесь, что Ollama запущен (ollama serve)", + "tip2": "Проверьте, что модель установлена (ollama pull llama3)", + "tip3": "Проверьте ваш API-ключ для OpenAI", + "tip4": "Проверьте сетевое подключение", + "title": "Диагностика", + "troubleshootingTitle": "Советы по устранению неполадок:" + }, + "favorites": { + "noFavorites": "Нет избранного", + "pinToFavorite": "Добавить в избранное", + "title": "Избранное", + "toggleSection": "Переключить раздел" + }, + "footer": { + "openSource": "Open Source клон", + "privacy": "Конфиденциальность", + "terms": "Условия" + }, + "general": { + "add": "Добавить", + "apply": "Применить", + "back": "Назад", + "cancel": "Отмена", + "clean": "Clean", + "clear": "Очистить", + "close": "Закрыть", + "confirm": "Подтвердить", + "edit": "Редактировать", + "error": "Произошла ошибка", + "indexAll": "Index All", + "loading": "Загрузка...", + "next": "Далее", + "operationFailed": "Операция не удалась", + "operationSuccess": "Операция успешна", + "preview": "Предпросмотр", + "previous": "Назад", + "reset": "Сбросить", + "save": "Сохранить", + "select": "Выбрать", + "submit": "Отправить", + "testConnection": "Test Connection", + "tryAgain": "Пожалуйста, попробуйте снова" + }, + "generalSettings": { + "description": "Общие настройки приложения", + "title": "Общие настройки" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} меток", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "Нет меток", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "Нажмите для просмотра", + "comparison": { + "clickToView": "Click to view note", + "helpful": "Helpful", + "helpfulQuestion": "Is this comparison helpful?", + "highSimilarityInsight": "These notes deal with the same topic with a high degree of similarity. They could be merged or consolidated.", + "notHelpful": "Not Helpful", + "similarityInfo": "These notes are connected by {similarity}% similarity", + "title": "💡 Note Comparison", + "untitled": "Untitled" + }, + "connection": "connection", + "connections": "Connections", + "connectionsBadge": "{count} connection{plural}", + "dailyInsight": "Daily insight from your notes", + "description": "Proactive connections between your notes", + "dismiss": "Dismiss for now", + "editorSection": { + "close": "Закрыть", + "compare": "Compare", + "compareAll": "Compare all", + "loading": "Loading...", + "merge": "Merge", + "mergeAll": "Merge all", + "title": "⚡ Connected Notes ({count})", + "view": "View" + }, + "fused": "Fused", + "fusion": { + "archiveOriginals": "Archive original notes", + "cancel": "Cancel", + "confirmFusion": "Confirm fusion", + "createBacklinks": "Create backlink to original notes", + "edit": "Edit", + "error": "Failed to merge notes", + "finishEditing": "Finish editing", + "generateError": "Failed to generate fusion", + "generateFusion": "Generate the fusion", + "generating": "Generating...", + "keepAllTags": "Keep all tags", + "mergeNotes": "Merge {count} note(s)", + "modify": "Modify", + "noContentReturned": "No fusion content returned from API", + "notesToMerge": "📝 Notes to merge", + "optionalPrompt": "💬 Fusion prompt (optional)", + "optionsTitle": "Fusion options", + "previewTitle": "📝 Preview of merged note", + "promptPlaceholder": "Optional instructions for AI (e.g., 'Keep the formal style of note 1')...", + "success": "Notes merged successfully!", + "title": "🔗 Intelligent Fusion", + "unknownDate": "Unknown date", + "useLatestTitle": "Use latest note as title" + }, + "helpful": "Helpful", + "insightReady": "Your insight is ready!", + "notHelpful": "Not Helpful", + "overlay": { + "error": "Ошибка", + "loading": "Loading...", + "noConnections": "No connections found", + "searchPlaceholder": "Search connections...", + "sortBy": "Sort by:", + "sortOldest": "Oldest", + "sortRecent": "Recent", + "sortSimilarity": "Similarity", + "title": "Connected Notes", + "viewAll": "View all side by side" + }, + "thanksFeedback": "Thanks for your feedback!", + "thanksFeedbackImproving": "Thanks! We'll use this to improve.", + "title": "I noticed something...", + "viewConnection": "View Connection" + }, + "nav": { + "accountSettings": "Настройки аккаунта", + "adminDashboard": "Панель администратора", + "aiSettings": "Настройки ИИ", + "archive": "Архив", + "buyMeACoffee": "Купить мне кофе", + "configureAI": "Настройте функции на базе ИИ, провайдера и предпочтения", + "diagnostics": "Диагностика", + "donateOnKofi": "Пожертвовать на Ko-fi", + "donationDescription": "Сделайте единовременное пожертвование или станьте ежемесячным сторонником.", + "donationNote": "Без комиссий платформы • Мгновенные выплаты • Безопасно", + "favorites": "Избранное", + "generalNotes": "Общие заметки", + "home": "Главная", + "login": "Войти", + "logout": "Выйти", + "manageAISettings": "Управление настройками ИИ", + "myLibrary": "Моя библиотека", + "notebooks": "Блокноты", + "notes": "Заметки", + "proPlan": "Про-план", + "profile": "Профиль", + "quickAccess": "Быстрый доступ", + "recent": "Недавние", + "reminders": "Напоминания", + "settings": "Настройки", + "sponsorDescription": "Станьте ежемесячным спонсором и получите признание.", + "sponsorOnGithub": "Спонсорировать на GitHub", + "support": "Поддержать Memento ☕", + "supportDescription": "Memento на 100% бесплатен и открыт. Ваша поддержка помогает сохранить это.", + "supportDevelopment": "Поддержать разработку Memento ☕", + "trash": "Корзина", + "userManagement": "Управление пользователями", + "workspace": "Рабочее пространство" + }, + "notebook": { + "cancel": "Отмена", + "create": "Создать блокнот", + "createDescription": "Начните новую коллекцию для эффективной организации ваших заметок, идей и проектов.", + "createNew": "Создать новый блокнот", + "creating": "Создание...", + "delete": "Удалить блокнот", + "deleteConfirm": "Удалить", + "deleteWarning": "Вы уверены, что хотите удалить этот блокнот? Заметки будут перемещены в Общие заметки.", + "edit": "Редактировать блокнот", + "editDescription": "Измените название, значок и цвет вашего блокнота.", + "generating": "Генерация сводки...", + "labels": "Метки", + "name": "Название блокнота", + "noLabels": "Нет меток", + "selectColor": "Цвет", + "selectIcon": "Значок", + "summary": "Сводка блокнота", + "summaryDescription": "Сгенерируйте сводку на основе ИИ всех заметок в этом блокноте.", + "summaryError": "Ошибка генерации сводки" + }, + "notebookSuggestion": { + "description": "Эта заметка, похоже, принадлежит этому блокноту", + "dismiss": "Отклонить", + "dismissIn": "Отклонить (закроется через {timeLeft}с)", + "generalNotes": "Общие заметки", + "move": "Переместить", + "moveToNotebook": "Переместить в блокнот", + "title": "Переместить в {icon} {name}?" + }, + "notebooks": { + "allNotebooks": "Все блокноты", + "create": "Создать блокнот", + "createFirst": "Создайте свой первый блокнот", + "noNotebooks": "Нет блокнотов" + }, + "notes": { + "add": "Добавить", + "addCollaborators": "Добавить соавторов", + "addImage": "Добавить изображение", + "addItem": "Добавить элемент", + "addLink": "Добавить ссылку", + "addListItem": "+ Элемент списка", + "addNote": "Добавить заметку", + "adding": "Добавление...", + "aiAssistant": "ИИ-помощник", + "archive": "Архивировать", + "backgroundOptions": "Параметры фона", + "changeColor": "Изменить цвет", + "changeSize": "Изменить размер", + "clarifyFailed": "Ошибка уточнения", + "close": "Закрыть", + "color": "Цвет", + "confirmDelete": "Вы уверены, что хотите удалить эту заметку?", + "confirmLeaveShare": "Вы уверены, что хотите покинуть эту общую заметку?", + "contentOrMediaRequired": "Пожалуйста, введите содержимое или добавьте ссылку/изображение", + "copy": "Копировать", + "copyFailed": "Не удалось скопировать заметку", + "copySuccess": "Заметка успешно скопирована!", + "createFirstNote": "Создайте свою первую заметку", + "date": "Дата", + "delete": "Удалить", + "dragToReorder": "Перетащите для изменения порядка", + "duplicate": "Дублировать", + "edit": "Редактировать заметку", + "emptyState": "Здесь нет заметок", + "fileTooLarge": "Файл слишком большой: {fileName}. Максимальный размер - {maxSize}.", + "improveFailed": "Ошибка улучшения", + "inNotebook": "В блокноте", + "invalidDateTime": "Недействительная дата или время", + "invalidFileType": "Недопустимый тип файла: {fileName}. Разрешены только JPEG, PNG, GIF и WebP.", + "itemOrMediaRequired": "Пожалуйста, добавьте хотя бы один элемент или медиа", + "large": "Большой", + "leaveShare": "Покинуть", + "linkAddFailed": "Не удалось добавить ссылку", + "linkAdded": "Ссылка добавлена", + "linkMetadataFailed": "Не удалось получить метаданные ссылки", + "listItem": "Элемент списка", + "makeCopy": "Сделать копию", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown ВЫКЛ", + "markdownOn": "Markdown ВКЛ", + "markdownPlaceholder": "Сделайте заметку... (Поддерживается Markdown)", + "medium": "Средний", + "more": "Ещё", + "moreOptions": "Больше параметров", + "moveFailed": "Ошибка перемещения", + "newChecklist": "Новый контрольный список", + "newNote": "Новая заметка", + "noContent": "Нет содержимого", + "noNotes": "Нет заметок", + "noNotesFound": "Заметки не найдены", + "noteCreateFailed": "Не удалось создать заметку", + "noteCreated": "Заметка успешно создана", + "others": "Другие", + "pin": "Закрепить", + "pinned": "Закреплённые", + "pinnedNotes": "Закреплённые заметки", + "placeholder": "Сделайте заметку...", + "preview": "Предпросмотр", + "readOnly": "Только чтение", + "recent": "Недавние", + "redo": "Повторить (Ctrl+Y)", + "redoShortcut": "Повторить (Ctrl+Y)", + "remindMe": "Напомнить мне", + "reminderDateTimeRequired": "Пожалуйста, введите дату и время", + "reminderMustBeFuture": "Напоминание должно быть в будущем", + "reminderPastError": "Напоминание должно быть в будущем", + "reminderRemoved": "Напоминание удалено", + "reminderSet": "Напоминание установлено на {datetime}", + "remove": "Remove", + "saving": "Сохранение...", + "setReminder": "Установить напоминание", + "setReminderButton": "Установить напоминание", + "share": "Поделиться", + "shareWithCollaborators": "Поделиться с соавторами", + "sharedBy": "Поделился", + "sharedReadOnly": "Эта заметка предоставлена вам в режиме только для чтения", + "shortenFailed": "Ошибка сокращения", + "showCollaborators": "Показать соавторов", + "size": "Размер", + "small": "Маленький", + "takeNote": "Сделайте заметку...", + "takeNoteMarkdown": "Сделайте заметку... (Поддерживается Markdown)", + "time": "Время", + "title": "Заметки", + "titlePlaceholder": "Заголовок", + "transformFailed": "Ошибка преобразования", + "unarchive": "Разархивировать", + "undo": "Отменить (Ctrl+Z)", + "undoShortcut": "Отменить (Ctrl+Z)", + "unpin": "Открепить", + "unpinned": "Откреплённая", + "untitled": "Без названия", + "uploadFailed": "Не удалось загрузить {filename}", + "view": "Просмотреть заметку" + }, + "pagination": { + "next": "→", + "pageInfo": "Страница {currentPage} / {totalPages}", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "Непринуждённый", + "expand": "Расширить", + "formal": "Формальный", + "improve": "Улучшить", + "shorten": "Сократить", + "title": "Улучшение текста" + }, + "profile": { + "accountSettings": "Настройки аккаунта", + "autoDetect": "Автоопределение", + "changePassword": "Изменить пароль", + "changePasswordDescription": "Обновите ваш пароль. Вам понадобится ваш текущий пароль.", + "confirmPassword": "Подтвердите пароль", + "currentPassword": "Текущий пароль", + "description": "Обновите вашу личную информацию", + "displayName": "Отображаемое имя", + "displaySettings": "Настройки отображения", + "displaySettingsDescription": "Настройте внешний вид и размер шрифта.", + "email": "Эл. почта", + "fontSize": "Размер шрифта", + "fontSizeDescription": "Настройте размер шрифта для лучшей читаемости. Это применяется ко всему тексту интерфейса.", + "fontSizeExtraLarge": "Очень большой", + "fontSizeLarge": "Большой", + "fontSizeMedium": "Средний", + "fontSizeSmall": "Маленький", + "fontSizeUpdateFailed": "Не удалось обновить размер шрифта", + "fontSizeUpdateSuccess": "Размер шрифта успешно обновлён", + "languageDescription": "Этот язык будет использоваться для функций на базе ИИ, анализа содержимого и текста интерфейса.", + "languagePreferences": "Языковые предпочтения", + "languagePreferencesDescription": "Выберите предпочитаемый язык для функций ИИ и интерфейса.", + "languageUpdateFailed": "Не удалось обновить язык", + "languageUpdateSuccess": "Язык успешно обновлён", + "manageAISettings": "Управление настройками ИИ", + "newPassword": "Новый пароль", + "passwordChangeFailed": "Не удалось изменить пароль", + "passwordChangeSuccess": "Пароль успешно изменён", + "passwordError": "Ошибка обновления пароля", + "passwordUpdated": "Пароль обновлён", + "preferredLanguage": "Предпочитаемый язык", + "profileError": "Ошибка обновления профиля", + "profileUpdated": "Профиль обновлён", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "Выбрать размер шрифта", + "selectLanguage": "Выберите язык", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "Профиль", + "updateFailed": "Не удалось обновить профиль", + "updatePassword": "Обновить пароль", + "updateSuccess": "Профиль обновлён" + }, + "reminder": { + "cancel": "Отмена", + "reminderDate": "Дата напоминания", + "reminderTime": "Время напоминания", + "removeReminder": "Удалить напоминание", + "save": "Установить напоминание", + "setReminder": "Установить напоминание", + "title": "Напоминание" + }, + "resetPassword": { + "confirmNewPassword": "Подтвердите новый пароль", + "description": "Введите ваш новый пароль ниже.", + "invalidLinkDescription": "Эта ссылка для сброса пароля недействительна или истекла.", + "invalidLinkTitle": "Недействительная ссылка", + "loading": "Загрузка...", + "newPassword": "Новый пароль", + "passwordMismatch": "Пароли не совпадают", + "requestNewLink": "Запросить новую ссылку", + "resetPassword": "Сбросить пароль", + "resetting": "Сброс...", + "success": "Пароль успешно сброшен. Теперь вы можете войти.", + "title": "Сброс пароля" + }, + "search": { + "exactMatch": "Точное совпадение", + "noResults": "Результаты не найдены", + "placeholder": "Поиск", + "related": "Связанные", + "resultsFound": "Найдено заметок: {count}", + "searchPlaceholder": "Поиск в заметках...", + "searching": "Поиск...", + "semanticInProgress": "ИИ-поиск...", + "semanticTooltip": "Семантический поиск с ИИ" }, "semanticSearch": { "exactMatch": "Точное совпадение", "related": "Связанные", "searching": "Поиск..." }, - "paragraphRefactor": { - "title": "Улучшение текста", - "shorten": "Сократить", - "expand": "Расширить", - "improve": "Улучшить", - "formal": "Формальный", - "casual": "Непринуждённый" + "settings": { + "about": "About", + "account": "Account", + "appearance": "Appearance", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "Manage your settings and preferences", + "language": "Language", + "languageAuto": "Автоматически", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "Notifications", + "privacy": "Privacy", + "profile": "Профиль", + "searchNoResults": "Результаты не найдены", + "security": "Security", + "selectLanguage": "Select language", + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "Error saving settings", + "settingsSaved": "Settings saved", + "theme": "Theme", + "themeDark": "Dark", + "themeLight": "Light", + "themeSystem": "System", + "title": "Settings", + "version": "Version" }, - "memoryEcho": { - "title": "Я заметил что-то...", - "description": "Проактивные связи между вашими заметками", - "dailyInsight": "Ежедневные идеи из ваших заметок", - "insightReady": "Ваша идея готова!", - "viewConnection": "Просмотреть связь", - "helpful": "Полезно", - "notHelpful": "Не полезно", - "dismiss": "Отклонить пока", - "thanksFeedback": "Спасибо за ваш отзыв!", - "thanksFeedbackImproving": "Спасибо! Мы используем это для улучшения.", - "connections": "Связи", - "connection": "связь", - "connectionsBadge": "{count} связь{plural}", - "fused": "Объединено", - "overlay": { - "title": "Связанные заметки", - "searchPlaceholder": "Поиск связей...", - "sortBy": "Сортировать по:", - "sortSimilarity": "Сходство", - "sortRecent": "Недавние", - "sortOldest": "Старые", - "viewAll": "Просмотреть все рядом", - "loading": "Загрузка...", - "noConnections": "Связи не найдены" - }, - "comparison": { - "title": "💡 Сравнение заметок", - "similarityInfo": "Эти заметки связаны на {similarity}% сходства", - "highSimilarityInsight": "Эти заметки посвящены одной теме с высокой степенью сходства. Они могут быть объединены или консолидированы.", - "untitled": "Без названия", - "clickToView": "Нажмите, чтобы просмотреть заметку", - "helpfulQuestion": "Это сравнение полезно?", - "helpful": "Полезно", - "notHelpful": "Не полезно" - }, - "editorSection": { - "title": "⚡ Связанные заметки ({count})", - "loading": "Загрузка...", - "view": "Просмотреть", - "compare": "Сравнить", - "merge": "Объединить", - "compareAll": "Сравнить все", - "mergeAll": "Объединить все" - }, - "fusion": { - "title": "🔗 Интеллектуальное объединение", - "mergeNotes": "Объединить {count} заметок(и)", - "notesToMerge": "📝 Заметки для объединения", - "optionalPrompt": "💬 Запрос объединения (необязательно)", - "promptPlaceholder": "Дополнительные инструкции для ИИ (например, 'Сохранить формальный стиль заметки 1')...", - "generateFusion": "Сгенерировать объединение", - "generating": "Генерация...", - "previewTitle": "📝 Предпросмотр объединённой заметки", - "edit": "Редактировать", - "modify": "Изменить", - "finishEditing": "Завершить редактирование", - "optionsTitle": "Параметры объединения", - "archiveOriginals": "Архивировать оригинальные заметки", - "keepAllTags": "Сохранить все теги", - "useLatestTitle": "Использовать последнюю заметку как заголовок", - "createBacklinks": "Создать обратную ссылку на оригинальные заметки", - "cancel": "Отмена", - "confirmFusion": "Подтвердить объединение", - "success": "Заметки успешно объединены!", - "error": "Не удалось объединить заметки", - "generateError": "Не удалось сгенерировать объединение", - "noContentReturned": "API не вернул контент объединения", - "unknownDate": "Неизвестная дата" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" + }, + "support": { + "aiApiCosts": "Расходы на API ИИ:", + "buyMeACoffee": "Купить мне кофе", + "contributeCode": "Внести вклад в код", + "description": "Memento на 100% бесплатен и с открытым кодом. Ваша поддержка помогает сохранить это.", + "directImpact": "Прямое влияние", + "domainSSL": "Домен и SSL:", + "donateOnKofi": "Пожертвовать на Ko-fi", + "donationDescription": "Сделайте разовое пожертвование или станьте ежемесячным сторонником.", + "githubDescription": "Регулярная поддержка • Публичное признание • Ориентировано на разработчиков", + "hostingServers": "Хостинг и серверы:", + "howSupportHelps": "Как помогает ваша поддержка", + "kofiDescription": "Без комиссий платформы • Мгновенные выплаты • Безопасно", + "otherWaysTitle": "Другие способы поддержки", + "reportBug": "Сообщить об ошибке", + "shareTwitter": "Поделиться в Twitter", + "sponsorDescription": "Станьте ежемесячным спонсором и получите признание.", + "sponsorOnGithub": "Спонсировать на GitHub", + "sponsorPerks": "Преимущества спонсора", + "starGithub": "Поставить звезду на GitHub", + "title": "Поддержать разработку Memento", + "totalExpenses": "Общие расходы:", + "transparency": "Прозрачность", + "transparencyDescription": "Я верю в полную прозрачность. Вот как используются пожертвования:" + }, + "testPages": { + "titleSuggestions": { + "analyzing": "Анализ...", + "contentLabel": "Содержимое (нужно более 50 слов):", + "error": "Ошибка:", + "idle": "Ожидание", + "noSuggestions": "Пока нет предложений. Напишите 50+ слов и подождите 2 секунды.", + "placeholder": "Напишите минимум 50 слов здесь...", + "status": "Статус:", + "suggestions": "Предложения ({count}):", + "title": "Тест предложений заголовков", + "wordCount": "Количество слов:" } }, - "nav": { - "home": "Главная", - "notes": "Заметки", - "notebooks": "Блокноты", - "generalNotes": "Общие заметки", - "archive": "Архив", - "settings": "Настройки", - "profile": "Профиль", - "aiSettings": "Настройки ИИ", - "logout": "Выйти", - "login": "Войти", - "adminDashboard": "Панель администратора", - "diagnostics": "Диагностика", - "trash": "Корзина", - "support": "Поддержать Memento ☕", - "reminders": "Напоминания", - "userManagement": "Управление пользователями", - "accountSettings": "Настройки аккаунта", - "manageAISettings": "Управление настройками ИИ", - "configureAI": "Настройте функции на базе ИИ, провайдера и предпочтения", - "supportDevelopment": "Поддержать разработку Memento ☕", - "supportDescription": "Memento на 100% бесплатен и открыт. Ваша поддержка помогает сохранить это.", - "buyMeACoffee": "Купить мне кофе", - "donationDescription": "Сделайте единовременное пожертвование или станьте ежемесячным сторонником.", - "donateOnKofi": "Пожертвовать на Ko-fi", - "donationNote": "Без комиссий платформы • Мгновенные выплаты • Безопасно", - "sponsorOnGithub": "Спонсорировать на GitHub", - "sponsorDescription": "Станьте ежемесячным спонсором и получите признание.", - "workspace": "Рабочее пространство", - "quickAccess": "Быстрый доступ", - "myLibrary": "Моя библиотека", - "favorites": "Избранное", - "recent": "Недавние", - "proPlan": "Про-план" + "time": { + "daysAgo": "{count} дней назад", + "hoursAgo": "{count} часов назад", + "justNow": "Только что", + "minutesAgo": "{count} минут назад", + "today": "Сегодня", + "tomorrow": "Завтра", + "yesterday": "Вчера" }, - "settings": { - "title": "Настройки", - "description": "Управление настройками и предпочтениями", - "account": "Аккаунт", - "appearance": "Внешний вид", - "theme": "Тема", - "themeLight": "Светлая", - "themeDark": "Тёмная", - "themeSystem": "Системная", - "notifications": "Уведомления", - "language": "Язык", - "selectLanguage": "Выбрать язык", - "privacy": "Конфиденциальность", - "security": "Безопасность", - "about": "О программе", - "version": "Версия", - "settingsSaved": "Настройки сохранены", - "settingsError": "Ошибка сохранения настроек" - }, - "profile": { - "title": "Профиль", - "description": "Обновите вашу личную информацию", - "displayName": "Отображаемое имя", - "email": "Эл. почта", - "changePassword": "Изменить пароль", - "changePasswordDescription": "Обновите ваш пароль. Вам понадобится ваш текущий пароль.", - "currentPassword": "Текущий пароль", - "newPassword": "Новый пароль", - "confirmPassword": "Подтвердите пароль", - "updatePassword": "Обновить пароль", - "passwordChangeSuccess": "Пароль успешно изменён", - "passwordChangeFailed": "Не удалось изменить пароль", - "passwordUpdated": "Пароль обновлён", - "passwordError": "Ошибка обновления пароля", - "languagePreferences": "Языковые предпочтения", - "languagePreferencesDescription": "Выберите предпочитаемый язык для функций ИИ и интерфейса.", - "preferredLanguage": "Предпочитаемый язык", - "selectLanguage": "Выберите язык", - "languageDescription": "Этот язык будет использоваться для функций на базе ИИ, анализа содержимого и текста интерфейса.", - "autoDetect": "Автоопределение", - "updateSuccess": "Профиль обновлён", - "updateFailed": "Не удалось обновить профиль", - "languageUpdateSuccess": "Язык успешно обновлён", - "languageUpdateFailed": "Не удалось обновить язык", - "profileUpdated": "Профиль обновлён", - "profileError": "Ошибка обновления профиля", - "accountSettings": "Настройки аккаунта", - "manageAISettings": "Управление настройками ИИ", - "displaySettings": "Настройки отображения", - "displaySettingsDescription": "Настройте внешний вид и размер шрифта.", - "fontSize": "Размер шрифта", - "selectFontSize": "Выбрать размер шрифта", - "fontSizeSmall": "Маленький", - "fontSizeMedium": "Средний", - "fontSizeLarge": "Большой", - "fontSizeExtraLarge": "Очень большой", - "fontSizeDescription": "Настройте размер шрифта для лучшей читаемости. Это применяется ко всему тексту интерфейса.", - "fontSizeUpdateSuccess": "Размер шрифта успешно обновлён", - "fontSizeUpdateFailed": "Не удалось обновить размер шрифта" - }, - "aiSettings": { - "title": "Настройки ИИ", - "description": "Настройте функции и предпочтения на базе ИИ", - "features": "Функции ИИ", - "provider": "Провайдер ИИ", - "providerAuto": "Авто (Рекомендуется)", - "providerOllama": "Ollama (Локальный)", - "providerOpenAI": "OpenAI (Облачный)", - "frequency": "Частота", - "frequencyDaily": "Ежедневно", - "frequencyWeekly": "Еженедельно", - "saving": "Сохранение...", - "saved": "Настройка обновлена", - "error": "Не удалось обновить настройку" - }, - "general": { - "loading": "Загрузка...", - "save": "Сохранить", - "cancel": "Отмена", - "add": "Добавить", - "edit": "Редактировать", - "confirm": "Подтвердить", - "close": "Закрыть", - "back": "Назад", - "next": "Далее", - "previous": "Назад", - "submit": "Отправить", - "reset": "Сбросить", - "apply": "Применить", - "clear": "Очистить", - "select": "Выбрать", - "tryAgain": "Пожалуйста, попробуйте снова", - "error": "Произошла ошибка", - "operationSuccess": "Операция успешна", - "operationFailed": "Операция не удалась" - }, - "colors": { - "default": "По умолчанию", - "red": "Красный", - "blue": "Синий", - "green": "Зелёный", - "yellow": "Жёлтый", - "purple": "Фиолетовый", - "pink": "Розовый", - "orange": "Оранжевый", - "gray": "Серый" - }, - "reminder": { - "title": "Напоминание", - "setReminder": "Установить напоминание", - "removeReminder": "Удалить напоминание", - "reminderDate": "Дата напоминания", - "reminderTime": "Время напоминания", - "save": "Установить напоминание", - "cancel": "Отмена" - }, - "notebookSuggestion": { - "title": "Переместить в {icon} {name}?", - "description": "Эта заметка, похоже, принадлежит этому блокноту", - "move": "Переместить", + "titleSuggestions": { + "available": "Предложения заголовков", "dismiss": "Отклонить", - "dismissIn": "Отклонить (закроется через {timeLeft}с)", - "moveToNotebook": "Переместить в блокнот", - "generalNotes": "Общие заметки" + "generating": "Генерация...", + "selectTitle": "Выберите заголовок", + "title": "Предложения ИИ" + }, + "toast": { + "feedbackFailed": "Ошибка отправки отзыва", + "notesFusionSuccess": "Заметки успешно объединены!", + "openConnectionFailed": "Ошибка открытия соединения", + "openingConnection": "Открытие соединения...", + "operationFailed": "Операция не удалась", + "operationSuccess": "Операция успешна", + "saveFailed": "Ошибка сохранения настройки", + "saved": "Настройка сохранена", + "thanksFeedback": "Спасибо за ваш отзыв!", + "thanksFeedbackImproving": "Спасибо! Мы используем это для улучшения." + }, + "trash": { + "deletePermanently": "Удалить навсегда", + "empty": "Корзина пуста", + "restore": "Восстановить", + "title": "Корзина" + }, + "ui": { + "close": "Закрыть", + "collapse": "Свернуть", + "expand": "Развернуть", + "open": "Открыть" } } diff --git a/keep-notes/locales/zh.json b/keep-notes/locales/zh.json index ca3357d..367da71 100644 --- a/keep-notes/locales/zh.json +++ b/keep-notes/locales/zh.json @@ -1,511 +1,993 @@ { - "auth": { - "signIn": "登录", - "signUp": "注册", - "email": "电子邮箱", - "password": "密码", - "name": "姓名", - "emailPlaceholder": "输入您的电子邮箱", - "passwordPlaceholder": "输入您的密码", - "namePlaceholder": "输入您的姓名", - "passwordMinChars": "输入密码(最少 6 个字符)", - "resetPassword": "重置密码", - "resetPasswordInstructions": "输入您的邮箱以重置密码", - "forgotPassword": "忘记密码?", - "noAccount": "没有账户?", - "hasAccount": "已有账户?", - "signInToAccount": "登录您的账户", - "createAccount": "创建您的账户", - "rememberMe": "记住我", - "orContinueWith": "或继续使用", - "checkYourEmail": "查看您的邮箱", - "resetEmailSent": "如果您的邮箱存在于我们的系统中,我们已向您发送密码重置链接。", - "returnToLogin": "返回登录", - "forgotPasswordTitle": "忘记密码", - "forgotPasswordDescription": "输入您的电子邮箱,我们将向您发送重置密码的链接。", - "sending": "发送中...", - "sendResetLink": "发送重置链接", - "backToLogin": "返回登录" + "about": { + "appDescription": "具有 AI 功能的强大笔记应用程序", + "appName": "Keep Notes", + "buildDate": "构建日期", + "description": "应用程序信息", + "features": { + "description": "AI 驱动的功能", + "dragDrop": "拖放笔记管理", + "labelSystem": "标签系统", + "memoryEcho": "Memory Echo 每日洞察", + "multipleProviders": "多个 AI 提供商(OpenAI、Ollama)", + "notebookOrganization": "笔记本组织", + "paragraphReformulation": "段落改写", + "semanticSearch": "使用嵌入的语义搜索", + "title": "功能", + "titleSuggestions": "AI 驱动的标题建议" + }, + "platform": "平台", + "platformWeb": "网页版", + "support": { + "description": "获取帮助和反馈", + "documentation": "文档", + "feedback": "反馈", + "reportIssues": "报告问题", + "title": "支持" + }, + "technology": { + "ai": "AI", + "authentication": "身份验证", + "backend": "后端", + "database": "数据库", + "description": "使用现代技术构建", + "frontend": "前端", + "testing": "测试", + "title": "技术栈", + "ui": "UI" + }, + "title": "关于", + "version": "版本" }, - "notes": { - "title": "笔记", - "newNote": "新建笔记", - "untitled": "无标题", - "placeholder": "记笔记...", - "markdownPlaceholder": "记笔记...(支持 Markdown)", - "titlePlaceholder": "标题", - "listItem": "列表项", - "addListItem": "+ 列表项", - "newChecklist": "新建清单", - "add": "添加", - "adding": "添加中...", - "close": "关闭", - "confirmDelete": "确定要删除这条笔记吗?", - "confirmLeaveShare": "确定要离开这条共享笔记吗?", - "sharedBy": "共享者", - "leaveShare": "离开", - "delete": "删除", - "archive": "归档", - "unarchive": "取消归档", - "pin": "置顶", - "unpin": "取消置顶", - "color": "颜色", - "changeColor": "更改颜色", - "setReminder": "设置提醒", - "setReminderButton": "设置提醒", - "date": "日期", - "time": "时间", - "reminderDateTimeRequired": "请输入日期和时间", - "invalidDateTime": "日期或时间无效", - "reminderMustBeFuture": "提醒时间必须是未来时间", - "reminderSet": "已设置提醒:{datetime}", - "reminderPastError": "提醒时间必须是未来时间", - "reminderRemoved": "提醒已移除", - "addImage": "添加图片", - "addLink": "添加链接", - "linkAdded": "链接已添加", - "linkMetadataFailed": "无法获取链接元数据", - "linkAddFailed": "添加链接失败", - "invalidFileType": "无效的文件类型:{fileName}。仅允许 JPEG、PNG、GIF 和 WebP。", - "fileTooLarge": "文件过大:{fileName}。最大大小为 {maxSize}。", - "uploadFailed": "上传失败:{filename}", - "contentOrMediaRequired": "请输入一些内容或添加链接/图片", - "itemOrMediaRequired": "请至少添加一个项目或媒体", - "noteCreated": "笔记创建成功", - "noteCreateFailed": "创建笔记失败", - "aiAssistant": "AI 助手", - "changeSize": "更改大小", - "backgroundOptions": "背景选项", - "moreOptions": "更多选项", - "remindMe": "提醒我", - "markdownMode": "Markdown", - "addCollaborators": "添加协作者", - "duplicate": "复制", - "share": "共享", - "showCollaborators": "显示协作者", - "pinned": "已置顶", - "others": "其他", - "noNotes": "无笔记", - "noNotesFound": "未找到笔记", - "createFirstNote": "创建您的第一条笔记", - "size": "大小", - "small": "小", - "medium": "中", - "large": "大", - "shareWithCollaborators": "与协作者共享", - "view": "查看笔记", - "edit": "编辑笔记", - "readOnly": "只读", - "preview": "预览", - "noContent": "无内容", - "takeNote": "记笔记...", - "takeNoteMarkdown": "记笔记...(支持 Markdown)", - "addItem": "添加项目", - "sharedReadOnly": "这条笔记以只读模式与您共享", - "makeCopy": "创建副本", - "saving": "保存中...", - "copySuccess": "笔记复制成功!", - "copyFailed": "复制笔记失败", - "copy": "复制", - "markdownOn": "Markdown 开启", - "markdownOff": "Markdown 关闭", - "undo": "撤销 (Ctrl+Z)", - "redo": "重做 (Ctrl+Y)" - }, - "pagination": { - "previous": "←", - "pageInfo": "第 {currentPage} 页 / 共 {totalPages} 页", - "next": "→" - }, - "labels": { - "title": "标签", - "filter": "按标签筛选", - "manage": "管理标签", - "manageTooltip": "管理标签", - "changeColor": "更改颜色", - "changeColorTooltip": "更改颜色", - "delete": "删除", - "deleteTooltip": "删除标签", - "confirmDelete": "确定要删除这个标签吗?", - "newLabelPlaceholder": "创建新标签", - "namePlaceholder": "输入标签名称", - "addLabel": "添加标签", - "createLabel": "创建标签", - "labelName": "标签名称", - "labelColor": "标签颜色", - "manageLabels": "管理标签", - "manageLabelsDescription": "为这条笔记添加或删除标签。点击标签可更改其颜色。", - "selectedLabels": "已选标签", - "allLabels": "所有标签", - "clearAll": "清除全部", - "filterByLabel": "按标签筛选", - "tagAdded": "标签 \"{tag}\" 已添加", - "showLess": "收起", - "showMore": "展开", - "editLabels": "编辑标签", - "editLabelsDescription": "创建、编辑颜色或删除标签。", - "noLabelsFound": "未找到标签。", - "loading": "加载中...", - "notebookRequired": "⚠️ 标签仅在笔记本中可用。请先将此笔记移动到笔记本。" - }, - "search": { - "placeholder": "搜索", - "searchPlaceholder": "搜索您的笔记...", - "semanticInProgress": "AI 搜索进行中...", - "semanticTooltip": "AI 语义搜索", - "searching": "搜索中...", - "noResults": "未找到结果", - "resultsFound": "找到 {count} 条笔记", - "exactMatch": "完全匹配", - "related": "相关" - }, - "collaboration": { - "emailPlaceholder": "输入电子邮箱", - "addCollaborator": "添加协作者", - "removeCollaborator": "移除协作者", - "owner": "所有者", - "canEdit": "可编辑", - "canView": "可查看", - "shareNote": "共享笔记", - "shareWithCollaborators": "与协作者共享", - "addCollaboratorDescription": "通过电子邮箱添加人员来协作编辑这条笔记。", - "viewerDescription": "您有权访问此笔记。只有所有者可以管理协作者。", - "emailAddress": "电子邮箱", - "enterEmailAddress": "输入电子邮箱", - "invite": "邀请", - "peopleWithAccess": "有访问权限的人员", - "noCollaborators": "还没有协作者。在上方添加某人!", - "noCollaboratorsViewer": "还没有协作者。", - "pendingInvite": "待处理的邀请", - "pending": "待处理", - "remove": "移除", - "unnamedUser": "未命名用户", - "done": "完成", - "willBeAdded": "{email} 将在创建笔记时被添加为协作者", - "alreadyInList": "此邮箱已在列表中", - "nowHasAccess": "{name} 现在有权访问此笔记", - "accessRevoked": "访问权限已被撤销", - "errorLoading": "加载协作者时出错", - "failedToAdd": "添加协作者失败", - "failedToRemove": "移除协作者失败" + "admin": { + "ai": { + "apiKey": "API 密钥", + "baseUrl": "基础 URL", + "commonEmbeddingModels": "OpenAI 兼容 API 的常用嵌入模型", + "commonModelsDescription": "OpenAI 兼容 API 的常用模型", + "description": "配置用于自动标签和语义搜索的 AI 提供商。使用不同的提供商以获得最佳性能。", + "embeddingsDescription": "用于语义搜索嵌入的 AI 提供商。推荐:OpenAI(最佳质量)。", + "embeddingsProvider": "嵌入提供商", + "model": "模型", + "modelRecommendations": "gpt-4o-mini = 最佳性价比 • gpt-4o = 最佳质量", + "openAIKeyDescription": "您来自 platform.openai.com 的 OpenAI API 密钥", + "openTestPanel": "打开 AI 测试面板", + "provider": "提供商", + "providerEmbeddingRequired": "AI_PROVIDER_EMBEDDING 是必需的", + "providerTagsRequired": "AI_PROVIDER_TAGS 是必需的", + "saveSettings": "保存 AI 设置", + "saving": "保存中...", + "selectEmbeddingModel": "选择您系统上安装的嵌入模型", + "selectOllamaModel": "选择您系统上安装的 Ollama 模型", + "tagsGenerationDescription": "用于自动标签建议的 AI 提供商。推荐:Ollama(免费,本地)。", + "tagsGenerationProvider": "标签生成提供商", + "title": "AI 配置", + "updateFailed": "更新 AI 设置失败", + "updateSuccess": "AI 设置更新成功" + }, + "aiTest": { + "description": "测试您的 AI 提供商的标签生成和语义搜索嵌入", + "embeddingDimensions": "嵌入维度:", + "embeddingsTestDescription": "测试负责语义搜索嵌入的 AI 提供商", + "embeddingsTestTitle": "嵌入测试", + "error": "错误:", + "first5Values": "前 5 个值:", + "generatedTags": "生成的标签:", + "howItWorksTitle": "测试如何工作", + "model": "模型:", + "provider": "提供商:", + "responseTime": "响应时间:{time}毫秒", + "runTest": "运行测试", + "tagsTestDescription": "测试负责自动标签建议的 AI 提供商", + "tagsTestTitle": "标签生成测试", + "testError": "测试错误:{error}", + "testFailed": "测试失败", + "testPassed": "测试通过", + "testing": "测试中...", + "tipDescription": "在测试之前使用 AI 测试面板诊断配置问题。", + "tipTitle": "提示:", + "title": "AI 提供商测试", + "vectorDimensions": "向量维度" + }, + "aiTesting": "AI 测试", + "security": { + "allowPublicRegistration": "允许公开注册", + "allowPublicRegistrationDescription": "如果禁用,新用户只能由管理员通过用户管理页面添加。", + "description": "管理访问控制和注册策略。", + "title": "安全设置", + "updateFailed": "更新安全设置失败", + "updateSuccess": "安全设置已更新" + }, + "settings": "管理员设置", + "smtp": { + "description": "配置用于密码重置的邮件服务器。", + "forceSSL": "强制 SSL/TLS(通常用于端口 465)", + "fromEmail": "发件人邮箱", + "host": "主机", + "ignoreCertErrors": "忽略证书错误(仅限自托管/开发环境)", + "password": "密码", + "port": "端口", + "saveSettings": "保存 SMTP 设置", + "sending": "发送中...", + "testEmail": "测试邮件", + "testFailed": "失败:{error}", + "testSuccess": "测试邮件发送成功!", + "title": "SMTP 配置", + "updateFailed": "更新 SMTP 设置失败", + "updateSuccess": "SMTP 设置已更新", + "username": "用户名" + }, + "title": "管理后台", + "userManagement": "用户管理", + "users": { + "addUser": "添加用户", + "confirmDelete": "Are you sure? This action cannot be undone.", + "createFailed": "创建用户失败", + "createSuccess": "用户创建成功", + "createUser": "创建用户", + "createUserDescription": "向系统添加新用户。", + "deleteFailed": "删除失败", + "deleteSuccess": "用户已删除", + "demote": "降级", + "email": "邮箱", + "name": "姓名", + "password": "密码", + "promote": "升级", + "role": "角色", + "roleUpdateFailed": "更新角色失败", + "roleUpdateSuccess": "用户角色已更新为 {role}", + "roles": { + "admin": "管理员", + "user": "用户" + }, + "table": { + "actions": "操作", + "createdAt": "创建时间", + "email": "邮箱", + "name": "姓名", + "role": "角色" + } + } }, "ai": { "analyzing": "AI 分析中...", + "assistant": "AI 助手", + "autoLabels": { + "analyzing": "正在分析您的笔记以获取标签建议...", + "create": "创建", + "createNewLabel": "Create this new label and add it", + "created": "{count} labels created successfully", + "creating": "正在创建标签...", + "description": "I've detected recurring themes in \"{notebookName}\" ({totalNotes} notes). Create labels for them?", + "error": "Failed to fetch label suggestions", + "new": "(新建)", + "noLabelsSelected": "No labels selected", + "note": "note", + "notes": "notes", + "title": "标签建议", + "typeContent": "Type content to get label suggestions..." + }, + "batchOrganization": { + "analyzing": "Analyzing your notes...", + "apply": "Apply", + "applyFailed": "Failed to apply organization plan", + "applying": "Applying...", + "description": "AI将分析您的笔记并建议将它们组织到笔记本中。", + "error": "Failed to create organization plan", + "noNotebooks": "No notebooks available. Create notebooks first to organize your notes.", + "noNotesSelected": "No notes selected", + "noSuggestions": "AI could not find a good way to organize these notes.", + "selectAllIn": "Select all notes in {notebook}", + "selectNote": "Select note: {title}", + "success": "{count} notes moved successfully", + "title": "Organize with AI" + }, + "clarify": "澄清", "clickToAddTag": "点击添加此标签", - "ignoreSuggestion": "忽略此建议", - "generatingTitles": "正在生成标题...", + "generateTitles": "生成标题", "generateTitlesTooltip": "使用 AI 生成标题", - "poweredByAI": "由 AI 驱动", + "generating": "生成中...", + "generatingTitles": "正在生成标题...", + "ignoreSuggestion": "忽略此建议", + "improveStyle": "改进风格", "languageDetected": "检测到的语言", + "notebookSummary": { + "regenerate": "重新生成摘要", + "regenerating": "正在重新生成摘要..." + }, + "original": "原文", + "poweredByAI": "由 AI 驱动", "processing": "处理中...", - "tagAdded": "标签 \"{tag}\" 已添加", - "titleGenerating": "生成中...", - "titleGenerateWithAI": "使用 AI 生成标题", - "titleGenerationMinWords": "内容必须至少包含 10 个单词才能生成标题(当前:{count} 个单词)", - "titleGenerationError": "生成标题时出错", - "titlesGenerated": "💡 已生成 {count} 个标题!", - "titleGenerationFailed": "生成标题失败", - "titleApplied": "标题已应用!", - "reformulationNoText": "请选择文本或添加内容", - "reformulationSelectionTooShort": "选择内容太短,将使用完整内容", - "reformulationMinWords": "文本必须至少包含 10 个单词(当前:{count} 个单词)", - "reformulationMaxWords": "文本最多包含 500 个单词", + "reformulateText": "改写文本", + "reformulated": "改写", + "reformulating": "改写中...", + "reformulationApplied": "改写文本已应用!", + "reformulationComparison": "改写比较", "reformulationError": "改写时出错", "reformulationFailed": "改写文本失败", - "reformulationApplied": "改写文本已应用!", - "transformMarkdown": "转换为 Markdown", - "transforming": "转换中...", - "transformSuccess": "文本已成功转换为 Markdown!", - "transformError": "转换时出错", - "assistant": "AI 助手", - "generating": "生成中...", - "generateTitles": "生成标题", - "reformulateText": "改写文本", - "reformulating": "改写中...", - "clarify": "澄清", + "reformulationMaxWords": "文本最多包含 500 个单词", + "reformulationMinWords": "文本必须至少包含 10 个单词(当前:{count} 个单词)", + "reformulationNoText": "请选择文本或添加内容", + "reformulationSelectionTooShort": "选择内容太短,将使用完整内容", "shorten": "缩短", - "improveStyle": "改进风格", - "reformulationComparison": "改写比较", - "original": "原文", - "reformulated": "改写" + "tagAdded": "标签 \"{tag}\" 已添加", + "titleApplied": "标题已应用!", + "titleGenerateWithAI": "使用 AI 生成标题", + "titleGenerating": "生成中...", + "titleGenerationError": "生成标题时出错", + "titleGenerationFailed": "生成标题失败", + "titleGenerationMinWords": "内容必须至少包含 10 个单词才能生成标题(当前:{count} 个单词)", + "titlesGenerated": "💡 已生成 {count} 个标题!", + "transformError": "转换时出错", + "transformMarkdown": "转换为 Markdown", + "transformSuccess": "文本已成功转换为 Markdown!", + "transforming": "转换中..." }, - "batchOrganization": { - "error": "创建组织计划失败", - "noNotesSelected": "未选择笔记", - "title": "用AI整理", - "description": "AI将分析您的笔记并建议将它们组织到笔记本中。", - "analyzing": "分析您的笔记...", - "notesToOrganize": "{count} 个笔记需要整理", - "selected": "已选择 {count}", - "noNotebooks": "没有可用的笔记本。请先创建笔记本来整理您的笔记。", - "noSuggestions": "AI找不到整理这些笔记的好方法。", - "confidence": "置信度", - "unorganized": "{count} 个笔记无法分类,将保留在\"普通笔记\"中。", - "applying": "应用中...", - "apply": "应用 ({count})" + "aiSettings": { + "description": "配置您的 AI 驱动功能和偏好设置", + "error": "更新设置失败", + "features": "AI 功能", + "frequency": "频率", + "frequencyDaily": "每天", + "frequencyWeekly": "每周", + "provider": "AI 提供商", + "providerAuto": "自动(推荐)", + "providerOllama": "Ollama(本地)", + "providerOpenAI": "OpenAI(云端)", + "saved": "设置已更新", + "saving": "保存中...", + "title": "AI 设置", + "titleSuggestionsDesc": "在 50+ 字后为无标题笔记建议标题", + "paragraphRefactorDesc": "AI 驱动的文本改进选项", + "frequencyDesc": "分析笔记连接的频率", + "providerDesc": "选择您偏好的 AI 提供商", + "providerAutoDesc": "优先使用 Ollama,备用 OpenAI", + "providerOllamaDesc": "100% 私有,在本地运行", + "providerOpenAIDesc": "最准确,需要 API 密钥" + }, + "appearance": { + "description": "自定义应用的外观", + "title": "外观" + }, + "auth": { + "backToLogin": "返回登录", + "checkYourEmail": "查看您的邮箱", + "createAccount": "创建您的账户", + "email": "电子邮箱", + "emailPlaceholder": "输入您的电子邮箱", + "forgotPassword": "忘记密码?", + "forgotPasswordDescription": "输入您的电子邮箱,我们将向您发送重置密码的链接。", + "forgotPasswordTitle": "忘记密码", + "hasAccount": "已有账户?", + "name": "姓名", + "namePlaceholder": "输入您的姓名", + "noAccount": "没有账户?", + "orContinueWith": "或继续使用", + "password": "密码", + "passwordMinChars": "输入密码(最少 6 个字符)", + "passwordPlaceholder": "输入您的密码", + "rememberMe": "记住我", + "resetEmailSent": "如果您的邮箱存在于我们的系统中,我们已向您发送密码重置链接。", + "resetPassword": "重置密码", + "resetPasswordInstructions": "输入您的邮箱以重置密码", + "returnToLogin": "返回登录", + "sendResetLink": "发送重置链接", + "sending": "发送中...", + "signIn": "登录", + "signInToAccount": "登录您的账户", + "signOut": "Sign out", + "signUp": "注册" }, "autoLabels": { - "error": "获取标签建议失败", - "noLabelsSelected": "未选择标签", - "created": "成功创建 {count} 个标签", "analyzing": "分析您的笔记...", - "title": "新标签建议", + "createNewLabel": "创建此新标签并添加它", + "created": "成功创建 {count} 个标签", "description": "我在 \"{notebookName}\" ({totalNotes} 个笔记) 中发现了重复的主题。为它们创建标签吗?", + "error": "获取标签建议失败", + "new": "(新)", + "noLabelsSelected": "未选择标签", "note": "笔记", "notes": "笔记", + "title": "新标签建议", "typeContent": "输入内容以获取标签建议...", - "createNewLabel": "创建此新标签并添加它", - "new": "(新)" + "typeForSuggestions": "输入以获取建议..." }, - "titleSuggestions": { - "available": "标题建议", - "title": "AI 建议", - "generating": "生成中...", - "selectTitle": "选择标题", - "dismiss": "忽略" + "batch": { + "organize": "整理", + "organizeWithAI": "用 AI 整理" + }, + "batchOrganization": { + "analyzing": "分析您的笔记...", + "apply": "应用 ({count})", + "applyFailed": "应用整理失败", + "applying": "应用中...", + "confidence": "置信度", + "description": "AI将分析您的笔记并建议将它们组织到笔记本中。", + "error": "创建组织计划失败", + "noNotebooks": "没有可用的笔记本。请先创建笔记本来整理您的笔记。", + "noNotesSelected": "未选择笔记", + "noSuggestions": "AI找不到整理这些笔记的好方法。", + "notesToOrganize": "{count} 个笔记需要整理", + "selectAllIn": "全选", + "selectNote": "选择笔记", + "selected": "已选择 {count}", + "success": "整理成功", + "title": "用AI整理", + "unorganized": "{count} 个笔记无法分类,将保留在\"普通笔记\"中。" + }, + "collaboration": { + "accessRevoked": "访问权限已被撤销", + "addCollaborator": "添加协作者", + "addCollaboratorDescription": "通过电子邮箱添加人员来协作编辑这条笔记。", + "alreadyInList": "此邮箱已在列表中", + "canEdit": "可编辑", + "canView": "可查看", + "done": "完成", + "emailAddress": "电子邮箱", + "emailPlaceholder": "输入电子邮箱", + "enterEmailAddress": "输入电子邮箱", + "errorLoading": "加载协作者时出错", + "failedToAdd": "添加协作者失败", + "failedToRemove": "移除协作者失败", + "invite": "邀请", + "noCollaborators": "还没有协作者。在上方添加某人!", + "noCollaboratorsViewer": "还没有协作者。", + "nowHasAccess": "{name} 现在有权访问此笔记", + "owner": "所有者", + "pending": "待处理", + "pendingInvite": "待处理的邀请", + "peopleWithAccess": "有访问权限的人员", + "remove": "移除", + "removeCollaborator": "移除协作者", + "shareNote": "共享笔记", + "shareWithCollaborators": "与协作者共享", + "unnamedUser": "未命名用户", + "viewerDescription": "您有权访问此笔记。只有所有者可以管理协作者。", + "willBeAdded": "{email} 将在创建笔记时被添加为协作者" + }, + "colors": { + "blue": "蓝色", + "default": "默认", + "gray": "灰色", + "green": "绿色", + "orange": "橙色", + "pink": "粉色", + "purple": "紫色", + "red": "红色", + "yellow": "黄色" + }, + "common": { + "add": "添加", + "cancel": "取消", + "close": "关闭", + "confirm": "确认", + "delete": "删除", + "edit": "编辑", + "error": "错误", + "loading": "加载中...", + "noResults": "无结果", + "notAvailable": "不可用", + "optional": "可选", + "remove": "移除", + "required": "必填", + "save": "保存", + "search": "搜索", + "success": "成功", + "unknown": "未知" + }, + "connection": { + "clickToView": "点击查看笔记", + "helpful": "有帮助", + "isHelpful": "此连接有帮助吗?", + "memoryEchoDiscovery": "Memory Echo 发现", + "notHelpful": "无帮助", + "similarityInfo": "这些笔记通过 {similarity}% 的相似度连接" + }, + "dataManagement": { + "cleanup": { + "button": "清理", + "description": "删除引用已删除笔记的标签和连接。", + "failed": "清理期间出错", + "title": "清理孤立数据" + }, + "cleanupComplete": "清理完成", + "cleanupError": "清理错误", + "dangerZone": "危险区域", + "dangerZoneDescription": "这些操作不可逆,请谨慎操作", + "delete": { + "button": "删除所有笔记", + "confirm": "确定吗?这将永久删除您的所有笔记。", + "description": "永久删除所有笔记。此操作无法撤销。", + "failed": "删除笔记失败", + "success": "所有笔记已删除", + "title": "删除所有笔记" + }, + "deleting": "删除中...", + "export": { + "button": "导出笔记", + "description": "将所有笔记下载为 JSON 文件。包括所有内容、标签和元数据。", + "failed": "导出笔记失败", + "success": "笔记导出成功", + "title": "导出所有笔记" + }, + "exporting": "导出中...", + "import": { + "button": "导入笔记", + "description": "上传 JSON 文件以导入笔记。这将添加到您现有的笔记中,而不是替换它们。", + "failed": "导入笔记失败", + "success": "已导入 {count} 条笔记", + "title": "导入笔记" + }, + "importing": "导入中...", + "indexing": { + "button": "重建索引", + "description": "为所有笔记重新生成嵌入以提高语义搜索效果。", + "failed": "索引期间出错", + "success": "索引完成:已处理 {count} 条笔记", + "title": "重建搜索索引" + }, + "indexingComplete": "索引完成", + "indexingError": "索引错误", + "title": "数据管理", + "toolsDescription": "维护数据库健康的工具" + }, + "demoMode": { + "activated": "演示模式已激活!Memory Echo 现在将即时工作。", + "createNotesTip": "创建 2 个以上相似的笔记,看看 Memory Echo 的实际效果!", + "deactivated": "演示模式已禁用。恢复正常参数。", + "delayBetweenNotes": "笔记之间 0 天延迟(通常为 7 天)", + "description": "加速 Memory Echo 以进行测试。连接会立即出现。", + "parametersActive": "演示参数已激活:", + "similarityThreshold": "50% 相似度阈值(通常为 75%)", + "title": "演示模式", + "toggleFailed": "切换演示模式失败", + "unlimitedInsights": "无限洞察(无频率限制)" + }, + "diagnostics": { + "apiStatus": "API 状态", + "checking": "Checking...", + "configuredProvider": "已配置的提供商", + "description": "Check your AI provider connection status", + "errorStatus": "Error", + "operational": "Operational", + "testDetails": "测试详情:", + "tip1": "确保 Ollama 正在运行(ollama serve)", + "tip2": "检查模型是否已安装(ollama pull llama3)", + "tip3": "验证您的 OpenAI API 密钥", + "tip4": "检查网络连接", + "title": "诊断", + "troubleshootingTitle": "故障排除提示:" + }, + "favorites": { + "noFavorites": "暂无收藏", + "pinToFavorite": "固定到收藏夹", + "title": "收藏夹", + "toggleSection": "切换收藏夹部分" + }, + "footer": { + "openSource": "开源克隆", + "privacy": "隐私", + "terms": "条款" + }, + "general": { + "add": "添加", + "apply": "应用", + "back": "返回", + "cancel": "取消", + "clean": "Clean", + "clear": "清除", + "close": "关闭", + "confirm": "确认", + "edit": "编辑", + "error": "发生错误", + "indexAll": "Index All", + "loading": "加载中...", + "next": "下一步", + "operationFailed": "操作失败", + "operationSuccess": "操作成功", + "preview": "预览", + "previous": "上一步", + "reset": "重置", + "save": "保存", + "select": "选择", + "submit": "提交", + "testConnection": "Test Connection", + "tryAgain": "请重试" + }, + "generalSettings": { + "description": "常规应用程序设置", + "title": "常规设置" + }, + "labels": { + "addLabel": "Add label", + "allLabels": "All Labels", + "changeColor": "Change Color", + "changeColorTooltip": "Change color", + "clearAll": "Clear all", + "confirmDelete": "Are you sure you want to delete this label?", + "count": "{count} 个标签", + "createLabel": "Create label", + "delete": "Delete", + "deleteTooltip": "Delete label", + "editLabels": "Edit Labels", + "editLabelsDescription": "Create, edit colors, or delete labels.", + "filter": "Filter by Label", + "filterByLabel": "Filter by label", + "labelColor": "Label color", + "labelName": "Label name", + "loading": "Loading...", + "manage": "Manage Labels", + "manageLabels": "Manage labels", + "manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.", + "manageTooltip": "Manage Labels", + "namePlaceholder": "Enter label name", + "newLabelPlaceholder": "Create new label", + "noLabels": "暂无标签", + "noLabelsFound": "No labels found.", + "notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.", + "selectedLabels": "Selected Labels", + "showLess": "Show less", + "showMore": "Show more", + "tagAdded": "Tag \"{tag}\" added", + "title": "Labels" + }, + "memoryEcho": { + "clickToView": "点击查看笔记", + "comparison": { + "clickToView": "点击查看笔记", + "helpful": "有帮助", + "helpfulQuestion": "此比较有帮助吗?", + "highSimilarityInsight": "这些笔记讨论同一主题,具有很高的相似度。它们可以合并或整合。", + "notHelpful": "无帮助", + "similarityInfo": "这些笔记的相似度为 {similarity}%", + "title": "💡 笔记比较", + "untitled": "无标题" + }, + "connection": "关联", + "connections": "关联", + "connectionsBadge": "{count} 个关联{plural}", + "dailyInsight": "您的笔记的每日洞察", + "description": "您的笔记之间的主动关联", + "dismiss": "暂时忽略", + "editorSection": { + "close": "关闭", + "compare": "比较", + "compareAll": "比较全部", + "loading": "加载中...", + "merge": "合并", + "mergeAll": "合并全部", + "title": "⚡ 关联的笔记({count})", + "view": "查看" + }, + "fused": "已融合", + "fusion": { + "archiveOriginals": "归档原始笔记", + "cancel": "取消", + "confirmFusion": "确认融合", + "createBacklinks": "创建指向原始笔记的反向链接", + "edit": "编辑", + "error": "合并笔记失败", + "finishEditing": "完成编辑", + "generateError": "生成融合失败", + "generateFusion": "生成融合", + "generating": "生成中...", + "keepAllTags": "保留所有标签", + "mergeNotes": "合并 {count} 条笔记", + "modify": "修改", + "noContentReturned": "API 未返回融合内容", + "notesToMerge": "📝 要合并的笔记", + "optionalPrompt": "💬 融合提示(可选)", + "optionsTitle": "融合选项", + "previewTitle": "📝 合并笔记的预览", + "promptPlaceholder": "AI 的可选指令(例如,'保持笔记 1 的正式风格')...", + "success": "笔记合并成功!", + "title": "🔗 智能融合", + "unknownDate": "未知日期", + "useLatestTitle": "使用最新笔记作为标题" + }, + "helpful": "有帮助", + "insightReady": "您的洞察已准备好!", + "notHelpful": "无帮助", + "overlay": { + "error": "加载关联时出错", + "loading": "加载中...", + "noConnections": "未找到关联", + "searchPlaceholder": "搜索关联...", + "sortBy": "排序方式:", + "sortOldest": "最早", + "sortRecent": "最近", + "sortSimilarity": "相似度", + "title": "关联的笔记", + "viewAll": "并排查看全部" + }, + "thanksFeedback": "感谢您的反馈!", + "thanksFeedbackImproving": "谢谢!我们将利用此来改进。", + "title": "我注意到了一些事情...", + "viewConnection": "查看关联" + }, + "nav": { + "accountSettings": "账户设置", + "adminDashboard": "管理后台", + "aiSettings": "AI 设置", + "archive": "归档", + "buyMeACoffee": "请我喝杯咖啡", + "configureAI": "配置您的 AI 驱动功能、提供商和偏好设置", + "diagnostics": "诊断", + "donateOnKofi": "在 Ko-fi 上捐赠", + "donationDescription": "进行一次性捐赠或成为月度支持者。", + "donationNote": "无平台费用 • 即时付款 • 安全", + "favorites": "收藏夹", + "generalNotes": "普通笔记", + "home": "主页", + "login": "登录", + "logout": "退出登录", + "manageAISettings": "管理 AI 设置", + "myLibrary": "我的库", + "notebooks": "笔记本", + "notes": "笔记", + "proPlan": "专业版", + "profile": "个人资料", + "quickAccess": "快速访问", + "recent": "最近", + "reminders": "提醒", + "settings": "设置", + "sponsorDescription": "成为月度赞助者并获得认可。", + "sponsorOnGithub": "在 GitHub 上赞助", + "support": "支持 Memento ☕", + "supportDescription": "Memento 是 100% 免费和开源的。您的支持帮助它保持这种方式。", + "supportDevelopment": "支持 Memento 开发 ☕", + "trash": "回收站", + "userManagement": "用户管理", + "workspace": "工作区" + }, + "notebook": { + "cancel": "取消", + "create": "创建笔记本", + "createDescription": "开始一个新的集合,高效地组织您的笔记、想法和项目。", + "createNew": "创建新笔记本", + "creating": "创建中...", + "delete": "删除笔记本", + "deleteConfirm": "删除", + "deleteWarning": "确定要删除此笔记本吗?笔记将被移动到普通笔记。", + "edit": "编辑笔记本", + "editDescription": "更改笔记本的名称、图标和颜色。", + "generating": "正在生成摘要...", + "labels": "标签", + "name": "笔记本名称", + "noLabels": "暂无标签", + "selectColor": "颜色", + "selectIcon": "图标", + "summary": "笔记本摘要", + "summaryDescription": "生成此笔记本中所有笔记的 AI 摘要。", + "summaryError": "生成摘要时出错" + }, + "notebookSuggestion": { + "description": "这条笔记似乎属于这个笔记本", + "dismiss": "忽略", + "dismissIn": "忽略({timeLeft} 秒后关闭)", + "generalNotes": "普通笔记", + "move": "移动", + "moveToNotebook": "移动到笔记本", + "title": "移动到 {icon} {name}?" + }, + "notebooks": { + "allNotebooks": "所有笔记本", + "create": "创建笔记本", + "createFirst": "创建您的第一个笔记本", + "noNotebooks": "暂无笔记本" + }, + "notes": { + "add": "添加", + "addCollaborators": "添加协作者", + "addImage": "添加图片", + "addItem": "添加项目", + "addLink": "添加链接", + "addListItem": "+ 列表项", + "addNote": "添加笔记", + "adding": "添加中...", + "aiAssistant": "AI 助手", + "archive": "归档", + "backgroundOptions": "背景选项", + "changeColor": "更改颜色", + "changeSize": "更改大小", + "clarifyFailed": "澄清失败", + "close": "关闭", + "color": "颜色", + "confirmDelete": "确定要删除这条笔记吗?", + "confirmLeaveShare": "确定要离开这条共享笔记吗?", + "contentOrMediaRequired": "请输入一些内容或添加链接/图片", + "copy": "复制", + "copyFailed": "复制笔记失败", + "copySuccess": "笔记复制成功!", + "createFirstNote": "创建您的第一条笔记", + "date": "日期", + "delete": "删除", + "dragToReorder": "拖动以重新排序", + "duplicate": "复制", + "edit": "编辑笔记", + "emptyState": "暂无笔记", + "fileTooLarge": "文件过大:{fileName}。最大大小为 {maxSize}。", + "improveFailed": "改进失败", + "inNotebook": "在笔记本中", + "invalidDateTime": "日期或时间无效", + "invalidFileType": "无效的文件类型:{fileName}。仅允许 JPEG、PNG、GIF 和 WebP。", + "itemOrMediaRequired": "请至少添加一个项目或媒体", + "large": "大", + "leaveShare": "离开", + "linkAddFailed": "添加链接失败", + "linkAdded": "链接已添加", + "linkMetadataFailed": "无法获取链接元数据", + "listItem": "列表项", + "makeCopy": "创建副本", + "markdown": "Markdown", + "markdownMode": "Markdown", + "markdownOff": "Markdown 关闭", + "markdownOn": "Markdown 开启", + "markdownPlaceholder": "记笔记...(支持 Markdown)", + "medium": "中", + "more": "更多", + "moreOptions": "更多选项", + "moveFailed": "移动失败", + "newChecklist": "新建清单", + "newNote": "新建笔记", + "noContent": "无内容", + "noNotes": "无笔记", + "noNotesFound": "未找到笔记", + "noteCreateFailed": "创建笔记失败", + "noteCreated": "笔记创建成功", + "others": "其他", + "pin": "置顶", + "pinned": "已置顶", + "pinnedNotes": "已置顶笔记", + "placeholder": "记笔记...", + "preview": "预览", + "readOnly": "只读", + "recent": "最近", + "redo": "重做 (Ctrl+Y)", + "redoShortcut": "重做 (Ctrl+Y)", + "remindMe": "提醒我", + "reminderDateTimeRequired": "请输入日期和时间", + "reminderMustBeFuture": "提醒时间必须是未来时间", + "reminderPastError": "提醒时间必须是未来时间", + "reminderRemoved": "提醒已移除", + "reminderSet": "已设置提醒:{datetime}", + "remove": "移除", + "saving": "保存中...", + "setReminder": "设置提醒", + "setReminderButton": "设置提醒", + "share": "共享", + "shareWithCollaborators": "与协作者共享", + "sharedBy": "共享者", + "sharedReadOnly": "这条笔记以只读模式与您共享", + "shortenFailed": "缩短失败", + "showCollaborators": "显示协作者", + "size": "大小", + "small": "小", + "takeNote": "记笔记...", + "takeNoteMarkdown": "记笔记...(支持 Markdown)", + "time": "时间", + "title": "笔记", + "titlePlaceholder": "标题", + "transformFailed": "转换失败", + "unarchive": "取消归档", + "undo": "撤销 (Ctrl+Z)", + "undoShortcut": "撤销 (Ctrl+Z)", + "unpin": "取消置顶", + "unpinned": "未置顶", + "untitled": "无标题", + "uploadFailed": "上传失败:{filename}", + "view": "查看笔记" + }, + "pagination": { + "next": "→", + "pageInfo": "第 {currentPage} 页 / 共 {totalPages} 页", + "previous": "←" + }, + "paragraphRefactor": { + "casual": "随意", + "expand": "扩展", + "formal": "正式", + "improve": "改进", + "shorten": "缩短", + "title": "文本改进" + }, + "profile": { + "accountSettings": "账户设置", + "autoDetect": "自动检测", + "changePassword": "更改密码", + "changePasswordDescription": "更新您的密码。您需要当前密码。", + "confirmPassword": "确认密码", + "currentPassword": "当前密码", + "description": "更新您的个人信息", + "displayName": "显示名称", + "displaySettings": "显示设置", + "displaySettingsDescription": "自定义外观和字体大小。", + "email": "电子邮箱", + "fontSize": "字体大小", + "fontSizeDescription": "调整字体大小以获得更好的可读性。这适用于界面中的所有文本。", + "fontSizeExtraLarge": "超大", + "fontSizeLarge": "大", + "fontSizeMedium": "中", + "fontSizeSmall": "小", + "fontSizeUpdateFailed": "更新字体大小失败", + "fontSizeUpdateSuccess": "字体大小更新成功", + "languageDescription": "此语言将用于 AI 驱动的功能、内容分析和界面文本。", + "languagePreferences": "语言偏好", + "languagePreferencesDescription": "为 AI 功能和界面选择您的首选语言。", + "languageUpdateFailed": "更新语言失败", + "languageUpdateSuccess": "语言更新成功", + "manageAISettings": "管理 AI 设置", + "newPassword": "新密码", + "passwordChangeFailed": "更改密码失败", + "passwordChangeSuccess": "密码更改成功", + "passwordError": "更新密码时出错", + "passwordUpdated": "密码已更新", + "preferredLanguage": "首选语言", + "profileError": "更新个人资料时出错", + "profileUpdated": "个人资料已更新", + "recentNotesUpdateFailed": "Failed to update recent notes setting", + "recentNotesUpdateSuccess": "Recent notes setting updated successfully", + "selectFontSize": "选择字体大小", + "selectLanguage": "选择语言", + "showRecentNotes": "Show Recent Notes Section", + "showRecentNotesDescription": "Display recent notes (last 7 days) on the main page", + "title": "个人资料", + "updateFailed": "更新个人资料失败", + "updatePassword": "更新密码", + "updateSuccess": "个人资料已更新" + }, + "reminder": { + "cancel": "取消", + "reminderDate": "提醒日期", + "reminderTime": "提醒时间", + "removeReminder": "移除提醒", + "save": "设置提醒", + "setReminder": "设置提醒", + "title": "提醒" + }, + "resetPassword": { + "confirmNewPassword": "确认新密码", + "description": "在下方输入您的新密码。", + "invalidLinkDescription": "此密码重置链接无效或已过期。", + "invalidLinkTitle": "无效链接", + "loading": "加载中...", + "newPassword": "新密码", + "passwordMismatch": "密码不匹配", + "requestNewLink": "请求新链接", + "resetPassword": "重置密码", + "resetting": "重置中...", + "success": "密码重置成功。您现在可以登录了。", + "title": "重置密码" + }, + "search": { + "exactMatch": "完全匹配", + "noResults": "未找到结果", + "placeholder": "搜索", + "related": "相关", + "resultsFound": "找到 {count} 条笔记", + "searchPlaceholder": "搜索您的笔记...", + "searching": "搜索中...", + "semanticInProgress": "AI 搜索进行中...", + "semanticTooltip": "AI 语义搜索" }, "semanticSearch": { "exactMatch": "完全匹配", "related": "相关", "searching": "搜索中..." }, - "paragraphRefactor": { - "title": "文本改进", - "shorten": "缩短", - "expand": "扩展", - "improve": "改进", - "formal": "正式", - "casual": "随意" - }, - "memoryEcho": { - "title": "我注意到了一些事情...", - "description": "您的笔记之间的主动关联", - "dailyInsight": "您的笔记的每日洞察", - "insightReady": "您的洞察已准备好!", - "viewConnection": "查看关联", - "helpful": "有帮助", - "notHelpful": "无帮助", - "dismiss": "暂时忽略", - "thanksFeedback": "感谢您的反馈!", - "thanksFeedbackImproving": "谢谢!我们将利用此来改进。", - "connections": "关联", - "connection": "关联", - "connectionsBadge": "{count} 个关联{plural}", - "fused": "已融合", - "overlay": { - "title": "关联的笔记", - "searchPlaceholder": "搜索关联...", - "sortBy": "排序方式:", - "sortSimilarity": "相似度", - "sortRecent": "最近", - "sortOldest": "最早", - "viewAll": "并排查看全部", - "loading": "加载中...", - "noConnections": "未找到关联" - }, - "comparison": { - "title": "💡 笔记比较", - "similarityInfo": "这些笔记的相似度为 {similarity}%", - "highSimilarityInsight": "这些笔记讨论同一主题,具有很高的相似度。它们可以合并或整合。", - "untitled": "无标题", - "clickToView": "点击查看笔记", - "helpfulQuestion": "此比较有帮助吗?", - "helpful": "有帮助", - "notHelpful": "无帮助" - }, - "editorSection": { - "title": "⚡ 关联的笔记({count})", - "loading": "加载中...", - "view": "查看", - "compare": "比较", - "merge": "合并", - "compareAll": "比较全部", - "mergeAll": "合并全部" - }, - "fusion": { - "title": "🔗 智能融合", - "mergeNotes": "合并 {count} 条笔记", - "notesToMerge": "📝 要合并的笔记", - "optionalPrompt": "💬 融合提示(可选)", - "promptPlaceholder": "AI 的可选指令(例如,'保持笔记 1 的正式风格')...", - "generateFusion": "生成融合", - "generating": "生成中...", - "previewTitle": "📝 合并笔记的预览", - "edit": "编辑", - "modify": "修改", - "finishEditing": "完成编辑", - "optionsTitle": "融合选项", - "archiveOriginals": "归档原始笔记", - "keepAllTags": "保留所有标签", - "useLatestTitle": "使用最新笔记作为标题", - "createBacklinks": "创建指向原始笔记的反向链接", - "cancel": "取消", - "confirmFusion": "确认融合", - "success": "笔记合并成功!", - "error": "合并笔记失败", - "generateError": "生成融合失败", - "noContentReturned": "API 未返回融合内容", - "unknownDate": "未知日期" - } - }, - "nav": { - "home": "主页", - "notes": "笔记", - "notebooks": "笔记本", - "generalNotes": "普通笔记", - "archive": "归档", - "settings": "设置", - "profile": "个人资料", - "aiSettings": "AI 设置", - "logout": "退出登录", - "login": "登录", - "adminDashboard": "管理后台", - "diagnostics": "诊断", - "trash": "回收站", - "support": "支持 Memento ☕", - "reminders": "提醒", - "userManagement": "用户管理", - "accountSettings": "账户设置", - "manageAISettings": "管理 AI 设置", - "configureAI": "配置您的 AI 驱动功能、提供商和偏好设置", - "supportDevelopment": "支持 Memento 开发 ☕", - "supportDescription": "Memento 是 100% 免费和开源的。您的支持帮助它保持这种方式。", - "buyMeACoffee": "请我喝杯咖啡", - "donationDescription": "进行一次性捐赠或成为月度支持者。", - "donateOnKofi": "在 Ko-fi 上捐赠", - "donationNote": "无平台费用 • 即时付款 • 安全", - "sponsorOnGithub": "在 GitHub 上赞助", - "sponsorDescription": "成为月度赞助者并获得认可。", - "workspace": "工作区", - "quickAccess": "快速访问", - "myLibrary": "我的库", - "favorites": "收藏夹", - "recent": "最近", - "proPlan": "专业版" - }, "settings": { - "title": "设置", - "description": "管理您的设置和偏好", + "about": "关于", "account": "账户", "appearance": "外观", - "theme": "主题", - "themeLight": "浅色", - "themeDark": "深色", - "themeSystem": "跟随系统", - "notifications": "通知", + "cleanTags": "Clean Orphan Tags", + "cleanTagsDescription": "Remove tags that are no longer used by any notes", + "description": "管理您的设置和偏好", "language": "语言", - "selectLanguage": "选择语言", + "languageAuto": "自动检测", + "maintenance": "Maintenance", + "maintenanceDescription": "Tools to maintain your database health", + "notifications": "通知", "privacy": "隐私", + "profile": "个人资料", + "searchNoResults": "未找到匹配的设置", "security": "安全", - "about": "关于", - "version": "版本", - "settingsSaved": "设置已保存", - "settingsError": "保存设置时出错" - }, - "profile": { - "title": "个人资料", - "description": "更新您的个人信息", - "displayName": "显示名称", - "email": "电子邮箱", - "changePassword": "更改密码", - "changePasswordDescription": "更新您的密码。您需要当前密码。", - "currentPassword": "当前密码", - "newPassword": "新密码", - "confirmPassword": "确认密码", - "updatePassword": "更新密码", - "passwordChangeSuccess": "密码更改成功", - "passwordChangeFailed": "更改密码失败", - "passwordUpdated": "密码已更新", - "passwordError": "更新密码时出错", - "languagePreferences": "语言偏好", - "languagePreferencesDescription": "为 AI 功能和界面选择您的首选语言。", - "preferredLanguage": "首选语言", "selectLanguage": "选择语言", - "languageDescription": "此语言将用于 AI 驱动的功能、内容分析和界面文本。", - "autoDetect": "自动检测", - "updateSuccess": "个人资料已更新", - "updateFailed": "更新个人资料失败", - "languageUpdateSuccess": "语言更新成功", - "languageUpdateFailed": "更新语言失败", - "profileUpdated": "个人资料已更新", - "profileError": "更新个人资料时出错", - "accountSettings": "账户设置", - "manageAISettings": "管理 AI 设置", - "displaySettings": "显示设置", - "displaySettingsDescription": "自定义外观和字体大小。", - "fontSize": "字体大小", - "selectFontSize": "选择字体大小", - "fontSizeSmall": "小", - "fontSizeMedium": "中", - "fontSizeLarge": "大", - "fontSizeExtraLarge": "超大", - "fontSizeDescription": "调整字体大小以获得更好的可读性。这适用于界面中的所有文本。", - "fontSizeUpdateSuccess": "字体大小更新成功", - "fontSizeUpdateFailed": "更新字体大小失败" + "semanticIndexing": "Semantic Indexing", + "semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search", + "settingsError": "保存设置时出错", + "settingsSaved": "设置已保存", + "theme": "主题", + "themeDark": "深色", + "themeLight": "浅色", + "themeSystem": "跟随系统", + "title": "设置", + "version": "版本" }, - "aiSettings": { - "title": "AI 设置", - "description": "配置您的 AI 驱动功能和偏好设置", - "features": "AI 功能", - "provider": "AI 提供商", - "providerAuto": "自动(推荐)", - "providerOllama": "Ollama(本地)", - "providerOpenAI": "OpenAI(云端)", - "frequency": "频率", - "frequencyDaily": "每天", - "frequencyWeekly": "每周", - "saving": "保存中...", - "saved": "设置已更新", - "error": "更新设置失败" + "sidebar": { + "archive": "Archive", + "editLabels": "Edit labels", + "labels": "Labels", + "notes": "Notes", + "reminders": "Reminders", + "trash": "Trash" }, - "general": { - "loading": "加载中...", - "save": "保存", - "cancel": "取消", - "add": "添加", - "edit": "编辑", - "confirm": "确认", - "close": "关闭", - "back": "返回", - "next": "下一步", - "previous": "上一步", - "submit": "提交", - "reset": "重置", - "apply": "应用", - "clear": "清除", - "select": "选择", - "tryAgain": "请重试", - "error": "发生错误", - "operationSuccess": "操作成功", - "operationFailed": "操作失败" + "support": { + "aiApiCosts": "AI API 成本:", + "buyMeACoffee": "请我喝杯咖啡", + "contributeCode": "贡献代码", + "description": "Memento 是 100% 免费和开源的。您的支持帮助它保持这种方式。", + "directImpact": "直接影响", + "domainSSL": "域名和 SSL:", + "donateOnKofi": "在 Ko-fi 上捐赠", + "donationDescription": "进行一次性捐赠或成为月度支持者。", + "githubDescription": "定期支持 • 公开认可 • 面向开发者", + "hostingServers": "托管和服务器:", + "howSupportHelps": "您的支持如何帮助", + "kofiDescription": "无平台费用 • 即时付款 • 安全", + "otherWaysTitle": "其他支持方式", + "reportBug": "报告错误", + "shareTwitter": "在 Twitter 上分享", + "sponsorDescription": "成为月度赞助者并获得认可。", + "sponsorOnGithub": "在 GitHub 上赞助", + "sponsorPerks": "赞助者福利", + "starGithub": "在 GitHub 上加星", + "title": "支持 Memento 开发", + "totalExpenses": "总支出:", + "transparency": "透明度", + "transparencyDescription": "我相信完全透明。以下是捐款的使用方式:" }, - "colors": { - "default": "默认", - "red": "红色", - "blue": "蓝色", - "green": "绿色", - "yellow": "黄色", - "purple": "紫色", - "pink": "粉色", - "orange": "橙色", - "gray": "灰色" + "testPages": { + "titleSuggestions": { + "analyzing": "分析中...", + "contentLabel": "内容(需要 50 个以上的单词):", + "error": "错误:", + "idle": "空闲", + "noSuggestions": "还没有建议。输入 50 个以上的单词并等待 2 秒。", + "placeholder": "在此输入至少 50 个单词...", + "status": "状态:", + "suggestions": "建议({count}):", + "title": "测试标题建议", + "wordCount": "字数:" + } }, - "reminder": { - "title": "提醒", - "setReminder": "设置提醒", - "removeReminder": "移除提醒", - "reminderDate": "提醒日期", - "reminderTime": "提醒时间", - "save": "设置提醒", - "cancel": "取消" + "time": { + "daysAgo": "{count} 天前", + "hoursAgo": "{count} 小时前", + "justNow": "刚刚", + "minutesAgo": "{count} 分钟前", + "today": "今天", + "tomorrow": "明天", + "yesterday": "昨天" }, - "notebookSuggestion": { - "title": "移动到 {icon} {name}?", - "description": "这条笔记似乎属于这个笔记本", - "move": "移动", + "titleSuggestions": { + "available": "标题建议", "dismiss": "忽略", - "dismissIn": "忽略({timeLeft} 秒后关闭)", - "moveToNotebook": "移动到笔记本", - "generalNotes": "普通笔记" + "generating": "生成中...", + "selectTitle": "选择标题", + "title": "AI 建议" + }, + "toast": { + "feedbackFailed": "提交反馈失败", + "notesFusionSuccess": "笔记合并成功!", + "openConnectionFailed": "打开连接失败", + "openingConnection": "正在打开连接...", + "operationFailed": "操作失败", + "operationSuccess": "操作成功", + "saveFailed": "保存设置失败", + "saved": "设置已保存", + "thanksFeedback": "感谢您的反馈!", + "thanksFeedbackImproving": "谢谢!我们将利用此来改进。" + }, + "trash": { + "deletePermanently": "永久删除", + "empty": "回收站是空的", + "restore": "恢复", + "title": "回收站" + }, + "ui": { + "close": "关闭", + "collapse": "收起", + "expand": "展开", + "open": "打开" } } diff --git a/keep-notes/prisma/dev.db b/keep-notes/prisma/dev.db index 6a83a0a..3469b17 100644 Binary files a/keep-notes/prisma/dev.db and b/keep-notes/prisma/dev.db differ diff --git a/keep-notes/scripts/check-config.ts b/keep-notes/scripts/check-config.ts new file mode 100644 index 0000000..69c64f9 --- /dev/null +++ b/keep-notes/scripts/check-config.ts @@ -0,0 +1,22 @@ +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient() + +async function main() { + const configs = await prisma.systemConfig.findMany() + console.log('--- System Config ---') + configs.forEach(c => { + if (c.key.startsWith('AI_') || c.key.startsWith('OLLAMA_')) { + console.log(`${c.key}: ${c.value}`) + } + }) +} + +main() + .catch(e => { + console.error(e) + process.exit(1) + }) + .finally(async () => { + await prisma.$disconnect() + })
NameEmailRoleCreated AtActions{t('admin.users.table.name')}{t('admin.users.table.email')}{t('admin.users.table.role')}{t('admin.users.table.createdAt')}{t('admin.users.table.actions')}
{user.name || 'N/A'}{user.name || t('common.notAvailable')} {user.email} - {user.role} + {user.role === 'ADMIN' ? t('admin.users.roles.admin') : t('admin.users.roles.user')} {format(new Date(user.createdAt), 'PP')}