feat: create precious metals by grams and show optional purchase profit
This commit is contained in:
1 parent
027a8c1b6a
commit
0491f515fe
22 files changed
+570
-105
No files matched your search
+102
-35
@@ -253,6 +253,10 @@ export default function App() {
|
||||
[error, setError] = useState(''),
|
||||
[success, setSuccess] = useState('');
|
||||
const [calendarRefresh, setCalendarRefresh] = useState(0);
|
||||
const [newAssetCategory, setNewAssetCategory] = useState(categories.asset[0][0]);
|
||||
useEffect(() => {
|
||||
setNewAssetCategory(categories.asset[0][0]);
|
||||
}, [modal?.kind]);
|
||||
const [quickTransfer, setQuickTransfer] = useState<{
|
||||
sourceId?: string;
|
||||
targetId?: string;
|
||||
@@ -1029,7 +1033,7 @@ export default function App() {
|
||||
</button>
|
||||
</section>
|
||||
)}
|
||||
{!overview.complete && (
|
||||
{!!overview.missing.length && (
|
||||
<div className="notice warning">
|
||||
{tr('缺少')}
|
||||
{overview.missing.join('、')} {tr('到')}
|
||||
@@ -1039,6 +1043,12 @@ export default function App() {
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
{!!overview.missingValuations?.length && (
|
||||
<div className="notice warning">
|
||||
{tr('待估值')}:{overview.missingValuations.map((p) => p.name).join('、')} ·{' '}
|
||||
{tr('缺少报价,当前总额不完整。')}
|
||||
</div>
|
||||
)}
|
||||
<div
|
||||
className="metrics"
|
||||
hidden={
|
||||
@@ -1277,14 +1287,17 @@ export default function App() {
|
||||
{p.archived ? tr(' · 已归档') : ''}
|
||||
</span>
|
||||
<h2 className={positionAmount(p).startsWith('-') ? 'danger-text' : undefined}>
|
||||
{money(positionAmount(p), p.currency)}
|
||||
{p.valuationAvailable === false
|
||||
? tr('待估值')
|
||||
: money(positionAmount(p), p.currency)}
|
||||
{p.metalGrams && <small> · {p.metalGrams} g</small>}
|
||||
</h2>
|
||||
{p.hidden && <span className="badge">{tr('隐藏资产')}</span>}
|
||||
<p className="muted" hidden={p.currency === user.baseCurrency}>
|
||||
{tr('本位币:')}
|
||||
{p.converted !== null
|
||||
? money(positionAmount(p, p.converted || '0'), user.baseCurrency)
|
||||
: tr('缺少汇率')}
|
||||
: tr(p.valuationAvailable === false ? '待估值' : '缺少汇率')}
|
||||
</p>
|
||||
<p className="notes-display">{p.notes || tr('暂无备注')}</p>
|
||||
{(p.included === false ||
|
||||
@@ -1548,12 +1561,15 @@ export default function App() {
|
||||
positionAmount(p).startsWith('-') ? 'danger-text' : undefined
|
||||
}
|
||||
>
|
||||
{money(positionAmount(p), p.currency)}
|
||||
{p.valuationAvailable === false
|
||||
? tr('待估值')
|
||||
: money(positionAmount(p), p.currency)}
|
||||
{p.metalGrams && <small> · {p.metalGrams} g</small>}
|
||||
</strong>
|
||||
<small hidden={p.currency === user.baseCurrency}>
|
||||
{tr('折合')}{' '}
|
||||
{p.converted === null
|
||||
? tr('缺少汇率')
|
||||
? tr(p.valuationAvailable === false ? '待估值' : '缺少汇率')
|
||||
: money(positionAmount(p, p.converted || '0'), user.baseCurrency)}
|
||||
</small>
|
||||
</button>
|
||||
@@ -2659,6 +2675,24 @@ export default function App() {
|
||||
}),
|
||||
tr('项目资料已保存'),
|
||||
);
|
||||
} else if (kind === 'asset' && v.category === 'gold') {
|
||||
void act(
|
||||
() =>
|
||||
api('/metals/holdings', 'POST', {
|
||||
name: v.name,
|
||||
currency: v.currency,
|
||||
notes: v.notes,
|
||||
date: v.date,
|
||||
metalType: v.metalType,
|
||||
metalGrams: v.metalGrams,
|
||||
metalPurity: v.metalPurity,
|
||||
metalCostPerGram: v.metalCostPerGram || null,
|
||||
autoValuation: true,
|
||||
hidden: f.has('hidden'),
|
||||
included: f.has('included'),
|
||||
}),
|
||||
tr('项目已添加'),
|
||||
);
|
||||
} else {
|
||||
const category = String(v.category),
|
||||
side =
|
||||
@@ -2742,6 +2776,7 @@ export default function App() {
|
||||
<Field label={tr('类别')}>
|
||||
<select
|
||||
name="category"
|
||||
onChange={(e) => setNewAssetCategory(e.target.value)}
|
||||
defaultValue={modal.p?.category || categories[modal.kind]?.[0][0]}
|
||||
>
|
||||
{categories[modal.p?.kind || modal.kind].map(([v, label]) => (
|
||||
@@ -2782,37 +2817,69 @@ export default function App() {
|
||||
</select>
|
||||
</Field>
|
||||
)}
|
||||
{['account', 'asset', 'debt', 'revision', 'correction'].includes(modal.kind) && (
|
||||
<Field
|
||||
label={
|
||||
tr(
|
||||
modal.p?.kind === 'debt'
|
||||
? '剩余本金'
|
||||
: modal.p?.kind === 'asset'
|
||||
? '当前估值'
|
||||
: '当前余额',
|
||||
) + (modal.p ? '(' + modal.p.currency + ')' : '')
|
||||
}
|
||||
>
|
||||
<input
|
||||
name="amount"
|
||||
inputMode="decimal"
|
||||
required
|
||||
pattern={
|
||||
modal.p?.kind === 'account' || modal.kind === 'account'
|
||||
? '-?(0|[1-9][0-9]{0,15})(\\.[0-9]{1,8})?'
|
||||
: '(0|[1-9][0-9]{0,15})(\\.[0-9]{1,8})?'
|
||||
{['account', 'asset', 'debt', 'revision', 'correction'].includes(modal.kind) &&
|
||||
!(modal.kind === 'asset' && newAssetCategory === 'gold') && (
|
||||
<Field
|
||||
label={
|
||||
tr(
|
||||
modal.p?.kind === 'debt'
|
||||
? '剩余本金'
|
||||
: modal.p?.kind === 'asset'
|
||||
? '当前估值'
|
||||
: '当前余额',
|
||||
) + (modal.p ? '(' + modal.p.currency + ')' : '')
|
||||
}
|
||||
defaultValue={
|
||||
modal.p
|
||||
? accountInputAmount(modal.p, modal.h?.after || modal.p.amount)
|
||||
: modal.kind === 'debt'
|
||||
? '0'
|
||||
: ''
|
||||
}
|
||||
placeholder="0.00"
|
||||
/>
|
||||
</Field>
|
||||
>
|
||||
<input
|
||||
name="amount"
|
||||
inputMode="decimal"
|
||||
required
|
||||
pattern={
|
||||
modal.p?.kind === 'account' || modal.kind === 'account'
|
||||
? '-?(0|[1-9][0-9]{0,15})(\\.[0-9]{1,8})?'
|
||||
: '(0|[1-9][0-9]{0,15})(\\.[0-9]{1,8})?'
|
||||
}
|
||||
defaultValue={
|
||||
modal.p
|
||||
? accountInputAmount(modal.p, modal.h?.after || modal.p.amount)
|
||||
: modal.kind === 'debt'
|
||||
? '0'
|
||||
: ''
|
||||
}
|
||||
placeholder="0.00"
|
||||
/>
|
||||
</Field>
|
||||
)}
|
||||
{modal.kind === 'asset' && newAssetCategory === 'gold' && (
|
||||
<>
|
||||
<Field label={tr('贵金属品种')}>
|
||||
<select name="metalType">
|
||||
<option value="gold">{tr('黄金')}</option>
|
||||
<option value="silver">{tr('白银')}</option>
|
||||
</select>
|
||||
</Field>
|
||||
<Field label={tr('重量(克)')}>
|
||||
<input
|
||||
name="metalGrams"
|
||||
required
|
||||
inputMode="decimal"
|
||||
pattern="(0|[1-9][0-9]{0,15})([.][0-9]{1,8})?"
|
||||
/>
|
||||
</Field>
|
||||
<Field label={tr('纯度(0–1,例如 0.999)')}>
|
||||
<input name="metalPurity" required defaultValue="1" inputMode="decimal" />
|
||||
</Field>
|
||||
<Field label={tr('买入价(每克,选填)')}>
|
||||
<input
|
||||
name="metalCostPerGram"
|
||||
inputMode="decimal"
|
||||
pattern="(0|[1-9][0-9]{0,11})([.][0-9]{1,12})?"
|
||||
/>
|
||||
</Field>
|
||||
<p className="muted">
|
||||
{tr('按克数添加,参考价自动估值;缺少报价时显示待估值,不计为已知零价值。')}
|
||||
</p>
|
||||
</>
|
||||
)}
|
||||
{['account', 'asset', 'debt', 'revision', 'correction'].includes(modal.kind) && (
|
||||
<Field label={tr('记录时间(UTC+8)')}>
|
||||
|
||||
@@ -87,7 +87,8 @@ export function MetalPanel({
|
||||
String(position.metalGrams) +
|
||||
String(position.autoValuation) +
|
||||
String(position.metalPurity) +
|
||||
String(position.metalType)
|
||||
String(position.metalType) +
|
||||
String(position.metalCostPerGram)
|
||||
}
|
||||
onSubmit={(e) => {
|
||||
e.preventDefault();
|
||||
@@ -97,6 +98,7 @@ export function MetalPanel({
|
||||
api('/metals/' + position.id, 'PUT', {
|
||||
metalType: f.get('metalType'),
|
||||
metalGrams: f.get('metalGrams'),
|
||||
metalCostPerGram: f.get('metalCostPerGram') || null,
|
||||
metalPurity: f.get('metalPurity'),
|
||||
autoValuation: f.has('autoValuation'),
|
||||
}),
|
||||
@@ -133,6 +135,25 @@ export function MetalPanel({
|
||||
defaultValue={position.metalPurity || '1'}
|
||||
/>
|
||||
</label>
|
||||
<label>
|
||||
{tr('买入价(每克,选填)')}({position.currency})
|
||||
<input
|
||||
name="metalCostPerGram"
|
||||
inputMode="decimal"
|
||||
defaultValue={position.metalCostPerGram || ''}
|
||||
pattern="(0|[1-9][0-9]{0,11})([.][0-9]{1,12})?"
|
||||
/>
|
||||
</label>
|
||||
<p className="muted">
|
||||
{tr('买入成本按实物总克数计算;参考估值按克数和纯度计算。清空买入价后不显示盈亏。')}
|
||||
</p>
|
||||
{position.metalCost != null && (
|
||||
<p>
|
||||
{tr('买入成本')}:{position.metalCost} {position.currency} · {tr('估值盈亏')}:
|
||||
{position.metalProfit ?? tr('待估值')}{' '}
|
||||
{position.metalProfit != null ? position.currency : ''}
|
||||
</p>
|
||||
)}
|
||||
<label className="check-line">
|
||||
<input type="checkbox" name="autoValuation" defaultChecked={position.autoValuation} />
|
||||
{tr('随参考价自动记录估值')}
|
||||
|
||||
@@ -53,6 +53,10 @@ export type History = {
|
||||
export type Position = {
|
||||
included?: boolean;
|
||||
metalType?: string | null;
|
||||
metalCostPerGram?: string | null;
|
||||
metalCost?: string | null;
|
||||
metalProfit?: string | null;
|
||||
valuationAvailable?: boolean;
|
||||
metalGrams?: string | null;
|
||||
metalPurity?: string;
|
||||
autoValuation?: boolean;
|
||||
@@ -79,6 +83,7 @@ export type Total = {
|
||||
net: string;
|
||||
complete: boolean;
|
||||
missing: string[];
|
||||
missingValuations?: { id: string; name: string }[];
|
||||
balanceChange?: string | null;
|
||||
fxChange?: string | null;
|
||||
};
|
||||
|
||||
@@ -551,5 +551,12 @@
|
||||
"正在更新贵金属参考价": "Updating reference prices",
|
||||
"贵金属价格更新失败,已有价格与估值已保留,可手动录价": "Price update failed. Previous prices and values are preserved; you can enter prices manually.",
|
||||
"请先创建至少两个启用中的账户。隐藏账户需验证密码后才能选择。": "Create at least two active accounts. Unlock hidden accounts before selecting them.",
|
||||
"请选择启用的账户": "Choose an active account"
|
||||
"请选择启用的账户": "Choose an active account",
|
||||
"买入价(每克,选填)": "Purchase price per gram (optional)",
|
||||
"买入成本按实物总克数计算;参考估值按克数和纯度计算。清空买入价后不显示盈亏。": "Cost uses total physical grams; valuation uses grams and purity. Clear purchase price to hide profit/loss.",
|
||||
"买入成本": "Purchase cost",
|
||||
"估值盈亏": "Valuation profit/loss",
|
||||
"待估值": "Awaiting valuation",
|
||||
"按克数添加,参考价自动估值;缺少报价时显示待估值,不计为已知零价值。": "Add by grams with automatic market valuation. Missing quotes mean awaiting valuation, not a known zero value.",
|
||||
"缺少报价,当前总额不完整。": "Quotes are missing; current totals are incomplete."
|
||||
}
|
||||
@@ -438,11 +438,11 @@
|
||||
"配对记录不完整,无法重算": "配對記錄不完整,無法重算",
|
||||
"资金操作之前必须保留一条余额记录": "資金操作之前必須保留一條餘額記錄",
|
||||
"修改后债务或资产金额不能为负数": "修改後債務或資產金額不能為負數",
|
||||
"重算后的金额超出支持范围": "重算後的金額超出支援範圍",
|
||||
"重算后的金额超出支持范围": "重算後的金額超出支持範圍",
|
||||
"请在资金往来中修改完整配对记录": "請在資金往來中修改完整配對記錄",
|
||||
"请在资金往来中删除完整配对记录": "請在資金往來中刪除完整配對記錄",
|
||||
"资金往来记录不存在": "資金往來記錄不存在",
|
||||
"修改记录不能更换账户或操作类型,请删除后重新创建": "修改記錄不能更換賬戶或操作類型,請刪除後重新建立",
|
||||
"修改记录不能更换账户或操作类型,请删除后重新创建": "修改記錄不能更換賬戶或操作類型,請刪除後重新創建",
|
||||
"修改": "修改",
|
||||
"统计粒度": "統計粒度",
|
||||
"删除记录": "刪除記錄",
|
||||
@@ -451,57 +451,57 @@
|
||||
"这条记录将被删除,并重算后续余额。": "這條記錄將被刪除,並重算後續餘額。",
|
||||
"删除后无法撤销,请确认已保存所需备份。": "刪除後無法撤銷,請確認已保存所需備份。",
|
||||
"账号与密码": "賬號與密碼",
|
||||
"修改后其他登录会话将退出,当前会话保持登录。": "修改後其他登入會話將退出,目前會話保持登入。",
|
||||
"当前密码": "目前密碼",
|
||||
"修改后其他登录会话将退出,当前会话保持登录。": "修改後其他登錄會話將退出,當前會話保持登錄。",
|
||||
"当前密码": "當前密碼",
|
||||
"新密码(不修改请留空)": "新密碼(不修改請留空)",
|
||||
"确认新密码": "確認新密碼",
|
||||
"两次输入的新密码不一致": "兩次輸入的新密碼不一致",
|
||||
"账号与密码已更新": "賬號與密碼已更新",
|
||||
"当前密码错误": "目前密碼錯誤",
|
||||
"当前密码错误": "當前密碼錯誤",
|
||||
"请填写新的账号或密码": "請填寫新的賬號或密碼",
|
||||
"账号已变更,请重新登录后操作": "賬號已變更,請重新登入後操作",
|
||||
"账号已变更,请重新登录后操作": "賬號已變更,請重新登錄後操作",
|
||||
"备份下载失败": "備份下載失敗",
|
||||
"备份文件格式错误": "備份檔案格式錯誤",
|
||||
"备份文件为空": "備份檔案為空",
|
||||
"备份已生成,请确认文件已保存": "備份已產生,請確認檔案已保存",
|
||||
"备份文件格式错误": "備份文件格式錯誤",
|
||||
"备份文件为空": "備份文件為空",
|
||||
"备份已生成,请确认文件已保存": "備份已生成,請確認文件已保存",
|
||||
"溢缴存款": "溢繳存款",
|
||||
"信用卡、贷款账户:负数为欠款,正数为溢缴存款;其余账户按实际余额填写。": "信用卡、貸款賬戶:負數為欠款,正數為溢繳存款;其餘賬戶按實際餘額填寫。",
|
||||
"负数表示欠款,正数表示溢缴存款;溢缴部分计入总资产。": "負數表示欠款,正數表示溢繳存款;溢繳部分計入總資產。",
|
||||
"仅账户支持负余额": "僅賬戶支援負餘額",
|
||||
"仅账户支持负余额": "僅賬戶支持負餘額",
|
||||
"分组排序": "分組排序",
|
||||
"上移": "上移",
|
||||
"下移": "下移",
|
||||
"分组顺序已保存": "分組順序已儲存",
|
||||
"分组顺序已保存": "分組順序已保存",
|
||||
"分组不可重复": "分組不可重複",
|
||||
"调整账户分组顺序,账户页和选择弹窗会同步使用。": "調整帳戶分組順序,帳戶頁和選擇彈窗會同步使用。",
|
||||
"拖动手柄调整顺序,也可聚焦手柄后使用方向键。保存后同步到账户页和选择弹窗。": "拖動手柄調整順序,也可聚焦手柄後使用方向鍵。儲存後同步到帳戶頁和選擇彈窗。",
|
||||
"账户分组顺序": "帳戶分組順序",
|
||||
"调整账户分组顺序,账户页和选择弹窗会同步使用。": "調整賬戶分組順序,賬戶頁和選擇彈窗會同步使用。",
|
||||
"拖动手柄调整顺序,也可聚焦手柄后使用方向键。保存后同步到账户页和选择弹窗。": "拖動手柄調整順序,也可聚焦手柄後使用方向鍵。保存後同步到賬戶頁和選擇彈窗。",
|
||||
"账户分组顺序": "賬戶分組順序",
|
||||
"拖动分组": "拖動分組",
|
||||
"已取消拖拽": "已取消拖曳",
|
||||
"常规设置": "一般設定",
|
||||
"显示与菜单": "顯示與選單",
|
||||
"登录与隐私": "登入與私隱",
|
||||
"导航菜单": "導覽選單",
|
||||
"设置已保存": "設定已儲存",
|
||||
"已取消拖拽": "已取消拖拽",
|
||||
"常规设置": "常規設置",
|
||||
"显示与菜单": "顯示與菜單",
|
||||
"登录与隐私": "登錄與隱私",
|
||||
"导航菜单": "導航菜單",
|
||||
"设置已保存": "設置已保存",
|
||||
"总览显示卡片": "總覽顯示卡片",
|
||||
"选择资产总览需要显示的卡片,数据和记录仍会保留。": "選擇資產總覽需要顯示的卡片,資料和記錄仍會保留。",
|
||||
"登录有效期(小时)": "登入有效期(小時)",
|
||||
"范围 1 小时至 30 天(720 小时)。保存后当前登录重新计时,其他会话沿用原到期时间;后续登录使用新设置。": "範圍 1 小時至 30 天(720 小時)。儲存後目前登入重新計時,其他會話沿用原到期時間;後續登入使用新設定。",
|
||||
"当前会话到期:": "目前會話到期:",
|
||||
"选择资产总览需要显示的卡片,数据和记录仍会保留。": "選擇資產總覽需要顯示的卡片,數據和記錄仍會保留。",
|
||||
"登录有效期(小时)": "登錄有效期(小時)",
|
||||
"范围 1 小时至 30 天(720 小时)。保存后当前登录重新计时,其他会话沿用原到期时间;后续登录使用新设置。": "範圍 1 小時至 30 天(720 小時)。保存後當前登錄重新計時,其他會話沿用原到期時間;後續登錄使用新設置。",
|
||||
"当前会话到期:": "當前會話到期:",
|
||||
"查看隐藏项目需要密码": "查看隱藏項目需要密碼",
|
||||
"关闭后,已登录账号可直接显示隐藏项目。每次显示持续 5 分钟,也可手动锁定;保存此设置会锁定所有会话的隐藏项目。": "關閉後,已登入帳號可直接顯示隱藏項目。每次顯示持續 5 分鐘,也可手動鎖定;儲存此設定會鎖定所有會話的隱藏項目。",
|
||||
"关闭后,已登录账号可直接显示隐藏项目。每次显示持续 5 分钟,也可手动锁定;保存此设置会锁定所有会话的隐藏项目。": "關閉後,已登錄賬號可直接顯示隱藏項目。每次顯示持續 5 分鐘,也可手動鎖定;保存此設置會鎖定所有會話的隱藏項目。",
|
||||
"隐藏项目已显示": "隱藏項目已顯示",
|
||||
"显示隐藏项目": "顯示隱藏項目",
|
||||
"当前包含隐藏项目 · 5 分钟后自动锁定": "目前包含隱藏項目 · 5 分鐘後自動鎖定",
|
||||
"当前包含隐藏项目 · 5 分钟后自动锁定": "當前包含隱藏項目 · 5 分鐘後自動鎖定",
|
||||
"尚未选择总览卡片": "尚未選擇總覽卡片",
|
||||
"设置显示卡片": "設定顯示卡片",
|
||||
"设置显示卡片": "設置顯示卡片",
|
||||
"修改计划": "修改計劃",
|
||||
"下次执行时间": "下次執行時間",
|
||||
"计划已保存": "計劃已儲存",
|
||||
"计划已保存": "計劃已保存",
|
||||
"操作提示": "操作提示",
|
||||
"快速转账": "快速轉賬",
|
||||
"重选": "重選",
|
||||
"按当前时间记录,手续费为 0。跨币种请填写实际到账金额。": "按目前時間記錄,手續費為 0。跨幣種請填寫實際到賬金額。",
|
||||
"按当前时间记录,手续费为 0。跨币种请填写实际到账金额。": "按當前時間記錄,手續費為 0。跨幣種請填寫實際到賬金額。",
|
||||
"关闭快速转账": "關閉快速轉賬",
|
||||
"点击账户卡片选择转出账户": "點擊賬戶卡片選擇轉出賬戶",
|
||||
"转出账户:": "轉出賬戶:",
|
||||
@@ -516,10 +516,10 @@
|
||||
"清除本账号全部账户、资产、债务、历史、私有图标和汇率(包括隐藏资产);保留登录账号、个人设置和已发布的共享图标。请先下载备份并确认文件已保存。": "清除本賬號全部賬戶、資產、債務、歷史、私有圖標和匯率(包括隱藏資產);保留登錄賬號、個人設置和已發佈的共享圖標。請先下載備份並確認文件已保存。",
|
||||
"隐藏资产已解锁 5 分钟": "隱藏資產已解鎖 5 分鐘",
|
||||
"查看隐藏资产需要密码": "查看隱藏資產需要密碼",
|
||||
"关闭后,已登录账号可直接显示隐藏资产。每次显示持续 5 分钟,也可手动锁定;保存此设置会锁定所有会话的隐藏资产。": "關閉後,已登入帳號可直接顯示隱藏資產。每次顯示持續 5 分鐘,也可手動鎖定;儲存此設定會鎖定所有會話的隱藏資產。",
|
||||
"关闭后,已登录账号可直接显示隐藏资产。每次显示持续 5 分钟,也可手动锁定;保存此设置会锁定所有会话的隐藏资产。": "關閉後,已登錄賬號可直接顯示隱藏資產。每次顯示持續 5 分鐘,也可手動鎖定;保存此設置會鎖定所有會話的隱藏資產。",
|
||||
"隐藏资产已显示": "隱藏資產已顯示",
|
||||
"显示隐藏资产": "顯示隱藏資產",
|
||||
"当前包含隐藏资产 · 5 分钟后自动锁定": "目前包含隱藏資產 · 5 分鐘後自動鎖定",
|
||||
"当前包含隐藏资产 · 5 分钟后自动锁定": "當前包含隱藏資產 · 5 分鐘後自動鎖定",
|
||||
"独立资产计入总览": "獨立資產計入總覽",
|
||||
"关闭后,独立资产不参与总额和净资产轨迹,资料与历史仍保留。": "關閉後,獨立資產不參與總額和淨資產軌跡,資料與歷史仍保留。",
|
||||
"计入资产总览": "計入資產總覽",
|
||||
@@ -533,23 +533,30 @@
|
||||
"重量(克)": "重量(克)",
|
||||
"纯度(0–1,例如 0.999)": "純度(0–1,例如 0.999)",
|
||||
"随参考价自动记录估值": "隨參考價自動記錄估值",
|
||||
"保存估价设置": "儲存估價設定",
|
||||
"保存估价设置": "保存估價設置",
|
||||
"开启后,每日价格更新会新增估值历史;已有历史不会改写。关闭后可手动应用估价。": "開啟後,每日價格更新會新增估值歷史;已有歷史不會改寫。關閉後可手動應用估價。",
|
||||
"刷新贵金属价格": "更新貴金屬價格",
|
||||
"刷新贵金属价格": "刷新貴金屬價格",
|
||||
"应用估价": "應用估價",
|
||||
"参考价": "參考價",
|
||||
"克": "克",
|
||||
"手动录入贵金属价格": "手動輸入貴金屬價格",
|
||||
"手动录入贵金属价格": "手動錄入貴金屬價格",
|
||||
"每克纯金属价格": "每克純金屬價格",
|
||||
"报价日期": "報價日期",
|
||||
"保存参考价": "儲存參考價",
|
||||
"贵金属估价设置已保存": "貴金屬估價設定已儲存",
|
||||
"保存参考价": "保存參考價",
|
||||
"贵金属估价设置已保存": "貴金屬估價設置已保存",
|
||||
"贵金属参考价已更新": "貴金屬參考價已更新",
|
||||
"估价已记入历史": "估價已記入歷史",
|
||||
"贵金属价格已保存": "貴金屬價格已儲存",
|
||||
"当前没有已设置重量的贵金属资产": "目前沒有已設定重量的貴金屬資產",
|
||||
"贵金属价格已保存": "貴金屬價格已保存",
|
||||
"当前没有已设置重量的贵金属资产": "當前沒有已設置重量的貴金屬資產",
|
||||
"正在更新贵金属参考价": "正在更新貴金屬參考價",
|
||||
"贵金属价格更新失败,已有价格与估值已保留,可手动录价": "貴金屬價格更新失敗,已有價格與估值已保留,可手動輸入價格",
|
||||
"请先创建至少两个启用中的账户。隐藏账户需验证密码后才能选择。": "請先建立至少兩個啟用中的賬戶。隱藏賬戶需驗證密碼後才能選擇。",
|
||||
"请选择启用的账户": "請選擇啟用的賬戶"
|
||||
"贵金属价格更新失败,已有价格与估值已保留,可手动录价": "貴金屬價格更新失敗,已有價格與估值已保留,可手動錄價",
|
||||
"请先创建至少两个启用中的账户。隐藏账户需验证密码后才能选择。": "請先創建至少兩個啟用中的賬戶。隱藏賬戶需驗證密碼後才能選擇。",
|
||||
"请选择启用的账户": "請選擇啟用的賬戶",
|
||||
"买入价(每克,选填)": "買入價(每克,選填)",
|
||||
"买入成本按实物总克数计算;参考估值按克数和纯度计算。清空买入价后不显示盈亏。": "買入成本按實物總克數計算;參考估值按克數和純度計算。清空買入價後不顯示盈虧。",
|
||||
"买入成本": "買入成本",
|
||||
"估值盈亏": "估值盈虧",
|
||||
"待估值": "待估值",
|
||||
"按克数添加,参考价自动估值;缺少报价时显示待估值,不计为已知零价值。": "按克數添加,參考價自動估值;缺少報價時顯示待估值,不計為已知零價值。",
|
||||
"缺少报价,当前总额不完整。": "缺少報價,當前總額不完整。"
|
||||
}
|
||||
Reference in new issue
Block a user