mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-05-31 10:14:15 +00:00
Some checks are pending
CI / go-test (push) Waiting to run
CI / govulncheck (push) Waiting to run
CI / frontend (push) Waiting to run
CodeQL Advanced / Analyze (go) (push) Waiting to run
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Release 3X-UI / build (386) (push) Waiting to run
Release 3X-UI / build (amd64) (push) Waiting to run
Release 3X-UI / build (arm64) (push) Waiting to run
Release 3X-UI / build (armv5) (push) Waiting to run
Release 3X-UI / build (armv6) (push) Waiting to run
Release 3X-UI / build (armv7) (push) Waiting to run
Release 3X-UI / build (s390x) (push) Waiting to run
Release 3X-UI / Build for Windows (push) Waiting to run
- TextModal: route the Copy button label and the post-copy toast
through t('copy')/t('copied') instead of hardcoded English.
- PromptModal: route cancelText through t('cancel') and default okText
through t('confirm') so the import-inbound prompt stops showing
"Cancel" in non-English UI.
- InboundsPage: pass the All-Inbounds and All-Inbounds-Subs download
filenames through t(...) so each locale can localize them.
- en-US.json: add pages.inbounds.exportAllLinksFileName and
pages.inbounds.exportAllSubsFileName.
- All 12 non-English locales: translate streamTab and sniffingTab
(previously left as literal English) and add the two new filename
keys with appropriate translations.
All 13 locale files now have 1541 lines.
61 lines
1.5 KiB
TypeScript
61 lines
1.5 KiB
TypeScript
import { Button, Input, Modal, message } from 'antd';
|
|
import { CopyOutlined, DownloadOutlined } from '@ant-design/icons';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
import { ClipboardManager, FileManager } from '@/utils';
|
|
|
|
interface TextModalProps {
|
|
open: boolean;
|
|
onClose: () => void;
|
|
title: string;
|
|
content: string;
|
|
fileName?: string;
|
|
}
|
|
|
|
export default function TextModal({ open, onClose, title, content, fileName = '' }: TextModalProps) {
|
|
const { t } = useTranslation();
|
|
const [messageApi, messageContextHolder] = message.useMessage();
|
|
async function copy() {
|
|
const ok = await ClipboardManager.copyText(content || '');
|
|
if (ok) {
|
|
messageApi.success(t('copied'));
|
|
onClose();
|
|
}
|
|
}
|
|
|
|
function download() {
|
|
if (!fileName) return;
|
|
FileManager.downloadTextFile(content, fileName);
|
|
}
|
|
|
|
return (
|
|
<>
|
|
{messageContextHolder}
|
|
<Modal
|
|
open={open}
|
|
title={title}
|
|
onCancel={onClose}
|
|
destroyOnHidden
|
|
footer={(
|
|
<>
|
|
{fileName && (
|
|
<Button icon={<DownloadOutlined />} onClick={download}>{fileName}</Button>
|
|
)}
|
|
<Button type="primary" icon={<CopyOutlined />} onClick={copy}>{t('copy')}</Button>
|
|
</>
|
|
)}
|
|
>
|
|
<Input.TextArea
|
|
value={content}
|
|
readOnly
|
|
autoSize={{ minRows: 10, maxRows: 20 }}
|
|
style={{
|
|
fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',
|
|
fontSize: 12,
|
|
overflowY: 'auto',
|
|
}}
|
|
/>
|
|
</Modal>
|
|
</>
|
|
);
|
|
}
|