DebuggerX 4 years ago
parent d7f9f7068e
commit e6fd3f33e5

5
.gitignore vendored

@ -32,3 +32,8 @@ yarn-error.log*
# vercel
.vercel
.idea/
lib/keys.ts
.vscode/
yarn.lock

1
next-env.d.ts vendored

@ -1,2 +1,3 @@
/// <reference types="next" />
/// <reference types="next/types/global" />
/// <reference types="next/image-types/global" />

@ -1,3 +1,8 @@
module.exports = {
reactStrictMode: true,
i18n: {
locales: ['zh_TW', 'zh_CN', 'en'],
defaultLocale: 'zh_TW',
localeDetection: true,
},
}

@ -6,10 +6,13 @@
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
"lint": "next lint",
"genI18nKeys": "node ./tools/genI18nKeys.js"
},
"dependencies": {
"next": "11.0.1",
"next-cookies": "^2.0.3",
"next-intl": "^1.4.1",
"react": "17.0.2",
"react-dom": "17.0.2"
},

@ -1,7 +1,34 @@
import '../styles/globals.css'
import type { AppProps } from 'next/app'
import App, { AppContext, AppProps } from "next/app";
import { NextIntlProvider } from "next-intl";
import { useRouter } from "next/router";
import cookies from "next-cookies";
function MyApp({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />
}
export default MyApp
const twMessages = require(`../public/h5_assets/messages/zh_TW/common.json`);
const cnMessages = require(`../public/h5_assets/messages/zh_CN/common.json`);
const MyApp = ({ Component, pageProps }: AppProps) => {
let router = useRouter();
return (
<NextIntlProvider
messages={(pageProps.lang ?? router.locale) === "zh_CN" ? { ...cnMessages } : { ...twMessages }}
>
<Component {...pageProps} />
</NextIntlProvider>
);
};
MyApp.getInitialProps = async (props: AppContext) => {
const NEXT_LOCALE = cookies(props.ctx)["NEXT_LOCALE"];
const appProps = await App.getInitialProps(props);
appProps.pageProps = {
...appProps.pageProps,
lang: NEXT_LOCALE,
};
return { ...appProps };
};
export default MyApp;

@ -1,13 +0,0 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from 'next'
type Data = {
name: string
}
export default function handler(
req: NextApiRequest,
res: NextApiResponse<Data>
) {
res.status(200).json({ name: 'John Doe' })
}

@ -1,69 +1,18 @@
import Head from 'next/head'
import Image from 'next/image'
import styles from '../styles/Home.module.css'
import React from "react";
import { useTranslations } from "next-intl";
import { KEYS } from "../lib/keys";
export default function Home() {
return (
<div className={styles.container}>
<Head>
<title>Create Next App</title>
<meta name="description" content="Generated by create next app" />
<link rel="icon" href="/favicon.ico" />
</Head>
<main className={styles.main}>
<h1 className={styles.title}>
Welcome to <a href="https://nextjs.org">Next.js!</a>
</h1>
<p className={styles.description}>
Get started by editing{' '}
<code className={styles.code}>pages/index.js</code>
</p>
<div className={styles.grid}>
<a href="https://nextjs.org/docs" className={styles.card}>
<h2>Documentation &rarr;</h2>
<p>Find in-depth information about Next.js features and API.</p>
</a>
const IndexPage: React.FC = () => {
let t = useTranslations();
<a href="https://nextjs.org/learn" className={styles.card}>
<h2>Learn &rarr;</h2>
<p>Learn about Next.js in an interactive course with quizzes!</p>
</a>
<a
href="https://github.com/vercel/next.js/tree/master/examples"
className={styles.card}
>
<h2>Examples &rarr;</h2>
<p>Discover and deploy boilerplate example Next.js projects.</p>
</a>
return (
<div>
{
t(KEYS.UI$bloodGlucose$about)
}
</div>
);
};
<a
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
className={styles.card}
>
<h2>Deploy &rarr;</h2>
<p>
Instantly deploy your Next.js site to a public URL with Vercel.
</p>
</a>
</div>
</main>
<footer className={styles.footer}>
<a
href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
Powered by{' '}
<span className={styles.logo}>
<Image src="/vercel.svg" alt="Vercel Logo" width={72} height={16} />
</span>
</a>
</footer>
</div>
)
}
export default IndexPage;

@ -0,0 +1,18 @@
import React from "react";
import { useTranslations } from "next-intl";
import { KEYS } from "../../lib/keys";
const IndexPage: React.FC = () => {
let t = useTranslations();
return (
<div>
{
t(KEYS.UI$tabs$quota, { p: 9 })
}
</div>
);
};
export default IndexPage;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

@ -0,0 +1,272 @@
{
"test_polar": "Test polar chart",
"test_egc": "Test egc chart",
"test_heart_health": "Test heart health",
"UI": {
"button_next": "Next",
"button_pre": "Previous",
"button_send": "Sent",
"questionnaire": {
"header": "According to the feeling at the moment, please observe whether you have the following symptoms or conditions? Please check at least one before the next step. After confirmation, you cannot modify it!",
"option_none": "None of the above symptoms"
},
"login": {
"uid_hint": "Please input your user ID",
"passwd_hint": "Please input your password",
"btn_login": "Get Started"
},
"health_params": {
"input_hint": {
"sdnn": "Please input SDNN",
"hf": "Please input HF",
"lf": "Please input LF",
"vlf": "Please input VLF",
"lf_o": "Please input Origin LF",
"hf_o": "Please input Origin HF",
"tp": "Please input TP",
"age": "Please input age",
"ecg_id": "Please enter the ECG report ID:",
"ecg_id_error": "Enter is incorrect, please check"
},
"submit": "Submit",
"input_id": "Input ID"
},
"tabs": {
"params": "Params",
"health_strength": "Health Strength",
"problem_analysis": "Problem Analysis",
"physique_analysis": "Physique Analysis",
"quota": "The quota remain this week: {{p}}"
},
"physique_analysis": {
"suggestion": "Suggestion:",
"title": "Scientific physical analysis"
},
"health_strength": {
"health": "Health Strength {{p}}",
"hint": "The ability of today's body to function comprehensively",
"repair": "Repair power {{p}}",
"antistress": "Anti-stress power {{p}}",
"endurance": "Endurance power {{p}}",
"resistance": "Resistance power {{p}}",
"label": {
"antistress": "Pressure index",
"endurance": "Life Index",
"health": "Health intensity",
"repair": "Repair Index",
"resistance": "Resistance index",
"physique": "Physique"
},
"priority": "Priority conditioning",
"physique": "{{t}} Physique"
},
"problem_analysis": {
"title": "Real-time physiological status analysis",
"subtitle": "The real-time physiological status analysis shows that the body function load or abnormality at the time of detection may be caused by a short-term phenomenon or a long-term accumulation. It is recommended that multiple tests and timely intervention and improvement are recommended to ensure maintenance of health and avoid injury from the lesion.",
"emergency": "Emergency Problems",
"system": "System Functions",
"health": "Health Risks",
"life": "Life Risks",
"emergency_desc": "Indicates possible recent problems\nwhich need to be actively dealt with to avoid cumulative damage",
"health_desc": "Indicates that the physiological abnormality has been caused\nIt is recommended to observe carefully or go to a specialist for examination",
"life_desc": "Indicates recent bad behavior\nif it is not immediately improved, it will cause health risks",
"system_desc": "Indicates the current status of the autonomic nerve\nwhich is used to coordinate the operation of various organs in the body"
},
"what_happened": {
"title_questionnaire": "Please click on the instructions according to the body's feelings.",
"title_problems": "According to the analysis, you may have problems",
"title_looks_fine": "No big problem!",
"looks_fine_dialog_content": "There is no big problem now!\nIt is recommended to drink a glass of water, let the body take a while\nIf there is something uncomfortable, it may be just a short phenomenon.\nAfter 30 minutes, measure it again, see\nHow is the body feel!",
"what_happened_msg": "What's wrong with me?",
"title_measure_time": "measure time",
"title_recently_ten_result": "Recently 10 analysis results",
"title_improve_ways": "I can improve {{type}} through the following ways"
},
"button_close": "shut down",
"warning_info": {
"happened_time": "Abnormal time",
"echarts_table": {
"echarts_1_title": "Sinus rhythm",
"echarts_2_title": "autonomic frequency map",
"echarts_1_subtitle": "RRI Scatter",
"echarts_2_subtitle": "AR-Power Spectral \n[Non-detrend]"
},
"form_table": {
"table_1_header": "time domain analysis",
"table_2_header": "sectrum analysis"
},
"heart_rate_title": "Instant ECG",
"average_bpm": "Average heartbeat:",
"max_bpm": "Maximum heartbeat:",
"min_bpm": "Minority heartbeat:"
},
"button_last_10_record": "Nearly 10",
"button_last_30_record": "Nearly 30",
"button_last_90_record": "Nearly 90",
"button_custom": "customize",
"hrv_report": {
"title": "Heart rate variability change trend",
"hrv_chart": {
"title": "Heart rate variant ms",
"comment_start": "Note:",
"comment_green": "green",
"comment_yellow": "yellow",
"comment_red": "red",
"comment_red_content": "more attention is needed within the scope.",
"comment_yellow_content": "need to pay attention within the scope,",
"comment_green_content": "The range is relatively safe (0.75 ~ 2.5)"
},
"action": {
"measure_time": "Measurement time:",
"detail_title": "Heart rate variant:",
"detail_show": "When the data details",
"detail_delete": "delete data"
},
"empty_content": "You haven't discharged it yet."
},
"ans_report": {
"title": "Self-discipline nerve trend",
"chart_2_title": "Self-discipline",
"chart_1_title": "Sype sense nerve LF",
"chart_1_subtitle": "Deputy-seniary nerve HF",
"chart_2_label": "Self-discipline neurodus:"
},
"health_risk_rank": {
"title": "Health risk ranking analysis",
"selector": {
"month": {
"month": "month",
"January": "January",
"February": "February",
"March": "March",
"April": "April",
"May": "May",
"June": "June",
"July": "July",
"August": "August",
"September": "September",
"October": "October",
"November": "November",
"December": "December"
},
"year": "year",
"season": {
"season_1": "first season",
"season_2": "second season",
"season_3": "third season",
"season_4": "fourth season",
"season": "season"
}
}
},
"health_friends": {
"menu": {
"add": "add friend",
"message": "Invitation notice",
"manage": "Manage healthy friends"
},
"add": {
"title": "Add health friend",
"hint": "Please enter the account you want to add",
"button": "Sent an invitation",
"msg": "Send invitation ~"
},
"invitation_msg": {
"title": "Invitation notice",
"your_friend": "Your friend",
"want_watch": "Want to view your health data",
"agreed": "approved",
"denied": "rejected"
},
"manage": {
"follower": "Care about me\nHealthy friend",
"following": "I care about it.\nHealthy friend"
},
"list": {
"title": "Friends List"
},
"report": {
"health_warning_title": "Health alert"
},
"hint": "prompt:",
"no_friends_hint": "You haven't added healthy friends yet!\nGo and click on the avatar."
},
"button_last_10_day": "Nearly 10 days",
"button_last_30_day": "Nearly 30 days",
"button_last_90_day": "Near 90 days",
"button_agree": "Agree",
"button_deny": "Deny",
"blood_glucose": {
"basic": {
"type": {
"empty_stomach_10_hour": "Empty stomach 10 hours",
"30min_before_sleep": "30 minutes before going to bed",
"random_measure": "Random measurement",
"30min_before_sleep_remark": "What have you eaten within an hour before going to bed? Is there a fasting?",
"empty_stomach_10_hour_remark": "Last night, is it? Have you taking medicine?",
"random_measure_remark": "Why is this information?"
},
"single_day_report": {
"title": "Single-day change",
"empty_content": "There is no measurement data on the same day."
}
},
"query_date": "Query date",
"normal": "normal",
"abnormal": "abnormal",
"value": "Blood sugar level:",
"unit": "mmol/L",
"normal_percent": "Measure number\nProportion",
"record_count": "Total measurement {{count}}",
"count_is": "The number of times is {{count}}",
"about": "About blood sugar",
"advanced": {
"type": {
"2hour_after_eating": "2 hours after dining",
"2hour_after_eating_remark": "I have a measure of this data before I eat.",
"30min_after_use_medicine": "30 minutes after medication",
"30min_after_use_medicine_remark": "Before the data was measured, I was eating.",
"30min_after_use_tonic": "30 minutes after health products",
"30min_after_use_tonic_remark": "Before you measure this data, the health food I eat is",
"30min_after_exercise": "30 minutes after exercise",
"30min_after_exercise_remark": "I measure this data before I do."
},
"delete": "Delete this comparison data",
"pre": "Previous group",
"next": "Next group"
}
},
"dialog": {
"confirm_delete": "Do you have to delete this information?"
},
"button_cancel": "Accidentally",
"button_confirm_delete": "confirm delete",
"temperature": {
"data_title": "Body temperature data",
"unit": "℃",
"label": "body temperature",
"measurement_position": "Measurement position",
"measurement_positions": {
"forehead": "forehead",
"armpit": "armpit",
"ear": "ear",
"mouth": "mouth",
"anus": "anus"
}
}
},
"ShiXin": {
"yin": "Yin",
"yang": "Yang",
"xu": "Xu",
"shi": "Shi",
"han": "Han",
"re": "Re",
"h": "Han",
"i": "Yin",
"r": "Re",
"s": "Shi",
"x": "Xu",
"a": "Yang"
}
}

@ -0,0 +1,272 @@
{
"test_polar": "测试极坐标图",
"test_egc": "测试EGC图",
"test_heart_health": "测试心健康",
"UI": {
"button_pre": "上一步",
"button_next": "下一步",
"button_send": "发送",
"questionnaire": {
"header": "根据此刻感受,请观察您是否有以下症状或状况呢?请至少勾选一项才可下一步,确认送出后不可修改!",
"option_none": "以上症状都没有"
},
"login": {
"uid_hint": "请输入您的用户ID",
"passwd_hint": "请输入您的登录密码",
"btn_login": "开始"
},
"health_params": {
"input_hint": {
"sdnn": "请输入SDNN",
"hf": "请输入HF",
"lf": "请输入LF",
"vlf": "请输入VLF",
"lf_o": "请输入原始LF",
"hf_o": "请输入原始HF",
"tp": "请输入TP",
"age": "请输入年龄",
"ecg_id": "请输入ECG报告ID",
"ecg_id_error": "输入有误,请检查"
},
"submit": "提交",
"input_id": "输入ID"
},
"tabs": {
"params": "输入参数",
"health_strength": "健康强度",
"problem_analysis": "问题分析",
"physique_analysis": "体质分析",
"quota": "本周剩余查询数:{p}"
},
"physique_analysis": {
"suggestion": "改善方式:",
"title": "科学体质分析"
},
"health_strength": {
"hint": "今日身体机能综合运作的能力",
"health": "健康强度 {{p}}",
"repair": "修复指数 {{p}}",
"antistress": "压力指数 {{p}}",
"endurance": "续航指数 {{p}}",
"resistance": "抵抗指数 {{p}}",
"label": {
"health": "健康强度",
"repair": "修复指数",
"antistress": "压力指数",
"endurance": "续航指数",
"resistance": "抵抗指数",
"physique": "健康体质"
},
"priority": "优先调理",
"physique": "{{t}}性体质"
},
"problem_analysis": {
"title": "即时生理状态分析",
"subtitle": "即时生理状态分析呈现检测时的身体机能负荷或异常,可能是短暂现象或是长期累积所造成。建议多次检测并及时介入改善,以确保维持健康,避免进入病变伤害。",
"emergency": "短期问题",
"system": "生理机能",
"health": "健康风险",
"life": "生活风险",
"emergency_desc": "表示近期的可能问题\n需积极处理以免累积造成伤害",
"health_desc": "表示已造成的生理异常\n建议留心观察或前往专科检查",
"life_desc": "表示近期的不良行为\n若不立即改善将产生健康风险",
"system_desc": "表示自律神经的现况\n用以协调体内各脏器之间的运作"
},
"what_happened": {
"title_questionnaire": "请根据身体的感受点选符合的说明",
"title_problems": "根据分析⋯⋯您目前可能有的问题",
"title_looks_fine": "没什么大问题哦!",
"looks_fine_dialog_content": "目前看起来没什么大问题哦!\n建议喝杯水、让身体休息片刻\n若有不舒服可能只是短暂现象\n30 分钟后再量测一次,看看\n身体感觉如何吧",
"what_happened_msg": "我怎么了?",
"title_measure_time": "测量时间",
"title_recently_ten_result": "最近十次分析结果",
"title_improve_ways": "我可以透过以下方式改善{{type}}"
},
"button_close": "关闭",
"warning_info": {
"happened_time": "发生异常时间",
"echarts_table": {
"echarts_1_title": "窦性心律图",
"echarts_1_subtitle": "RRI Scatter",
"echarts_2_title": "自律神经频率图",
"echarts_2_subtitle": "AR-Power Spectral \n [Non-detrend]"
},
"form_table": {
"table_1_header": "时域分析",
"table_2_header": "频谱分析"
},
"heart_rate_title": "即时心电图",
"average_bpm": "平均心跳: ",
"max_bpm": "最大心跳: ",
"min_bpm": "最小心跳: "
},
"button_last_10_record": "近10笔",
"button_last_30_record": "近30笔",
"button_last_90_record": "近90笔",
"button_custom": "自定义",
"hrv_report": {
"title": "心率变异度变化趋势",
"hrv_chart": {
"title": "心率变异度 ms",
"comment_start": "注:",
"comment_green": "绿色",
"comment_yellow": "黄色",
"comment_red": "红色",
"comment_red_content": " 范围内需要多加注意。",
"comment_yellow_content": " 范围内需要留心,",
"comment_green_content": " 范围内(0.752.5)相对安全"
},
"action": {
"measure_time": "量测时间:",
"detail_title": "心率变异度:",
"detail_show": "当笔数据详情",
"detail_delete": "删除数据"
},
"empty_content": "您还没有数据快去测量吧"
},
"ans_report": {
"title": "自律神经趋势变化",
"chart_2_title": "自律神经比例图",
"chart_1_title": "交感神经LF",
"chart_1_subtitle": "副交感神经HF",
"chart_2_label": "自律神经比例:"
},
"health_risk_rank": {
"title": "健康风险排行分析",
"selector": {
"month": {
"month": "月",
"January": "一月",
"February": "二月",
"March": "三月",
"April": "四月",
"May": "五月",
"June": "六月",
"July": "七月",
"August": "八月",
"September": "九月",
"October": "十月",
"November": "十一月",
"December": "十二月"
},
"year": "年",
"season": {
"season_1": "第一季",
"season_2": "第二季",
"season_3": "第三季",
"season_4": "第四季",
"season": "季"
}
}
},
"health_friends": {
"menu": {
"add": "添加好友",
"message": "邀请通知",
"manage": "管理健康好友"
},
"add": {
"title": "新增健康好友",
"hint": "请输入您要添加的账号",
"button": "送出邀请",
"msg": "已发送邀请~"
},
"invitation_msg": {
"title": "邀请通知",
"your_friend": "您的好友",
"want_watch": "想查看您的健康数据",
"agreed": "已同意",
"denied": "已拒绝"
},
"manage": {
"follower": "关心我的\n健康好友",
"following": "我关心的\n健康好友"
},
"list": {
"title": "好友列表"
},
"report": {
"health_warning_title": "健康警报"
},
"hint": "提示:",
"no_friends_hint": "您还没有添加健康好友哦!\n快去点击头像添加吧。"
},
"button_last_10_day": "近10天",
"button_last_30_day": "近30天",
"button_last_90_day": "近90天",
"button_agree": "同意",
"button_deny": "拒绝",
"blood_glucose": {
"basic": {
"type": {
"empty_stomach_10_hour": "空腹10小时",
"30min_before_sleep": "睡前30分钟",
"random_measure": "随机测量",
"30min_before_sleep_remark": "睡前一小时内吃了什么?有禁食吗?",
"empty_stomach_10_hour_remark": "昨晚就寝时间是?有服药吗?",
"random_measure_remark": "为什么量这笔资料?"
},
"single_day_report": {
"title": "单日变化",
"empty_content": "当日没有测量数据哦"
}
},
"query_date": "查询日期",
"normal": "正常",
"abnormal": "异常",
"value": "血糖值:",
"unit": "mmol/L",
"normal_percent": "测量数\n据比例",
"record_count": "总共测量 {{count}} 次",
"count_is": "次数为 {{count}} 次",
"about": "关于血糖",
"advanced": {
"type": {
"2hour_after_eating": "用餐后2小时",
"2hour_after_eating_remark": "量测这笔数据之前,我吃了",
"30min_after_use_medicine": "用药后30分钟",
"30min_after_use_medicine_remark": "量测这笔数据之前,我吃的药是",
"30min_after_use_tonic": "保健品后30分钟",
"30min_after_use_tonic_remark": "量测这笔数据之前,我吃的保健食品是",
"30min_after_exercise": "运动后30分钟",
"30min_after_exercise_remark": "量测这笔数据之前,我做的运动是"
},
"delete": "删除该对比数据",
"pre": "上一组",
"next": "下一组"
}
},
"dialog": {
"confirm_delete": "您确定要删除这笔资料吗?"
},
"button_cancel": "不小心按错",
"button_confirm_delete": "确定删除",
"temperature": {
"data_title": "体温数据",
"unit": "℃",
"label": "体温",
"measurement_position": "测量部位",
"measurement_positions": {
"forehead": "额头",
"armpit": "腋下",
"ear": "耳朵",
"mouth": "口腔",
"anus": "肛门"
}
}
},
"ShiXin": {
"yin": "阴",
"yang": "阳",
"xu": "虚",
"shi": "实",
"han": "寒",
"re": "热",
"h": "寒",
"i": "阴",
"r": "热",
"s": "实",
"x": "虚",
"a": "阳"
}
}

@ -0,0 +1,272 @@
{
"test_polar": "測試極坐標圖",
"test_egc": "測試EGC圖",
"test_heart_health": "測試心健康",
"UI": {
"button_next": "下一步",
"button_pre": "上一步",
"button_send": "送出",
"questionnaire": {
"header": "根據此刻感受,請觀察您是否有以下症狀或狀況呢?請至少勾選一項才可下一步,確認送出後不可修改!",
"option_none": "以上症狀都沒有"
},
"login": {
"uid_hint": "請輸入您的用戶ID",
"passwd_hint": "請輸入您的登錄密碼",
"btn_login": "開始"
},
"health_params": {
"input_hint": {
"sdnn": "請輸入SDNN",
"hf": "請輸入HF",
"lf": "請輸入LF",
"vlf": "請輸入VLF",
"lf_o": "請輸入原始LF",
"hf_o": "請輸入原始HF",
"tp": "請輸入TP",
"age": "請輸入年齡",
"ecg_id": "請輸入ECG報告ID",
"ecg_id_error": "輸入有誤,請檢查"
},
"submit": "確定",
"input_id": "輸入"
},
"tabs": {
"params": "參數錄入",
"health_strength": "健康強度",
"problem_analysis": "問題分析",
"physique_analysis": "體質分析",
"quota": "本週剩餘查詢數:{p}"
},
"physique_analysis": {
"suggestion": "改善方法:",
"title": "科學體質分析"
},
"health_strength": {
"health": "健康強度 {{p}}",
"hint": "今日身體機能綜合運作的能力",
"repair": "修復指數 {{p}}",
"antistress": "壓力指數 {{p}}",
"endurance": "續航指數 {{p}}",
"resistance": "抵抗指數 {{p}}",
"label": {
"antistress": "壓力指數",
"endurance": "續航指數",
"health": "健康強度",
"repair": "修復指數",
"resistance": "抵抗指數",
"physique": "健康體質"
},
"priority": "優先調理",
"physique": "{{t}}性體質"
},
"problem_analysis": {
"title": "即時生理狀態分析",
"subtitle": "即時生理狀態分析呈現檢測時的身體機能負荷或異常,可能是短暫現象或是長期累積所造成。建議多次檢測並及時介入改善,以確保維持健康,避免進入病變傷害。",
"emergency": "短期問題",
"system": "生理機能",
"health": "健康風險",
"life": "生活風險",
"emergency_desc": "表示近期的可能問題\n需積極處理以免累積造成傷害",
"health_desc": "表示已造成的生理異常\n建議留心觀察或前往專科檢查",
"life_desc": "表示近期的不良行為\n若不立即改善將產生健康風險",
"system_desc": "表示自律神經的現況\n用以協調體內各臟器之間的運作"
},
"what_happened": {
"title_questionnaire": "請根據身體的感受點選符合的說明",
"title_problems": "根據分析⋯⋯您目前可能有的問題",
"title_looks_fine": "沒什麼大問題哦!",
"looks_fine_dialog_content": "目前看起來沒什麼大問題哦!\n建議喝杯水、讓身體休息片刻\n若有不舒服可能只是短暫現象\n30 分鐘後再量測一次,看看\n身體感覺如何吧",
"what_happened_msg": "我怎麼了?",
"title_measure_time": "量測時間",
"title_recently_ten_result": "最近十次分析結果",
"title_improve_ways": "我可以透過以下方式改善{{type}}"
},
"button_close": "關閉",
"warning_info": {
"happened_time": "發生異常時間",
"echarts_table": {
"echarts_1_title": "竇性心律圖",
"echarts_2_title": "自律神經頻率圖",
"echarts_1_subtitle": "RRI Scatter",
"echarts_2_subtitle": "AR-Power Spectral \n [Non-detrend]"
},
"form_table": {
"table_1_header": "時域分析",
"table_2_header": "頻譜分析"
},
"heart_rate_title": "即時心電圖",
"average_bpm": "平均心跳:",
"max_bpm": "最大心跳:",
"min_bpm": "最小心跳:"
},
"button_last_10_record": "近10筆",
"button_last_30_record": "近30筆",
"button_last_90_record": "近90筆",
"button_custom": "自定義",
"hrv_report": {
"title": "心率變異度變化趨勢",
"hrv_chart": {
"title": "心率變異度 ms",
"comment_start": "注:",
"comment_green": "綠色",
"comment_yellow": "黃色",
"comment_red": "紅色",
"comment_red_content": "範圍內需要多加註意。",
"comment_yellow_content": "範圍內需要留心,",
"comment_green_content": "範圍內(0.752.5)相對安全"
},
"action": {
"measure_time": "量測時間:",
"detail_title": "心率變異度:",
"detail_show": "當筆數據詳情",
"detail_delete": "刪除數據"
},
"empty_content": "您還沒有數據快去測量吧"
},
"ans_report": {
"title": "自律神經趨勢變化",
"chart_2_title": "自律神經比例圖",
"chart_1_title": "交感神經LF",
"chart_1_subtitle": "副交感神經HF",
"chart_2_label": "自律神經比例:"
},
"health_risk_rank": {
"title": "健康風險排行分析",
"selector": {
"month": {
"month": "月",
"January": "一月",
"February": "二月",
"March": "三月",
"April": "四月",
"May": "五月",
"June": "六月",
"July": "七月",
"August": "八月",
"September": "九月",
"October": "十月",
"November": "十一月",
"December": "十二月"
},
"year": "年",
"season": {
"season_1": "第一季",
"season_2": "第二季",
"season_3": "第三季",
"season_4": "第四季",
"season": "季"
}
}
},
"health_friends": {
"menu": {
"add": "添加好友",
"message": "邀請通知",
"manage": "管理健康好友"
},
"add": {
"title": "新增健康好友",
"hint": "請輸入您要添加的帳號",
"button": "送出邀請",
"msg": "已發送邀請~"
},
"invitation_msg": {
"title": "邀請通知",
"your_friend": "您的好友",
"want_watch": "想查看您的健康數據",
"agreed": "已同意",
"denied": "已拒絕"
},
"manage": {
"follower": "關心我的\n健康好友",
"following": "我關心的\n健康好友"
},
"list": {
"title": "好友列表"
},
"report": {
"health_warning_title": "健康警報"
},
"hint": "提示:",
"no_friends_hint": "您還沒有添加健康好友哦!\n快去點擊頭像添加吧。"
},
"button_last_10_day": "近10天",
"button_last_30_day": "近30天",
"button_last_90_day": "近90天",
"button_agree": "同意",
"button_deny": "拒絕",
"blood_glucose": {
"basic": {
"type": {
"empty_stomach_10_hour": "空腹10小時",
"30min_before_sleep": "睡前30分鐘",
"random_measure": "隨機測量",
"30min_before_sleep_remark": "睡前一小時內吃了什麼?有禁食嗎?",
"empty_stomach_10_hour_remark": "昨晚就寢時間是?有服藥嗎?",
"random_measure_remark": "為什麼量這筆資料?"
},
"single_day_report": {
"title": "單日變化",
"empty_content": "當日沒有測量數據哦"
}
},
"query_date": "查詢日期",
"normal": "正常",
"abnormal": "異常",
"value": "血糖值:",
"unit": "mg/dl",
"normal_percent": "測量數\n據比例",
"record_count": "總共測量 {{count}} 次",
"count_is": "次數為 {{count}} 次",
"about": "關於血糖",
"advanced": {
"type": {
"2hour_after_eating": "用餐後2小時",
"2hour_after_eating_remark": "量測這筆數據之前,我吃了",
"30min_after_use_medicine": "用藥後30分鐘",
"30min_after_use_medicine_remark": "量測這筆數據之前,我吃的藥是",
"30min_after_use_tonic": "保健品後30分鐘",
"30min_after_use_tonic_remark": "量測這筆數據之前,我吃的保健食品是",
"30min_after_exercise": "運動後30分鐘",
"30min_after_exercise_remark": "量測這筆數據之前,我做的運動是"
},
"delete": "刪除該對比數據",
"pre": "上一組",
"next": "下一組"
}
},
"dialog": {
"confirm_delete": "您確定要刪除這筆資料嗎?"
},
"button_cancel": "不小心按錯",
"button_confirm_delete": "確定刪除",
"temperature": {
"data_title": "體溫數據",
"unit": "℃",
"label": "體溫",
"measurement_position": "測量部位",
"measurement_positions": {
"forehead": "額頭",
"armpit": "腋下",
"ear": "耳朵",
"mouth": "口腔",
"anus": "肛門"
}
}
},
"ShiXin": {
"yin": "陰",
"yang": "陽",
"xu": "虛",
"shi": "實",
"han": "寒",
"re": "熱",
"h": "寒",
"i": "陰",
"r": "熱",
"s": "實",
"x": "虛",
"a": "陽"
}
}

@ -1,4 +0,0 @@
<svg width="283" height="64" viewBox="0 0 283 64" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z" fill="#000"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

@ -1,121 +0,0 @@
.container {
min-height: 100vh;
padding: 0 0.5rem;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
}
.main {
padding: 5rem 0;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.footer {
width: 100%;
height: 100px;
border-top: 1px solid #eaeaea;
display: flex;
justify-content: center;
align-items: center;
}
.footer a {
display: flex;
justify-content: center;
align-items: center;
flex-grow: 1;
}
.title a {
color: #0070f3;
text-decoration: none;
}
.title a:hover,
.title a:focus,
.title a:active {
text-decoration: underline;
}
.title {
margin: 0;
line-height: 1.15;
font-size: 4rem;
}
.title,
.description {
text-align: center;
}
.description {
line-height: 1.5;
font-size: 1.5rem;
}
.code {
background: #fafafa;
border-radius: 5px;
padding: 0.75rem;
font-size: 1.1rem;
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
Bitstream Vera Sans Mono, Courier New, monospace;
}
.grid {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
max-width: 800px;
margin-top: 3rem;
}
.card {
margin: 1rem;
padding: 1.5rem;
text-align: left;
color: inherit;
text-decoration: none;
border: 1px solid #eaeaea;
border-radius: 10px;
transition: color 0.15s ease, border-color 0.15s ease;
width: 45%;
}
.card:hover,
.card:focus,
.card:active {
color: #0070f3;
border-color: #0070f3;
}
.card h2 {
margin: 0 0 1rem 0;
font-size: 1.5rem;
}
.card p {
margin: 0;
font-size: 1.25rem;
line-height: 1.5;
}
.logo {
height: 1em;
margin-left: 0.5rem;
}
@media (max-width: 600px) {
.grid {
width: 100%;
flex-direction: column;
}
}

@ -1,16 +0,0 @@
html,
body {
padding: 0;
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
}
a {
color: inherit;
text-decoration: none;
}
* {
box-sizing: border-box;
}

@ -0,0 +1,29 @@
const message = require("../public/h5_assets/messages/zh_CN/common.json");
const fs = require('fs')
let keys = [];
function toHump(name) {
return name.replace(/_(\w)/g, function (all, letter) {
return letter.toUpperCase();
});
}
function parse(obj, preFix = "", preKey = "") {
Object.keys(obj).forEach(key => {
if (typeof obj[key] == 'string') {
keys.push(` ${ preFix }${ preFix === "" ? "" : '$' }${ toHump(key) } = "${ preKey }${ preKey === "" ? "" : '.' }${ key }",`);
} else {
parse(obj[key], `${ preFix }${ preFix === "" ? "" : '$' }${ toHump(key) }`, `${ preKey }${ preKey === "" ? "" : '.' }${ key }`)
}
});
}
keys.push("export enum KEYS {");
parse(message);
keys.push("}");
fs.writeFile('./lib/keys.ts', keys.join('\n'), (e) => {
console.info(e);
});
Loading…
Cancel
Save