diff --git a/docs/api/request.md b/docs/api/request.md index feb647f..1533b60 100644 --- a/docs/api/request.md +++ b/docs/api/request.md @@ -14,6 +14,7 @@ HTTP 请求基础封装,提供 `get` 和 `post` 方法,支持自定义请求 - GET 请求:支持 query 参数,自动序列化 - POST 请求:支持 JSON body - 自定义 headers:通过 `RequestConfig.headers` 传入 +- **Accept-Language**:所有 GET/POST 请求自动附带标准 `Accept-Language` 头,值为当前 vue-i18n 的 `locale`(如 `zh-CN`、`en`),可在 `config.headers` 中覆盖 ## 使用方式 diff --git a/docs/components/OrderBook.md b/docs/components/OrderBook.md index 4f2c713..c40d380 100644 --- a/docs/components/OrderBook.md +++ b/docs/components/OrderBook.md @@ -11,7 +11,7 @@ - Trade Up / Trade Down Tab - Asks、Bids 列表,带 `HorizontalProgressBar` 深度条 - Last price、Spread 展示 -- Live / 连接中 状态展示 +- Live / 连接中 状态展示(均通过 i18n 国际化) ## Props @@ -41,6 +41,14 @@ ``` +## 国际化 + +组件内所有展示文案均使用 `trade.*` 与 `activity.live` 键: + +- `trade.orderBook`、`trade.orderBookConnecting`、`trade.orderBookPrice`、`trade.orderBookShares`、`trade.orderBookTotal` +- `trade.orderBookAsks`、`trade.orderBookBids`、`trade.orderBookLast`、`trade.orderBookSpread` +- `activity.live`(实时状态) + ## 扩展方式 1. **点击下单**:点击某行价格时,将价格传入 TradeComponent diff --git a/docs/components/TradeComponent.md b/docs/components/TradeComponent.md index ae63bfd..577dd53 100644 --- a/docs/components/TradeComponent.md +++ b/docs/components/TradeComponent.md @@ -33,6 +33,15 @@ /> ``` +## 国际化 + +Merge/Split 弹窗文案均通过 `trade.*` 键国际化: + +- **Merge 弹窗**:`mergeDialogTitle`、`mergeDialogDesc`、`mergeAvailableShares`、`mergeNoMarket`、`mergeSubmitBtn`;复用 `trade.amount`、`trade.max` +- **Split 弹窗**:`splitDialogTitle`、`splitDialogDesc`、`splitAmountLabel`、`splitNoMarket`、`splitSubmitBtn` + +`mergeDialogDesc`、`splitDialogDesc`、`mergeNoMarket`、`splitNoMarket` 支持 `{yesLabel}`、`{noLabel}` 插值。 + ## 扩展方式 1. **Limit 单**:完善 Limit 模式下的价格输入与下单逻辑 diff --git a/src/api/request.ts b/src/api/request.ts index 1d1f39d..de4af06 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -1,3 +1,5 @@ +import { i18n } from '@/plugins/i18n' + /** * 请求基础 URL,默认 https://api.xtrader.vip,可通过环境变量 VITE_API_BASE_URL 覆盖 */ @@ -49,6 +51,7 @@ export async function get( } const headers: Record = { 'Content-Type': 'application/json', + 'Accept-Language': i18n.global.locale.value as string, ...config?.headers, } const res = await fetch(url.toString(), { method: 'GET', headers }) @@ -69,6 +72,7 @@ export async function post( const url = new URL(path, BASE_URL || window.location.origin) const headers: Record = { 'Content-Type': 'application/json', + 'Accept-Language': i18n.global.locale.value as string, ...config?.headers, } const res = await fetch(url.toString(), { diff --git a/src/components/OrderBook.vue b/src/components/OrderBook.vue index c77b3a3..7e33ad3 100644 --- a/src/components/OrderBook.vue +++ b/src/components/OrderBook.vue @@ -8,7 +8,7 @@ {{ t('activity.live') }} - 连接中... + {{ t('trade.orderBookConnecting') }} $4.4k Vol. mdi-chevron-up @@ -28,9 +28,9 @@
-
PRICE
-
SHARES
-
TOTAL
+
{{ t('trade.orderBookPrice') }}
+
{{ t('trade.orderBookShares') }}
+
{{ t('trade.orderBookTotal') }}
@@ -48,8 +48,8 @@
{{ ask.cumulativeTotal.toFixed(2) }}
-
Asks
-
Bids
+
{{ t('trade.orderBookAsks') }}
+
{{ t('trade.orderBookBids') }}
diff --git a/src/components/TradeComponent.vue b/src/components/TradeComponent.vue index 9932f72..988ebff 100644 --- a/src/components/TradeComponent.vue +++ b/src/components/TradeComponent.vue @@ -1174,7 +1174,7 @@ >
-

Merge shares

+

{{ t('trade.mergeDialogTitle') }}

- Merge a share of {{ yesLabel }} and {{ noLabel }} to get 1 USDC. You can do this to save - cost when trying to get rid of a position. + {{ t('trade.mergeDialogDesc', { yesLabel, noLabel }) }}

- +

- Available shares: {{ availableMergeShares }} - + {{ t('trade.mergeAvailableShares') }} {{ availableMergeShares }} +

- Please select a market first (e.g. click Buy {{ yesLabel }}/{{ noLabel }} on a market). + {{ t('trade.mergeNoMarket', { yesLabel, noLabel }) }}

{{ mergeError }}

@@ -1221,7 +1220,7 @@ :disabled="mergeLoading || mergeAmount <= 0" @click="submitMerge" > - Merge Shares + {{ t('trade.mergeSubmitBtn') }}
@@ -1237,7 +1236,7 @@ >
-

Split

+

{{ t('trade.splitDialogTitle') }}

- Use USDC to get one share of {{ yesLabel }} and one share of {{ noLabel }} for this - market. 1 USDC ≈ 1 complete set. + {{ t('trade.splitDialogDesc', { yesLabel, noLabel }) }}

- +

- Please select a market first (e.g. click Buy {{ yesLabel }}/{{ noLabel }} on a market). + {{ t('trade.splitNoMarket', { yesLabel, noLabel }) }}

{{ splitError }}

@@ -1281,7 +1279,7 @@ :disabled="splitLoading || splitAmount <= 0" @click="submitSplit" > - Split + {{ t('trade.splitSubmitBtn') }}
diff --git a/src/locales/en.json b/src/locales/en.json index 3bde4cd..0e54820 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -21,10 +21,28 @@ "buy": "Buy", "sell": "Sell", "orderBook": "Order Book", + "orderBookConnecting": "Connecting...", + "orderBookPrice": "PRICE", + "orderBookShares": "SHARES", + "orderBookTotal": "TOTAL", + "orderBookAsks": "Asks", + "orderBookBids": "Bids", + "orderBookLast": "Last", + "orderBookSpread": "Spread", "buyLabel": "Trade {label}", "sellLabel": "Sell {label}", "merge": "Merge", + "mergeDialogTitle": "Merge shares", + "mergeDialogDesc": "Merge a share of {yesLabel} and {noLabel} to get 1 USDC. You can do this to save cost when trying to get rid of a position.", + "mergeAvailableShares": "Available shares:", + "mergeNoMarket": "Please select a market first (e.g. click Buy {yesLabel}/{noLabel} on a market).", + "mergeSubmitBtn": "Merge Shares", "split": "Split", + "splitDialogTitle": "Split", + "splitDialogDesc": "Use USDC to get one share of {yesLabel} and one share of {noLabel} for this market. 1 USDC ≈ 1 complete set.", + "splitAmountLabel": "Amount (USDC)", + "splitNoMarket": "Please select a market first (e.g. click Buy {yesLabel}/{noLabel} on a market).", + "splitSubmitBtn": "Split", "market": "Market", "limit": "Limit", "deposit": "Deposit", diff --git a/src/locales/ja.json b/src/locales/ja.json index f9d7a0c..0d7b41c 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -21,10 +21,28 @@ "buy": "買う", "sell": "売る", "orderBook": "オーダーブック", + "orderBookConnecting": "接続中...", + "orderBookPrice": "価格", + "orderBookShares": "数量", + "orderBookTotal": "合計", + "orderBookAsks": "売り", + "orderBookBids": "買い", + "orderBookLast": "最新", + "orderBookSpread": "スプレッド", "buyLabel": "{label}を取引", "sellLabel": "{label}を売る", "merge": "マージ", + "mergeDialogTitle": "シェアをマージ", + "mergeDialogDesc": "{yesLabel} と {noLabel} のシェアを 1 つずつマージすると 1 USDC を獲得できます。ポジションを解消する際のコスト削減に使えます。", + "mergeAvailableShares": "利用可能シェア:", + "mergeNoMarket": "先に市場を選択してください(例:市場の 買 {yesLabel}/{noLabel} をクリック)。", + "mergeSubmitBtn": "シェアをマージ", "split": "スプリット", + "splitDialogTitle": "スプリット", + "splitDialogDesc": "USDC でこの市場の {yesLabel} と {noLabel} のシェアを 1 つずつ獲得できます。1 USDC ≈ 1 セット。", + "splitAmountLabel": "金額 (USDC)", + "splitNoMarket": "先に市場を選択してください(例:市場の 買 {yesLabel}/{noLabel} をクリック)。", + "splitSubmitBtn": "スプリット", "market": "成行", "limit": "指値", "deposit": "入金", diff --git a/src/locales/ko.json b/src/locales/ko.json index 149624f..b5971c3 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -21,10 +21,28 @@ "buy": "매수", "sell": "매도", "orderBook": "호가창", + "orderBookConnecting": "연결 중...", + "orderBookPrice": "가격", + "orderBookShares": "수량", + "orderBookTotal": "합계", + "orderBookAsks": "매도", + "orderBookBids": "매수", + "orderBookLast": "최신", + "orderBookSpread": "스프레드", "buyLabel": "{label} 거래", "sellLabel": "{label} 매도", "merge": "병합", + "mergeDialogTitle": "주식 병합", + "mergeDialogDesc": "{yesLabel} 1주와 {noLabel} 1주를 병합하면 1 USDC를 받습니다. 포지션 청산 시 비용 절감에 사용할 수 있습니다.", + "mergeAvailableShares": "사용 가능 주식:", + "mergeNoMarket": "먼저 시장을 선택하세요 (예: 시장에서 {yesLabel}/{noLabel} 매수 클릭).", + "mergeSubmitBtn": "주식 병합", "split": "분할", + "splitDialogTitle": "분할", + "splitDialogDesc": "USDC로 이 시장의 {yesLabel} 1주와 {noLabel} 1주를 받을 수 있습니다. 1 USDC ≈ 1 세트.", + "splitAmountLabel": "금액 (USDC)", + "splitNoMarket": "먼저 시장을 선택하세요 (예: 시장에서 {yesLabel}/{noLabel} 매수 클릭).", + "splitSubmitBtn": "분할", "market": "시장가", "limit": "지정가", "deposit": "입금", diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json index e2700fd..f3610e6 100644 --- a/src/locales/zh-CN.json +++ b/src/locales/zh-CN.json @@ -21,10 +21,28 @@ "buy": "买入", "sell": "卖出", "orderBook": "订单簿", - "buyLabel": "交易{label}", + "orderBookConnecting": "连接中...", + "orderBookPrice": "价格", + "orderBookShares": "份额", + "orderBookTotal": "合计", + "orderBookAsks": "卖单", + "orderBookBids": "买单", + "orderBookLast": "最新", + "orderBookSpread": "价差", + "buyLabel": "{label} 交易", "sellLabel": "卖{label}", "merge": "合并", + "mergeDialogTitle": "合并份额", + "mergeDialogDesc": "将 1 份 {yesLabel} 和 1 份 {noLabel} 合并可获得 1 USDC。可用于平仓时降低成本。", + "mergeAvailableShares": "可用份额:", + "mergeNoMarket": "请先选择市场(例如点击某市场的买入 {yesLabel}/{noLabel})。", + "mergeSubmitBtn": "合并份额", "split": "拆分", + "splitDialogTitle": "拆分", + "splitDialogDesc": "使用 USDC 可获得 1 份 {yesLabel} 和 1 份 {noLabel}。1 USDC ≈ 1 完整套。", + "splitAmountLabel": "金额 (USDC)", + "splitNoMarket": "请先选择市场(例如点击某市场的买入 {yesLabel}/{noLabel})。", + "splitSubmitBtn": "拆分", "market": "市价", "limit": "限价", "deposit": "入金", @@ -169,4 +187,4 @@ "ja": "日本語", "ko": "한국어" } -} +} \ No newline at end of file diff --git a/src/locales/zh-TW.json b/src/locales/zh-TW.json index 52abb23..8f473f3 100644 --- a/src/locales/zh-TW.json +++ b/src/locales/zh-TW.json @@ -21,10 +21,28 @@ "buy": "買入", "sell": "賣出", "orderBook": "訂單簿", + "orderBookConnecting": "連接中...", + "orderBookPrice": "價格", + "orderBookShares": "份額", + "orderBookTotal": "合計", + "orderBookAsks": "賣單", + "orderBookBids": "買單", + "orderBookLast": "最新", + "orderBookSpread": "價差", "buyLabel": "交易{label}", "sellLabel": "賣{label}", "merge": "合併", + "mergeDialogTitle": "合併份額", + "mergeDialogDesc": "將 1 份 {yesLabel} 和 1 份 {noLabel} 合併可獲得 1 USDC。可用於平倉時降低成本。", + "mergeAvailableShares": "可用份額:", + "mergeNoMarket": "請先選擇市場(例如點擊某市場的買入 {yesLabel}/{noLabel})。", + "mergeSubmitBtn": "合併份額", "split": "拆分", + "splitDialogTitle": "拆分", + "splitDialogDesc": "使用 USDC 可獲得 1 份 {yesLabel} 和 1 份 {noLabel}。1 USDC ≈ 1 完整套。", + "splitAmountLabel": "金額 (USDC)", + "splitNoMarket": "請先選擇市場(例如點擊某市場的買入 {yesLabel}/{noLabel})。", + "splitSubmitBtn": "拆分", "market": "市價", "limit": "限價", "deposit": "入金",