diff --git a/locales/ar/subscription.json b/locales/ar/subscription.json index ea4389c412..befdc96781 100644 --- a/locales/ar/subscription.json +++ b/locales/ar/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "عرض جميع الخطط", "comparePlans": "عرض الخطط", "createSubscriptionError": "فشل في إنشاء الاشتراك", - "currentPlan.cancelAlert": "سيتم إلغاء الاشتراك بعد {{canceledAt}}. لا يزال بإمكانك استعادته من \"إدارة الاشتراك\" قبل ذلك", - "currentPlan.downgradeAlert": "سيتم تخفيض الخطة إلى {{plan}} بعد {{downgradedAt}}.", - "currentPlan.management": "إدارة الاشتراك", - "currentPlan.notIncluded": "غير مشمول في الخطة الحالية", - "currentPlan.paymentExpired": "سينتهي هذا الاشتراك في {{expiredAt}}، يرجى التخطيط لاستخدامك وفقًا لذلك", - "currentPlan.seeAllFeaturesAndComparePlans": "عرض جميع الميزات ومقارنة الخطط", - "currentPlan.title": "الخطة الحالية", - "discount.add": "إضافة", - "discount.maxOff": "خصم يصل إلى {{percent}}٪", - "discount.off": "{{percent}}٪ خصم", - "discount.save": "توفير", - "downgradePlans.alert": "ستستمر في الاستفادة من المزايا حتى انتهاء الخطة الحالية ({{date}}). ستصبح الخطة الجديدة سارية بعد انتهاء الخطة الحالية.", - "downgradePlans.desc": "سيتم تطبيق تغيير الخطة بعد انتهاء الخطة الحالية.", - "downgradePlans.success": "تم إلغاء الاشتراك بنجاح", - "downgradePlans.title": "التحويل إلى {{plan}}", "credits.packages.expired": "منتهية", "credits.packages.expiresIn": "تنتهي خلال {{days}} يومًا", "credits.packages.expiresToday": "تنتهي اليوم", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "الترقية إلى", "credits.topUp.upgradeSuffix": "لتوفير ${{savings}}", "credits.topUp.validityInfo": "صالح لمدة {{months}} أشهر", + "currentPlan.cancelAlert": "سيتم إلغاء الاشتراك بعد {{canceledAt}}. لا يزال بإمكانك استعادته من \"إدارة الاشتراك\" قبل ذلك", + "currentPlan.downgradeAlert": "سيتم تخفيض الخطة إلى {{plan}} بعد {{downgradedAt}}.", + "currentPlan.management": "إدارة الاشتراك", + "currentPlan.notIncluded": "غير مشمول في الخطة الحالية", + "currentPlan.paymentExpired": "سينتهي هذا الاشتراك في {{expiredAt}}، يرجى التخطيط لاستخدامك وفقًا لذلك", + "currentPlan.seeAllFeaturesAndComparePlans": "عرض جميع الميزات ومقارنة الخطط", + "currentPlan.title": "الخطة الحالية", + "discount.add": "إضافة", + "discount.maxOff": "خصم يصل إلى {{percent}}٪", + "discount.off": "{{percent}}٪ خصم", + "discount.save": "توفير", + "downgradePlans.alert": "ستستمر في الاستفادة من المزايا حتى انتهاء الخطة الحالية ({{date}}). ستصبح الخطة الجديدة سارية بعد انتهاء الخطة الحالية.", + "downgradePlans.desc": "سيتم تطبيق تغيير الخطة بعد انتهاء الخطة الحالية.", + "downgradePlans.success": "تم إلغاء الاشتراك بنجاح", + "downgradePlans.title": "التحويل إلى {{plan}}", "header.desc": "إدارة الاستخدام والاشتراك", "header.title": "الفوترة", "keyMissMatch.button": "استعادة الاستخدام ومتابعة المحادثة", diff --git a/locales/bg-BG/subscription.json b/locales/bg-BG/subscription.json index 6566ffbea4..4f96e817f5 100644 --- a/locales/bg-BG/subscription.json +++ b/locales/bg-BG/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Преглед на всички планове", "comparePlans": "Преглед на плановете", "createSubscriptionError": "Неуспешно създаване на абонамент", - "currentPlan.cancelAlert": "Абонаментът ще бъде анулиран след {{canceledAt}}. Можете да го възстановите в \"Управление на абонамента\" преди това", - "currentPlan.downgradeAlert": "Ще бъде понижен до {{plan}} след {{downgradedAt}}.", - "currentPlan.management": "Управление на абонамента", - "currentPlan.notIncluded": "Не е включено в текущия план", - "currentPlan.paymentExpired": "Този абонамент ще изтече на {{expiredAt}}, моля планирайте използването си съответно", - "currentPlan.seeAllFeaturesAndComparePlans": "Виж всички функции и сравни плановете", - "currentPlan.title": "Текущ план", - "discount.add": "Добави", - "discount.maxOff": "До {{percent}}% отстъпка", - "discount.off": "{{percent}}% отстъпка", - "discount.save": "Спести", - "downgradePlans.alert": "Ще продължите да се възползвате от предимствата до изтичането на текущия план ({{date}}). Новият план ще влезе в сила след това.", - "downgradePlans.desc": "Промяната на плана ще влезе в сила след изтичането на текущия план.", - "downgradePlans.success": "Абонаментът е успешно анулиран", - "downgradePlans.title": "Превключване към {{plan}}", "credits.packages.expired": "Изтекъл", "credits.packages.expiresIn": "Изтича след {{days}} дни", "credits.packages.expiresToday": "Изтича днес", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Надстрой до", "credits.topUp.upgradeSuffix": "за да спестиш ${{savings}}", "credits.topUp.validityInfo": "Валидност: {{months}} месеца", + "currentPlan.cancelAlert": "Абонаментът ще бъде анулиран след {{canceledAt}}. Можете да го възстановите в \"Управление на абонамента\" преди това", + "currentPlan.downgradeAlert": "Ще бъде понижен до {{plan}} след {{downgradedAt}}.", + "currentPlan.management": "Управление на абонамента", + "currentPlan.notIncluded": "Не е включено в текущия план", + "currentPlan.paymentExpired": "Този абонамент ще изтече на {{expiredAt}}, моля планирайте използването си съответно", + "currentPlan.seeAllFeaturesAndComparePlans": "Виж всички функции и сравни плановете", + "currentPlan.title": "Текущ план", + "discount.add": "Добави", + "discount.maxOff": "До {{percent}}% отстъпка", + "discount.off": "{{percent}}% отстъпка", + "discount.save": "Спести", + "downgradePlans.alert": "Ще продължите да се възползвате от предимствата до изтичането на текущия план ({{date}}). Новият план ще влезе в сила след това.", + "downgradePlans.desc": "Промяната на плана ще влезе в сила след изтичането на текущия план.", + "downgradePlans.success": "Абонаментът е успешно анулиран", + "downgradePlans.title": "Превключване към {{plan}}", "header.desc": "Управление на използването и абонаментите", "header.title": "Фактуриране", "keyMissMatch.button": "Възстанови използването и продължи разговора", diff --git a/locales/de-DE/subscription.json b/locales/de-DE/subscription.json index 4e29d819d5..2831a3ea26 100644 --- a/locales/de-DE/subscription.json +++ b/locales/de-DE/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Alle Pläne anzeigen", "comparePlans": "Pläne anzeigen", "createSubscriptionError": "Abonnement konnte nicht erstellt werden", - "currentPlan.cancelAlert": "Das Abonnement wird nach dem {{canceledAt}} gekündigt. Du kannst es bis dahin unter „Abonnement verwalten“ wiederherstellen.", - "currentPlan.downgradeAlert": "Wird nach dem {{downgradedAt}} auf {{plan}} herabgestuft.", - "currentPlan.management": "Abonnement verwalten", - "currentPlan.notIncluded": "Nicht im aktuellen Plan enthalten", - "currentPlan.paymentExpired": "Dieses Abonnement läuft am {{expiredAt}} ab. Bitte plane deine Nutzung entsprechend.", - "currentPlan.seeAllFeaturesAndComparePlans": "Alle Funktionen anzeigen und Pläne vergleichen", - "currentPlan.title": "Aktueller Plan", - "discount.add": "Hinzufügen", - "discount.maxOff": "Bis zu {{percent}}% Rabatt", - "discount.off": "{{percent}}% Rabatt", - "discount.save": "Sparen", - "downgradePlans.alert": "Du kannst die Vorteile bis zum Ablauf des aktuellen Plans ({{date}}) weiterhin nutzen. Der neue Plan tritt danach in Kraft.", - "downgradePlans.desc": "Die Planänderung tritt nach Ablauf des aktuellen Plans in Kraft.", - "downgradePlans.success": "Abonnement erfolgreich gekündigt", - "downgradePlans.title": "Wechsel zu {{plan}}", "credits.packages.expired": "Abgelaufen", "credits.packages.expiresIn": "Läuft in {{days}} Tagen ab", "credits.packages.expiresToday": "Läuft heute ab", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Upgrade auf", "credits.topUp.upgradeSuffix": "und spare ${{savings}}", "credits.topUp.validityInfo": "{{months}} Monate gültig", + "currentPlan.cancelAlert": "Das Abonnement wird nach dem {{canceledAt}} gekündigt. Du kannst es bis dahin unter „Abonnement verwalten“ wiederherstellen.", + "currentPlan.downgradeAlert": "Wird nach dem {{downgradedAt}} auf {{plan}} herabgestuft.", + "currentPlan.management": "Abonnement verwalten", + "currentPlan.notIncluded": "Nicht im aktuellen Plan enthalten", + "currentPlan.paymentExpired": "Dieses Abonnement läuft am {{expiredAt}} ab. Bitte plane deine Nutzung entsprechend.", + "currentPlan.seeAllFeaturesAndComparePlans": "Alle Funktionen anzeigen und Pläne vergleichen", + "currentPlan.title": "Aktueller Plan", + "discount.add": "Hinzufügen", + "discount.maxOff": "Bis zu {{percent}}% Rabatt", + "discount.off": "{{percent}}% Rabatt", + "discount.save": "Sparen", + "downgradePlans.alert": "Du kannst die Vorteile bis zum Ablauf des aktuellen Plans ({{date}}) weiterhin nutzen. Der neue Plan tritt danach in Kraft.", + "downgradePlans.desc": "Die Planänderung tritt nach Ablauf des aktuellen Plans in Kraft.", + "downgradePlans.success": "Abonnement erfolgreich gekündigt", + "downgradePlans.title": "Wechsel zu {{plan}}", "header.desc": "Nutzung und Abonnement verwalten", "header.title": "Abrechnung", "keyMissMatch.button": "Nutzung wiederherstellen und Gespräch fortsetzen", diff --git a/locales/en-US/subscription.json b/locales/en-US/subscription.json index 996323e0fb..025b5499b3 100644 --- a/locales/en-US/subscription.json +++ b/locales/en-US/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "View All Plans", "comparePlans": "View Plans", "createSubscriptionError": "Failed to create subscription", - "currentPlan.cancelAlert": "Subscription will be cancelled after {{canceledAt}}. You can still restore it in \"Manage Subscription\" before then", - "currentPlan.downgradeAlert": "Will be downgraded to {{plan}} after {{downgradedAt}}.", - "currentPlan.management": "Manage Subscription", - "currentPlan.notIncluded": "Not included in current plan", - "currentPlan.paymentExpired": "This subscription will expire on {{expiredAt}}, please plan your usage accordingly", - "currentPlan.seeAllFeaturesAndComparePlans": "See all features and compare plans", - "currentPlan.title": "Current Plan", - "discount.add": "Add", - "discount.maxOff": "Up to {{percent}}% off", - "discount.off": "{{percent}}% off", - "discount.save": "Save", - "downgradePlans.alert": "You will still enjoy the benefits until the current plan expires ({{date}}). The new plan will take effect after the current plan expires.", - "downgradePlans.desc": "The plan change will take effect after the current plan expires.", - "downgradePlans.success": "Subscription cancelled successfully", - "downgradePlans.title": "Switch to {{plan}}", "credits.packages.expired": "Expired", "credits.packages.expiresIn": "Expires in {{days}} days", "credits.packages.expiresToday": "Expires today", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Upgrade to", "credits.topUp.upgradeSuffix": "to save ${{savings}}", "credits.topUp.validityInfo": "{{months}} months validity", + "currentPlan.cancelAlert": "Subscription will be cancelled after {{canceledAt}}. You can still restore it in \"Manage Subscription\" before then", + "currentPlan.downgradeAlert": "Will be downgraded to {{plan}} after {{downgradedAt}}.", + "currentPlan.management": "Manage Subscription", + "currentPlan.notIncluded": "Not included in current plan", + "currentPlan.paymentExpired": "This subscription will expire on {{expiredAt}}, please plan your usage accordingly", + "currentPlan.seeAllFeaturesAndComparePlans": "See all features and compare plans", + "currentPlan.title": "Current Plan", + "discount.add": "Add", + "discount.maxOff": "Up to {{percent}}% off", + "discount.off": "{{percent}}% off", + "discount.save": "Save", + "downgradePlans.alert": "You will still enjoy the benefits until the current plan expires ({{date}}). The new plan will take effect after the current plan expires.", + "downgradePlans.desc": "The plan change will take effect after the current plan expires.", + "downgradePlans.success": "Subscription cancelled successfully", + "downgradePlans.title": "Switch to {{plan}}", "header.desc": "Usage and subscription management", "header.title": "Billing", "keyMissMatch.button": "Restore usage and continue conversation", diff --git a/locales/es-ES/subscription.json b/locales/es-ES/subscription.json index c1c9f288a0..487ecf9b6f 100644 --- a/locales/es-ES/subscription.json +++ b/locales/es-ES/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Ver Todos los Planes", "comparePlans": "Ver Planes", "createSubscriptionError": "Error al crear la suscripción", - "currentPlan.cancelAlert": "La suscripción se cancelará después del {{canceledAt}}. Aún puedes restaurarla en \"Gestionar Suscripción\" antes de esa fecha", - "currentPlan.downgradeAlert": "Se degradará a {{plan}} después del {{downgradedAt}}.", - "currentPlan.management": "Gestionar Suscripción", - "currentPlan.notIncluded": "No incluido en el plan actual", - "currentPlan.paymentExpired": "Esta suscripción expirará el {{expiredAt}}, por favor planifica tu uso en consecuencia", - "currentPlan.seeAllFeaturesAndComparePlans": "Ver todas las funciones y comparar planes", - "currentPlan.title": "Plan Actual", - "discount.add": "Agregar", - "discount.maxOff": "Hasta {{percent}}% de descuento", - "discount.off": "{{percent}}% de descuento", - "discount.save": "Ahorrar", - "downgradePlans.alert": "Seguirás disfrutando de los beneficios hasta que el plan actual expire ({{date}}). El nuevo plan entrará en vigor después de la expiración.", - "downgradePlans.desc": "El cambio de plan se aplicará después de que expire el plan actual.", - "downgradePlans.success": "Suscripción cancelada con éxito", - "downgradePlans.title": "Cambiar a {{plan}}", "credits.packages.expired": "Expirado", "credits.packages.expiresIn": "Expira en {{days}} días", "credits.packages.expiresToday": "Expira hoy", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Mejorar a", "credits.topUp.upgradeSuffix": "para ahorrar ${{savings}}", "credits.topUp.validityInfo": "Validez de {{months}} meses", + "currentPlan.cancelAlert": "La suscripción se cancelará después del {{canceledAt}}. Aún puedes restaurarla en \"Gestionar Suscripción\" antes de esa fecha", + "currentPlan.downgradeAlert": "Se degradará a {{plan}} después del {{downgradedAt}}.", + "currentPlan.management": "Gestionar Suscripción", + "currentPlan.notIncluded": "No incluido en el plan actual", + "currentPlan.paymentExpired": "Esta suscripción expirará el {{expiredAt}}, por favor planifica tu uso en consecuencia", + "currentPlan.seeAllFeaturesAndComparePlans": "Ver todas las funciones y comparar planes", + "currentPlan.title": "Plan Actual", + "discount.add": "Agregar", + "discount.maxOff": "Hasta {{percent}}% de descuento", + "discount.off": "{{percent}}% de descuento", + "discount.save": "Ahorrar", + "downgradePlans.alert": "Seguirás disfrutando de los beneficios hasta que el plan actual expire ({{date}}). El nuevo plan entrará en vigor después de la expiración.", + "downgradePlans.desc": "El cambio de plan se aplicará después de que expire el plan actual.", + "downgradePlans.success": "Suscripción cancelada con éxito", + "downgradePlans.title": "Cambiar a {{plan}}", "header.desc": "Gestión de uso y suscripción", "header.title": "Facturación", "keyMissMatch.button": "Restaurar uso y continuar conversación", diff --git a/locales/fa-IR/subscription.json b/locales/fa-IR/subscription.json index e8eae11592..19a00afaa4 100644 --- a/locales/fa-IR/subscription.json +++ b/locales/fa-IR/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "مشاهده همه پلن‌ها", "comparePlans": "مشاهده پلن‌ها", "createSubscriptionError": "ایجاد اشتراک ناموفق بود", - "currentPlan.cancelAlert": "اشتراک در تاریخ {{canceledAt}} لغو خواهد شد. تا آن زمان می‌توانید از طریق «مدیریت اشتراک» آن را بازیابی کنید", - "currentPlan.downgradeAlert": "در تاریخ {{downgradedAt}} به پلن {{plan}} تنزل خواهد یافت.", - "currentPlan.management": "مدیریت اشتراک", - "currentPlan.notIncluded": "در پلن فعلی گنجانده نشده است", - "currentPlan.paymentExpired": "این اشتراک در تاریخ {{expiredAt}} منقضی می‌شود، لطفاً مصرف خود را برنامه‌ریزی کنید", - "currentPlan.seeAllFeaturesAndComparePlans": "مشاهده همه ویژگی‌ها و مقایسه پلن‌ها", - "currentPlan.title": "پلن فعلی", - "discount.add": "افزودن", - "discount.maxOff": "تا {{percent}}٪ تخفیف", - "discount.off": "{{percent}}٪ تخفیف", - "discount.save": "صرفه‌جویی", - "downgradePlans.alert": "تا پایان دوره فعلی ({{date}}) همچنان از مزایای اشتراک بهره‌مند خواهید بود. پلن جدید پس از پایان دوره فعلی فعال می‌شود.", - "downgradePlans.desc": "تغییر پلن پس از پایان پلن فعلی اعمال خواهد شد.", - "downgradePlans.success": "اشتراک با موفقیت لغو شد", - "downgradePlans.title": "تغییر به {{plan}}", "credits.packages.expired": "منقضی شده", "credits.packages.expiresIn": "منقضی در {{days}} روز", "credits.packages.expiresToday": "امروز منقضی می‌شود", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "ارتقا به", "credits.topUp.upgradeSuffix": "برای صرفه‌جویی ${{savings}}", "credits.topUp.validityInfo": "اعتبار {{months}} ماهه", + "currentPlan.cancelAlert": "اشتراک در تاریخ {{canceledAt}} لغو خواهد شد. تا آن زمان می‌توانید از طریق «مدیریت اشتراک» آن را بازیابی کنید", + "currentPlan.downgradeAlert": "در تاریخ {{downgradedAt}} به پلن {{plan}} تنزل خواهد یافت.", + "currentPlan.management": "مدیریت اشتراک", + "currentPlan.notIncluded": "در پلن فعلی گنجانده نشده است", + "currentPlan.paymentExpired": "این اشتراک در تاریخ {{expiredAt}} منقضی می‌شود، لطفاً مصرف خود را برنامه‌ریزی کنید", + "currentPlan.seeAllFeaturesAndComparePlans": "مشاهده همه ویژگی‌ها و مقایسه پلن‌ها", + "currentPlan.title": "پلن فعلی", + "discount.add": "افزودن", + "discount.maxOff": "تا {{percent}}٪ تخفیف", + "discount.off": "{{percent}}٪ تخفیف", + "discount.save": "صرفه‌جویی", + "downgradePlans.alert": "تا پایان دوره فعلی ({{date}}) همچنان از مزایای اشتراک بهره‌مند خواهید بود. پلن جدید پس از پایان دوره فعلی فعال می‌شود.", + "downgradePlans.desc": "تغییر پلن پس از پایان پلن فعلی اعمال خواهد شد.", + "downgradePlans.success": "اشتراک با موفقیت لغو شد", + "downgradePlans.title": "تغییر به {{plan}}", "header.desc": "مدیریت مصرف و اشتراک", "header.title": "صورتحساب", "keyMissMatch.button": "بازیابی مصرف و ادامه گفتگو", diff --git a/locales/fr-FR/subscription.json b/locales/fr-FR/subscription.json index 5af3387c70..b20d473de2 100644 --- a/locales/fr-FR/subscription.json +++ b/locales/fr-FR/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Voir tous les forfaits", "comparePlans": "Voir les forfaits", "createSubscriptionError": "Échec de la création de l'abonnement", - "currentPlan.cancelAlert": "L'abonnement sera annulé après le {{canceledAt}}. Vous pouvez encore le réactiver dans « Gérer l'abonnement » d'ici là", - "currentPlan.downgradeAlert": "Sera rétrogradé au forfait {{plan}} après le {{downgradedAt}}.", - "currentPlan.management": "Gérer l'abonnement", - "currentPlan.notIncluded": "Non inclus dans le forfait actuel", - "currentPlan.paymentExpired": "Cet abonnement expirera le {{expiredAt}}, veuillez planifier votre utilisation en conséquence", - "currentPlan.seeAllFeaturesAndComparePlans": "Voir toutes les fonctionnalités et comparer les forfaits", - "currentPlan.title": "Forfait actuel", - "discount.add": "Ajouter", - "discount.maxOff": "Jusqu'à {{percent}}% de réduction", - "discount.off": "{{percent}}% de réduction", - "discount.save": "Économiser", - "downgradePlans.alert": "Vous bénéficierez toujours des avantages jusqu'à l'expiration de l'abonnement actuel ({{date}}). Le nouveau forfait prendra effet après l'expiration.", - "downgradePlans.desc": "Le changement de forfait prendra effet après l'expiration de l'abonnement actuel.", - "downgradePlans.success": "Abonnement annulé avec succès", - "downgradePlans.title": "Passer à {{plan}}", "credits.packages.expired": "Expiré", "credits.packages.expiresIn": "Expire dans {{days}} jours", "credits.packages.expiresToday": "Expire aujourd'hui", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Passer à", "credits.topUp.upgradeSuffix": "pour économiser ${{savings}}", "credits.topUp.validityInfo": "Validité de {{months}} mois", + "currentPlan.cancelAlert": "L'abonnement sera annulé après le {{canceledAt}}. Vous pouvez encore le réactiver dans « Gérer l'abonnement » d'ici là", + "currentPlan.downgradeAlert": "Sera rétrogradé au forfait {{plan}} après le {{downgradedAt}}.", + "currentPlan.management": "Gérer l'abonnement", + "currentPlan.notIncluded": "Non inclus dans le forfait actuel", + "currentPlan.paymentExpired": "Cet abonnement expirera le {{expiredAt}}, veuillez planifier votre utilisation en conséquence", + "currentPlan.seeAllFeaturesAndComparePlans": "Voir toutes les fonctionnalités et comparer les forfaits", + "currentPlan.title": "Forfait actuel", + "discount.add": "Ajouter", + "discount.maxOff": "Jusqu'à {{percent}}% de réduction", + "discount.off": "{{percent}}% de réduction", + "discount.save": "Économiser", + "downgradePlans.alert": "Vous bénéficierez toujours des avantages jusqu'à l'expiration de l'abonnement actuel ({{date}}). Le nouveau forfait prendra effet après l'expiration.", + "downgradePlans.desc": "Le changement de forfait prendra effet après l'expiration de l'abonnement actuel.", + "downgradePlans.success": "Abonnement annulé avec succès", + "downgradePlans.title": "Passer à {{plan}}", "header.desc": "Gestion de l'utilisation et des abonnements", "header.title": "Facturation", "keyMissMatch.button": "Restaurer l'utilisation et continuer la conversation", diff --git a/locales/it-IT/subscription.json b/locales/it-IT/subscription.json index 1021d0f61b..57b050eb0d 100644 --- a/locales/it-IT/subscription.json +++ b/locales/it-IT/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Visualizza Tutti i Piani", "comparePlans": "Visualizza Piani", "createSubscriptionError": "Creazione dell'abbonamento non riuscita", - "currentPlan.cancelAlert": "L'abbonamento verrà annullato dopo il {{canceledAt}}. Puoi ancora ripristinarlo in \"Gestisci Abbonamento\" prima di tale data", - "currentPlan.downgradeAlert": "Verrà effettuato il downgrade a {{plan}} dopo il {{downgradedAt}}.", - "currentPlan.management": "Gestisci Abbonamento", - "currentPlan.notIncluded": "Non incluso nel piano attuale", - "currentPlan.paymentExpired": "Questo abbonamento scadrà il {{expiredAt}}, pianifica l'utilizzo di conseguenza", - "currentPlan.seeAllFeaturesAndComparePlans": "Visualizza tutte le funzionalità e confronta i piani", - "currentPlan.title": "Piano Attuale", - "discount.add": "Aggiungi", - "discount.maxOff": "Fino al {{percent}}% di sconto", - "discount.off": "{{percent}}% di sconto", - "discount.save": "Risparmia", - "downgradePlans.alert": "Potrai continuare a usufruire dei vantaggi fino alla scadenza dell'attuale piano ({{date}}). Il nuovo piano entrerà in vigore dopo la scadenza.", - "downgradePlans.desc": "Il cambio di piano avrà effetto dopo la scadenza del piano attuale.", - "downgradePlans.success": "Abbonamento annullato con successo", - "downgradePlans.title": "Passa a {{plan}}", "credits.packages.expired": "Scaduto", "credits.packages.expiresIn": "Scade tra {{days}} giorni", "credits.packages.expiresToday": "Scade oggi", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Passa a", "credits.topUp.upgradeSuffix": "per risparmiare ${{savings}}", "credits.topUp.validityInfo": "Validità di {{months}} mesi", + "currentPlan.cancelAlert": "L'abbonamento verrà annullato dopo il {{canceledAt}}. Puoi ancora ripristinarlo in \"Gestisci Abbonamento\" prima di tale data", + "currentPlan.downgradeAlert": "Verrà effettuato il downgrade a {{plan}} dopo il {{downgradedAt}}.", + "currentPlan.management": "Gestisci Abbonamento", + "currentPlan.notIncluded": "Non incluso nel piano attuale", + "currentPlan.paymentExpired": "Questo abbonamento scadrà il {{expiredAt}}, pianifica l'utilizzo di conseguenza", + "currentPlan.seeAllFeaturesAndComparePlans": "Visualizza tutte le funzionalità e confronta i piani", + "currentPlan.title": "Piano Attuale", + "discount.add": "Aggiungi", + "discount.maxOff": "Fino al {{percent}}% di sconto", + "discount.off": "{{percent}}% di sconto", + "discount.save": "Risparmia", + "downgradePlans.alert": "Potrai continuare a usufruire dei vantaggi fino alla scadenza dell'attuale piano ({{date}}). Il nuovo piano entrerà in vigore dopo la scadenza.", + "downgradePlans.desc": "Il cambio di piano avrà effetto dopo la scadenza del piano attuale.", + "downgradePlans.success": "Abbonamento annullato con successo", + "downgradePlans.title": "Passa a {{plan}}", "header.desc": "Gestione utilizzo e abbonamenti", "header.title": "Fatturazione", "keyMissMatch.button": "Ripristina l'utilizzo e continua la conversazione", diff --git a/locales/ja-JP/subscription.json b/locales/ja-JP/subscription.json index a3666179d3..ac3d9f970c 100644 --- a/locales/ja-JP/subscription.json +++ b/locales/ja-JP/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "すべてのプランを見る", "comparePlans": "プランを見る", "createSubscriptionError": "サブスクリプションの作成に失敗しました", - "currentPlan.cancelAlert": "{{canceledAt}} にサブスクリプションがキャンセルされます。それまでは「サブスクリプション管理」で復元可能です", - "currentPlan.downgradeAlert": "{{downgradedAt}} に {{plan}} にダウングレードされます。", - "currentPlan.management": "サブスクリプション管理", - "currentPlan.notIncluded": "現在のプランには含まれていません", - "currentPlan.paymentExpired": "このサブスクリプションは {{expiredAt}} に期限切れとなります。ご利用計画にご注意ください", - "currentPlan.seeAllFeaturesAndComparePlans": "すべての機能を確認し、プランを比較", - "currentPlan.title": "現在のプラン", - "discount.add": "追加", - "discount.maxOff": "最大 {{percent}}% 割引", - "discount.off": "{{percent}}% 割引", - "discount.save": "節約", - "downgradePlans.alert": "現在のプランの有効期限({{date}})までは引き続き特典をご利用いただけます。新しいプランはその後に有効になります。", - "downgradePlans.desc": "プランの変更は現在のプランの有効期限後に反映されます。", - "downgradePlans.success": "サブスクリプションのキャンセルに成功しました", - "downgradePlans.title": "{{plan}} に切り替え", "credits.packages.expired": "期限切れ", "credits.packages.expiresIn": "{{days}}日後に期限切れ", "credits.packages.expiresToday": "本日期限切れ", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "アップグレードして", "credits.topUp.upgradeSuffix": "${{savings}} 節約", "credits.topUp.validityInfo": "{{months}} ヶ月の有効期間", + "currentPlan.cancelAlert": "{{canceledAt}} にサブスクリプションがキャンセルされます。それまでは「サブスクリプション管理」で復元可能です", + "currentPlan.downgradeAlert": "{{downgradedAt}} に {{plan}} にダウングレードされます。", + "currentPlan.management": "サブスクリプション管理", + "currentPlan.notIncluded": "現在のプランには含まれていません", + "currentPlan.paymentExpired": "このサブスクリプションは {{expiredAt}} に期限切れとなります。ご利用計画にご注意ください", + "currentPlan.seeAllFeaturesAndComparePlans": "すべての機能を確認し、プランを比較", + "currentPlan.title": "現在のプラン", + "discount.add": "追加", + "discount.maxOff": "最大 {{percent}}% 割引", + "discount.off": "{{percent}}% 割引", + "discount.save": "節約", + "downgradePlans.alert": "現在のプランの有効期限({{date}})までは引き続き特典をご利用いただけます。新しいプランはその後に有効になります。", + "downgradePlans.desc": "プランの変更は現在のプランの有効期限後に反映されます。", + "downgradePlans.success": "サブスクリプションのキャンセルに成功しました", + "downgradePlans.title": "{{plan}} に切り替え", "header.desc": "使用状況とサブスクリプションの管理", "header.title": "請求", "keyMissMatch.button": "使用を復元して会話を続ける", diff --git a/locales/ko-KR/subscription.json b/locales/ko-KR/subscription.json index 4e274a1611..9b53ffa2bf 100644 --- a/locales/ko-KR/subscription.json +++ b/locales/ko-KR/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "모든 플랜 보기", "comparePlans": "플랜 보기", "createSubscriptionError": "구독 생성에 실패했습니다", - "currentPlan.cancelAlert": "{{canceledAt}} 이후 구독이 취소됩니다. 그 전까지는 \"구독 관리\"에서 복원할 수 있습니다", - "currentPlan.downgradeAlert": "{{downgradedAt}} 이후 {{plan}}으로 다운그레이드됩니다.", - "currentPlan.management": "구독 관리", - "currentPlan.notIncluded": "현재 플랜에 포함되지 않음", - "currentPlan.paymentExpired": "이 구독은 {{expiredAt}}에 만료됩니다. 사용 계획을 세워주세요", - "currentPlan.seeAllFeaturesAndComparePlans": "모든 기능 보기 및 플랜 비교", - "currentPlan.title": "현재 플랜", - "discount.add": "추가", - "discount.maxOff": "최대 {{percent}}% 할인", - "discount.off": "{{percent}}% 할인", - "discount.save": "절약", - "downgradePlans.alert": "현재 플랜이 만료되는 {{date}}까지 혜택을 계속 누릴 수 있습니다. 새 플랜은 만료 후 적용됩니다.", - "downgradePlans.desc": "플랜 변경은 현재 플랜이 만료된 후 적용됩니다.", - "downgradePlans.success": "구독이 성공적으로 취소되었습니다", - "downgradePlans.title": "{{plan}}으로 전환", "credits.packages.expired": "만료됨", "credits.packages.expiresIn": "{{days}}일 후 만료", "credits.packages.expiresToday": "오늘 만료", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "업그레이드하여", "credits.topUp.upgradeSuffix": "${{savings}} 절약하기", "credits.topUp.validityInfo": "{{months}}개월 유효", + "currentPlan.cancelAlert": "{{canceledAt}} 이후 구독이 취소됩니다. 그 전까지는 \"구독 관리\"에서 복원할 수 있습니다", + "currentPlan.downgradeAlert": "{{downgradedAt}} 이후 {{plan}}으로 다운그레이드됩니다.", + "currentPlan.management": "구독 관리", + "currentPlan.notIncluded": "현재 플랜에 포함되지 않음", + "currentPlan.paymentExpired": "이 구독은 {{expiredAt}}에 만료됩니다. 사용 계획을 세워주세요", + "currentPlan.seeAllFeaturesAndComparePlans": "모든 기능 보기 및 플랜 비교", + "currentPlan.title": "현재 플랜", + "discount.add": "추가", + "discount.maxOff": "최대 {{percent}}% 할인", + "discount.off": "{{percent}}% 할인", + "discount.save": "절약", + "downgradePlans.alert": "현재 플랜이 만료되는 {{date}}까지 혜택을 계속 누릴 수 있습니다. 새 플랜은 만료 후 적용됩니다.", + "downgradePlans.desc": "플랜 변경은 현재 플랜이 만료된 후 적용됩니다.", + "downgradePlans.success": "구독이 성공적으로 취소되었습니다", + "downgradePlans.title": "{{plan}}으로 전환", "header.desc": "사용량 및 구독 관리", "header.title": "청구", "keyMissMatch.button": "사용량 복원 및 대화 계속하기", diff --git a/locales/nl-NL/subscription.json b/locales/nl-NL/subscription.json index 60a39b3655..fb790b2e43 100644 --- a/locales/nl-NL/subscription.json +++ b/locales/nl-NL/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Bekijk Alle Abonnementen", "comparePlans": "Bekijk Abonnementen", "createSubscriptionError": "Abonnement aanmaken mislukt", - "currentPlan.cancelAlert": "Abonnement wordt geannuleerd na {{canceledAt}}. Je kunt het tot die tijd herstellen via \"Abonnement Beheren\"", - "currentPlan.downgradeAlert": "Wordt teruggezet naar {{plan}} na {{downgradedAt}}.", - "currentPlan.management": "Abonnement Beheren", - "currentPlan.notIncluded": "Niet inbegrepen in huidig abonnement", - "currentPlan.paymentExpired": "Dit abonnement verloopt op {{expiredAt}}, plan je gebruik dienovereenkomstig", - "currentPlan.seeAllFeaturesAndComparePlans": "Bekijk alle functies en vergelijk abonnementen", - "currentPlan.title": "Huidig Abonnement", - "discount.add": "Toevoegen", - "discount.maxOff": "Tot {{percent}}% korting", - "discount.off": "{{percent}}% korting", - "discount.save": "Bespaar", - "downgradePlans.alert": "Je blijft profiteren van de voordelen tot het huidige abonnement afloopt ({{date}}). Het nieuwe abonnement gaat daarna in.", - "downgradePlans.desc": "De wijziging van het abonnement gaat in na afloop van het huidige abonnement.", - "downgradePlans.success": "Abonnement succesvol geannuleerd", - "downgradePlans.title": "Overschakelen naar {{plan}}", "credits.packages.expired": "Verlopen", "credits.packages.expiresIn": "Verloopt over {{days}} dagen", "credits.packages.expiresToday": "Verloopt vandaag", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Upgrade naar", "credits.topUp.upgradeSuffix": "om ${{savings}} te besparen", "credits.topUp.validityInfo": "Geldig voor {{months}} maanden", + "currentPlan.cancelAlert": "Abonnement wordt geannuleerd na {{canceledAt}}. Je kunt het tot die tijd herstellen via \"Abonnement Beheren\"", + "currentPlan.downgradeAlert": "Wordt teruggezet naar {{plan}} na {{downgradedAt}}.", + "currentPlan.management": "Abonnement Beheren", + "currentPlan.notIncluded": "Niet inbegrepen in huidig abonnement", + "currentPlan.paymentExpired": "Dit abonnement verloopt op {{expiredAt}}, plan je gebruik dienovereenkomstig", + "currentPlan.seeAllFeaturesAndComparePlans": "Bekijk alle functies en vergelijk abonnementen", + "currentPlan.title": "Huidig Abonnement", + "discount.add": "Toevoegen", + "discount.maxOff": "Tot {{percent}}% korting", + "discount.off": "{{percent}}% korting", + "discount.save": "Bespaar", + "downgradePlans.alert": "Je blijft profiteren van de voordelen tot het huidige abonnement afloopt ({{date}}). Het nieuwe abonnement gaat daarna in.", + "downgradePlans.desc": "De wijziging van het abonnement gaat in na afloop van het huidige abonnement.", + "downgradePlans.success": "Abonnement succesvol geannuleerd", + "downgradePlans.title": "Overschakelen naar {{plan}}", "header.desc": "Beheer van gebruik en abonnementen", "header.title": "Facturatie", "keyMissMatch.button": "Herstel gebruik en ga verder met het gesprek", diff --git a/locales/pl-PL/subscription.json b/locales/pl-PL/subscription.json index c8df232ef4..b57b8d4d40 100644 --- a/locales/pl-PL/subscription.json +++ b/locales/pl-PL/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Zobacz wszystkie plany", "comparePlans": "Zobacz plany", "createSubscriptionError": "Nie udało się utworzyć subskrypcji", - "currentPlan.cancelAlert": "Subskrypcja zostanie anulowana po {{canceledAt}}. Do tego czasu możesz ją przywrócić w \"Zarządzaj subskrypcją\"", - "currentPlan.downgradeAlert": "Zostanie obniżony do {{plan}} po {{downgradedAt}}.", - "currentPlan.management": "Zarządzaj subskrypcją", - "currentPlan.notIncluded": "Nie zawarte w obecnym planie", - "currentPlan.paymentExpired": "Subskrypcja wygaśnie {{expiredAt}}, zaplanuj odpowiednio swoje użycie", - "currentPlan.seeAllFeaturesAndComparePlans": "Zobacz wszystkie funkcje i porównaj plany", - "currentPlan.title": "Obecny plan", - "discount.add": "Dodaj", - "discount.maxOff": "Do {{percent}}% zniżki", - "discount.off": "{{percent}}% zniżki", - "discount.save": "Oszczędź", - "downgradePlans.alert": "Będziesz nadal korzystać z korzyści do wygaśnięcia obecnego planu ({{date}}). Nowy plan zacznie obowiązywać po jego wygaśnięciu.", - "downgradePlans.desc": "Zmiana planu zacznie obowiązywać po wygaśnięciu obecnego planu.", - "downgradePlans.success": "Subskrypcja została pomyślnie anulowana", - "downgradePlans.title": "Zmień na {{plan}}", "credits.packages.expired": "Wygasło", "credits.packages.expiresIn": "Wygasa za {{days}} dni", "credits.packages.expiresToday": "Wygasa dzisiaj", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Ulepsz do", "credits.topUp.upgradeSuffix": "aby zaoszczędzić ${{savings}}", "credits.topUp.validityInfo": "Ważność: {{months}} miesięcy", + "currentPlan.cancelAlert": "Subskrypcja zostanie anulowana po {{canceledAt}}. Do tego czasu możesz ją przywrócić w \"Zarządzaj subskrypcją\"", + "currentPlan.downgradeAlert": "Zostanie obniżony do {{plan}} po {{downgradedAt}}.", + "currentPlan.management": "Zarządzaj subskrypcją", + "currentPlan.notIncluded": "Nie zawarte w obecnym planie", + "currentPlan.paymentExpired": "Subskrypcja wygaśnie {{expiredAt}}, zaplanuj odpowiednio swoje użycie", + "currentPlan.seeAllFeaturesAndComparePlans": "Zobacz wszystkie funkcje i porównaj plany", + "currentPlan.title": "Obecny plan", + "discount.add": "Dodaj", + "discount.maxOff": "Do {{percent}}% zniżki", + "discount.off": "{{percent}}% zniżki", + "discount.save": "Oszczędź", + "downgradePlans.alert": "Będziesz nadal korzystać z korzyści do wygaśnięcia obecnego planu ({{date}}). Nowy plan zacznie obowiązywać po jego wygaśnięciu.", + "downgradePlans.desc": "Zmiana planu zacznie obowiązywać po wygaśnięciu obecnego planu.", + "downgradePlans.success": "Subskrypcja została pomyślnie anulowana", + "downgradePlans.title": "Zmień na {{plan}}", "header.desc": "Zarządzanie użyciem i subskrypcją", "header.title": "Rozliczenia", "keyMissMatch.button": "Przywróć użycie i kontynuuj rozmowę", diff --git a/locales/pt-BR/subscription.json b/locales/pt-BR/subscription.json index 46c8d6381d..d23d9a6eda 100644 --- a/locales/pt-BR/subscription.json +++ b/locales/pt-BR/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Ver Todos os Planos", "comparePlans": "Ver Planos", "createSubscriptionError": "Falha ao criar assinatura", - "currentPlan.cancelAlert": "A assinatura será cancelada após {{canceledAt}}. Você ainda pode restaurá-la em \"Gerenciar Assinatura\" antes disso", - "currentPlan.downgradeAlert": "Será rebaixado para {{plan}} após {{downgradedAt}}.", - "currentPlan.management": "Gerenciar Assinatura", - "currentPlan.notIncluded": "Não incluído no plano atual", - "currentPlan.paymentExpired": "Esta assinatura expirará em {{expiredAt}}, planeje seu uso adequadamente", - "currentPlan.seeAllFeaturesAndComparePlans": "Veja todos os recursos e compare os planos", - "currentPlan.title": "Plano Atual", - "discount.add": "Adicionar", - "discount.maxOff": "Até {{percent}}% de desconto", - "discount.off": "{{percent}}% de desconto", - "discount.save": "Economizar", - "downgradePlans.alert": "Você ainda terá acesso aos benefícios até o vencimento do plano atual ({{date}}). O novo plano entrará em vigor após o vencimento.", - "downgradePlans.desc": "A mudança de plano entrará em vigor após o vencimento do plano atual.", - "downgradePlans.success": "Assinatura cancelada com sucesso", - "downgradePlans.title": "Mudar para {{plan}}", "credits.packages.expired": "Expirado", "credits.packages.expiresIn": "Expira em {{days}} dias", "credits.packages.expiresToday": "Expira hoje", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Atualize para", "credits.topUp.upgradeSuffix": "para economizar ${{savings}}", "credits.topUp.validityInfo": "Validade de {{months}} meses", + "currentPlan.cancelAlert": "A assinatura será cancelada após {{canceledAt}}. Você ainda pode restaurá-la em \"Gerenciar Assinatura\" antes disso", + "currentPlan.downgradeAlert": "Será rebaixado para {{plan}} após {{downgradedAt}}.", + "currentPlan.management": "Gerenciar Assinatura", + "currentPlan.notIncluded": "Não incluído no plano atual", + "currentPlan.paymentExpired": "Esta assinatura expirará em {{expiredAt}}, planeje seu uso adequadamente", + "currentPlan.seeAllFeaturesAndComparePlans": "Veja todos os recursos e compare os planos", + "currentPlan.title": "Plano Atual", + "discount.add": "Adicionar", + "discount.maxOff": "Até {{percent}}% de desconto", + "discount.off": "{{percent}}% de desconto", + "discount.save": "Economizar", + "downgradePlans.alert": "Você ainda terá acesso aos benefícios até o vencimento do plano atual ({{date}}). O novo plano entrará em vigor após o vencimento.", + "downgradePlans.desc": "A mudança de plano entrará em vigor após o vencimento do plano atual.", + "downgradePlans.success": "Assinatura cancelada com sucesso", + "downgradePlans.title": "Mudar para {{plan}}", "header.desc": "Gerenciamento de uso e assinatura", "header.title": "Cobrança", "keyMissMatch.button": "Restaurar uso e continuar conversa", diff --git a/locales/ru-RU/subscription.json b/locales/ru-RU/subscription.json index 234e72a01c..6f44bf934e 100644 --- a/locales/ru-RU/subscription.json +++ b/locales/ru-RU/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Просмотреть все планы", "comparePlans": "Сравнить планы", "createSubscriptionError": "Не удалось создать подписку", - "currentPlan.cancelAlert": "Подписка будет отменена после {{canceledAt}}. До этого момента вы можете восстановить её в разделе «Управление подпиской»", - "currentPlan.downgradeAlert": "Будет понижен до {{plan}} после {{downgradedAt}}.", - "currentPlan.management": "Управление подпиской", - "currentPlan.notIncluded": "Не включено в текущий план", - "currentPlan.paymentExpired": "Подписка истекает {{expiredAt}}, пожалуйста, спланируйте использование заранее", - "currentPlan.seeAllFeaturesAndComparePlans": "Посмотреть все функции и сравнить планы", - "currentPlan.title": "Текущий план", - "discount.add": "Добавить", - "discount.maxOff": "Скидка до {{percent}}%", - "discount.off": "{{percent}}% скидка", - "discount.save": "Сэкономить", - "downgradePlans.alert": "Вы продолжите пользоваться преимуществами до окончания текущего плана ({{date}}). Новый план вступит в силу после окончания текущего.", - "downgradePlans.desc": "Изменение плана вступит в силу после окончания текущего.", - "downgradePlans.success": "Подписка успешно отменена", - "downgradePlans.title": "Переключиться на {{plan}}", "credits.packages.expired": "Истёк", "credits.packages.expiresIn": "Истекает через {{days}} дн.", "credits.packages.expiresToday": "Истекает сегодня", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Обновите до", "credits.topUp.upgradeSuffix": "и сэкономьте ${{savings}}", "credits.topUp.validityInfo": "Срок действия {{months}} мес.", + "currentPlan.cancelAlert": "Подписка будет отменена после {{canceledAt}}. До этого момента вы можете восстановить её в разделе «Управление подпиской»", + "currentPlan.downgradeAlert": "Будет понижен до {{plan}} после {{downgradedAt}}.", + "currentPlan.management": "Управление подпиской", + "currentPlan.notIncluded": "Не включено в текущий план", + "currentPlan.paymentExpired": "Подписка истекает {{expiredAt}}, пожалуйста, спланируйте использование заранее", + "currentPlan.seeAllFeaturesAndComparePlans": "Посмотреть все функции и сравнить планы", + "currentPlan.title": "Текущий план", + "discount.add": "Добавить", + "discount.maxOff": "Скидка до {{percent}}%", + "discount.off": "{{percent}}% скидка", + "discount.save": "Сэкономить", + "downgradePlans.alert": "Вы продолжите пользоваться преимуществами до окончания текущего плана ({{date}}). Новый план вступит в силу после окончания текущего.", + "downgradePlans.desc": "Изменение плана вступит в силу после окончания текущего.", + "downgradePlans.success": "Подписка успешно отменена", + "downgradePlans.title": "Переключиться на {{plan}}", "header.desc": "Управление использованием и подпиской", "header.title": "Платежи", "keyMissMatch.button": "Восстановить использование и продолжить", diff --git a/locales/tr-TR/subscription.json b/locales/tr-TR/subscription.json index f922421c2d..5331bec1ab 100644 --- a/locales/tr-TR/subscription.json +++ b/locales/tr-TR/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Tüm Planları Görüntüle", "comparePlans": "Planları Görüntüle", "createSubscriptionError": "Abonelik oluşturulamadı", - "currentPlan.cancelAlert": "Abonelik {{canceledAt}} tarihinde iptal edilecek. O zamana kadar \"Aboneliği Yönet\" bölümünden geri yükleyebilirsiniz", - "currentPlan.downgradeAlert": "{{downgradedAt}} tarihinden itibaren {{plan}} planına düşürülecek.", - "currentPlan.management": "Aboneliği Yönet", - "currentPlan.notIncluded": "Mevcut planda dahil değil", - "currentPlan.paymentExpired": "Bu abonelik {{expiredAt}} tarihinde sona erecek, lütfen kullanımınızı buna göre planlayın", - "currentPlan.seeAllFeaturesAndComparePlans": "Tüm özellikleri görüntüle ve planları karşılaştır", - "currentPlan.title": "Mevcut Plan", - "discount.add": "Ekle", - "discount.maxOff": "En fazla %{{percent}} indirim", - "discount.off": "%{{percent}} indirim", - "discount.save": "Tasarruf Et", - "downgradePlans.alert": "Mevcut planın süresi dolana kadar avantajlardan yararlanmaya devam edeceksiniz ({{date}}). Yeni plan, mevcut planın süresi dolduktan sonra geçerli olacaktır.", - "downgradePlans.desc": "Plan değişikliği, mevcut planın süresi dolduktan sonra geçerli olacaktır.", - "downgradePlans.success": "Abonelik başarıyla iptal edildi", - "downgradePlans.title": "{{plan}} planına geç", "credits.packages.expired": "Süresi Doldu", "credits.packages.expiresIn": "{{days}} gün içinde sona eriyor", "credits.packages.expiresToday": "Bugün sona eriyor", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Yükselt", "credits.topUp.upgradeSuffix": "ve ${{savings}} tasarruf et", "credits.topUp.validityInfo": "{{months}} ay geçerlilik", + "currentPlan.cancelAlert": "Abonelik {{canceledAt}} tarihinde iptal edilecek. O zamana kadar \"Aboneliği Yönet\" bölümünden geri yükleyebilirsiniz", + "currentPlan.downgradeAlert": "{{downgradedAt}} tarihinden itibaren {{plan}} planına düşürülecek.", + "currentPlan.management": "Aboneliği Yönet", + "currentPlan.notIncluded": "Mevcut planda dahil değil", + "currentPlan.paymentExpired": "Bu abonelik {{expiredAt}} tarihinde sona erecek, lütfen kullanımınızı buna göre planlayın", + "currentPlan.seeAllFeaturesAndComparePlans": "Tüm özellikleri görüntüle ve planları karşılaştır", + "currentPlan.title": "Mevcut Plan", + "discount.add": "Ekle", + "discount.maxOff": "En fazla %{{percent}} indirim", + "discount.off": "%{{percent}} indirim", + "discount.save": "Tasarruf Et", + "downgradePlans.alert": "Mevcut planın süresi dolana kadar avantajlardan yararlanmaya devam edeceksiniz ({{date}}). Yeni plan, mevcut planın süresi dolduktan sonra geçerli olacaktır.", + "downgradePlans.desc": "Plan değişikliği, mevcut planın süresi dolduktan sonra geçerli olacaktır.", + "downgradePlans.success": "Abonelik başarıyla iptal edildi", + "downgradePlans.title": "{{plan}} planına geç", "header.desc": "Kullanım ve abonelik yönetimi", "header.title": "Faturalandırma", "keyMissMatch.button": "Kullanımı geri yükle ve konuşmaya devam et", diff --git a/locales/vi-VN/subscription.json b/locales/vi-VN/subscription.json index 63f44211d6..b53c2b6292 100644 --- a/locales/vi-VN/subscription.json +++ b/locales/vi-VN/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "Xem tất cả các gói", "comparePlans": "Xem các gói", "createSubscriptionError": "Tạo đăng ký thất bại", - "currentPlan.cancelAlert": "Đăng ký sẽ bị hủy sau {{canceledAt}}. Bạn vẫn có thể khôi phục trong \"Quản lý đăng ký\" trước thời điểm đó", - "currentPlan.downgradeAlert": "Sẽ bị hạ cấp xuống {{plan}} sau {{downgradedAt}}.", - "currentPlan.management": "Quản lý đăng ký", - "currentPlan.notIncluded": "Không bao gồm trong gói hiện tại", - "currentPlan.paymentExpired": "Đăng ký này sẽ hết hạn vào {{expiredAt}}, vui lòng lên kế hoạch sử dụng phù hợp", - "currentPlan.seeAllFeaturesAndComparePlans": "Xem tất cả tính năng và so sánh các gói", - "currentPlan.title": "Gói hiện tại", - "discount.add": "Thêm", - "discount.maxOff": "Giảm tối đa {{percent}}%", - "discount.off": "Giảm {{percent}}%", - "discount.save": "Tiết kiệm", - "downgradePlans.alert": "Bạn vẫn sẽ được hưởng quyền lợi cho đến khi gói hiện tại hết hạn ({{date}}). Gói mới sẽ có hiệu lực sau khi gói hiện tại hết hạn.", - "downgradePlans.desc": "Thay đổi gói sẽ có hiệu lực sau khi gói hiện tại hết hạn.", - "downgradePlans.success": "Hủy đăng ký thành công", - "downgradePlans.title": "Chuyển sang {{plan}}", "credits.packages.expired": "Đã hết hạn", "credits.packages.expiresIn": "Hết hạn sau {{days}} ngày", "credits.packages.expiresToday": "Hết hạn hôm nay", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "Nâng cấp lên", "credits.topUp.upgradeSuffix": "để tiết kiệm ${{savings}}", "credits.topUp.validityInfo": "Hiệu lực {{months}} tháng", + "currentPlan.cancelAlert": "Đăng ký sẽ bị hủy sau {{canceledAt}}. Bạn vẫn có thể khôi phục trong \"Quản lý đăng ký\" trước thời điểm đó", + "currentPlan.downgradeAlert": "Sẽ bị hạ cấp xuống {{plan}} sau {{downgradedAt}}.", + "currentPlan.management": "Quản lý đăng ký", + "currentPlan.notIncluded": "Không bao gồm trong gói hiện tại", + "currentPlan.paymentExpired": "Đăng ký này sẽ hết hạn vào {{expiredAt}}, vui lòng lên kế hoạch sử dụng phù hợp", + "currentPlan.seeAllFeaturesAndComparePlans": "Xem tất cả tính năng và so sánh các gói", + "currentPlan.title": "Gói hiện tại", + "discount.add": "Thêm", + "discount.maxOff": "Giảm tối đa {{percent}}%", + "discount.off": "Giảm {{percent}}%", + "discount.save": "Tiết kiệm", + "downgradePlans.alert": "Bạn vẫn sẽ được hưởng quyền lợi cho đến khi gói hiện tại hết hạn ({{date}}). Gói mới sẽ có hiệu lực sau khi gói hiện tại hết hạn.", + "downgradePlans.desc": "Thay đổi gói sẽ có hiệu lực sau khi gói hiện tại hết hạn.", + "downgradePlans.success": "Hủy đăng ký thành công", + "downgradePlans.title": "Chuyển sang {{plan}}", "header.desc": "Quản lý sử dụng và đăng ký", "header.title": "Thanh toán", "keyMissMatch.button": "Khôi phục sử dụng và tiếp tục trò chuyện", diff --git a/locales/zh-CN/subscription.json b/locales/zh-CN/subscription.json index 0ebd8aa76e..792d7d793b 100644 --- a/locales/zh-CN/subscription.json +++ b/locales/zh-CN/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "查看所有套餐", "comparePlans": "查看套餐", "createSubscriptionError": "创建订阅失败", - "currentPlan.cancelAlert": "订阅将于 {{canceledAt}} 后取消。您仍可在“管理订阅”中恢复。", - "currentPlan.downgradeAlert": "将于 {{downgradedAt}} 降级为 {{plan}}。", - "currentPlan.management": "管理订阅", - "currentPlan.notIncluded": "当前套餐不包含", - "currentPlan.paymentExpired": "当前订阅将于 {{expiredAt}} 到期,请合理安排使用", - "currentPlan.seeAllFeaturesAndComparePlans": "查看所有功能并比较套餐", - "currentPlan.title": "当前套餐", - "discount.add": "添加", - "discount.maxOff": "最高优惠 {{percent}}%", - "discount.off": "优惠 {{percent}}%", - "discount.save": "节省", - "downgradePlans.alert": "您仍可享受当前订阅权益,直到 {{date}} 到期。新套餐将在当前套餐到期后生效。", - "downgradePlans.desc": "套餐变更将在当前套餐到期后生效。", - "downgradePlans.success": "取消订阅成功", - "downgradePlans.title": "切换至 {{plan}}", "credits.packages.expired": "已过期", "credits.packages.expiresIn": "{{days}} 天后过期", "credits.packages.expiresToday": "今日过期", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "升级至", "credits.topUp.upgradeSuffix": "可节省 ${{savings}}", "credits.topUp.validityInfo": "有效期 {{months}} 个月", + "currentPlan.cancelAlert": "订阅将于 {{canceledAt}} 后取消。您仍可在“管理订阅”中恢复。", + "currentPlan.downgradeAlert": "将于 {{downgradedAt}} 降级为 {{plan}}。", + "currentPlan.management": "管理订阅", + "currentPlan.notIncluded": "当前套餐不包含", + "currentPlan.paymentExpired": "当前订阅将于 {{expiredAt}} 到期,请合理安排使用", + "currentPlan.seeAllFeaturesAndComparePlans": "查看所有功能并比较套餐", + "currentPlan.title": "当前套餐", + "discount.add": "添加", + "discount.maxOff": "最高优惠 {{percent}}%", + "discount.off": "优惠 {{percent}}%", + "discount.save": "节省", + "downgradePlans.alert": "您仍可享受当前订阅权益,直到 {{date}} 到期。新套餐将在当前套餐到期后生效。", + "downgradePlans.desc": "套餐变更将在当前套餐到期后生效。", + "downgradePlans.success": "取消订阅成功", + "downgradePlans.title": "切换至 {{plan}}", "header.desc": "使用情况与订阅管理", "header.title": "账单", "keyMissMatch.button": "恢复使用并继续对话", diff --git a/locales/zh-TW/subscription.json b/locales/zh-TW/subscription.json index 87bc0b3933..e1137c8fe3 100644 --- a/locales/zh-TW/subscription.json +++ b/locales/zh-TW/subscription.json @@ -35,21 +35,6 @@ "compareAllPlans": "查看所有方案", "comparePlans": "查看方案", "createSubscriptionError": "建立訂閱失敗", - "currentPlan.cancelAlert": "訂閱將於 {{canceledAt}} 取消,您可在「管理訂閱」中恢復。", - "currentPlan.downgradeAlert": "將於 {{downgradedAt}} 降級為 {{plan}}。", - "currentPlan.management": "管理訂閱", - "currentPlan.notIncluded": "目前方案未包含", - "currentPlan.paymentExpired": "此訂閱將於 {{expiredAt}} 到期,請妥善規劃使用時間", - "currentPlan.seeAllFeaturesAndComparePlans": "查看所有功能並比較方案", - "currentPlan.title": "目前方案", - "discount.add": "新增", - "discount.maxOff": "最高折扣 {{percent}}%", - "discount.off": "折扣 {{percent}}%", - "discount.save": "省下", - "downgradePlans.alert": "您仍可享有目前方案的權益至到期日({{date}}),新方案將於到期後生效。", - "downgradePlans.desc": "方案變更將於目前方案到期後生效。", - "downgradePlans.success": "成功取消訂閱", - "downgradePlans.title": "切換至 {{plan}}", "credits.packages.expired": "已過期", "credits.packages.expiresIn": "{{days}} 天後過期", "credits.packages.expiresToday": "今日過期", @@ -88,6 +73,21 @@ "credits.topUp.upgradePrefix": "升級至", "credits.topUp.upgradeSuffix": "可省下 ${{savings}}", "credits.topUp.validityInfo": "有效期 {{months}} 個月", + "currentPlan.cancelAlert": "訂閱將於 {{canceledAt}} 取消,您可在「管理訂閱」中恢復。", + "currentPlan.downgradeAlert": "將於 {{downgradedAt}} 降級為 {{plan}}。", + "currentPlan.management": "管理訂閱", + "currentPlan.notIncluded": "目前方案未包含", + "currentPlan.paymentExpired": "此訂閱將於 {{expiredAt}} 到期,請妥善規劃使用時間", + "currentPlan.seeAllFeaturesAndComparePlans": "查看所有功能並比較方案", + "currentPlan.title": "目前方案", + "discount.add": "新增", + "discount.maxOff": "最高折扣 {{percent}}%", + "discount.off": "折扣 {{percent}}%", + "discount.save": "省下", + "downgradePlans.alert": "您仍可享有目前方案的權益至到期日({{date}}),新方案將於到期後生效。", + "downgradePlans.desc": "方案變更將於目前方案到期後生效。", + "downgradePlans.success": "成功取消訂閱", + "downgradePlans.title": "切換至 {{plan}}", "header.desc": "使用與訂閱管理", "header.title": "帳單", "keyMissMatch.button": "恢復使用並繼續對話", diff --git a/packages/types/src/aiChat.ts b/packages/types/src/aiChat.ts index 986bdde2b5..92febbf53e 100644 --- a/packages/types/src/aiChat.ts +++ b/packages/types/src/aiChat.ts @@ -1,10 +1,9 @@ import { z } from 'zod'; +import type { UIChatMessage } from './message'; import type { MessageMetadata } from './message/common'; import { ChatToolPayloadSchema, MessageMetadataSchema } from './message/common'; -import type { UIChatMessage } from './message'; -import type { CreateMessageParams } from './message/ui/params'; -import type { PageSelection } from './message/ui/params'; +import type { CreateMessageParams, PageSelection } from './message/ui/params'; import { PageSelectionSchema } from './message/ui/params'; import type { OpenAIChatMessage } from './openai/chat'; import type { LobeUniformTool } from './tool'; @@ -24,11 +23,10 @@ export interface SendNewMessage { parentId?: string; } -export interface SendPreloadMessage - extends Omit< - Pick, - 'metadata' - > { +export interface SendPreloadMessage extends Omit< + Pick, + 'metadata' +> { metadata?: MessageMetadata; role: 'assistant' | 'tool'; } @@ -71,8 +69,8 @@ export interface SendMessageServerParams { title?: string; topicMessageIds?: string[]; }; - preloadMessages?: SendPreloadMessage[]; newUserMessage: SendNewMessage; + preloadMessages?: SendPreloadMessage[]; sessionId?: string; threadId?: string; // if there is activeTopicId,then add topicId to message diff --git a/src/components/FormInput/FormInput.tsx b/src/components/FormInput/FormInput.tsx index 3143c99c1c..753be2c6bc 100644 --- a/src/components/FormInput/FormInput.tsx +++ b/src/components/FormInput/FormInput.tsx @@ -3,13 +3,15 @@ import { Input } from '@lobehub/ui'; import { type InputRef } from 'antd/es/input/Input'; import { memo, useEffect, useRef, useState } from 'react'; +import { useIMECompositionEvent } from '@/hooks/useIMECompositionEvent'; + interface FormInputProps extends Omit { onChange?: (value: string) => void; } const FormInput = memo(({ onChange, value: defaultValue, ...props }) => { const ref = useRef(null); - const isChineseInput = useRef(false); + const { compositionProps, isComposingRef } = useIMECompositionEvent(); const [value, setValue] = useState(defaultValue as string); @@ -26,14 +28,9 @@ const FormInput = memo(({ onChange, value: defaultValue, ...prop onChange={(e) => { setValue(e.target.value); }} - onCompositionEnd={() => { - isChineseInput.current = false; - }} - onCompositionStart={() => { - isChineseInput.current = true; - }} + {...compositionProps} onPressEnter={() => { - if (isChineseInput.current) return; + if (isComposingRef.current) return; onChange?.(value); }} {...props} diff --git a/src/components/FormInput/FormPassword.tsx b/src/components/FormInput/FormPassword.tsx index 5384292af6..dc136a873f 100644 --- a/src/components/FormInput/FormPassword.tsx +++ b/src/components/FormInput/FormPassword.tsx @@ -3,13 +3,15 @@ import { InputPassword } from '@lobehub/ui'; import { type InputRef } from 'antd/es/input/Input'; import { memo, useEffect, useRef, useState } from 'react'; +import { useIMECompositionEvent } from '@/hooks/useIMECompositionEvent'; + interface FormPasswordProps extends Omit { onChange?: (value: string) => void; } const FormPassword = memo(({ onChange, value: defaultValue, ...props }) => { const ref = useRef(null); - const isChineseInput = useRef(false); + const { compositionProps, isComposingRef } = useIMECompositionEvent(); const [value, setValue] = useState(defaultValue as string); @@ -26,14 +28,9 @@ const FormPassword = memo(({ onChange, value: defaultValue, . onChange={(e) => { setValue(e.target.value); }} - onCompositionEnd={() => { - isChineseInput.current = false; - }} - onCompositionStart={() => { - isChineseInput.current = true; - }} + {...compositionProps} onPressEnter={() => { - if (isChineseInput.current) return; + if (isComposingRef.current) return; onChange?.(value); }} {...props} diff --git a/src/components/TextArea/index.tsx b/src/components/TextArea/index.tsx index 78c3dae49b..379edbe622 100644 --- a/src/components/TextArea/index.tsx +++ b/src/components/TextArea/index.tsx @@ -3,13 +3,15 @@ import { TextArea as LobeTextArea } from '@lobehub/ui'; import { type TextAreaRef } from 'antd/es/input/TextArea'; import { memo, useRef, useState } from 'react'; +import { useIMECompositionEvent } from '@/hooks/useIMECompositionEvent'; + interface TextAreaProps extends Omit { onChange?: (value: string) => void; } const TextArea = memo(({ onChange, value: defaultValue, ...props }) => { const ref = useRef(null); - const isChineseInput = useRef(false); + const { compositionProps, isComposingRef } = useIMECompositionEvent(); const [value, setValue] = useState(defaultValue as string); @@ -22,14 +24,9 @@ const TextArea = memo(({ onChange, value: defaultValue, ...props onChange={(e) => { setValue(e.target.value); }} - onCompositionEnd={() => { - isChineseInput.current = false; - }} - onCompositionStart={() => { - isChineseInput.current = true; - }} + {...compositionProps} onPressEnter={() => { - if (isChineseInput.current) return; + if (isComposingRef.current) return; onChange?.(value); }} {...props} diff --git a/src/features/AgentSetting/AgentMeta/AutoGenerateInput.tsx b/src/features/AgentSetting/AgentMeta/AutoGenerateInput.tsx index db31a61d87..fff5921b15 100644 --- a/src/features/AgentSetting/AgentMeta/AutoGenerateInput.tsx +++ b/src/features/AgentSetting/AgentMeta/AutoGenerateInput.tsx @@ -4,6 +4,8 @@ import { Wand2 } from 'lucide-react'; import { memo, useCallback, useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { useIMECompositionEvent } from '@/hooks/useIMECompositionEvent'; + export interface AutoGenerateInputProps extends Omit { canAutoGenerate?: boolean; loading?: boolean; @@ -18,7 +20,7 @@ const AutoGenerateInput = memo( const [input, setInput] = useState(value || ''); - const isChineseInput = useRef(false); + const { compositionProps, isComposingRef } = useIMECompositionEvent(); const isFocusing = useRef(false); const updateValue = useCallback(() => { @@ -55,17 +57,12 @@ const AutoGenerateInput = memo( onChange={(e) => { setInput(e.target.value); }} - onCompositionEnd={() => { - isChineseInput.current = false; - }} - onCompositionStart={() => { - isChineseInput.current = true; - }} + {...compositionProps} onFocus={() => { isFocusing.current = true; }} onPressEnter={(e) => { - if (!e.shiftKey && !isChineseInput.current) { + if (!e.shiftKey && !isComposingRef.current) { e.preventDefault(); updateValue(); isFocusing.current = false; diff --git a/src/features/ChatInput/InputEditor/index.tsx b/src/features/ChatInput/InputEditor/index.tsx index 3e9feb178f..7f817c8543 100644 --- a/src/features/ChatInput/InputEditor/index.tsx +++ b/src/features/ChatInput/InputEditor/index.tsx @@ -5,10 +5,11 @@ import { INSERT_MENTION_COMMAND, ReactMathPlugin, type SlashOptions } from '@lob import { Editor, FloatMenu, useEditorState } from '@lobehub/editor/react'; import { combineKeys } from '@lobehub/ui'; import { css, cx } from 'antd-style'; -import { memo, useCallback, useEffect, useMemo, useRef } from 'react'; +import { memo, useCallback, useEffect, useMemo } from 'react'; import { useHotkeysContext } from 'react-hotkeys-hook'; import { usePasteFile, useUploadFiles } from '@/components/DragUploadZone'; +import { useIMECompositionEvent } from '@/hooks/useIMECompositionEvent'; import { useAgentStore } from '@/store/agent'; import { agentByIdSelectors } from '@/store/agent/selectors'; import { useUserStore } from '@/store/user'; @@ -46,7 +47,7 @@ const InputEditor = memo<{ defaultRows?: number }>(({ defaultRows = 2 }) => { const hotkey = useUserStore(settingsSelectors.getHotkeyById(HotkeyEnum.AddUserMessage)); const { enableScope, disableScope } = useHotkeysContext(); - const isChineseInput = useRef(false); + const { compositionProps, isComposingRef } = useIMECompositionEvent(); const useCmdEnterToSend = useUserStore(preferenceSelectors.useCmdEnterToSend); @@ -192,12 +193,7 @@ const InputEditor = memo<{ defaultRows?: number }>(({ defaultRows = 2 }) => { onChange={() => { updateMarkdownContent(); }} - onCompositionEnd={() => { - isChineseInput.current = false; - }} - onCompositionStart={() => { - isChineseInput.current = true; - }} + {...compositionProps} onContextMenu={async ({ event: e, editor }) => { if (isDesktop) { e.preventDefault(); @@ -214,7 +210,7 @@ const InputEditor = memo<{ defaultRows?: number }>(({ defaultRows = 2 }) => { enableScope(HotkeyEnum.AddUserMessage); }} onPressEnter={({ event: e }) => { - if (e.shiftKey || isChineseInput.current) return; + if (e.shiftKey || isComposingRef.current) return; // when user like alt + enter to add ai message if (e.altKey && hotkey === combineKeys([KeyEnum.Alt, KeyEnum.Enter])) return true; const commandKey = isCommandPressed(e); diff --git a/src/features/Conversation/Messages/AssistantGroup/index.tsx b/src/features/Conversation/Messages/AssistantGroup/index.tsx index 6aabd7bcec..017b0d2242 100644 --- a/src/features/Conversation/Messages/AssistantGroup/index.tsx +++ b/src/features/Conversation/Messages/AssistantGroup/index.tsx @@ -83,7 +83,7 @@ const GroupMessage = memo(({ id, index, disableEditing, isLat const isDevMode = useUserStore((s) => userGeneralSettingsSelectors.config(s).isDevMode); const addReaction = useConversationStore((s) => s.addReaction); const removeReaction = useConversationStore((s) => s.removeReaction); - const userId = useUserStore(userProfileSelectors.userId)! + const userId = useUserStore(userProfileSelectors.userId)!; const reactions: EmojiReaction[] = metadata?.reactions || []; const handleReactionClick = useCallback( diff --git a/src/features/Conversation/Messages/Tasks/shared/TaskMessages.tsx b/src/features/Conversation/Messages/Tasks/shared/TaskMessages.tsx index 3405dde65b..54d0d754df 100644 --- a/src/features/Conversation/Messages/Tasks/shared/TaskMessages.tsx +++ b/src/features/Conversation/Messages/Tasks/shared/TaskMessages.tsx @@ -219,7 +219,9 @@ const ProcessingView = memo<{ {/* Usage display */} - {isDevMode && model && provider && } + {isDevMode && model && provider && ( + + )} ); }); diff --git a/src/features/ModelSwitchPanel/components/List/index.tsx b/src/features/ModelSwitchPanel/components/List/index.tsx index 03e3e19273..5ea3487eaf 100644 --- a/src/features/ModelSwitchPanel/components/List/index.tsx +++ b/src/features/ModelSwitchPanel/components/List/index.tsx @@ -80,12 +80,7 @@ export const List: FC = ({ }, [listHeight, activeKey]); return ( - + {listItems.map((item, index) => { const itemKey = menuKey( 'provider' in item && item.provider ? item.provider.id : '', diff --git a/src/features/ModelSwitchPanel/hooks/useBuildListItems.ts b/src/features/ModelSwitchPanel/hooks/useBuildListItems.ts index 12eac6f624..c82843b525 100644 --- a/src/features/ModelSwitchPanel/hooks/useBuildListItems.ts +++ b/src/features/ModelSwitchPanel/hooks/useBuildListItems.ts @@ -70,14 +70,13 @@ export const useBuildListItems = ( }); } - return modelArray - .map((data) => ({ - data, - type: - data.providers.length === 1 - ? ('model-item-single' as const) - : ('model-item-multiple' as const), - })); + return modelArray.map((data) => ({ + data, + type: + data.providers.length === 1 + ? ('model-item-single' as const) + : ('model-item-multiple' as const), + })); } else { const items: ListItem[] = []; diff --git a/src/hooks/useIMECompositionEvent.ts b/src/hooks/useIMECompositionEvent.ts new file mode 100644 index 0000000000..48c9ec4d62 --- /dev/null +++ b/src/hooks/useIMECompositionEvent.ts @@ -0,0 +1,35 @@ +import type { CompositionEvent } from 'react'; +import { useCallback, useRef } from 'react'; + +interface IMECompositionEventOptions { + onCompositionEnd?: (e: CompositionEvent) => void; + onCompositionStart?: (e: CompositionEvent) => void; +} + +/** + * Hook to track IME composition state (e.g. Chinese input). + * Use this to avoid triggering Enter key handlers during composition. + */ +export const useIMECompositionEvent = (mergeProps?: IMECompositionEventOptions) => { + const isComposingRef = useRef(false); + const mergePropsRef = useRef(mergeProps); + mergePropsRef.current = mergeProps; + + const onCompositionEnd = useCallback((e: CompositionEvent) => { + isComposingRef.current = false; + mergePropsRef.current?.onCompositionEnd?.(e); + }, []); + + const onCompositionStart = useCallback((e: CompositionEvent) => { + isComposingRef.current = true; + mergePropsRef.current?.onCompositionStart?.(e); + }, []); + + return { + compositionProps: { + onCompositionEnd, + onCompositionStart, + }, + isComposingRef, + }; +}; diff --git a/src/routes/(desktop)/desktop-onboarding/features/LoginStep.tsx b/src/routes/(desktop)/desktop-onboarding/features/LoginStep.tsx index 13fb4a6173..92bd111449 100644 --- a/src/routes/(desktop)/desktop-onboarding/features/LoginStep.tsx +++ b/src/routes/(desktop)/desktop-onboarding/features/LoginStep.tsx @@ -13,6 +13,7 @@ import urlJoin from 'url-join'; import { OFFICIAL_SITE } from '@/const/url'; import { isDesktop } from '@/const/version'; import UserInfo from '@/features/User/UserInfo'; +import { useIMECompositionEvent } from '@/hooks/useIMECompositionEvent'; import { remoteServerService } from '@/services/electron/remoteServer'; import { electronSystemService } from '@/services/electron/system'; import { useElectronStore } from '@/store/electron'; @@ -69,6 +70,7 @@ const LoginStep = memo(({ onBack, onNext }) => { const [showEndpoint, setShowEndpoint] = useState(false); const [hasLegacyLocalDb, setHasLegacyLocalDb] = useState(false); const [localRemainingSeconds, setLocalRemainingSeconds] = useState(null); + const { compositionProps, isComposingRef } = useIMECompositionEvent(); const [ dataSyncConfig, @@ -457,6 +459,7 @@ const LoginStep = memo(({ onBack, onNext }) => { style={{ width: '100%' }} value={endpoint} onChange={(e) => setEndpoint(e.target.value)} + {...compositionProps} onContextMenu={async (e) => { if (!isDesktop) return; e.preventDefault(); @@ -471,7 +474,7 @@ const LoginStep = memo(({ onBack, onNext }) => { }); }} onKeyDown={(e) => { - if (e.key === 'Enter') { + if (e.key === 'Enter' && !isComposingRef.current) { handleSelfhostConnect(); } }} diff --git a/src/routes/(main)/agent/features/Conversation/MainChatInput/index.tsx b/src/routes/(main)/agent/features/Conversation/MainChatInput/index.tsx index fa9660fee1..accae74a5b 100644 --- a/src/routes/(main)/agent/features/Conversation/MainChatInput/index.tsx +++ b/src/routes/(main)/agent/features/Conversation/MainChatInput/index.tsx @@ -45,8 +45,7 @@ const MainChatInput = memo(() => { rightActions={rightActions} {...(isDevMode ? { sendMenu: { items: sendMenuItems } } - : { sendButtonProps: { shape: 'round' } } - )} + : { sendButtonProps: { shape: 'round' } })} onEditorReady={(instance) => { // Sync to global ChatStore for compatibility with other features useChatStore.setState({ mainInputEditor: instance }); diff --git a/src/routes/(main)/home/_layout/Header/components/User.tsx b/src/routes/(main)/home/_layout/Header/components/User.tsx index 6bd0f7ce57..29c1996339 100644 --- a/src/routes/(main)/home/_layout/Header/components/User.tsx +++ b/src/routes/(main)/home/_layout/Header/components/User.tsx @@ -42,11 +42,7 @@ const User = memo<{ lite?: boolean }>(({ lite }) => { {!isSignedIn && (nickname || username) ? ( ) : ( - + {nickname || username} )} diff --git a/src/routes/(main)/home/features/InputArea/index.tsx b/src/routes/(main)/home/features/InputArea/index.tsx index 95718265e4..d0ef0e5928 100644 --- a/src/routes/(main)/home/features/InputArea/index.tsx +++ b/src/routes/(main)/home/features/InputArea/index.tsx @@ -62,8 +62,7 @@ const InputArea = () => { [], ); - const hideStarterList = - inputActiveMode && ['agent', 'group', 'write'].includes(inputActiveMode); + const hideStarterList = inputActiveMode && ['agent', 'group', 'write'].includes(inputActiveMode); const showSuggestQuestions = !inputActiveMode || ['agent', 'group', 'write'].includes(inputActiveMode); diff --git a/src/routes/(main)/home/index.tsx b/src/routes/(main)/home/index.tsx index 9759cf728a..9a7c822c59 100644 --- a/src/routes/(main)/home/index.tsx +++ b/src/routes/(main)/home/index.tsx @@ -15,9 +15,7 @@ const Home: FC = () => { return ( <> {isHomeRoute && } - } - /> + } />