Merge pull request #643 from kunalk16/feat-i18n-bangla-support

feat(i18n): support for bengali(bn-IN) language
This commit is contained in:
Luis Novo 2026-03-10 22:15:44 -03:00 committed by GitHub
commit 2e952f61a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 952 additions and 5 deletions

View file

@ -63,7 +63,7 @@ In a world dominated by Artificial Intelligence, having the ability to think
- 🎙️ **Generate professional podcasts** - Advanced multi-speaker podcast generation - 🎙️ **Generate professional podcasts** - Advanced multi-speaker podcast generation
- 🔍 **Search intelligently** - Full-text and vector search across all your content - 🔍 **Search intelligently** - Full-text and vector search across all your content
- 💬 **Chat with context** - AI conversations powered by your research - 💬 **Chat with context** - AI conversations powered by your research
- 🌐 **Multi-language UI** - English, Portuguese, Chinese (Simplified & Traditional), Japanese, and Russian support - 🌐 **Multi-language UI** - English, Portuguese, Chinese (Simplified & Traditional), Japanese, Russian, and Bengali support
Learn more about our project at [https://www.open-notebook.ai](https://www.open-notebook.ai) Learn more about our project at [https://www.open-notebook.ai](https://www.open-notebook.ai)

View file

@ -76,6 +76,12 @@ export function LanguageToggle({ iconOnly = false }: LanguageToggleProps) {
> >
<span>{t.common.russian}</span> <span>{t.common.russian}</span>
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuItem
onClick={() => setLanguage('bn-IN')}
className={currentLang === 'bn-IN' || currentLang.startsWith('bn') ? 'bg-accent' : ''}
>
<span>{t.common.bengali}</span>
</DropdownMenuItem>
</DropdownMenuContent> </DropdownMenuContent>
</DropdownMenu> </DropdownMenu>
) )

View file

@ -19,7 +19,8 @@ lib/
├── zh-CN/index.ts # Simplified Chinese translations ├── zh-CN/index.ts # Simplified Chinese translations
├── zh-TW/index.ts # Traditional Chinese translations ├── zh-TW/index.ts # Traditional Chinese translations
├── ja-JP/index.ts # Japanese translations ├── ja-JP/index.ts # Japanese translations
└── ru-RU/index.ts # Russian translations ├── ru-RU/index.ts # Russian translations
└── bn-IN/index.ts # Bengali translations
``` ```
## Key Components ## Key Components

View file

@ -0,0 +1,928 @@
export const bnIN = {
common: {
search: "অনুসন্ধান...",
create: "নতুন",
new: "নতুন",
cancel: "বাতিল",
delete: "মুছে ফেলুন",
edit: "সম্পাদনা",
theme: "থিম",
signOut: "সাইন আউট",
noMatches: "কোনো মিল পাওয়া যায়নি",
tryDifferentSearch: "একটি ভিন্ন অনুসন্ধান শব্দ ব্যবহার করার চেষ্টা করুন।",
light: "হালকা",
dark: "অন্ধকার",
system: "সিস্টেম",
loading: "লোড হচ্ছে...",
note: "নোট",
insight: "অন্তর্দৃষ্টি",
newSource: "নতুন উৎস",
newNotebook: "নতুন নোটবুক",
newPodcast: "নতুন পডকাস্ট",
language: "ভাষা",
english: "English",
chinese: "简体中文",
japanese: "日本語",
french: "Français",
russian: "Русский",
bengali: "বাংলা",
source: "উৎস",
notebook: "নোটবুক",
podcast: "পডকাস্ট",
quickActions: "দ্রুত ক্রিয়া",
quickActionsDesc: "নেভিগেশন, অনুসন্ধান, প্রশ্ন, থিম",
appName: "ওপেন নোটবুক",
add: "যোগ করুন",
remove: "সরান",
confirm: "নিশ্চিত করুন",
warning: "সতর্কতা",
error: "ত্রুটি",
success: "সফল",
model: "মডেল",
back: "পিছনে",
next: "পরবর্তী",
done: "সম্পন্ন",
processing: "প্রক্রিয়াকরণ...",
creating: "তৈরি করা হচ্ছে...",
linked: "সংযুক্ত",
adding: "যোগ করা হচ্ছে...",
addSelected: "নির্বাচিত যোগ করুন",
customModel: "কাস্টম মডেল",
failed: "ব্যর্থ",
current: "বর্তমান",
save: "সংরক্ষণ",
writeNote: "নোট লিখুন",
batchMode: "ব্যাচ মোড",
optional: "ঐচ্ছিক",
type: "ধরন",
title: "শিরোনাম",
created: "তৈরি করা হয়েছে {time}",
updated: "আপডেট করা হয়েছে {time}",
actions: "ক্রিয়া",
noResults: "কোনো ফলাফল নেই",
references: "রেফারেন্স",
refreshPage: "অনুগ্রহ করে পৃষ্ঠাটি রিফ্রেশ করার চেষ্টা করুন",
refresh: "রিফ্রেশ",
aiGenerated: "AI দ্বারা তৈরি",
human: "মানুষ",
unknown: "অজানা",
notes: "নোটগুলি",
chat: "চ্যাট",
deleteForever: "চিরতরে মুছে ফেলুন",
connectionError: "সংযোগ ত্রুটি",
unableToConnect: "API সার্ভারে সংযোগ করতে অক্ষম",
retryConnection: "সংযোগ পুনরায় চেষ্টা করুন",
diagnosticInfo: "ডায়াগনস্টিক তথ্য",
version: "সংস্করণ",
built: "নির্মিত",
apiUrl: "API URL",
frontendUrl: "ফ্রন্টএন্ড URL",
checkConsoleLogs: "বিস্তারিত লগের জন্য ব্রাউজার কনসোল চেক করুন (🔧 [Config] বার্তা দেখুন)",
yes: "হ্যাঁ",
no: "না",
saving: "সংরক্ষণ করা হচ্ছে...",
description: "বিবরণ",
saveToNote: "নোটে সংরক্ষণ করুন",
copyToClipboard: "ক্লিপবোর্ডে কপি করুন",
close: "বন্ধ",
insights: "অন্তর্দৃষ্টি",
progress: "অগ্রগতি",
deleting: "মুছে ফেলা হচ্ছে...",
created_label: "তৈরি",
updated_label: "আপডেট",
download: "ডাউনলোড",
saveChanges: "পরিবর্তন সংরক্ষণ",
name: "নাম",
default: "ডিফল্ট",
nameRequired: "নাম প্রয়োজন",
modelConfiguration: "মডেল কনফিগারেশন",
resetToDefault: "ডিফল্টে রিসেট",
reasoning: "যুক্তি",
searchTerms: "অনুসন্ধান শব্দ",
strategy: "কৌশল",
individualAnswers: "ব্যক্তিগত উত্তর ({count})",
finalAnswer: "চূড়ান্ত উত্তর",
notebookLabel: "নোটবুক: {name}",
itemNotFound: "এই {type} খুঁজে পাওয়া যায়নি",
accessibility: {
transformationViews: "ট্রান্সফরমেশন ভিউ",
searchKB: "আপনার জ্ঞানভান্ডার জিজ্ঞাসা বা অনুসন্ধান করুন",
enterQuestion: "জ্ঞানভান্ডার জিজ্ঞাসা করতে আপনার প্রশ্ন লিখুন",
enterSearch: "অনুসন্ধান ক্যোয়ারি লিখুন",
searchKBBtn: "জ্ঞানভান্ডার অনুসন্ধান",
podcastViews: "পডকাস্ট ভিউ",
ytVideo: "YouTube ভিডিও",
askResponse: "জিজ্ঞাসার উত্তর",
searchNotebooks: "নোটবুক অনুসন্ধান",
},
url: "URL",
errorDetails: "ত্রুটির বিবরণ",
editTransformation: "ট্রান্সফরমেশন সম্পাদনা",
retry: "আবার চেষ্টা করুন",
traditionalChinese: "繁體中文",
portuguese: "Português",
completed: "সম্পন্ন",
saveSuccess: "সফলভাবে সংরক্ষিত",
contextModes: {
off: "চ্যাটে অন্তর্ভুক্ত নয়",
insights: "শুধুমাত্র অন্তর্দৃষ্টি",
full: "সম্পূর্ণ কন্টেন্ট",
clickToCycle: "সাইকেল করতে ক্লিক করুন",
},
clickToEdit: "সম্পাদনা করতে ক্লিক করুন",
},
apiErrors: {
notebookNotFound: "নোটবুক খুঁজে পাওয়া যায়নি",
sourceNotFound: "উৎস খুঁজে পাওয়া যায়নি",
transformationNotFound: "ট্রান্সফরমেশন খুঁজে পাওয়া যায়নি",
fileUploadFailed: "ফাইল আপলোড ব্যর্থ",
urlRequired: "লিন্ক টাইপের জন্য URL প্রয়োজন",
contentRequired: "টেক্সট টাইপের জন্য কন্টেন্ট প্রয়োজন",
invalidSourceType: "অবৈধ উৎস ধরন",
processingFailed: "প্রক্রিয়াকরণ ব্যর্থ",
failedToQueue: "প্রক্রিয়াকরণ কিউ করতে ব্যর্থ",
invalidSortBy: "সাজানোর ফিল্ড 'created' বা 'updated' হতে হবে",
invalidSortOrder: "সাজানোর ক্রম 'asc' বা 'desc' হতে হবে",
accessDenied: "ফাইলের অ্যাক্সেস অস্বীকৃত",
fileNotFoundOnServer: "সার্ভারে ফাইল খুঁজে পাওয়া যায়নি",
searchFailed: "অনুসন্ধান ব্যর্থ",
askFailed: "প্রশ্ন করা ব্যর্থ",
pleaseEnterQuestion: "অনুগ্রহ করে একটি প্রশ্ন লিখুন",
pleaseConfigureModels: "অনুগ্রহ করে সব প্রয়োজনীয় মডেল কনফিগার করুন",
failedToCreateSession: "সেশন তৈরি করতে ব্যর্থ",
failedToUpdateSession: "সেশন আপডেট করতে ব্যর্থ",
failedToDeleteSession: "সেশন মুছে ফেলতে ব্যর্থ",
failedToSendMessage: "বার্তা পাঠাতে ব্যর্থ",
unauthorized: "অননুমোদিত অ্যাক্সেস, অনুগ্রহ করে আপনার পাসওয়ার্ড চেক করুন",
invalidPassword: "অবৈধ পাসওয়ার্ড",
embeddingModelRequired: "এই ফিচারের জন্য একটি embedding মডেল প্রয়োজন। অনুগ্রহ করে Models সেকশনে একটি কনফিগার করুন।",
strategyModelNotFound: "Strategy মডেল খুঁজে পাওয়া যায়নি",
answerModelNotFound: "Answer মডেল খুঁজে পাওয়া যায়নি",
finalAnswerModelNotFound: "Final answer মডেল খুঁজে পাওয়া যায়নি",
noAnswerGenerated: "কোনো উত্তর তৈরি করা যায়নি",
genericError: "একটি অপ্রত্যাশিত ত্রুটি ঘটেছে",
},
connectionErrors: {
apiTitle: "API সার্ভারে সংযোগ করতে অক্ষম",
apiDesc: "ওপেন নোটবুক API সার্ভারে পৌঁছানো যায়নি",
dbTitle: "ডেটাবেস সংযোগ ব্যর্থ",
dbDesc: "API সার্ভার চালু আছে, কিন্তু ডেটাবেস অ্যাক্সেসযোগ্য নয়",
troubleshooting: "এটি সাধারণত মানে:",
apiUnreachable1: "API সার্ভার চালু নেই",
apiUnreachable2: "API সার্ভার ভিন্ন ঠিকানায় চালু আছে",
apiUnreachable3: "নেটওয়ার্ক সংযোগ সমস্যা",
dbFailed1: "SurrealDB চালু নেই",
dbFailed2: "ডেটাবেস সংযোগ সেটিংস ভুল",
dbFailed3: "API ও ডেটাবেসের মধ্যে নেটওয়ার্ক সমস্যা",
quickFixes: "দ্রুত সমাধান:",
setApiUrl: "API_URL environment variable সেট করুন:",
checkSurreal: "SurrealDB চালু আছে কিনা চেক করুন:",
seeDocumentation: "বিস্তারিত সেটআপ নির্দেশনার জন্য দেখুন:",
docLink: "ওপেন নোটবুক ডকুমেন্টেশন",
showTechnical: "টেকনিক্যাল বিবরণ দেখুন",
attemptedUrl: "চেষ্টা করা URL",
message: "বার্তা",
technicalDetails: "টেকনিক্যাল বিবরণ",
stackTrace: "Stack Trace",
retryLabel: "সংযোগ পুনরায় চেষ্টা",
retryHint: "R চাপুন বা বোতামে ক্লিক করে পুনরায় চেষ্টা করুন",
dockerLabel: "Docker এর জন্য",
localDevLabel: "স্থানীয় ডেভেলপমেন্টের জন্য",
},
auth: {
loginTitle: "ওপেন নোটবুক",
loginDesc: "অ্যাপ্লিকেশন অ্যাক্সেস করতে আপনার পাসওয়ার্ড লিখুন",
passwordPlaceholder: "পাসওয়ার্ড",
signingIn: "সাইন ইন করা হচ্ছে...",
signIn: "সাইন ইন",
connectErrorHint: "সার্ভারে সংযোগ করতে অক্ষম। API চালু আছে কিনা চেক করুন।",
},
navigation: {
collect: "সংগ্রহ",
process: "প্রক্রিয়া",
create: "তৈরি",
manage: "ব্যবস্থাপনা",
sources: "উৎসগুলি",
notebooks: "নোটবুকগুলি",
askAndSearch: "জিজ্ঞাসা ও অনুসন্ধান",
podcasts: "পডকাস্ট",
models: "মডেলগুলি",
transformations: "ট্রান্সফরমেশনস",
transformation: "ট্রান্সফরমেশন",
settings: "সেটিংস",
advanced: "উন্নত",
nav: "নেভিগেশন",
language: "ভাষা টগল",
theme: "থিম",
ask: "জিজ্ঞাসা",
},
notebooks: {
title: "নোটবুকগুলি",
newNotebook: "নতুন নোটবুক",
searchPlaceholder: "নোটবুক অনুসন্ধান...",
archived: "আর্কাইভ করা",
archive: "আর্কাইভ",
unarchive: "আর্কাইভ বাতিল",
deleteNotebook: "নোটবুক মুছে ফেলুন",
deleteNotebookDesc: "আপনি কি নিশ্চিত \"{name}\" মুছে ফেলতে চান? এই কাজটি পুনরায় করা যাবে না।",
deleteNotebookLoading: "মুছে ফেলার প্রিভিউ লোড হচ্ছে...",
deleteNotebookNotes: "{count}টি নোট চিরতরে মুছে যাবে।",
deleteNotebookNoNotes: "মুছার জন্য কোন নোট নেই।",
deleteNotebookExclusiveSources: "{count}টি উৎস শুধুমাত্র এই নোটবুকে আছে।",
deleteNotebookSharedSources: "{count}টি উৎস অন্য নোটবুকের সাথে সাঝা করা এবং আনলিংক হবে।",
deleteNotebookNoSources: "এই নোটবুকে কোন উৎস নেই।",
deleteExclusiveSourcesLabel: "এক্সক্লুসিভ উৎসগুলি মুছে ফেলুন",
keepExclusiveSourcesLabel: "আনলিংক করে রাখুন",
activeNotebooks: "সক্রিয় নোটবুক",
archivedNotebooks: "আর্কাইভ নোটবুক",
notFound: "নোটবুক খুঁজে পাওয়া যায়নি",
notFoundDesc: "অনুরোধ করা নোটবুক অস্তিত্ব নেই।",
updated: "আপডেট করা",
namePlaceholder: "নোটবুকের নাম",
addDescription: "বিবরণ যোগ করুন...",
noNotesYet: "এখনও কোন নোট নেই",
deleteNote: "নোট মুছে ফেলুন",
deleteNoteConfirm: "আপনি কি নিশ্চিত এই নোটটি মুছে ফেলতে চান? এই কাজটি পুনরায় করা যাবে না।",
noteCreatedSuccess: "নোট সফলভাবে তৈরি হয়েছে",
failedToCreateNote: "নোট তৈরি করতে ব্যর্থ",
noteUpdatedSuccess: "নোট সফলভাবে আপডেট হয়েছে",
failedToUpdateNote: "নোট আপডেট করতে ব্যর্থ",
noteDeletedSuccess: "নোট সফলভাবে মুছে ফেলা হয়েছে",
failedToDeleteNote: "নোট মুছে ফেলতে ব্যর্থ",
createNew: "নতুন নোটবুক তৈরি করুন",
createNewDesc: "শুরু করতে একটি নাম ও একটি ঐচ্ছিক বিবরণ লিখুন।",
descPlaceholder: "এই নোটবুক সম্পর্কে আরো তথ্য এখানে যোগ করুন...",
createSuccess: "নোটবুক সফলভাবে তৈরি হয়েছে",
updateSuccess: "নোটবুক সফলভাবে আপডেট হয়েছে",
deleteSuccess: "নোটবুক সফলভাবে মুছে ফেলা হয়েছে",
},
sources: {
title: "উৎসগুলি",
add: "উৎস যোগ করুন",
addNew: "নতুন উৎস যোগ করুন",
addExisting: "বিদ্যমান উৎস যোগ করুন",
delete: "উৎস মুছে ফেলুন",
statusPreparing: "প্রস্তুত করা হচ্ছে",
statusQueued: "কিউ করা",
statusProcessing: "প্রক্রিয়াকরণ",
statusCompleted: "সম্পন্ন",
statusFailed: "ব্যর্থ",
statusPreparingDesc: "প্রক্রিয়াকরণের জন্য প্রস্তুত করা হচ্ছে",
statusQueuedDesc: "প্রক্রিয়াকরণের জন্য অপেক্ষা করছে",
statusProcessingDesc: "প্রক্রিয়াকরণ হচ্ছে",
statusCompletedDesc: "সফলভাবে প্রক্রিয়াকরণ করা হয়েছে",
statusFailedDesc: "প্রক্রিয়াকরণ ব্যর্থ",
failedToLoad: "উৎস লোড করতে ব্যর্থ",
allSourcesDesc: "এখানে আপনার সব উৎস দেখুন। আপনি নতুন উৎস যোগ করতে বা বিদ্যমান উৎস পরিচালনা করতে পারেন।",
allSources: "সব উৎস",
insights: "অন্তর্দৃষ্টি",
yes: "হ্যাঁ",
no: "না",
loadingMore: "আরো লোড হচ্ছে...",
noSourcesYet: "এখনও কোন উৎস নেই",
allSourcesDescShort: "এখানে আপনার সব উৎস দেখুন।",
cannotSaveNoteNoNotebook: "নোট সংরক্ষণ করতে পারা যায়নি: নোটবুক ID উপলব্ধ নয়",
createFirstSource: "আপনার জ্ঞানভান্ডার তৈরি শুরু করতে আপনার প্রথম উৎস যোগ করুন।",
deleteSourceConfirm: "আপনি কি নিশ্চিত এই উৎসটি মুছে ফেলতে চান?",
deleteConfirm: "আপনি কি নিশ্চিত এটি মুছে ফেলতে চান?",
deleteConfirmWithTitle: "আপনি কি নিশ্চিত \"{title}\" মুছে ফেলতে চান?",
deleteSuccess: "উৎস সফলভাবে মুছে ফেলা হয়েছে। নোট: স্টোরেজ থেকে ফাইল মুছে ফেলতে, আপনাকে অবশ্যই সেটিংস পেজে \"ফাইল মুছে ফেলুন\" অপশনটি সক্ষম করতে হবে।",
failedToDelete: "উৎস মুছে ফেলতে ব্যর্থ",
sourceQueued: "উৎস কিউ করা হয়েছে",
sourceQueuedDesc: "ব্যাকগ্রাউন্ড প্রক্রিয়াকরণের জন্য উৎস জমা দেওয়া হয়েছে। আপনি উৎসের তালিকায় অগ্রগতি পর্যবেক্ষণ করতে পারেন।",
sourceAddedSuccess: "উৎস সফলভাবে যোগ করা হয়েছে",
failedToAddSource: "উৎস যোগ করতে ব্যর্থ",
sourceUpdatedSuccess: "উৎস সফলভাবে আপডেট করা হয়েছে",
failedToUpdateSource: "উৎস আপডেট করতে ব্যর্থ",
sourceDeletedSuccess: "উৎস সফলভাবে মুছে ফেলা হয়েছে",
failedToDeleteSource: "উৎস মুছে ফেলতে ব্যর্থ",
fileUploadedSuccess: "ফাইল সফলভাবে আপলোড হয়েছে",
failedToUploadFile: "ফাইল আপলোড করতে ব্যর্থ",
sourceRequeued: "উৎস পুনরায় কিউ করা হয়েছে",
sourceRequeuedDesc: "উৎসটি প্রক্রিয়াকরণের জন্য পুনরায় কিউ করা হয়েছে।",
failedToRetry: "পুনরায় চেষ্টা ব্যর্থ",
sourcesAddedToNotebook: "{count}টি উৎস নোটবুকে যোগ করা হয়েছে",
failedToAddSourcesToNotebook: "নোটবুকে উৎস যোগ করতে ব্যর্থ",
partialAddSuccess: "{success}টি উৎস যোগ হয়েছে, {failed}টি ব্যর্থ",
sourceRemovedFromNotebook: "নোটবুক থেকে উৎস সফলভাবে সরানো হয়েছে",
failedToRemoveSourceFromNotebook: "নোটবুক থেকে উৎস সরাতে ব্যর্থ",
removeConfirm: "আপনি কি নিশ্চিত নোটবুক থেকে এটি সরাতে চান?",
checking: "চেক করা হচ্ছে...",
untitledSource: "শিরোনামহীন উৎস",
maxItems: "সর্বোচ্চ {count}",
insightsCount: "{count}টি অন্তর্দৃষ্টি",
details: "বিবরণ",
detailsTitle: "উৎসের বিবরণ",
content: "কন্টেন্ট",
metadata: "মেটাডেটা",
type: {
link: "লিংক",
file: "ফাইল",
text: "টেক্সট",
},
id: "উৎস ID",
topics: "বিষয়বস্তু",
embedded: "এমবেড করা",
notEmbedded: "এমবেড করা হয়নি",
embedContent: "কন্টেন্ট এমবেড করুন",
embedding: "এমবেড করা হচ্ছে...",
alreadyEmbedded: "ইতিমধ্যে এমবেড করা",
downloadFile: "ফাইল ডাউনলোড করুন",
fileUnavailable: "ফাইল উপলব্ধ নয়",
preparing: "প্রস্তুত করা হচ্ছে...",
generateNewInsight: "নতুন অন্তর্দৃষ্টি তৈরি করুন",
selectTransformation: "একটি ট্রান্সফরমেশন নির্বাচন করুন...",
noInsightsYet: "এখনও কোন অন্তর্দৃষ্টি নেই",
createFirstInsight: "উপরের ট্রান্সফরমেশন ব্যবহার করে আপনার প্রথম অন্তর্দৃষ্টি তৈরি করুন",
viewInsight: "অন্তর্দৃষ্টি দেখুন",
deleteInsight: "অন্তর্দৃষ্টি মুছে ফেলুন",
deleteInsightConfirm: "আপনি কি নিশ্চিত এই অন্তর্দৃষ্টি মুছে ফেলতে চান? এই কাজটি পুনরায় করা যাবে না।",
insightGenerationStarted: "অন্তর্দৃষ্টি তৈরি শুরু হয়েছে। শীঘ্রই এটি দেখা যাবে।",
editNote: "নোট সম্পাদনা করুন",
createNote: "নোট তৈরি করুন",
addTitle: "একটি শিরোনাম যোগ করুন...",
untitledNote: "শিরোনামহীন নোট",
writeNotePlaceholder: "এখানে আপনার নোটের কন্টেন্ট লিখুন...",
saveNote: "নোট সংরক্ষণ",
createNoteBtn: "নোট তৈরি করুন",
createFirstNote: "অন্তর্দৃষ্টি ও পর্যবেক্ষণ ক্যাপচার করতে আপনার প্রথম নোট তৈরি করুন।",
urlLabel: "URL(গুলি) *",
fileLabel: "ফাইল(গুলি) *",
textContentLabel: "টেক্সট কন্টেন্ট *",
enterUrlsPlaceholder: "URL লিখুন, প্রতি লাইনে একটি\nhttps://example.com/article1\nhttps://example.com/article2",
batchUrlHint: "ব্যাচ ইমপোর্টের জন্য একাধিক URL পেস্ট করুন (প্রতি লাইনে একটি)",
invalidUrlsDetected: "অবৈধ URL সনাক্ত করা হয়েছে:",
lineLabel: "লাইন {line}",
fixInvalidUrls: "অবৈধ URL ঠিক করুন বা সরান",
selectMultipleFilesHint: "ব্যাচ ইমপোর্টের জন্য একাধিক ফাইল নির্বাচন করুন। সমর্থিত: ডকুমেন্ট (PDF, DOC, DOCX, PPT, XLS, EPUB, TXT, MD), মিডিয়া (MP4, MP3, WAV, M4A), ছবি (JPG, PNG), আর্কাইভ (ZIP)",
selectedFiles: "নির্বাচিত ফাইল:",
textPlaceholder: "এখানে আপনার কন্টেন্ট পেস্ট বা টাইপ করুন...",
htmlDetected: "HTML কন্টেন্ট সনাক্ত করা হয়েছে। প্রক্রিয়াকরণের পর এটি Markdown এ রূপান্তরিত হবে।",
titlePlaceholder: "আপনার উৎসের একটি বর্ণনামূলক শিরোনাম দিন",
batchTitlesAuto: "প্রতিটি উৎসের জন্য শিরোনাম স্বয়ংক্রিয়ভাবে তৈরি হবে।",
batchCommonSettings: "একই নোটবুক এবং ট্রান্সফরমেশন সব আইটেমে প্রয়োগ হবে।",
urlsCount: "{count}টি URL",
filesCount: "{count}টি ফাইল",
addSource: "উৎস যোগ করুন",
notEmbeddedAlert: "কন্টেন্ট এমবেড করা হয়নি",
notEmbeddedDesc: "এই কন্টেন্ট ভেক্টর সার্চের জন্য এমবেড করা হয়নি। এমবেডিং উন্নত সার্চ ক্ষমতা এবং ভাল কন্টেন্ট আবিষ্কার সক্ষম করে।",
openOnYoutube: "YouTube এ খুলুন",
urlCopied: "URL ক্লিপবোর্ডে কপি করা হয়েছে",
viewSource: "উৎস দেখুন",
noInsightSelected: "কোন অন্তর্দৃষ্টি নির্বাচিত নয়",
sourceInsight: "উৎসের অন্তর্দৃষ্টি",
manageNotebooks: "নোটবুক পরিচালনা করুন",
manageNotebooksDesc: "এই উৎস কোন নোটবুকে রয়েছে তা পরিচালনা করুন",
noNotebooksAvailable: "কোন নোটবুক উপলব্ধ নয়",
loadFailed: "উৎসের বিবরণ লোড করতে ব্যর্থ",
removeFromNotebook: "নোটবুক থেকে সরান",
retryProcessing: "প্রক্রিয়াকরণ পুনরায় চেষ্টা করুন",
deleteSource: "উৎস মুছে ফেলুন",
retry: "আবার চেষ্টা",
addExistingTitle: "বিদ্যমান উৎস যোগ করুন",
addExistingDesc: "বর্তমানে যোগ করতে আপনার সব নোটবুক থেকে বিদ্যমান উৎস নির্বাচন করুন।",
searchPlaceholder: "নাম বা URL দিয়ে উৎস অনুসন্ধান করুন...",
noNotebooksFound: "কোন নোটবুক পাওয়া যায়নি।",
showingFirst100: "প্রথম ১০০টি উৎস দেখানো হচ্ছে। নির্দিষ্ট খুঁজতে অনুসন্ধান ব্যবহার করুন।",
selectedCount: "{count}টি উৎস নির্বাচিত",
added: "{date} তারিখে যোগ করা হয়েছে",
addUrl: "URL যোগ করুন",
uploadFile: "ফাইল আপলোড করুন",
enterText: "টেক্সট লিখুন",
processDescription: "কন্টেন্ট প্রক্রিয়াকৃত এবং AI দ্বারা বিশ্লেষিত হবে।",
processingFiles: "আপনার ফাইলগুলি প্রক্রিয়াকরণ করা হচ্ছে...",
titleRequired: "টেক্সট কন্টেন্টের জন্য একটি শিরোনাম প্রয়োজন",
titleGenerated: "খালি রাখলে, কন্টেন্ট থেকে একটি শিরোনাম তৈরি হবে",
batchCount: "{count}টি {type} প্রক্রিয়াকরণ করা হবে",
enableEmbedding: "অনুসন্ধানের জন্য এমবেডিং সক্ষম করুন",
embeddingDesc: "এই উৎসকে ভেক্টর সার্চ এবং AI ক্যোয়ারিতে খুঁজে পাওয়ার অনুমতি দেয়",
embeddingAlways: "এমবেডিং স্বয়ংক্রিয়ভাবে সক্ষম",
embeddingAlwaysDesc: "আপনার সেটিংস ভেক্টর সার্চের জন্য সবসময় কন্টেন্ট এমবেড করার জন্য কনফিগার করা।",
embeddingNever: "এমবেডিং অক্ষম",
embeddingNeverDesc: "আপনার সেটিংস এমবেডিং এড়িয়ে যাওয়ার জন্য কনফিগার করা। এই উৎসের জন্য ভেক্টর সার্চ উপলব্ধ থাকবে না।",
changeInSettings: "আপনি এটি সেটিংসে পরিবর্তন করতে পারেন",
notFound: "উৎস পাওয়া যায়নি",
noContent: "কোন কন্টেন্ট উপলব্ধ নয়",
insightsDesc: "মডেল বিশ্লেষণ থেকে তৈরি অন্তর্দৃষ্টি",
uploadedFile: "আপলোড করা ফাইল",
fileUnavailableDesc: "স্টোরেজ সিস্টেমের কারণে এই ফাইল বর্তমানে উপলব্ধ নয়।",
batchSuccess: "{count}টি উৎস সফলভাবে তৈরি হয়েছে",
batchFailed: "সব {count}টি উৎস তৈরি করতে ব্যর্থ",
batchPartial: "{success}টি সফল, {failed}টি ব্যর্থ",
submittingSource: "প্রক্রিয়াকরণের জন্য উৎস জমা দেওয়া হচ্ছে...",
processingBatchSources: "{count}টি উৎস প্রক্রিয়াকরণ করা হচ্ছে। এটি কিছু মুহূর্ত সময় নিতে পারে।",
processingSource: "আপনার উৎস প্রক্রিয়াকরণ করা হচ্ছে। এটি কিছু মুহূর্ত সময় নিতে পারে।",
maxFilesAllowed: "ব্যাচে সর্বোচ্চ {count}টি ফাইল অনুমোদিত",
},
chat: {
sessions: "সেশনগুলি",
sessionTitlePlaceholder: "এখানে একটি শিরোনাম লিখুন...",
noSessions: "এখনও কোন চ্যাট সেশন নেই",
deleteSession: "সেশন মুছে ফেলুন",
deleteSessionDesc: "আপনি কি নিশ্চিত এই চ্যাট সেশন মুছে ফেলতে চান? এই কাজটি পুনরায় করা যাবে না।",
sendPlaceholder: "আপনার উৎসগুলি সম্পর্কে যেকোন কিছু জিজ্ঞাসা করুন...",
sessionsTitle: "চ্যাট সেশনগুলি",
chatWith: "{name} এর সাথে চ্যাট করুন",
startConversation: "এই {type} সম্পর্কে কথোপকথন শুরু করুন",
askQuestions: "বিষয়বস্তু ভাল ভাবে বুঝতে প্রশ্ন করুন",
pressToSend: "পাঠাতে {key} চাপুন",
model: "মডেল",
createToStart: "শুরু করতে একটি সেশন তৈরি করুন।",
chatWithNotebook: "নোটবুকের সাথে চ্যাট করুন",
unableToLoadChat: "চ্যাট লোড করতে অক্ষম",
noDescription: "কোন বিবরণ নেই",
startByCreating: "আপনার ঠৈ সাজানোর জন্য প্রথম নোটবুক তৈরি করে শুরু করুন।",
messagesCount: "{count}টি বার্তা",
sessionCreated: "চ্যাট সেশন তৈরি হয়েছে",
sessionUpdated: "সেশন আপডেট হয়েছে",
sessionDeleted: "সেশন মুছে ফেলা হয়েছে",
},
searchPage: {
askAndSearch: "জিজ্ঞাসা ও অনুসন্ধান",
chooseAMode: "একটি মোড বেছে নিন",
askBeta: "জিজ্ঞাসা (বেটা)",
search: "অনুসন্ধান",
askYourKb: "আপনার জ্ঞানভান্ডার জিজ্ঞাসা করুন (বেটা)",
askYourKbDesc: "LLM আপনার জ্ঞানভান্ডারের ভিত্তিতে আপনার প্রশ্নের উত্তর দেবে।",
question: "প্রশ্ন",
enterQuestionPlaceholder: "আপনার প্রশ্ন লিখুন...",
pressToSubmit: "জমা দিতে Cmd/Ctrl+Enter চাপুন",
noEmbeddingModel: "আপনি এই ফিচারটি ব্যবহার করতে পারবেন না কারণ কোনো এমবেডিং মডেল নির্বাচিত নেই। অনুগ্রহ করে Models পেজে একটি সেট করুন।",
usingCustomModels: "কাস্টম মডেল ব্যবহার করা হচ্ছে",
usingDefaultModels: "ডিফল্ট মডেল ব্যবহার করা হচ্ছে",
advanced: "উন্নত",
strategy: "কৌশল",
answer: "উত্তর",
final: "চূড়ান্ত",
ask: "জিজ্ঞাসা",
processing: "প্রক্রিয়াকরণ...",
saveToNotebooks: "নোটবুকে সংরক্ষণ করুন",
searchDesc: "নির্দিষ্ট কীওয়ার্ড বা ধারণার জন্য আপনার জ্ঞানভান্ডার অনুসন্ধান করুন",
enterSearchPlaceholder: "অনুসন্ধান ক্যোয়ারি লিখুন...",
pressToSearch: "অনুসন্ধান করতে Enter চাপুন",
searchType: "অনুসন্ধানের ধরন",
vectorSearchWarning: "ভেক্টর অনুসন্ধানের জন্য একটি এমবেডিং মডেল প্রয়োজন। শুধুমাত্র টেক্সট অনুসন্ধান উপলব্ধ।",
textSearch: "টেক্সট অনুসন্ধান",
vectorSearch: "ভেক্টর অনুসন্ধান",
searchIn: "যেখানে অনুসন্ধান করবেন",
searchSources: "উৎস অনুসন্ধান",
searchNotes: "নোট অনুসন্ধান",
resultsFound: "{count}টি ফলাফল পাওয়া গেছে",
matches: "মিল ({count})",
noResultsFor: "\"{query}\" এর জন্য কোনো ফলাফল পাওয়া যায়নি",
notSet: "সেট করা হয়নি",
saveToNotebook: "নোটবুকে সংরক্ষণ করুন",
saveSuccess: "সফলভাবে নোটবুকে সংরক্ষণ করা হয়েছে",
saveError: "নোটবুকে সংরক্ষণ করতে ব্যর্থ",
selectNotebook: "নোটবুক নির্বাচন করুন",
searchAndAsk: "অনুসন্ধান ও জিজ্ঞাসা",
searchResultsFor: "\"{query}\" এর জন্য অনুসন্ধান ফলাফল",
askAbout: "\"{query}\" সম্পর্কে জিজ্ঞাসা করুন",
orSearchKb: "অথবা আপনার জ্ঞানভান্ডার অনুসন্ধান করুন",
saving: "সংরক্ষণ করা হচ্ছে...",
advancedModelTitle: "উন্নত মডেল নির্বাচন",
advancedModelDesc: "জিজ্ঞাসা প্রক্রিয়ার প্রতিটি পর্যায়ের জন্য নির্দিষ্ট মডেল বেছে নিন",
strategyModel: "কৌশল মডেল",
answerModel: "উত্তর মডেল",
finalAnswerModel: "চূড়ান্ত উত্তর মডেল",
selectStrategyPlaceholder: "কৌশল মডেল নির্বাচন করুন",
selectAnswerPlaceholder: "উত্তর মডেল নির্বাচন করুন",
selectFinalPlaceholder: "চূড়ান্ত উত্তর মডেল নির্বাচন করুন",
saveChanges: "পরিবর্তন সংরক্ষণ করুন",
processingQuestion: "আপনার প্রশ্ন প্রক্রিয়া করা হচ্ছে...",
},
podcasts: {
generateEpisode: "পডকাস্ট এপিসোড তৈরি করুন",
generateEpisodeDesc: "নতুন পডকাস্ট এপিসোড তৈরি করার আগে অন্তর্ভুক্ত করার জন্য কন্টেন্ট নির্বাচন করুন এবং এপিসোডের বিবরণ কনফিগার করুন।",
content: "কন্টেন্ট",
contentDesc: "এই এপিসোডে অন্তর্ভুক্ত করতে নোটবুক, উৎস এবং নোট বেছে নিন।",
itemsSelected: "{count}টি আইটেম নির্বাচিত",
tokens: "{count} টোকেন",
chars: "{count} অক্ষর",
loadingNotebooks: "নোটবুক লোড হচ্ছে...",
noNotebooksFoundInPodcasts: "কোন নোটবুক পাওয়া যায়নি। পডকাস্ট তৈরির আগে একটি নোটবুক তৈরি করে কন্টেন্ট যোগ করুন।",
noContentSelected: "কোন কন্টেন্ট নির্বাচিত নয়",
summary: "সারাংশ",
fullContent: "সম্পূর্ণ কন্টেন্ট",
untitledSource: "শিরোনামহীন উৎস",
untitledNote: "শিরোনামহীন নোট",
episodeSettings: "এপিসোড সেটিংস",
episodeProfile: "এপিসোড প্রোফাইল",
episodeProfilePlaceholder: "একটি এপিসোড প্রোফাইল নির্বাচন করুন",
episodeName: "এপিসোডের নাম",
episodeNamePlaceholder: "যেমন, AI এবং কাজের ভবিষ্যৎ",
additionalInstructions: "অতিরিক্ত নির্দেশনা",
instructionsPlaceholder: "এপিসোড ব্রিফিং-এ যোগ করার জন্য কোন অতিরিক্ত পরামর্শ...",
generating: "তৈরি করা হচ্ছে...",
generate: "তৈরি করুন",
hostPlaceholder: "হোস্ট {number}",
profileRequired: "এপিসোড প্রোফাইল প্রয়োজন",
profileRequiredDesc: "পডকাস্ট তৈরির আগে একটি এপিসোড প্রোফাইল নির্বাচন করুন।",
nameRequired: "এপিসোডের নাম প্রয়োজন",
nameRequiredDesc: "এপিসোডের জন্য একটি নাম দিন।",
addContext: "কন্টেক্সট যোগ করুন",
addContextDesc: "এপিসোডে অন্তর্ভুক্ত করতে কমপক্ষে একটি উৎস বা নোট নির্বাচন করুন।",
generationFailed: "পডকাস্ট তৈরি ব্যর্থ",
speakerProfile: "স্পিকার প্রোফাইল",
usesSpeakerProfile: "স্পিকার প্রোফাইল ব্যবহার করে",
sources: "উৎসগুলি",
notes: "নোটগুলি",
noSources: "এই নোটবুকে কোন উৎস উপলব্ধ নয়।",
noNotes: "এই নোটবুকে কোন নোট উপলব্ধ নয়।",
selectMode: "মোড নির্বাচন করুন",
buildContextFailed: "কন্টেক্সট তৈরি করতে ব্যর্থ। অনুগ্রহ করে আপনার নির্বাচন পর্যালোচনা করুন।",
podcastTaskStarted: "পডকাস্ট কাজ শুরু হয়েছে",
loadingProfiles: "এপিসোড প্রোফাইল লোড হচ্ছে...",
noProfilesFound: "কোন এপিসোড প্রোফাইল পাওয়া যায়নি। পডকাস্ট তৈরির আগে একটি এপিসোড প্রোফাইল তৈরি করুন।",
listTitle: "পডকাস্ট",
listDesc: "তৈরি করা এপিসোড ট্র্যাক করুন এবং পুনঃব্যবহারযোগ্য প্রোফাইল পরিচালনা করুন।",
chooseAView: "একটি ভিউ বেছে নিন",
episodesTab: "এপিসোড",
templatesTab: "প্রোফাইল",
overviewTitle: "এপিসোড ওভারভিউ",
overviewDesc: "পডকাস্ট তৈরি কাজ মনিটর করুন এবং চূড়ান্ত ফলাফল পর্যালোচনা করুন।",
generateBtn: "পডকাস্ট তৈরি করুন",
total: "মোট",
processingLabel: "প্রক্রিয়াকরণ",
completedLabel: "সম্পন্ন",
failedLabel: "ব্যর্থ",
pendingLabel: "অপেক্ষমাণ",
loadErrorTitle: "এপিসোড লোড করতে ব্যর্থ",
loadErrorDesc: "আমরা সর্বশেষ পডকাস্ট এপিসোড আনতে পারিনি। শীঘ্রই আবার চেষ্টা করুন।",
loadingEpisodes: "এপিসোড লোড হচ্ছে...",
noEpisodesYet: "এখনও কোন পডকাস্ট এপিসোড নেই। নোটবুক বা সোর্স চ্যাট ইন্টারফেস থেকে আপনার প্রথমটি তৈরি করুন।",
statusRunningTitle: "বর্তমানে প্রক্রিয়াকরণ",
statusRunningDesc: "এপিসোড যা সক্রিয়ভাবে সম্পদ তৈরি করছে।",
statusPendingTitle: "কিউ / অপেক্ষমাণ",
statusPendingDesc: "জমা দেওয়া এপিসোড যা প্রক্রিয়াকরণ শুরুর অপেক্ষায়।",
statusCompletedTitle: "সম্পন্ন এপিসোড",
statusCompletedDesc: "পর্যালোচনা, ডাউনলোড বা প্রকাশের জন্য প্রস্তুত।",
statusFailedTitle: "ব্যর্থ এপিসোড",
statusFailedDesc: "তৈরির সময় সমস্যায় পড়া এপিসোড।",
templatesWorkspaceTitle: "প্রোফাইল ওয়ার্কস্পেস",
templatesWorkspaceDesc: "দ্রুত পডকাস্ট উৎপাদনের জন্য পুনঃব্যবহারযোগ্য এপিসোড এবং স্পিকার কনফিগারেশন তৈরি করুন।",
howTemplatesPowerTitle: "প্রোফাইল কিভাবে পডকাস্ট তৈরিকে শক্তিশালী করে",
howTemplatesPowerDesc: "প্রোফাইল পডকাস্ট ওয়ার্কফ্লোকে দুটি পুনঃব্যবহারযোগ্য বিল্ডিং ব্লকে বিভক্ত করে। নতুন এপিসোড তৈরি করার সময় এগুলো মিশ্রিত এবং মিল করুন।",
episodeProfilesSetFormat: "এপিসোড প্রোফাইল ফর্ম্যাট সেট করে",
episodeProfilesList1: "সেগমেন্টের সংখ্যা এবং গল্পের প্রবাহ রূপরেখা দিন",
episodeProfilesList2: "ব্রিফিং, রূপরেখা এবং স্ক্রিপ্ট লেখার জন্য ব্যবহৃত ভাষা মডেল বেছে নিন",
episodeProfilesList3: "ডিফল্ট ব্রিফিং সংরক্ষণ করুন যাতে প্রতিটি এপিসোড সুসংগত টোন দিয়ে শুরু হয়",
speakerProfilesBringVoices: "স্পিকার প্রোফাইল ভয়েসকে জীবন্ত করে তোলে",
speakerProfilesList1: "টেক্সট-টু-স্পিচ প্রোভাইডার এবং মডেল বেছে নিন",
speakerProfilesList2: "প্রতি স্পিকারের ব্যক্তিত্ব, পটভূমি এবং উচ্চারণ নোট ক্যাপচার করুন",
speakerProfilesList3: "বিভিন্ন এপিসোড ফর্ম্যাটে একই হোস্ট বা গেস্ট ভয়েস পুনঃব্যবহার করুন",
recommendedWorkflow: "প্রস্তাবিত ওয়ার্কফ্লো",
workflowStep1: "আপনার প্রয়োজনীয় প্রতিটি ভয়েসের জন্য স্পিকার প্রোফাইল তৈরি করুন",
workflowStep2: "নাম দিয়ে সেই স্পিকারদের রেফারেন্স করে এপিসোড প্রোফাইল তৈরি করুন",
workflowStep3: "গল্পের সাথে মানানসই এপিসোড প্রোফাইল নির্বাচন করে পডকাস্ট তৈরি করুন",
workflowHint: "এপিসোড প্রোফাইল নাম দিয়ে স্পিকার প্রোফাইল রেফারেন্স করে, তাই স্পিকার দিয়ে শুরু করলে পরে ভয়েস অ্যাসাইনমেন্ট মিস করার সমস্যা এড়ানো যায়।",
failedToLoadTemplates: "প্রোফাইল ডেটা লোড করতে ব্যর্থ",
failedToLoadTemplatesDesc: "নিশ্চিত করুন API চলছে এবং আবার চেষ্টা করুন। কিছু সেকশন অসম্পূর্ণ হতে পারে।",
loadingTemplates: "প্রোফাইল লোড হচ্ছে…",
speakerProfilesTitle: "স্পিকার প্রোফাইল",
speakerProfilesDesc: "তৈরি করা এপিসোডের জন্য ভয়েস এবং ব্যক্তিত্ব কনফিগার করুন।",
createSpeaker: "স্পিকার তৈরি করুন",
noSpeakerProfiles: "এখনও কোন স্পিকার প্রোফাইল নেই। এপিসোড প্রোফাইল উপলব্ধ করতে একটি তৈরি করুন।",
noDescription: "কোন বিবরণ প্রদান করা হয়নি।",
usedByCount_one: "১টি এপিসোড দ্বারা ব্যবহৃত",
usedByCount_other: "{count}টি এপিসোড দ্বারা ব্যবহৃত",
usedByCount: "{count}টি এপিসোড দ্বারা ব্যবহৃত",
unused: "অব্যবহৃত",
voiceId: "ভয়েস ID",
backstory: "পটভূমির গল্প",
personality: "ব্যক্তিত্ব",
edit: "সম্পাদনা",
duplicate: "ডুপ্লিকেট",
deleteSpeakerProfileTitle: "স্পিকার প্রোফাইল মুছে ফেলবেন?",
deleteSpeakerProfileDesc: "\"{name}\" মুছে ফেলা পূর্বাবস্থায় ফেরানো যাবে না।",
deleteSpeakerDisabledHint: "এটি মুছে ফেলার আগে এই স্পিকারকে এপিসোড প্রোফাইল থেকে সরান।",
deleting: "মুছে ফেলা হচ্ছে…",
episodeProfilesTitle: "এপিসোড প্রোফাইল",
episodeProfilesDesc: "আপনার শোগুলির জন্য পুনঃব্যবহারযোগ্য তৈরি সেটিংস সংজ্ঞায়িত করুন।",
createProfile: "প্রোফাইল তৈরি করুন",
createSpeakerFirst: "এপিসোড প্রোফাইল যোগ করার আগে একটি স্পিকার প্রোফাইল তৈরি করুন।",
noEpisodeProfiles: "এখনও কোন এপিসোড প্রোফাইল নেই। পডকাস্ট তৈরি শুরু করতে একটি তৈরি করুন।",
speakerCreated: "স্পিকার তৈরি হয়েছে",
speakerCreatedDesc: "স্পিকার \"{name}\" সফলভাবে যোগ করা হয়েছে।",
failedToCreateSpeaker: "স্পিকার প্রোফাইল তৈরি করতে ব্যর্থ",
speakerUpdated: "স্পিকার আপডেট হয়েছে",
speakerUpdatedDesc: "স্পিকার \"{name}\" সফলভাবে আপডেট করা হয়েছে।",
failedToUpdateSpeaker: "স্পিকার প্রোফাইল আপডেট করতে ব্যর্থ",
speakerDeleted: "স্পিকার মুছে ফেলা হয়েছে",
speakerDeletedDesc: "স্পিকার \"{name}\" সফলভাবে সরানো হয়েছে।",
failedToDeleteSpeaker: "স্পিকার প্রোফাইল মুছে ফেলতে ব্যর্থ",
speakerDuplicated: "স্পিকার ডুপ্লিকেট করা হয়েছে",
speakerDuplicatedDesc: "স্পিকার \"{name}\" সফলভাবে ডুপ্লিকেট করা হয়েছে।",
failedToDuplicateSpeaker: "স্পিকার প্রোফাইল ডুপ্লিকেট করতে ব্যর্থ",
generationStarted: "তৈরি শুরু হয়েছে",
generationStartedDesc: "পডকাস্ট তৈরি কিউ করা হয়েছে।",
failedToStartGeneration: "তৈরি শুরু করতে ব্যর্থ",
tryAgainMoment: "একটু পরে আবার চেষ্টা করুন।",
deleteProfileTitle: "প্রোফাইল মুছে ফেলবেন?",
deleteProfileDesc: "এটি \"{name}\" সরিয়ে দেবে। বিদ্যমান এপিসোড তাদের ডেটা রাখবে, কিন্তু নতুনগুলি আর এই কনফিগারেশন ব্যবহার করবে না।",
profileCreated: "প্রোফাইল তৈরি হয়েছে",
profileCreatedDesc: "এপিসোড প্রোফাইল \"{name}\" সফলভাবে তৈরি করা হয়েছে।",
failedToCreateProfile: "প্রোফাইল তৈরি করতে ব্যর্থ",
profileUpdated: "প্রোফাইল আপডেট হয়েছে",
profileUpdatedDesc: "এপিসোড প্রোফাইল \"{name}\" সফলভাবে আপডেট করা হয়েছে।",
failedToUpdateProfile: "প্রোফাইল আপডেট করতে ব্যর্থ",
profileDeleted: "প্রোফাইল মুছে ফেলা হয়েছে",
profileDeletedDesc: "এপিসোড প্রোফাইল \"{name}\" সফলভাবে সরানো হয়েছে।",
failedToDeleteProfile: "প্রোফাইল মুছে ফেলতে ব্যর্থ",
failedToDeleteProfileDesc: "এপিসোড প্রোফাইল সরাতে ব্যর্থ।",
profileDuplicated: "প্রোফাইল ডুপ্লিকেট করা হয়েছে",
profileDuplicatedDesc: "এপিসোড প্রোফাইল \"{name}\" সফলভাবে ডুপ্লিকেট করা হয়েছে।",
failedToDuplicateProfile: "প্রোফাইল ডুপ্লিকেট করতে ব্যর্থ",
episodeDeleted: "এপিসোড মুছে ফেলা হয়েছে",
episodeDeletedDesc: "এপিসোড সফলভাবে মুছে ফেলা হয়েছে।",
failedToDeleteEpisode: "এপিসোড মুছে ফেলতে ব্যর্থ",
failedToDeleteSpeakerDesc: "স্পিকার প্রোফাইল সরাতে ব্যর্থ।",
outlineModel: "রূপরেখা মডেল",
transcriptModel: "ট্রান্সক্রিপ্ট মডেল",
segments: "সেগমেন্ট",
defaultBriefingTitle: "ডিফল্ট ব্রিফিং",
created: "{time} এ তৈরি",
details: "বিবরণ",
summaryTab: "সারাংশ",
outlineTab: "রূপরেখা",
transcriptTab: "ট্রান্সক্রিপ্ট",
briefing: "ব্রিফিং",
noOutline: "কোন রূপরেখা উপলব্ধ নয়।",
noTranscript: "কোন ট্রান্সক্রিপ্ট উপলব্ধ নয়।",
deleteEpisodeTitle: "এপিসোড মুছে ফেলবেন?",
deleteEpisodeDesc: "এটি \"{name}\" এবং এর অডিও ফাইল স্থায়ীভাবে সরিয়ে দেবে।",
audioUnavailable: "অডিও উপলব্ধ নয়",
segment: "সেগমেন্ট",
speaker: "স্পিকার",
profile: "প্রোফাইল",
link: "লিঙ্ক",
file: "ফাইল",
embedded: "এমবেডেড",
notEmbedded: "এমবেডেড নয়",
noSpeakerProfilesAvailable: "কোন স্পিকার প্রোফাইল উপলব্ধ নয়",
editEpisodeProfile: "এপিসোড প্রোফাইল সম্পাদনা করুন",
createEpisodeProfile: "এপিসোড প্রোফাইল তৈরি করুন",
episodeProfileFormDesc: "ডিফল্টভাবে এপিসোডগুলি কীভাবে তৈরি হবে এবং তারা কোন স্পিকার কনফিগারেশন ব্যবহার করবে তা নির্ধারণ করুন।",
noSpeakerProfilesDesc: "এপিসোড প্রোফাইল কনফিগার করার আগে একটি স্পিকার প্রোফাইল তৈরি করুন।",
profileName: "প্রোফাইল নাম",
profileNamePlaceholder: "যেমন, প্রযুক্তি আলোচনা",
descriptionPlaceholder: "এই প্রোফাইলটি কখন ব্যবহার করবেন তার সংক্ষিপ্ত সারাংশ",
speakerConfig: "স্পিকার কনফিগারেশন",
selectSpeakerProfile: "একটি স্পিকার প্রোফাইল নির্বাচন করুন",
outlineGeneration: "রূপরেখা তৈরি",
transcriptGeneration: "ট্রান্সক্রিপ্ট তৈরি",
defaultBriefingPlaceholder: "এই এপিসোড ফর্ম্যাটের জন্য কাঠামো, টোন এবং লক্ষ্যগুলি বর্ণনা করুন",
editSpeakerProfile: "স্পিকার প্রোফাইল সম্পাদনা করুন",
createSpeakerProfile: "স্পিকার প্রোফাইল তৈরি করুন",
speakerProfileFormDesc: "টেক্সট-টু-স্পিচ সেটিংস কনফিগার করুন এবং চারটি পর্যন্ত স্পিকার নির্ধারণ করুন।",
speakers: "স্পিকার",
speakersDesc: "এই প্রোফাইলের জন্য এক থেকে চারটি কণ্ঠস্বর কনফিগার করুন।",
addSpeaker: "স্পিকার যোগ করুন",
speakerNumber: "স্পিকার {number}",
backstoryPlaceholder: "স্পিকারের সংক্ষিপ্ত জীবনী বা প্রেক্ষাপট",
personalityPlaceholder: "শৈলী এবং টোন বর্ণনা করুন",
outlineModelRequired: "রূপরেখা মডেল প্রয়োজন",
transcriptModelRequired: "ট্রান্সক্রিপ্ট মডেল প্রয়োজন",
defaultBriefingRequired: "ডিফল্ট ব্রিফিং প্রয়োজন",
segmentsInteger: "অবশ্যই একটি পূর্ণসংখ্যা হতে হবে",
segmentsMin: "কমপক্ষে ৩টি সেগমেন্ট",
segmentsMax: "সর্বোচ্চ ২০টি সেগমেন্ট",
voiceIdRequired: "ভয়েস আইডি প্রয়োজন",
backstoryRequired: "পটভূমি প্রয়োজন",
personalityRequired: "ব্যক্তিত্ব প্রয়োজন",
speakerCountMin: "কমপক্ষে একজন স্পিকার প্রয়োজন",
speakerCountMax: "আপনি সর্বোচ্চ ৪জন স্পিকার কনফিগার করতে পারেন",
delete: "মুছে ফেলুন",
failedToDelete: "পডকাস্ট মুছে ফেলতে ব্যর্থ",
retry: "পুনঃচেষ্টা",
retrying: "পুনঃচেষ্টা করছে…",
retryStarted: "পুনঃচেষ্টা শুরু হয়েছে",
retryStartedDesc: "একটি নতুন পডকাস্ট তৈরির কাজ জমা দেওয়া হয়েছে।",
failedToRetry: "এপিসোড পুনঃচেষ্টা করতে ব্যর্থ",
errorDetails: "ত্রুটির বিবরণ",
language: "ভাষা",
languagePlaceholder: "একটি ভাষা নির্বাচন করুন (ঐচ্ছিক)",
podcastLanguage: "পডকাস্টের ভাষা",
selectOutlineModel: "রূপরেখা মডেল নির্বাচন করুন",
selectTranscriptModel: "ট্রান্সক্রিপ্ট মডেল নির্বাচন করুন",
voiceModel: "ভয়েস মডেল",
voiceModelRequired: "ভয়েস মডেল প্রয়োজন",
selectVoiceModel: "ভয়েস মডেল নির্বাচন করুন",
perSpeakerTtsOverride: "প্রতি স্পিকার TTS ওভাররাইড (ঐচ্ছিক)",
useProfileDefault: "প্রোফাইল ডিফল্ট ব্যবহার করুন",
setupRequired: "সেটআপ প্রয়োজন",
setupRequiredDesc:
"কিছু প্রোফাইলে এখনও মডেল কনফিগার করা হয়নি। পডকাস্ট তৈরির আগে মডেল নির্বাচন করতে সেগুলি সম্পাদনা করুন।",
notConfigured: "কনফিগার করা হয়নি",
},
settings: {
contentProcessing: "কন্টেন্ট প্রক্রিয়াকরণ",
contentProcessingDesc: "ডকুমেন্ট এবং URL কিভাবে প্রক্রিয়া করা হবে তা কনফিগার করুন",
docEngine: "ডকুমেন্ট প্রক্রিয়াকরণ ইঞ্জিন",
docEnginePlaceholder: "ডকুমেন্ট প্রক্রিয়াকরণ ইঞ্জিন নির্বাচন করুন",
urlEngine: "URL প্রক্রিয়াকরণ ইঞ্জিন",
urlEnginePlaceholder: "URL প্রক্রিয়াকরণ ইঞ্জিন নির্বাচন করুন",
autoRecommended: "স্বয়ংক্রিয় (প্রস্তাবিত)",
simple: "সাধারণ",
docling: "ডকলিং",
helpMeChoose: "আমাকে বেছে নিতে সাহায্য করুন",
docHelp: "· ডকলিং একটু ধীর কিন্তু আরো নির্ভুল, বিশেষ করে যদি ডকুমেন্টে টেবিল এবং ছবি থাকে। · সাধারণ ফর্ম্যাটিং ছাড়াই ডকুমেন্ট থেকে যেকোন কন্টেন্ট এক্সট্রাক্ট করবে। · স্বয়ংক্রিয় (প্রস্তাবিত) ডকলিং দিয়ে প্রক্রিয়া করার চেষ্টা করবে এবং সাধারণে ডিফল্ট হবে।",
firecrawl: "ফায়ারক্রল",
jina: "জিনা",
urlHelp: "· ফায়ারক্রল একটি পেইড সার্ভিস (ফ্রি টিয়ার সহ), এবং খুব শক্তিশালী। · জিনাও একটি ভাল অপশন এবং এর ফ্রি টিয়ার আছে। · সাধারণ মৌলিক HTTP এক্সট্রাকশন ব্যবহার করবে এবং জাভাস্ক্রিপ্ট-ভিত্তিক ওয়েবসাইটে কন্টেন্ট মিস করবে। · স্বয়ংক্রিয় (প্রস্তাবিত) প্রথমে ফায়ারক্রল তারপর জিনা ব্যবহার করার চেষ্টা করবে, সবশেষে সাধারণে ফলব্যাক করবে।",
embeddingAndSearch: "এমবেডিং এবং অনুসন্ধান",
embeddingAndSearchDesc: "অনুসন্ধান এবং এমবেডিং অপশন কনফিগার করুন",
defaultEmbeddingOption: "ডিফল্ট এমবেডিং অপশন",
embeddingOptionPlaceholder: "এমবেডিং অপশন নির্বাচন করুন",
ask: "জিজ্ঞাসা",
always: "সর্বদা",
never: "কখনো না",
embeddingHelp: "কন্টেন্ট এমবেড করলে আপনার এবং আপনার AI এজেন্টদের জন্য খুঁজে পাওয়া সহজ হবে। যদি আপনি একটি স্থানীয় এমবেডিং মডেল (যেমন Ollama) চালান, তাহলে খরচ নিয়ে চিন্তা না করে সবকিছু এমবেড করুন।",
fileManagement: "ফাইল ব্যবস্থাপনা",
fileManagementDesc: "ফাইল হ্যান্ডলিং এবং স্টোরেজ অপশন কনফিগার করুন",
autoDeleteFiles: "স্বয়ংক্রিয় ফাইল মুছে ফেলা",
autoDeletePlaceholder: "স্বয়ংক্রিয় মুছে ফেলার অপশন নির্বাচন করুন",
filesHelp: "একবার আপনার ফাইল আপলোড এবং প্রক্রিয়া হওয়ার পর, সেগুলি আর প্রয়োজন নেই। বেশিরভাগ ব্যবহারকারী Open Notebook কে আপলোড ফোল্ডার থেকে আপলোড করা ফাইল স্বয়ংক্রিয়ভাবে মুছে ফেলার অনুমতি দিতে পারেন।",
loadFailed: "সেটিংস লোড করতে ব্যর্থ",
},
advanced: {
title: "উন্নত টুলস",
desc: "পাওয়ার ব্যবহারকারীদের জন্য উন্নত টুল এবং ইউটিলিটি",
systemInfo: "সিস্টেম তথ্য",
rebuildEmbeddings: "এমবেডিং পুনর্নির্মাণ",
rebuildEmbeddingsDesc: "সব উৎসের জন্য ভেক্টর সার্চ ইনডেক্স পুনর্নির্মাণ",
currentVersion: "বর্তমান সংস্করণ",
latestVersion: "সর্বশেষ সংস্করণ",
status: "অবস্থা",
updateAvailable: "সংস্করণ {version} উপলব্ধ",
updateAvailableDesc: "Open Notebook এর একটি নতুন সংস্করণ উপলব্ধ।",
upToDate: "আপ টু ডেট",
unknown: "অজানা",
viewOnGithub: "GitHub এ দেখুন",
updateCheckFailed: "আপডেট চেক করতে অক্ষম। GitHub অপৌঁছানীয় হতে পারে।",
rebuild: {
mode: "পুনর্নির্মাণ মোড",
existing: "বিদ্যমান",
all: "সব",
existingDesc: "শুধুমাত্র এমবেডিং আছে এমন আইটেম পুনরায় এমবেড করুন (দ্রুততর, মডেল পরিবর্তনের জন্য)",
allDesc: "বিদ্যমান আইটেম পুনরায় এমবেড + কোন এমবেডিং নেই এমন আইটেমের জন্য এমবেডিং তৈরি (ধীর, ব্যাপক)",
include: "পুনর্নির্মাণে অন্তর্ভুক্ত",
selectOneError: "অনুগ্রহ করে পুনর্নির্মাণের জন্য কমপক্ষে একটি আইটেম ধরন নির্বাচন করুন",
starting: "পুনর্নির্মাণ শুরু করা হচ্ছে...",
startBtn: "🚀 পুনর্নির্মাণ শুরু করুন",
queued: "কিউ করা",
running: "কাজ জমা দেওয়া হচ্ছে...",
completed: "কাজ জমা দেওয়া হয়েছে!",
failed: "ব্যর্থ",
leavePageHint: "আপনি এই পৃষ্ঠা ছেড়ে যেতে পারেন কারণ এটি ব্যাকগ্রাউন্ডে চলবে",
startNew: "নতুন পুনর্নির্মাণ শুরু করুন",
itemsProcessed: "{processed}/{total} কাজ জমা দেওয়া হয়েছে ({percent}%)",
failedItems: "{count} কাজ জমা দিতে ব্যর্থ",
time: "সময়",
whenToRebuild: "কখন এমবেডিং পুনর্নির্মাণ করা উচিত?",
whenToRebuildAns: "মডেল পরিবর্তন, সংস্করণ আপগ্রেড, দুর্নীতি ঠিক করা বা বাল্ক ইমপোর্টের পরে আপনার পুনর্নির্মাণ করা উচিত।",
howLong: "পুনর্নির্মাণে কত সময় লাগে?",
howLongAns: "প্রক্রিয়াকরণের সময় আইটেম সংখ্যা, মডেলের গতি এবং API রেট লিমিটের উপর নির্ভর করে। স্থানীয় মডেল সাধারণত খুব দ্রুত।",
isSafe: "অ্যাপ ব্যবহার করার সময় পুনর্নির্মাণ নিরাপদ?",
isSafeAns: "হ্যাঁ, পুনর্নির্মাণ নিরাপদ! এটি কন্টেন্ট মুছে ফেলে না, শুধুমাত্র এমবেডিং প্রতিস্থাপন করে, এবং ত্রুটি সুন্দরভাবে পরিচালনা করে।",
},
},
transformations: {
title: "ট্রান্সফরমেশন",
desc: "ট্রান্সফরমেশনগুলি হল প্রম্পট যা LLM দ্বারা একটি উৎস প্রক্রিয়া করতে এবং অন্তর্দৃষ্টি, সারাংশ ইত্যাদি বের করতে ব্যবহৃত হবে।",
workspace: "একটি ওয়ার্কস্পেস বেছে নিন",
playground: "খেলার জায়গা",
defaultPrompt: "ডিফল্ট ট্রান্সফরমেশন প্রম্পট",
defaultPromptDesc: "এটি আপনার সব ট্রান্সফরমেশন প্রম্পটে যোগ করা হবে",
defaultPromptPlaceholder: "আপনার ডিফল্ট ট্রান্সফরমেশন নির্দেশনা লিখুন...",
listTitle: "কাস্টম ট্রান্সফরমেশন",
createNew: "নতুন তৈরি করুন",
inputLabel: "ইনপুট টেক্সট",
inputPlaceholder: "ট্রান্সফর্ম করার জন্য কিছু টেক্সট লিখুন...",
outputLabel: "আউটপুট",
runTest: "ট্রান্সফরমেশন চালান",
running: "চালানো হচ্ছে...",
selectToStart: "শুরু করতে একটি ট্রান্সফরমেশন নির্বাচন করুন",
name: "নাম",
namePlaceholder: "ইউনিক আইডেন্টিফায়ার, যেমন key_topics",
titlePlaceholder: "প্রদর্শিত শিরোনাম, নামে ডিফল্ট",
promptPlaceholder: "এই ট্রান্সফরমেশন চালানোর প্রম্পট লিখুন...",
descriptionPlaceholder: "এই ট্রান্সফরমেশন কি করে তার বর্ণনা দিন।",
suggestDefault: "নতুন উৎসে ডিফল্ট হিসেবে পরামর্শ দিন",
promptHint: "প্রম্পট উৎসের কন্টেন্ট মাথায় রেখে লিখতে হবে। আপনি মডেলকে সারাংশ, অন্তর্দৃষ্টি বের করতে বা টেবিলের মতো স্ট্রাকচার্ড আউটপুট তৈরি করতে বলতে পারেন।",
createSuccess: "ট্রান্সফরমেশন সফলভাবে তৈরি হয়েছে",
updateSuccess: "ট্রান্সফরমেশন সফলভাবে আপডেট হয়েছে",
deleteSuccess: "ট্রান্সফরমেশন সফলভাবে মুছে ফেলা হয়েছে",
noTransformations: "এখনও কোন ট্রান্সফরমেশন নেই",
createOne: "শুরু করতে একটি ট্রান্সফরমেশন তৈরি করুন",
selectModel: "একটি মডেল নির্বাচন করুন",
deleteConfirm: "আপনি কি নিশ্চিত এই ট্রান্সফরমেশন মুছে ফেলতে চান?",
model: "মডেল",
systemPrompt: "সিস্টেম প্রম্পট",
overrideModelDesc: "এই চ্যাট সেশনের জন্য ডিফল্ট মডেল ওভাররাইড করুন। সিস্টেম ডিফল্ট ব্যবহার করতে খালি রাখুন।",
sessionUseReplacement: "এই সেশন ডিফল্ট মডেলের পরিবর্তে {name} ব্যবহার করবে।",
systemDefault: "সিস্টেম ডিফল্ট",
},
models: {
embedding: "এমবেডিং মডেল",
tts: "টেক্সট টু স্পিচ (TTS)",
stt: "স্পিচ টু টেক্সট (STT)",
apiKey: "API কী",
deleteSuccess: "মডেল সফলভাবে মুছে ফেলা হয়েছে",
saveSuccess: "মডেল সফলভাবে সংরক্ষিত হয়েছে",
noModels: "কোন মডেল নেই",
discoverModels: "মডেল আবিষ্কার করুন",
noModelsFound: "এই প্রোভাইডার থেকে কোন মডেল পাওয়া যায়নি",
modelType: "মডেল ধরন",
modelTypeHint: "আপনি যেই ধরনের মডেল যোগ করতে চান তা নির্বাচন করুন। যদি আপনার বিভিন্ন ধরনের প্রয়োজন হয়, তাহলে আলাদা ব্যাচে যোগ করুন।",
deleteModel: "মডেল মুছুন",
defaultAssignments: "ডিফল্ট মডেল অ্যাসাইনমেন্ট",
defaultAssignmentsDesc: "Open Notebook জুড়ে বিভিন্ন কাজের জন্য কোন মডেল ব্যবহার করব তা কনফিগার করুন",
missingRequiredModels: "প্রয়োজনীয় মডেল অনুপস্থিত: {models}। এগুলি ছাড়া Open Notebook সঠিকভাবে কাজ নাও করতে পারে।",
selectModelPlaceholder: "একটি মডেল নির্বাচন করুন",
requiredModelPlaceholder: "⚠️ প্রয়োজন - একটি মডেল নির্বাচন করুন",
chatModelLabel: "চ্যাট মডেল",
chatModelDesc: "চ্যাট কথোপকথনের জন্য ব্যবহৃত",
transformationModelLabel: "ট্রান্সফরমেশন মডেল",
transformationModelDesc: "সারাংশ, অন্তর্দৃষ্টি এবং ট্রান্সফরমেশনের জন্য ব্যবহৃত",
toolsModelLabel: "টুলস মডেল",
toolsModelDesc: "ফাংশন কলিং এর জন্য ব্যবহৃত - OpenAI বা Anthropic প্রস্তাবিত",
largeContextModelLabel: "বড় কন্টেক্সট মডেল",
largeContextModelDesc: "বড় ডকুমেন্ট প্রক্রিয়াকরণের জন্য ব্যবহৃত - Gemini প্রস্তাবিত",
embeddingModelLabel: "এমবেডিং মডেল",
embeddingModelDesc: "সেমান্টিক সার্চ এবং ভেক্টর এমবেডিংয়ের জন্য ব্যবহৃত",
ttsModelLabel: "টেক্সট-টু-স্পিচ মডেল",
ttsModelDesc: "পডকাস্ট তৈরির জন্য ব্যবহৃত",
sttModelLabel: "স্পিচ-টু-টেক্সট মডেল",
sttModelDesc: "অডিও ট্রান্সক্রিপশনের জন্য ব্যবহৃত",
embeddingChangeTitle: "এমবেডিং মডেল পরিবর্তন",
embeddingChangeConfirm: "আপনি আপনার এমবেডিং মডেল {from} থেকে {to} তে পরিবর্তন করতে যাচ্ছেন।",
rebuildRequired: "গুরুত্বপূর্ণ: পুনর্নির্মাণ প্রয়োজন",
rebuildReason: "আপনার এমবেডিং মডেল পরিবর্তন করার জন্য সামঞ্জস্য বজায় রাখতে সব বিদ্যমান এমবেডিং পুনর্নির্মাণ প্রয়োজন। পুনর্নির্মাণ ছাড়া, আপনার অনুসন্ধান ভুল বা অসম্পূর্ণ ফলাফল ফিরিয়ে দিতে পারে।",
whatHappensNext: "পরবর্তীতে কি ঘটে:",
step1: "আপনার ডিফল্ট এমবেডিং মডেল আপডেট হবে",
step2: "পুনর্নির্মাণ পর্যন্ত বিদ্যমান এমবেডিংগুলি অপরিবর্তিত থাকবে",
step3: "নতুন কন্টেন্ট নতুন এমবেডিং মডেল ব্যবহার করবে",
step4: "আপনার যত তাড়াতাড়ি সম্ভব এমবেডিং পুনর্নির্মাণ করা উচিত",
proceedToRebuildPrompt: "এখনই পুনর্নির্মাণ শুরু করতে Advanced পেজে যেতে চান?",
changeModelOnly: "শুধু মডেল পরিবর্তন",
changeAndRebuild: "পরিবর্তন এবং পুনর্নির্মাণে যান",
autoAssign: "স্বয়ংক্রিয় ডিফল্ট অ্যাসাইন",
autoAssigning: "অ্যাসাইন করা হচ্ছে...",
autoAssignSuccess: "{count}টি ডিফল্ট মডেল স্বয়ংক্রিয়ভাবে অ্যাসাইন করা হয়েছে",
autoAssignNoModels: "অ্যাসাইনের জন্য কোন মডেল উপলব্ধ নেই। অনুগ্রহ করে প্রথমে মডেল সিঙ্ক করুন।",
autoAssignAlreadySet: "সব ডিফল্ট মডেল ইতিমধ্যে কনফিগার করা আছে",
testModel: "মডেল পরীক্ষা",
testModelSuccess: "মডেল পরীক্ষা পাস",
testModelFailed: "মডেল পরীক্ষা ব্যর্থ",
searchOrAddModel: "মডেলের নাম খুঁজুন বা টাইপ করুন...",
addCustomModel: "\"{name}\" যোগ করুন",
},
apiKeys: {
title: "আপনার নিজের API কী দিয়ে আপনার AI কনফিগার করুন",
description: "Open Notebook এ AI প্রোভাইডার সক্ষম করতে ডেটাবেসে নিরাপদভাবে API কী সংরক্ষণ করুন।",
encryptionRequired: "এনক্রিপশন কী কনফিগার করা হয়নি",
encryptionRequiredDescription: "ডেটাবেসে API কী সংরক্ষণ করতে OPEN_NOTEBOOK_ENCRYPTION_KEY environment variable যেকোন গোপন স্ট্রিংয়ে সেট করুন।",
configured: "কনফিগার করা",
notConfigured: "কনফিগার করা হয়নি",
migrationAvailable: "এনভায়রনমেন্ট ভ্যারিয়েবল সনাক্ত করা হয়েছে",
migrationDescription: "{count}টি API কী environment variable এর মাধ্যমে কনফিগার করা আছে এবং সহজ ব্যবস্থাপনার জন্য ডেটাবেসে মাইগ্রেট করা যেতে পারে।",
migrateToDatabase: "ডেটাবেসে মাইগ্রেট করুন",
migrating: "মাইগ্রেট করা হচ্ছে...",
migrationSuccess: "{count}টি API কী সফলভাবে মাইগ্রেট হয়েছে",
migrationErrors: "{count}টি কী মাইগ্রেট করতে ব্যর্থ",
migrationNothingToMigrate: "সব কী ইতিমধ্যে ডেটাবেসে আছে",
learnMore: "API কী কনফিগার করা শিখুন →",
testConnection: "সংযোগ পরীক্ষা",
testSuccess: "সংযোগ সফল",
testFailed: "সংযোগ পরীক্ষা ব্যর্থ",
syncModels: "মডেল সিঙ্ক করুন",
syncSuccess: "{discovered}টি মডেল আবিষ্কৃত, {new}টি নতুন যোগ",
syncNoNew: "{count}টি মডেল আবিষ্কৃত, সব ইতিমধ্যে নিবন্ধিত",
syncFailed: "মডেল সিঙ্ক করতে ব্যর্থ",
getApiKey: "API কী পান",
vertexProject: "GCP প্রজেক্ট ID",
vertexLocation: "অঞ্চল",
vertexCredentials: "সার্ভিস অ্যাকাউন্ট JSON পাথ",
addConfig: "কনফিগারেশন যোগ করুন",
editConfig: "কনফিগারেশন সম্পাদনা",
deleteConfig: "কনফিগারেশন মুছুন",
configName: "কনফিগারেশনের নাম",
configNameHint: "এই কনফিগারেশনের জন্য একটি বর্ণনামূলক নাম (যেমন, 'Production', 'Development')",
baseUrl: "বেস URL",
baseUrlOverrideHint: "শুধুমাত্র তখনই এটি পরিবর্তন করুন যদি আপনার প্রোভাইডারের ডিফল্ট API এন্ডপয়েন্ট ওভাররাইড করতে হয়।",
deleteConfigConfirm: "আপনি কি নিশ্চিত '{name}' মুছে ফেলতে চান? এটি পুনরায় করা যাবে না।",
configSaveSuccess: "কনফিগারেশন সফলভাবে সংরক্ষিত",
configUpdateSuccess: "কনফিগারেশন সফলভাবে আপডেট",
configDeleteSuccess: "কনফিগারেশন সফলভাবে মুছে ফেলা",
apiKeyEditHint: "বিদ্যমান API কী রাখতে খালি রাখুন",
},
setupBanner: {
encryptionRequired: "এনক্রিপশন কী কনফিগার করা হয়নি",
encryptionRequiredDescription: "নিরাপদ credential স্টোরেজ সক্ষম করতে OPEN_NOTEBOOK_ENCRYPTION_KEY environment variable সেট করুন।",
migrationAvailable: "API key মাইগ্রেশন উপলব্ধ",
migrationDescription: "{count}টি প্রভাইডারের API key environment variable দিয়ে সেট করা আছে। সহজ ব্যবস্থাপনার জন্য সেগুলি ডেটাবেসে মাইগ্রেট করুন।",
goToSettings: "সেটিংসে যান",
viewDocs: "ডকুমেন্টেশন দেখুন",
},
}

View file

@ -25,6 +25,7 @@ export const enUS = {
japanese: "日本語", japanese: "日本語",
french: "Français", french: "Français",
russian: "Русский", russian: "Русский",
bengali: "বাংলা",
source: "Source", source: "Source",
notebook: "Notebook", notebook: "Notebook",
podcast: "Podcast", podcast: "Podcast",

View file

@ -25,6 +25,7 @@ export const frFR = {
japanese: "日本語", japanese: "日本語",
french: "Français", french: "Français",
russian: "Русский", russian: "Русский",
bengali: "বাংলা",
source: "Source", source: "Source",
notebook: "Carnet", notebook: "Carnet",
podcast: "Podcast", podcast: "Podcast",

View file

@ -6,6 +6,7 @@ import { jaJP } from './ja-JP';
import { itIT } from './it-IT'; import { itIT } from './it-IT';
import { frFR } from './fr-FR'; import { frFR } from './fr-FR';
import { ruRU } from './ru-RU'; import { ruRU } from './ru-RU';
import { bnIN } from './bn-IN';
export const resources = { export const resources = {
'zh-CN': { translation: zhCN }, 'zh-CN': { translation: zhCN },
@ -16,11 +17,12 @@ export const resources = {
'it-IT': { translation: itIT }, 'it-IT': { translation: itIT },
'fr-FR': { translation: frFR }, 'fr-FR': { translation: frFR },
'ru-RU': { translation: ruRU }, 'ru-RU': { translation: ruRU },
'bn-IN': { translation: bnIN },
} as const; } as const;
export type TranslationKeys = typeof enUS; export type TranslationKeys = typeof enUS;
export type LanguageCode = 'zh-CN' | 'en-US' | 'zh-TW' | 'pt-BR' | 'ja-JP' | 'it-IT' | 'fr-FR' | 'ru-RU'; export type LanguageCode = 'zh-CN' | 'en-US' | 'zh-TW' | 'pt-BR' | 'ja-JP' | 'it-IT' | 'fr-FR' | 'ru-RU' | 'bn-IN';
export type Language = { export type Language = {
code: LanguageCode; code: LanguageCode;
@ -36,6 +38,7 @@ export const languages: Language[] = [
{ code: 'it-IT', label: 'Italiano' }, { code: 'it-IT', label: 'Italiano' },
{ code: 'fr-FR', label: 'Français' }, { code: 'fr-FR', label: 'Français' },
{ code: 'ru-RU', label: 'Русский' }, { code: 'ru-RU', label: 'Русский' },
{ code: 'bn-IN', label: 'বাংলা' },
]; ];
export { zhCN, enUS, zhTW, ptBR, jaJP, itIT, frFR, ruRU }; export { zhCN, enUS, zhTW, ptBR, jaJP, itIT, frFR, ruRU, bnIN };

View file

@ -25,6 +25,7 @@ export const itIT = {
japanese: "日本語", japanese: "日本語",
french: "Français", french: "Français",
russian: "Русский", russian: "Русский",
bengali: "বাংলা",
source: "Fonte", source: "Fonte",
notebook: "Quaderno", notebook: "Quaderno",
podcast: "Podcast", podcast: "Podcast",

View file

@ -25,6 +25,7 @@ export const jaJP = {
japanese: "日本語", japanese: "日本語",
french: "Français", french: "Français",
russian: "Русский", russian: "Русский",
bengali: "বাংলা",
source: "ソース", source: "ソース",
notebook: "ノートブック", notebook: "ノートブック",
podcast: "ポッドキャスト", podcast: "ポッドキャスト",

View file

@ -25,6 +25,7 @@ export const ptBR = {
japanese: "日本語", japanese: "日本語",
french: "Français", french: "Français",
russian: "Русский", russian: "Русский",
bengali: "বাংলা",
source: "Fonte", source: "Fonte",
notebook: "Caderno", notebook: "Caderno",
podcast: "Podcast", podcast: "Podcast",

View file

@ -25,6 +25,7 @@ export const ruRU = {
japanese: "日本語", japanese: "日本語",
french: "Français", french: "Français",
russian: "Русский", russian: "Русский",
bengali: "বাংলা",
source: "Источник", source: "Источник",
notebook: "Блокнот", notebook: "Блокнот",
podcast: "Подкаст", podcast: "Подкаст",

View file

@ -25,6 +25,7 @@ export const zhCN = {
japanese: "日本語", japanese: "日本語",
french: "Français", french: "Français",
russian: "Русский", russian: "Русский",
bengali: "বাংলা",
source: "来源", source: "来源",
notebook: "笔记本", notebook: "笔记本",
podcast: "播客", podcast: "播客",

View file

@ -25,6 +25,7 @@ export const zhTW = {
japanese: "日本語", japanese: "日本語",
french: "Français", french: "Français",
russian: "Русский", russian: "Русский",
bengali: "বাংলা",
source: "來源", source: "來源",
notebook: "筆記本", notebook: "筆記本",
podcast: "播客", podcast: "播客",

View file

@ -1,4 +1,4 @@
import { zhCN, enUS, zhTW, ptBR, ja, fr, ru, Locale } from 'date-fns/locale' import { zhCN, enUS, zhTW, ptBR, ja, fr, ru, bn, Locale } from 'date-fns/locale'
/** /**
* Mapping of language codes to date-fns locales. * Mapping of language codes to date-fns locales.
@ -12,6 +12,7 @@ const LOCALE_MAP: Record<string, Locale> = {
'ja-JP': ja, 'ja-JP': ja,
'fr-FR': fr, 'fr-FR': fr,
'ru-RU': ru, 'ru-RU': ru,
'bn-IN': bn,
} }
/** /**