From ff85698edb29f72c88af97f39d881007d0ec0276 Mon Sep 17 00:00:00 2001
From: shuaiplus <2327005759@qq.com>
Date: Thu, 25 Jun 2026 21:11:57 +0800
Subject: [PATCH] feat: add Tigris backup provider support with recommendations
and localization updates
---
.../backup-center/BackupDestinationDetail.tsx | 66 ++++++++++++-------
webapp/src/lib/backup-recommendations.ts | 19 +++++-
webapp/src/lib/i18n/locales/en.ts | 23 +++++--
webapp/src/lib/i18n/locales/es.ts | 23 +++++--
webapp/src/lib/i18n/locales/ru.ts | 23 +++++--
webapp/src/lib/i18n/locales/zh-CN.ts | 15 ++++-
webapp/src/lib/i18n/locales/zh-TW.ts | 23 +++++--
7 files changed, 144 insertions(+), 48 deletions(-)
diff --git a/webapp/src/components/backup-center/BackupDestinationDetail.tsx b/webapp/src/components/backup-center/BackupDestinationDetail.tsx
index 615e749..c05a345 100644
--- a/webapp/src/components/backup-center/BackupDestinationDetail.tsx
+++ b/webapp/src/components/backup-center/BackupDestinationDetail.tsx
@@ -54,21 +54,18 @@ function renderRecommendedProviderDetails(provider: RecommendedProvider) {
<>
- 1. {t('txt_backup_recommend_koofr_step_1')}
-
-
- 3. {t('txt_backup_recommend_koofr_step_3')}
+ 2. {t('txt_backup_recommend_koofr_step_3')}
- 4. {t('txt_backup_recommend_koofr_step_4')}
+ 3. {t('txt_backup_recommend_koofr_step_4')}
@@ -98,13 +95,10 @@ function renderRecommendedProviderDetails(provider: RecommendedProvider) {
return (
- 1. {t('txt_backup_recommend_pcloud_step_1')}
+ 1. {t('txt_backup_recommend_pcloud_step_2')}
- 2. {t('txt_backup_recommend_pcloud_step_2')}
-
-
- 3. {t('txt_backup_recommend_pcloud_step_3')}
+ 2. {t('txt_backup_recommend_pcloud_step_3')}
);
@@ -112,18 +106,15 @@ function renderRecommendedProviderDetails(provider: RecommendedProvider) {
return (
- 1. {t('txt_backup_recommend_infinicloud_step_1')}
-
-
-
2. {t('txt_backup_recommend_infinicloud_step_2_prefix')}{' '}
+
1. {t('txt_backup_recommend_infinicloud_step_2_prefix')}{' '}
My Page
{t('txt_backup_recommend_infinicloud_step_2_suffix')}
- 3. {t('txt_backup_recommend_infinicloud_step_3')}
+ 2. {t('txt_backup_recommend_infinicloud_step_3')}
- 4. {t('txt_backup_recommend_infinicloud_step_4')}
+ 3. {t('txt_backup_recommend_infinicloud_step_4')}
);
@@ -131,23 +122,23 @@ function renderRecommendedProviderDetails(provider: RecommendedProvider) {
return (
- 1. {t('txt_backup_recommend_backblaze_step_1')}
-
-
-
2. {t('txt_backup_recommend_backblaze_step_2_prefix')}{' '}
+
1. {t('txt_backup_recommend_backblaze_step_2_prefix')}{' '}
Buckets
{t('txt_backup_recommend_backblaze_step_2_suffix')}
- 3. {t('txt_backup_recommend_backblaze_step_3')}
+ 2. {t('txt_backup_recommend_backblaze_step_3')}
-
4. {t('txt_backup_recommend_backblaze_step_4_prefix')}{' '}
+
3. {t('txt_backup_recommend_backblaze_step_4_prefix')}{' '}
Application Keys
{t('txt_backup_recommend_backblaze_step_4_suffix')}
- 5. {t('txt_backup_recommend_backblaze_step_5')}
+ 4. {t('txt_backup_recommend_backblaze_step_5')}
+
+
+ 5. {t('txt_backup_recommend_s3_path_prefix_step')}
);
@@ -175,6 +166,30 @@ function renderRecommendedProviderDetails(provider: RecommendedProvider) {
);
+ case 'tigris':
+ return (
+
+
+
1. {t('txt_backup_recommend_tigris_step_2_prefix')}{' '}
+
Create Bucket
+ {t('txt_backup_recommend_tigris_step_2_suffix')}
+
+
+
+ 3. {t('txt_backup_recommend_tigris_step_4')}
+
+
+ 4. {t('txt_backup_recommend_tigris_step_5')}
+
+
+ 5. {t('txt_backup_recommend_s3_path_prefix_step')}
+
+
+ );
}
}
@@ -197,6 +212,7 @@ export function BackupDestinationDetail(props: BackupDestinationDetailProps) {
: props.selectedRecommendedProvider.id === 'koofr' ? t('txt_backup_recommend_koofr_summary')
: props.selectedRecommendedProvider.id === 'backblaze-b2' ? t('txt_backup_recommend_backblaze_summary')
: props.selectedRecommendedProvider.id === 'cloudflare-r2' ? t('txt_backup_recommend_cloudflare_r2_summary')
+ : props.selectedRecommendedProvider.id === 'tigris' ? t('txt_backup_recommend_tigris_summary')
: t('txt_backup_recommend_pcloud_summary')}
diff --git a/webapp/src/lib/backup-recommendations.ts b/webapp/src/lib/backup-recommendations.ts
index a2be712..c285585 100644
--- a/webapp/src/lib/backup-recommendations.ts
+++ b/webapp/src/lib/backup-recommendations.ts
@@ -4,7 +4,7 @@ export interface RecommendedStorageLink {
}
export interface RecommendedProviderBase {
- id: 'infinicloud' | 'koofr' | 'pcloud' | 'backblaze-b2' | 'cloudflare-r2';
+ id: 'infinicloud' | 'koofr' | 'pcloud' | 'backblaze-b2' | 'cloudflare-r2' | 'tigris';
name: string;
capacity: string;
protocol: 'webdav' | 's3';
@@ -40,7 +40,13 @@ export interface CloudflareR2Provider extends RecommendedProviderBase {
apiTokenUrl: string;
}
-export type RecommendedProvider = InfinicloudProvider | KoofrProvider | PcloudProvider | BackblazeB2Provider | CloudflareR2Provider;
+export interface TigrisProvider extends RecommendedProviderBase {
+ id: 'tigris';
+ bucketUrl: string;
+ accessKeyUrl: string;
+}
+
+export type RecommendedProvider = InfinicloudProvider | KoofrProvider | PcloudProvider | BackblazeB2Provider | CloudflareR2Provider | TigrisProvider;
export const RECOMMENDED_PROVIDERS: RecommendedProvider[] = [
{
@@ -91,6 +97,15 @@ export const RECOMMENDED_PROVIDERS: RecommendedProvider[] = [
bucketUrl: 'https://dash.cloudflare.com/?to=/:account/r2/new',
apiTokenUrl: 'https://dash.cloudflare.com/?to=/:account/r2/api-tokens/create?type=user',
},
+ {
+ id: 'tigris',
+ name: 'Tigris',
+ capacity: '5G',
+ protocol: 's3',
+ signupUrl: 'https://console.storage.dev/signup',
+ bucketUrl: 'https://console.storage.dev/createbucket',
+ accessKeyUrl: 'https://console.storage.dev/createaccesskey',
+ },
];
export function hasLinkedStorages(provider: RecommendedProvider): provider is KoofrProvider {
diff --git a/webapp/src/lib/i18n/locales/en.ts b/webapp/src/lib/i18n/locales/en.ts
index dce58ee..c0c97a4 100644
--- a/webapp/src/lib/i18n/locales/en.ts
+++ b/webapp/src/lib/i18n/locales/en.ts
@@ -85,15 +85,15 @@ const en: Record