-
Input:
+
{t('chat.LLMResponseInfoPopover.promptTokens')}
{usage.prompt_tokens}
-
Output:
+
{t('chat.LLMResponseInfoPopover.completionTokens')}
{usage.completion_tokens}
-
Total:
+
{t('chat.LLMResponseInfoPopover.totalTokens')}
{usage.total_tokens}
@@ -59,24 +60,24 @@ export default function LLMResponseInfoPopover({
- Estimated price:
+ {t('chat.LLMResponseInfoPopover.estimatedPrice')}
{estimatedPrice === null
- ? 'Not available'
+ ? t('chat.LLMResponseInfoPopover.notAvailable')
: `$${estimatedPrice.toFixed(4)}`}
- Model:
+ {t('chat.LLMResponseInfoPopover.model')}
- {model ?? 'Not available'}
+ {model ?? t('chat.LLMResponseInfoPopover.notAvailable')}
) : (
- Usage statistics are not available for this model
+ {t('chat.LLMResponseInfoPopover.usageNotAvailable')}
)}
diff --git a/src/components/chat-view/Markdown/MarkdownApplyDiffBlock.tsx b/src/components/chat-view/Markdown/MarkdownApplyDiffBlock.tsx
index cb08512..385e8b2 100644
--- a/src/components/chat-view/Markdown/MarkdownApplyDiffBlock.tsx
+++ b/src/components/chat-view/Markdown/MarkdownApplyDiffBlock.tsx
@@ -2,6 +2,7 @@ import { Check, Diff, Loader2, X } from 'lucide-react'
import { PropsWithChildren, useState } from 'react'
import { useDarkModeContext } from "../../../contexts/DarkModeContext"
+import { t } from '../../../lang/helpers'
import { ApplyStatus, ToolArgs } from "../../../types/apply"
import { MemoizedSyntaxHighlighterWrapper } from "./SyntaxHighlighterWrapper"
@@ -55,23 +56,23 @@ export default function MarkdownApplyDiffBlock({
{
!finish ? (
<>
-
Loading...
+
{t('chat.reactMarkdown.loading')}
>
) : applyStatus === ApplyStatus.Idle ? (
applying ? (
<>
-
Applying...
+
{t('chat.reactMarkdown.applying')}
>
) : (
- 'Apply'
+ t('chat.reactMarkdown.apply')
)
) : applyStatus === ApplyStatus.Applied ? (
<>
-
Success
+
{t('chat.reactMarkdown.success')}
>
) : (
<>
-
Failed
+
{t('chat.reactMarkdown.failed')}
>
)}
diff --git a/src/components/chat-view/Markdown/MarkdownEditFileBlock.tsx b/src/components/chat-view/Markdown/MarkdownEditFileBlock.tsx
index c06e5d9..e0cffe7 100644
--- a/src/components/chat-view/Markdown/MarkdownEditFileBlock.tsx
+++ b/src/components/chat-view/Markdown/MarkdownEditFileBlock.tsx
@@ -2,6 +2,7 @@ import { Check, CopyIcon, Edit, Loader2, X } from 'lucide-react'
import { PropsWithChildren, useMemo, useState } from 'react'
import { useDarkModeContext } from "../../../contexts/DarkModeContext"
+import { t } from '../../../lang/helpers'
import { ApplyStatus, ToolArgs } from "../../../types/apply"
import { MemoizedSyntaxHighlighterWrapper } from "./SyntaxHighlighterWrapper"
@@ -63,7 +64,7 @@ export default function MarkdownEditFileBlock({
{path && (
- {mode}: {path}
+ {t('chat.reactMarkdown.editOrApplyDiff').replace('{mode}', mode).replace('{path}', path)}
)}
@@ -74,34 +75,34 @@ export default function MarkdownEditFileBlock({
>
{copied ? (
<>
-
Copied
+
{t('chat.reactMarkdown.copied')}
>
) : (
<>
-
Copy
+
{t('chat.reactMarkdown.copy')}
>
)}
diff --git a/src/components/chat-view/Markdown/MarkdownFetchUrlsContentBlock.tsx b/src/components/chat-view/Markdown/MarkdownFetchUrlsContentBlock.tsx
index 8c202e9..b783049 100644
--- a/src/components/chat-view/Markdown/MarkdownFetchUrlsContentBlock.tsx
+++ b/src/components/chat-view/Markdown/MarkdownFetchUrlsContentBlock.tsx
@@ -1,6 +1,7 @@
import { Check, ChevronDown, ChevronRight, Globe, Loader2, X } from 'lucide-react'
import React, { useEffect, useRef, useState } from 'react'
+import { t } from '../../../lang/helpers'
import { ApplyStatus, FetchUrlsContentToolArgs } from "../../../types/apply"
export default function MarkdownFetchUrlsContentBlock({
@@ -38,7 +39,7 @@ export default function MarkdownFetchUrlsContentBlock({
- Fetch URLs Content
+ {t('chat.reactMarkdown.fetchUrlsContent')}
diff --git a/src/components/chat-view/Markdown/MarkdownListFilesBlock.tsx b/src/components/chat-view/Markdown/MarkdownListFilesBlock.tsx
index 4b97c88..211298b 100644
--- a/src/components/chat-view/Markdown/MarkdownListFilesBlock.tsx
+++ b/src/components/chat-view/Markdown/MarkdownListFilesBlock.tsx
@@ -2,6 +2,7 @@ import { FolderOpen } from 'lucide-react'
import React from 'react'
import { useApp } from "../../../contexts/AppContext"
+import { t } from '../../../lang/helpers'
import { ApplyStatus, ListFilesToolArgs } from "../../../types/apply"
import { openMarkdownFile } from "../../../utils/obsidian"
@@ -42,7 +43,7 @@ export default function MarkdownListFilesBlock({
- List files: {path}
+ {t('chat.reactMarkdown.listFiles').replace('{path}', path)}
diff --git a/src/components/chat-view/Markdown/MarkdownReadFileBlock.tsx b/src/components/chat-view/Markdown/MarkdownReadFileBlock.tsx
index 288f55d..f7bb598 100644
--- a/src/components/chat-view/Markdown/MarkdownReadFileBlock.tsx
+++ b/src/components/chat-view/Markdown/MarkdownReadFileBlock.tsx
@@ -2,6 +2,7 @@ import { ExternalLink } from 'lucide-react'
import React from 'react'
import { useApp } from "../../../contexts/AppContext"
+import { t } from '../../../lang/helpers'
import { ApplyStatus, ReadFileToolArgs } from "../../../types/apply"
import { openMarkdownFile } from "../../../utils/obsidian"
@@ -39,7 +40,7 @@ export default function MarkdownReadFileBlock({
- Read file: {path}
+ {t('chat.reactMarkdown.readFile').replace('{path}', path)}
diff --git a/src/components/chat-view/Markdown/MarkdownReasoningBlock.tsx b/src/components/chat-view/Markdown/MarkdownReasoningBlock.tsx
index c542ad0..0f5b89d 100644
--- a/src/components/chat-view/Markdown/MarkdownReasoningBlock.tsx
+++ b/src/components/chat-view/Markdown/MarkdownReasoningBlock.tsx
@@ -2,6 +2,7 @@ import { ChevronDown, ChevronRight, Brain } from 'lucide-react'
import { PropsWithChildren, useEffect, useRef, useState } from 'react'
import { useDarkModeContext } from "../../../contexts/DarkModeContext"
+import { t } from '../../../lang/helpers'
import { MemoizedSyntaxHighlighterWrapper } from "./SyntaxHighlighterWrapper"
@@ -28,7 +29,7 @@ export default function MarkdownReasoningBlock({
- Reasoning
+ {t('chat.reactMarkdown.reasoning')}
diff --git a/src/components/chat-view/Markdown/MarkdownSearchAndReplace.tsx b/src/components/chat-view/Markdown/MarkdownSearchAndReplace.tsx
index 935a394..e815e72 100644
--- a/src/components/chat-view/Markdown/MarkdownSearchAndReplace.tsx
+++ b/src/components/chat-view/Markdown/MarkdownSearchAndReplace.tsx
@@ -3,6 +3,7 @@ import React from 'react'
import { useApp } from '../../../contexts/AppContext'
import { useDarkModeContext } from '../../../contexts/DarkModeContext'
+import { t } from '../../../lang/helpers'
import { ApplyStatus, SearchAndReplaceToolArgs } from '../../../types/apply'
import { openMarkdownFile } from '../../../utils/obsidian'
@@ -52,7 +53,7 @@ export default function MarkdownSearchAndReplace({
- Search and replace in {path}
+ {t('chat.reactMarkdown.searchAndReplaceInPath').replace('{path}', path)}
diff --git a/src/components/chat-view/Markdown/MarkdownSearchWebBlock.tsx b/src/components/chat-view/Markdown/MarkdownSearchWebBlock.tsx
index 445c659..9ded9f5 100644
--- a/src/components/chat-view/Markdown/MarkdownSearchWebBlock.tsx
+++ b/src/components/chat-view/Markdown/MarkdownSearchWebBlock.tsx
@@ -2,6 +2,7 @@ import { Check, Loader2, Search, X } from 'lucide-react'
import React from 'react'
import { useSettings } from "../../../contexts/SettingsContext"
+import { t } from '../../../lang/helpers'
import { ApplyStatus, SearchWebToolArgs } from "../../../types/apply"
export default function MarkdownWebSearchBlock({
@@ -46,7 +47,7 @@ export default function MarkdownWebSearchBlock({
- Web search: {query}
+ {t('chat.reactMarkdown.webSearch').replace('{query}', query)}
diff --git a/src/components/chat-view/Markdown/MarkdownSemanticSearchFilesBlock.tsx b/src/components/chat-view/Markdown/MarkdownSemanticSearchFilesBlock.tsx
index 9fd74a7..9af9102 100644
--- a/src/components/chat-view/Markdown/MarkdownSemanticSearchFilesBlock.tsx
+++ b/src/components/chat-view/Markdown/MarkdownSemanticSearchFilesBlock.tsx
@@ -2,6 +2,7 @@ import { FileSearch } from 'lucide-react'
import React from 'react'
import { useApp } from "../../../contexts/AppContext"
+import { t } from '../../../lang/helpers'
import { ApplyStatus, SemanticSearchFilesToolArgs } from "../../../types/apply"
import { openMarkdownFile } from "../../../utils/obsidian"
@@ -42,7 +43,7 @@ export default function MarkdownSemanticSearchFilesBlock({
- semantic search files "{query}" in {path}
+ {t('chat.reactMarkdown.semanticSearchInPath').replace('{query}', query).replace('{path}', path)}
diff --git a/src/components/chat-view/Markdown/MarkdownSwitchModeBlock.tsx b/src/components/chat-view/Markdown/MarkdownSwitchModeBlock.tsx
index 971a60c..49a33fc 100644
--- a/src/components/chat-view/Markdown/MarkdownSwitchModeBlock.tsx
+++ b/src/components/chat-view/Markdown/MarkdownSwitchModeBlock.tsx
@@ -2,6 +2,7 @@ import { Check, Loader2, Settings2, X } from 'lucide-react'
import { PropsWithChildren, useState } from 'react'
import { useDarkModeContext } from "../../../contexts/DarkModeContext"
+import { t } from '../../../lang/helpers'
import { ApplyStatus, ToolArgs } from "../../../types/apply"
import { MemoizedSyntaxHighlighterWrapper } from "./SyntaxHighlighterWrapper"
@@ -40,7 +41,7 @@ export default function MarkdownSwitchModeBlock({
- Switch to "{mode.charAt(0).toUpperCase() + mode.slice(1)}" mode
+ {t('chat.reactMarkdown.switchToMode').replace('{mode}', mode.charAt(0).toUpperCase() + mode.slice(1))}
diff --git a/src/components/chat-view/Markdown/MarkdownWithIcon.tsx b/src/components/chat-view/Markdown/MarkdownWithIcon.tsx
index eb43bbc..78c7084 100644
--- a/src/components/chat-view/Markdown/MarkdownWithIcon.tsx
+++ b/src/components/chat-view/Markdown/MarkdownWithIcon.tsx
@@ -5,6 +5,8 @@ import ReactMarkdown from 'react-markdown';
import rehypeRaw from 'rehype-raw';
import { useApp } from 'src/contexts/AppContext';
+import { t } from '../../../lang/helpers'
+
function CopyButton({ message }: { message: string }) {
const [copied, setCopied] = useState(false)
@@ -33,7 +35,7 @@ function CopyButton({ message }: { message: string }) {
- Copy message
+ {t('chat.reactMarkdown.copyMsg')}
@@ -77,7 +79,7 @@ function CreateNewFileButton({ message }: { message: string }) {
- Create new note
+ {t('chat.reactMarkdown.createNewNote')}
@@ -123,9 +125,9 @@ const MarkdownWithIcons = ({
switch (iconName) {
case 'ask_followup_question':
- return 'Ask Followup Question:';
+ return t('chat.reactMarkdown.askFollowupQuestion');
case 'attempt_completion':
- return 'Task Completion';
+ return t('chat.reactMarkdown.taskCompletion');
default:
return null;
}
diff --git a/src/components/chat-view/QueryProgress.tsx b/src/components/chat-view/QueryProgress.tsx
index d816ff5..81bb598 100644
--- a/src/components/chat-view/QueryProgress.tsx
+++ b/src/components/chat-view/QueryProgress.tsx
@@ -1,5 +1,5 @@
import { SelectVector } from '../../database/schema'
-
+import { t } from '../../lang/helpers'
export type QueryProgressState =
| {
type: 'reading-mentionables'
@@ -38,7 +38,7 @@ export default function QueryProgress({
return (
- Reading mentioned files
+ {t('chat.queryProgress.readingMentionableFiles')}
@@ -47,17 +47,17 @@ export default function QueryProgress({
return (
- {`Indexing ${state.indexProgress.totalFiles} file`}
+ {`${t('chat.queryProgress.indexing')} ${state.indexProgress.totalFiles} ${t('chat.queryProgress.file')}`}
-
{`${state.indexProgress.completedChunks}/${state.indexProgress.totalChunks} chunks indexed`}
+
{`${state.indexProgress.completedChunks}/${state.indexProgress.totalChunks} ${t('chat.queryProgress.chunkIndexed')}`}
)
case 'querying':
return (
- Querying the vault
+ {t('chat.queryProgress.queryingVault')}
@@ -66,7 +66,7 @@ export default function QueryProgress({
return (
- Reading related files
+ {t('chat.queryProgress.readingRelatedFiles')}
{state.queryResult.map((result) => (
diff --git a/src/components/chat-view/ShortcutInfo.tsx b/src/components/chat-view/ShortcutInfo.tsx
index 5d6dd86..4d74ea5 100644
--- a/src/components/chat-view/ShortcutInfo.tsx
+++ b/src/components/chat-view/ShortcutInfo.tsx
@@ -1,20 +1,22 @@
import { Platform } from 'obsidian';
import React from 'react';
+import { t } from '../../lang/helpers'
+
const ShortcutInfo: React.FC = () => {
const modKey = Platform.isMacOS ? 'Cmd' : 'Ctrl';
const shortcuts = [
{
- label: 'Edit inline',
+ label: t('chat.shortcutInfo.editInline'),
shortcut: `${modKey}+Shift+K`,
},
{
- label: 'Chat with select',
+ label: t('chat.shortcutInfo.chatWithSelect'),
shortcut: `${modKey}+Shift+L`,
},
{
- label: 'Submit with vault',
+ label: t('chat.shortcutInfo.submitWithVault'),
shortcut: `${modKey}+Shift+Enter`,
}
];
diff --git a/src/components/chat-view/SimilaritySearchResults.tsx b/src/components/chat-view/SimilaritySearchResults.tsx
index e52fb51..e41fc13 100644
--- a/src/components/chat-view/SimilaritySearchResults.tsx
+++ b/src/components/chat-view/SimilaritySearchResults.tsx
@@ -5,67 +5,69 @@ import { useState } from 'react'
import { useApp } from '../../contexts/AppContext'
import { SelectVector } from '../../database/schema'
+import { t } from '../../lang/helpers'
import { openMarkdownFile } from '../../utils/obsidian'
function SimiliartySearchItem({
- chunk,
+ chunk,
}: {
- chunk: Omit
& {
- similarity: number
- }
+ chunk: Omit & {
+ similarity: number
+ }
}) {
- const app = useApp()
+ const app = useApp()
- const handleClick = () => {
- openMarkdownFile(app, chunk.path, chunk.metadata.startLine)
- }
- return (
-
-
- {chunk.similarity.toFixed(3)}
-
-
- {path.basename(chunk.path)}
-
-
- {`${chunk.metadata.startLine} - ${chunk.metadata.endLine}`}
-
-
- )
+ const handleClick = () => {
+ openMarkdownFile(app, chunk.path, chunk.metadata.startLine)
+ }
+ return (
+
+
+ {chunk.similarity.toFixed(3)}
+
+
+ {path.basename(chunk.path)}
+
+
+ {`${chunk.metadata.startLine} - ${chunk.metadata.endLine}`}
+
+
+ )
}
export default function SimilaritySearchResults({
- similaritySearchResults,
+ similaritySearchResults,
}: {
- similaritySearchResults: (Omit & {
- similarity: number
- })[]
+ similaritySearchResults: (Omit & {
+ similarity: number
+ })[]
}) {
- const [isOpen, setIsOpen] = useState(false)
+ const [isOpen, setIsOpen] = useState(false)
- return (
-
-
{
- setIsOpen(!isOpen)
- }}
- className="infio-similarity-search-results__trigger"
- >
- {isOpen ?
:
}
-
Show Referenced Documents ({similaritySearchResults.length})
-
- {isOpen && (
-
- {similaritySearchResults.map((chunk) => (
-
- ))}
-
- )}
-
- )
+ return (
+
+
{
+ setIsOpen(!isOpen)
+ }}
+ className="infio-similarity-search-results__trigger"
+ >
+ {isOpen ?
:
}
+
+ {t('chat.searchResults.showReferencedDocuments')} ({similaritySearchResults.length})
+
+ {isOpen && (
+
+ {similaritySearchResults.map((chunk) => (
+
+ ))}
+
+ )}
+
+ )
}
diff --git a/src/components/chat-view/chat-input/ImageUploadButton.tsx b/src/components/chat-view/chat-input/ImageUploadButton.tsx
index e1626be..b412493 100644
--- a/src/components/chat-view/chat-input/ImageUploadButton.tsx
+++ b/src/components/chat-view/chat-input/ImageUploadButton.tsx
@@ -2,6 +2,7 @@ import { ImageIcon } from 'lucide-react'
import { TFile } from 'obsidian'
import { useApp } from '../../../contexts/AppContext'
+import { t } from '../../../lang/helpers'
import { ImageSelectorModal } from '../../modals/ImageSelectorModal'
export function ImageUploadButton({
@@ -34,7 +35,7 @@ export function ImageUploadButton({
- Image
+ {t('chat.input.image')}
)
}
diff --git a/src/components/chat-view/chat-input/ModelSelect.tsx b/src/components/chat-view/chat-input/ModelSelect.tsx
index 2821d5b..3542da1 100644
--- a/src/components/chat-view/chat-input/ModelSelect.tsx
+++ b/src/components/chat-view/chat-input/ModelSelect.tsx
@@ -4,6 +4,7 @@ import { ChevronDown, ChevronUp, Star, StarOff } from 'lucide-react'
import { useEffect, useMemo, useRef, useState } from 'react'
import { useSettings } from '../../../contexts/SettingsContext'
+import { t } from '../../../lang/helpers'
import { ApiProvider } from '../../../types/llm/model'
import { GetAllProviders, GetProviderModelIds } from "../../../utils/api"
@@ -256,7 +257,7 @@ export function ModelSelect() {
{settings.collectedChatModels?.length > 0 && (
- collected models
+ {t('chat.input.collectedModels')}
{settings.collectedChatModels.map((collectedModel, index) => (
@@ -415,7 +416,7 @@ export function ModelSelect() {
)}
{isLoading ? (
- loading...
+ {t('chat.input.loading')}
) : (
diff --git a/src/components/chat-view/chat-input/SubmitButton.tsx b/src/components/chat-view/chat-input/SubmitButton.tsx
index 95f5684..6d321d5 100644
--- a/src/components/chat-view/chat-input/SubmitButton.tsx
+++ b/src/components/chat-view/chat-input/SubmitButton.tsx
@@ -1,9 +1,11 @@
import { CornerDownLeftIcon } from 'lucide-react'
+import { t } from '../../../lang/helpers'
+
export function SubmitButton({ onClick }: { onClick: () => void }) {
return (
)
}
diff --git a/src/components/inline-edit/InlineEdit.tsx b/src/components/inline-edit/InlineEdit.tsx
index cc565d8..a52c95d 100644
--- a/src/components/inline-edit/InlineEdit.tsx
+++ b/src/components/inline-edit/InlineEdit.tsx
@@ -4,6 +4,7 @@ import React, { useEffect, useRef, useState } from 'react';
import { APPLY_VIEW_TYPE } from '../../constants';
import LLMManager from '../../core/llm/manager';
+import { t } from '../../lang/helpers';
import { InfioSettings } from '../../types/settings';
import { GetProviderModelIds } from '../../utils/api';
import { ApplyEditToFile } from '../../utils/apply';
@@ -52,7 +53,7 @@ const InputArea: React.FC = ({ value, onChange, handleSubmit, ha