Keep/keep-notes/lib/i18n/LanguageProvider.tsx
sepehr 7fb486c9a4 feat: Complete internationalization and code cleanup
## Translation Files
- Add 11 new language files (es, de, pt, ru, zh, ja, ko, ar, hi, nl, pl)
- Add 100+ missing translation keys across all 15 languages
- New sections: notebook, pagination, ai.batchOrganization, ai.autoLabels
- Update nav section with workspace, quickAccess, myLibrary keys

## Component Updates
- Update 15+ components to use translation keys instead of hardcoded text
- Components: notebook dialogs, sidebar, header, note-input, ghost-tags, etc.
- Replace 80+ hardcoded English/French strings with t() calls
- Ensure consistent UI across all supported languages

## Code Quality
- Remove 77+ console.log statements from codebase
- Clean up API routes, components, hooks, and services
- Keep only essential error handling (no debugging logs)

## UI/UX Improvements
- Update Keep logo to yellow post-it style (from-yellow-400 to-amber-500)
- Change selection colors to #FEF3C6 (notebooks) and #EFB162 (nav items)
- Make "+" button permanently visible in notebooks section
- Fix grammar and syntax errors in multiple components

## Bug Fixes
- Fix JSON syntax errors in it.json, nl.json, pl.json, zh.json
- Fix syntax errors in notebook-suggestion-toast.tsx
- Fix syntax errors in use-auto-tagging.ts
- Fix syntax errors in paragraph-refactor.service.ts
- Fix duplicate "fusion" section in nl.json

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

Ou une version plus courte si vous préférez :

feat(i18n): Add 15 languages, remove logs, update UI components

- Create 11 new translation files (es, de, pt, ru, zh, ja, ko, ar, hi, nl, pl)
- Add 100+ translation keys: notebook, pagination, AI features
- Update 15+ components to use translations (80+ strings)
- Remove 77+ console.log statements from codebase
- Fix JSON syntax errors in 4 translation files
- Fix component syntax errors (toast, hooks, services)
- Update logo to yellow post-it style
- Change selection colors (#FEF3C6, #EFB162)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-11 22:26:13 +01:00

81 lines
2.3 KiB
TypeScript

'use client'
import { createContext, useContext, useEffect, useState } from 'react'
import type { ReactNode } from 'react'
import { SupportedLanguage, loadTranslations, getTranslationValue, Translations } from './load-translations'
type LanguageContextType = {
language: SupportedLanguage
setLanguage: (lang: SupportedLanguage) => void
t: (key: string, params?: Record<string, string | number>) => string
translations: Translations
}
const LanguageContext = createContext<LanguageContextType | undefined>(undefined)
export function LanguageProvider({ children, initialLanguage = 'en' }: {
children: ReactNode
initialLanguage?: SupportedLanguage
}) {
const [language, setLanguageState] = useState<SupportedLanguage>(initialLanguage)
const [translations, setTranslations] = useState<Translations | null>(null)
// Load translations when language changes
useEffect(() => {
const loadLang = async () => {
const loaded = await loadTranslations(language)
setTranslations(loaded)
}
loadLang()
}, [language])
// Load saved language from localStorage on mount
useEffect(() => {
const saved = localStorage.getItem('user-language') as SupportedLanguage
if (saved) {
setLanguageState(saved)
document.documentElement.lang = saved
}
}, [])
const setLanguage = (lang: SupportedLanguage) => {
setLanguageState(lang)
localStorage.setItem('user-language', lang)
// Update HTML lang attribute for font styling
document.documentElement.lang = lang
}
const t = (key: string, params?: Record<string, string | number>) => {
if (!translations) return key
let value: any = getTranslationValue(translations, key)
// Replace parameters like {count}, {percentage}, etc.
if (params) {
Object.entries(params).forEach(([param, paramValue]) => {
value = value.replace(`{${param}}`, String(paramValue))
})
}
return value
}
if (!translations) {
return null // Show loading state if needed
}
return (
<LanguageContext.Provider value={{ language, setLanguage, t, translations }}>
{children}
</LanguageContext.Provider>
)
}
export function useLanguage() {
const context = useContext(LanguageContext)
if (context === undefined) {
throw new Error('useLanguage must be used within a LanguageProvider')
}
return context
}