Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
c145b72
feat(i18n): add Japanese UI locale
tjm8874 Oct 4, 2026
2765b43
fix(i18n): address Japanese locale review and native smoke findings
tjm8874 Oct 4, 2026
6848504
Merge branch 'tinyhumansai:main' into feat/japanese-ui
tjm8874 Oct 4, 2026
0897eea
fix(i18n): align Japanese dictionary with Memory v2
tjm8874 Oct 4, 2026
d043a13
fix(i18n): refresh Japanese copy changed by Memory v2
tjm8874 Oct 4, 2026
673e33a
refactor(i18n): use natural Japanese copy for Memory v2
tjm8874 Oct 4, 2026
6bfc61d
test(i18n): cover Japanese locale browser E2E and native smoke
tjm8874 Oct 4, 2026
f14845d
docs(i18n): record successful native model chat and relaunch
tjm8874 Oct 4, 2026
3a9580f
test(i18n): assert interpolated labels fit their containers
tjm8874 Oct 4, 2026
79cf16e
Merge remote-tracking branch 'origin/main' into feat/japanese-ui
tjm8874 Oct 4, 2026
c261b29
fix(i18n): align Japanese memory lifecycle with latest main
tjm8874 Oct 4, 2026
3634df2
docs(i18n): record refreshed native E2E and align app lockfile
tjm8874 Oct 4, 2026
1527e92
test(i18n): wait for Japanese persistence before navigation
tjm8874 Oct 4, 2026
bab00e2
ci: synchronize audited upstream static inventories
tjm8874 Oct 4, 2026
8fae68a
test(i18n): use shared browser helpers and decode persisted locale
tjm8874 Oct 4, 2026
c8cc3e5
ci: restore current memory and delegation integration fixtures
tjm8874 Oct 4, 2026
a2d0722
fix(agent): honor iteration overrides and permanent host tools
tjm8874 Oct 4, 2026
18682a4
ci: tighten layout pins after agent helper reuse
tjm8874 Oct 4, 2026
82130dc
Merge remote-tracking branch 'origin/main' into feat/japanese-ui
tjm8874 Oct 4, 2026
1da82e2
ci: align app lock with upstream embedded memory facade
tjm8874 Oct 4, 2026
8b61f81
ci: resolve selected Rust binaries for confined tool tests
tjm8874 Oct 4, 2026
abfc1d6
fix: resolve PR integration conflicts and review findings
senamakel Oct 6, 2026
acf91a1
fix(i18n): refresh Japanese copy and unify dependency calibration
tjm8874 Oct 6, 2026
4344c23
fix: clarify dependency calibration pairing
senamakel Oct 6, 2026
31ace35
fix: clear PR lane validation failures
senamakel Oct 6, 2026
0a460ce
test: document navigation E2E registration
senamakel Oct 6, 2026
11893b8
fix(i18n): align Japanese locale header
senamakel Oct 6, 2026
6fd6146
Merge upstream main into feat/japanese-ui
senamakel Oct 6, 2026
3862c78
fix(e2e): register keyboard navigation spec once
tjm8874 Oct 6, 2026
cd8ccb9
fix(i18n): add Japanese memory credit labels
senamakel Oct 6, 2026
1ff9059
test(i18n): cover Japanese local Composio panel
senamakel Oct 6, 2026
cf2f93e
fix(i18n): detect halfwidth Katakana as Japanese
tjm8874 Oct 6, 2026
78790d7
Merge commit 'a07d3cc8579eef39416d34e24808e359d29cc9d8' into feat/jap…
tjm8874 Oct 6, 2026
3092dbb
fix(i18n): retain credit labels against current English baseline
tjm8874 Oct 6, 2026
52bf49d
test(i18n): await persisted locale before Composio navigation
tjm8874 Oct 7, 2026
3841ca6
test(i18n): preserve base URL for Japanese browser context
tjm8874 Oct 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -339,4 +339,51 @@ If you are contributing through a coding agent or remote environment, include th
- Keep logs grep-friendly and avoid logging secrets, tokens, or full PII.
- Follow ESLint, Prettier, and Rust formatting output as authoritative.

### UI translations

All locales use the same workflow. Use `useT()` for UI text and treat
`app/src/lib/i18n/en.ts` as the key source. Preserve existing good translations,
translate new or changed English meanings, and remove keys retired from English.
`scripts/apply-i18n-translations.ts` applies translation JSON files, retains
existing values, removes obsolete keys, and writes keys in English order. Supply
real translations for new strings; its English fallback is not a finished translation.
Run `pnpm i18n:check`, `pnpm i18n:english:check`, the i18n coverage test, and Prettier.
Preserve interpolation placeholders exactly, including repeated placeholders and
double braces. Keep product names, paths, commands, and technical identifiers intact.

#### Japanese UI copy

Review text where it appears: a button, setting label, status, empty state, or
confirmation dialog. Prefer short action labels and plain, polite sentences.
Remove roundabout wording, not information: keep conditions, units, upload
destinations, consent requirements, and deletion scope. Errors should describe
what happened without guessing a cause. For example, keep "no answer" distinct
from "no data" or a connection failure.

| Context | Prefer | Avoid |
| --- | --- | --- |
| Save button | 保存 | 変更内容の保存を実行 |
| Saved status | 保存しました | 正常に保存されました |
| Available action | 変更できます | 変更することができます |
| Delete a stored memory item | メモリーから削除 | 忘れる |

Use these terms consistently on the Memory screens. Translate by meaning rather
than substituting words mechanically; source connections and answer citations are
different concepts.

| Concept | Japanese |
| --- | --- |
| Memory / memory engine | メモリー / メモリーエンジン |
| Learning / preference | 学習内容 / 好み |
| Brain / belief / memory pack | ブレイン / 信念 / メモリーパック |
| Source to sync / answer citation | ソース / 出典 |
| Context brief | コンテキスト要約; 要約 when the context is clear |
| Sync / import | 同期 / インポート |
| Endpoint URL / API key | 接続先URL / APIキー |
| Conversation / thread / turn | 会話 / スレッド / ターン |

Keep backend count units such as ターン; do not reinterpret them as messages or
conversations. This is contributor writing guidance, not a separate Japanese key
matcher, fallback, or validation rule.

Thank you for contributing to OpenHuman.
54 changes: 54 additions & 0 deletions app/src/components/LanguageSelect.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { configureStore } from '@reduxjs/toolkit';
import { fireEvent, render, screen } from '@testing-library/react';
import { Provider } from 'react-redux';
import { describe, expect, it } from 'vitest';

import { I18nProvider, useT } from '../lib/i18n/I18nContext';
import localeReducer, { setLocale } from '../store/localeSlice';
import LanguageSelect from './LanguageSelect';

function LanguageSetting() {
const { t } = useT();
return <span>{t('settings.language')}</span>;
}

function renderPicker() {
Comment thread
tjm8874 marked this conversation as resolved.
const store = configureStore({ reducer: { locale: localeReducer } });
store.dispatch(setLocale('en'));
render(
<Provider store={store}>
<I18nProvider>
<LanguageSelect />
<LanguageSetting />
</I18nProvider>
</Provider>
);
return store;
}

describe('LanguageSelect', () => {
it('offers Japanese in its native script and applies it immediately', () => {
const store = renderPicker();
expect(screen.getByRole('option', { name: '🇯🇵 日本語' })).toHaveValue('ja');

fireEvent.change(screen.getByRole('combobox'), { target: { value: 'ja' } });
Comment thread
tjm8874 marked this conversation as resolved.

expect(store.getState().locale.current).toBe('ja');
expect(screen.getByRole('combobox')).toHaveValue('ja');
expect(screen.getByText('言語')).toBeInTheDocument();
expect(document.documentElement.lang).toBe('ja');
expect(document.documentElement.dir).toBe('ltr');
});

it('can switch back to English after Japanese', () => {
const store = renderPicker();
const picker = screen.getByRole('combobox');
fireEvent.change(picker, { target: { value: 'ja' } });
fireEvent.change(picker, { target: { value: 'en' } });

expect(store.getState().locale.current).toBe('en');
expect(picker).toHaveValue('en');
expect(screen.getByText('Language')).toBeInTheDocument();
expect(document.documentElement.lang).toBe('en');
});
});
1 change: 1 addition & 0 deletions app/src/components/LanguageSelect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ interface LocaleOption {

const LOCALE_OPTIONS: LocaleOption[] = [
{ value: 'en', flag: '🇬🇧', label: 'English' },
{ value: 'ja', flag: '🇯🇵', label: '日本語' },
Comment thread
tjm8874 marked this conversation as resolved.
Comment thread
tjm8874 marked this conversation as resolved.
Comment thread
tjm8874 marked this conversation as resolved.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

priority high security confident

Keep unsupported locales out of the default locale list

ja is not a member of the Locale union, so this entry makes the LocaleOption[] declaration fail TypeScript checking. Remove this option or add complete Japanese locale support, including the Locale type and translations, before registering it here.

[RULE] unsupported-locale ·

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Japanese is already in the Locale union at line 14:

. The same tree also contains ja.ts, the I18nContext registration and browser-language mapping. TypeScript and the complete hosted frontend checks passed at this head: https://github.com/tinyhumansai/openhuman/actions/runs/37543248284/job/112541135155 . Removing the Japanese option would regress the feature. Please clear this retrieval-based false positive.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved — the reply explains why it is not a problem (advisory), as of 3841ca6.

If this is wrong, reopen the conversation and say so; the finding will be re-raised on the next push if it still reproduces.

{ value: 'ko', flag: '🇰🇷', label: '한국어' },
{ value: 'zh-CN', flag: '🇨🇳', label: '简体中文' },
{ value: 'hi', flag: '🇮🇳', label: 'हिन्दी' },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,28 @@ describe('ComposioPanel', () => {
expect(screen.getByText(/Managed Composio auth is unavailable here/i)).toBeInTheDocument();
});

test('renders the direct-only explanation in Japanese for a local session', async () => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

priority medium critique confident

Drive the Japanese Composio direct-only panel in an E2E spec

This adds only a mocked component unit test. The repository's testing rule requires frontend flows to have mocked browser/desktop E2E coverage, and this test does not exercise the actual embedded panel, locale selection, or rendered flow in the application shell. Add an E2E spec using the shared helpers that opens the relevant panel in a local session and asserts the Japanese direct-only experience.


Additional security observation

priority medium likely

Drive the Japanese Composio flow in an E2E spec

[RULE] missing-e2e-coverage

This adds only a colocated Vitest unit test. It does not exercise the actual browser/desktop flow that selects Japanese, renders the local-session direct-only Composio panel, and verifies the user-visible result. The repository rules require frontend flows to have mocked browser/desktop E2E coverage under app/test/e2e/specs/; add that coverage rather than relying on the provider and Redux state being set up correctly in a unit test.

[RULE] missing-e2e-coverage ·

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This browser flow already exists in the reviewed head:

test('renders the Japanese Composio direct-only explanation for a local session', async ({
. It establishes a local session through auth_store_session, selects Japanese through browserElements, navigates to the real Composio panel and asserts the Japanese direct-only explanation. The Playwright wrapper discovers this fourth case. The separate persistence-race finding was valid and is fixed in 52bf49d. No duplicate E2E case is needed. Source existence/discovery is confirmed; I am not claiming a fresh full browser/Core execution in this reply.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved — the reply explains why it is not a problem (advisory), as of 3841ca6.

If this is wrong, reopen the conversation and say so; the finding will be re-raised on the next push if it still reproduces.

coreStateMock.mockReturnValue({ snapshot: { sessionToken: 'header.payload.local' } });
const Panel = await importPanel();
const { I18nProvider } = await import('../../../../lib/i18n/I18nContext');
renderWithProviders(
<I18nProvider>
<Panel embedded />
</I18nProvider>,
{ preloadedState: { locale: { current: 'ja' } } }
Comment thread
tjm8874 marked this conversation as resolved.
);

expect(
await screen.findByText(
'この環境ではComposioのマネージド認証を利用できません。独自のComposio APIキーを入力するか、設定を後回しにしてください。'
)
).toBeInTheDocument();
expect(screen.getByText('直接接続(独自のAPIキーを使用)')).toBeInTheDocument();
expect(
screen.queryByText(/Managed Composio auth is unavailable here/i)
).not.toBeInTheDocument();
});

test('saving Direct mode with a key calls setApiKey and masks the field', async () => {
const Panel = await importPanel();
renderWithProviders(<Panel />);
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/I18nContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import fr from './fr';
import hi from './hi';
import id from './id';
import it from './it';
import ja from './ja';
Comment thread
tjm8874 marked this conversation as resolved.
import ko from './ko';
import pl from './pl';
import pt from './pt';
Expand All @@ -28,6 +29,7 @@ interface I18nContextValue {

const translations: Record<Locale, Record<string, string>> = {
en,
ja,
Comment thread
tjm8874 marked this conversation as resolved.
ko,
'zh-CN': zhCN,
hi,
Expand Down
12 changes: 12 additions & 0 deletions app/src/lib/i18n/__tests__/I18nContext.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,18 @@ describe('I18nProvider', () => {
expect(screen.getByTestId('missing-key')).toHaveTextContent('this.key.does.not.exist');
});

it('serves Japanese translations with the existing unknown-key fallback', () => {
Comment thread
tjm8874 marked this conversation as resolved.
Comment thread
tjm8874 marked this conversation as resolved.
renderWithLocale('ja');

expect(screen.getByTestId('locale')).toHaveTextContent('ja');
expect(screen.getByText('言語')).toBeInTheDocument();
expect(screen.getByText('アプリデータを削除')).toBeInTheDocument();
expect(screen.getByText('終了')).toBeInTheDocument();
expect(screen.getByTestId('missing-key')).toHaveTextContent('this.key.does.not.exist');
expect(document.documentElement.lang).toBe('ja');
Comment thread
tjm8874 marked this conversation as resolved.
expect(document.documentElement.dir).toBe('ltr');
});

it('serves German translations from the registered locale map', () => {
renderWithLocale('de');

Expand Down
14 changes: 14 additions & 0 deletions app/src/lib/i18n/__tests__/coverage.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const LOCALES = [
'ru',
'id',
'it',
'ja',
Comment thread
tjm8874 marked this conversation as resolved.
'ko',
'pl',
] as const;
Expand Down Expand Up @@ -54,6 +55,19 @@ describe('i18n coverage', () => {
expect(extra).toEqual([]);
});

it('preserves Japanese interpolation placeholders exactly', () => {
const japanese = loadLocale('ja');
const placeholders = (value: string) => value.match(/\{+[^{}]+\}+/g)?.sort() ?? [];
const mismatches = Object.entries(enFlat)
.filter(
([key, value]) =>
JSON.stringify(placeholders(japanese[key])) !== JSON.stringify(placeholders(value))
)
.map(([key]) => key);

expect(mismatches).toEqual([]);
});

it.each(['en', ...LOCALES])('locale %s contains no em dashes', locale => {
const flat = locale === 'en' ? enFlat : loadLocale(locale);
const keysWithEmDashes = Object.entries(flat)
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/__tests__/mascotDismissPath.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import fr from '../fr';
import hi from '../hi';
import id from '../id';
import itIT from '../it';
import ja from '../ja';
Comment thread
tjm8874 marked this conversation as resolved.
import ko from '../ko';
import pl from '../pl';
import pt from '../pt';
Expand All @@ -25,6 +26,7 @@ const LOCALES: Record<string, Record<string, string>> = {
hi,
id,
it: itIT,
ja,
ko,
pl,
pt,
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3377,6 +3377,8 @@ const messages: TranslationMap = {
'تكاملاتك الحالية (Gmail، Slack، GitHub، إلخ المرتبطة عبر OpenHuman) لن تكون مرئية: فهي موجودة في مستأجر Composio المُدار من OpenHuman.',
'settings.composio.intro':
'يُدمج Composio أكثر من 250 تطبيقًا خارجيًا كأدوات يمكن للوكيل استدعاؤها. اختر كيفية توجيه هذه الاستدعاءات.',
'settings.composio.directOnlyDesc':
'المصادقة المُدارة لـ Composio غير متاحة هنا. أدخل مفتاح API الخاص بك لـ Composio أو تخطَّ هذه الخطوة الآن.',
'settings.composio.modeDirect': 'مباشر (استخدم مفتاح API الخاص بك)',
'settings.composio.modeDirectDesc':
'تذهب الاستدعاءات إلى backend.composio.dev مباشرةً. سيادي / مناسب للعمل دون اتصال. تنفيذ الأدوات يعمل بشكل متزامن؛ مشغّلات الـ webhooks الفورية لم تُوجَّه بعد في الوضع المباشر (مشكلة متابعة).',
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/bn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3435,6 +3435,8 @@ const messages: TranslationMap = {
'OpenHuman-এর মাধ্যমে লিঙ্ক করা আপনার বিদ্যমান ইন্টিগ্রেশনগুলি (Gmail, Slack, GitHub ইত্যাদি) দৃশ্যমান হবে না: সেগুলি OpenHuman-পরিচালিত Composio টেন্যান্টে থাকে।',
'settings.composio.intro':
'Composio ২৫০+ বহিরাগত অ্যাপকে টুল হিসেবে ইন্টিগ্রেট করে যা আপনার এজেন্ট কল করতে পারে। এই টুল কলগুলি কীভাবে রুট হবে তা নির্বাচন করুন।',
'settings.composio.directOnlyDesc':
'এখানে Composio-এর পরিচালিত প্রমাণীকরণ উপলভ্য নয়। আপনার নিজের Composio API কী লিখুন অথবা আপাতত এই ধাপটি এড়িয়ে যান।',
'settings.composio.modeDirect': 'ডাইরেক্ট (নিজের API কী আনুন)',
'settings.composio.modeDirectDesc':
'কলগুলি সরাসরি backend.composio.dev-এ যায়। সার্বভৌম / অফলাইন-বান্ধব। টুল এক্সিকিউশন সিঙ্ক্রোনাসভাবে কাজ করে; রিয়েল-টাইম ট্রিগার webhooks এখনও direct মোডে রুট করা হয় না (ফলো-আপ ইস্যু)।',
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3526,6 +3526,8 @@ const messages: TranslationMap = {
'Deine vorhandenen Integrationen (Gmail, Slack, GitHub usw., die über OpenHuman verknüpft sind) sind nicht sichtbar – sie befinden sich im von OpenHuman verwalteten Composio-Mandanten.',
'settings.composio.intro':
'Composio integriert mehr als 250 externe Apps als Tools, die dein Agent aufrufen kann. Wähle aus, wie diese Werkzeugaufrufe weitergeleitet werden.',
'settings.composio.directOnlyDesc':
'Die verwaltete Composio-Authentifizierung ist hier nicht verfügbar. Gib deinen eigenen Composio-API-Schlüssel ein oder überspringe diesen Schritt vorerst.',
'settings.composio.modeDirect': 'Direkt (bring deinen eigenen API-Schlüssel mit)',
'settings.composio.modeDirectDesc':
'Anrufe gehen direkt an backend.composio.dev. Souverän / offlinefreundlich. Die Werkzeugausführung erfolgt synchron; Echtzeit-Trigger-Webhooks werden noch nicht im Direktmodus weitergeleitet (Folgeproblem).',
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4018,6 +4018,8 @@ const en: TranslationMap = {
"Your existing integrations (Gmail, Slack, GitHub, etc. linked through OpenHuman) won't be visible: they live in the OpenHuman-managed Composio tenant.",
'settings.composio.intro':
'Composio integrates 250+ external apps as tools your agent can call. Choose how those tool calls are routed.',
'settings.composio.directOnlyDesc':
Comment thread
senamakel marked this conversation as resolved.
'Managed Composio auth is unavailable here. Enter your own Composio API key or skip this for now.',
'settings.composio.modeDirect': 'Direct (bring your own API key)',
'settings.composio.modeDirectDesc':
'Calls go to backend.composio.dev directly. Sovereign / offline-friendly. Tool execution works synchronously; real-time trigger webhooks are not yet routed in direct mode (follow-up issue).',
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3489,6 +3489,8 @@ const messages: TranslationMap = {
'Tus integraciones existentes (Gmail, Slack, GitHub, etc. vinculadas a través de OpenHuman) no serán visibles: viven en el inquilino de Composio gestionado por OpenHuman.',
'settings.composio.intro':
'Composio integra más de 250 aplicaciones externas como herramientas que tu agente puede invocar. Elige cómo se enrutan esas llamadas.',
'settings.composio.directOnlyDesc':
'La autenticación administrada de Composio no está disponible aquí. Introduce tu propia clave API de Composio u omite este paso por ahora.',
'settings.composio.modeDirect': 'Directo (usa tu propia clave API)',
'settings.composio.modeDirectDesc':
'Las llamadas van directamente a backend.composio.dev. Soberano / amigable con uso sin conexión. La ejecución de herramientas funciona de forma síncrona; los webhooks de triggers en tiempo real aún no están enrutados en modo directo (incidencia pendiente).',
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3505,6 +3505,8 @@ const messages: TranslationMap = {
'Vos intégrations existantes (Gmail, Slack, GitHub, etc. liées via OpenHuman) ne seront pas visibles: elles vivent dans le tenant Composio géré par OpenHuman.',
'settings.composio.intro':
"Composio intègre plus de 250 applications externes en tant qu'outils que votre agent peut appeler. Choisissez comment ces appels d'outils sont routés.",
'settings.composio.directOnlyDesc':
'L’authentification gérée de Composio n’est pas disponible ici. Saisis ta propre clé API Composio ou passe cette étape pour le moment.',
'settings.composio.modeDirect': 'Direct (apporte ta propre clé API)',
'settings.composio.modeDirectDesc':
"Les appels vont directement à backend.composio.dev. Souverain / compatible hors ligne. L'exécution des outils fonctionne de manière synchrone ; les webhooks de déclencheurs en temps réel ne sont pas encore routés en mode direct (problème de suivi).",
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/hi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3436,6 +3436,8 @@ const messages: TranslationMap = {
'आपके मौजूदा एकीकरण (Gmail, Slack, GitHub, आदि OpenHuman के माध्यम से लिंक किए गए) दिखाई नहीं देंगे: वे OpenHuman-प्रबंधित Composio टेनेंट में रहते हैं।',
'settings.composio.intro':
'Composio 250+ बाहरी ऐप्स को टूल्स के रूप में एकीकृत करता है जिन्हें आपका एजेंट कॉल कर सकता है। चुनें कि वे टूल कॉल कैसे रूट किए जाएँ।',
'settings.composio.directOnlyDesc':
'यहाँ Composio का प्रबंधित प्रमाणीकरण उपलब्ध नहीं है। अपनी Composio API कुंजी दर्ज करें या अभी यह चरण छोड़ दें।',
'settings.composio.modeDirect': 'डायरेक्ट (अपनी API key लाएं)',
'settings.composio.modeDirectDesc':
'कॉल सीधे backend.composio.dev पर जाती हैं। संप्रभु / ऑफ़लाइन-अनुकूल। टूल निष्पादन सिंक्रोनस रूप से कार्य करता है; रीयल-टाइम ट्रिगर वेबहुक्स अभी डायरेक्ट मोड में रूट नहीं हैं (फॉलो-अप मुद्दा)।',
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/id.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3459,6 +3459,8 @@ const messages: TranslationMap = {
'Integrasi Anda yang sudah ada (Gmail, Slack, GitHub, dll. yang terhubung melalui OpenHuman) tidak akan terlihat: mereka berada di tenant Composio yang dikelola OpenHuman.',
'settings.composio.intro':
'Composio mengintegrasikan 250+ aplikasi eksternal sebagai tool yang dapat dipanggil agen Anda. Pilih cara pemanggilan tool tersebut dirutekan.',
'settings.composio.directOnlyDesc':
'Autentikasi Composio terkelola tidak tersedia di sini. Masukkan kunci API Composio Anda sendiri atau lewati langkah ini untuk sementara.',
'settings.composio.modeDirect': 'Langsung (bawa API key Anda sendiri)',
'settings.composio.modeDirectDesc':
'Panggilan langsung ke backend.composio.dev. Berdaulat / ramah offline. Eksekusi tool berjalan sinkron; webhook trigger real-time belum dirutekan dalam mode direct (isu lanjutan).',
Expand Down
2 changes: 2 additions & 0 deletions app/src/lib/i18n/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3486,6 +3486,8 @@ const messages: TranslationMap = {
'Le tue integrazioni esistenti (Gmail, Slack, GitHub, ecc. collegate tramite OpenHuman) non saranno visibili: risiedono nel tenant Composio gestito da OpenHuman.',
'settings.composio.intro':
'Composio integra oltre 250 app esterne come strumenti che il tuo agente può chiamare. Scegli come instradare queste chiamate.',
'settings.composio.directOnlyDesc':
'L’autenticazione gestita di Composio non è disponibile qui. Inserisci la tua chiave API Composio o salta questo passaggio per ora.',
'settings.composio.modeDirect': 'Diretta (usa la tua chiave API)',
'settings.composio.modeDirectDesc':
"Le chiamate vanno direttamente a backend.composio.dev. Sovrana / offline-friendly. L'esecuzione degli strumenti funziona in modo sincrono; i webhook dei trigger in tempo reale non sono ancora instradati in modalità diretta (issue di follow-up).",
Expand Down
Loading
Loading