st 2 months ago
commit
9603dde317
100 changed files with 4903 additions and 0 deletions
  1. 106 0
      .commitlintrc.cjs
  2. 13 0
      .editorconfig
  3. 1 0
      .eslintignore
  4. 99 0
      .eslintrc-auto-import.json
  5. 97 0
      .eslintrc.cjs
  6. 40 0
      .gitignore
  7. 4 0
      .husky/commit-msg
  8. 4 0
      .husky/pre-commit
  9. 6 0
      .npmrc
  10. 9 0
      .prettierignore
  11. 19 0
      .prettierrc.cjs
  12. 1 0
      .stylelintignore
  13. 58 0
      .stylelintrc.cjs
  14. 18 0
      .vscode/extensions.json
  15. 65 0
      .vscode/settings.json
  16. 56 0
      .vscode/vue3.code-snippets
  17. 21 0
      LICENSE
  18. 37 0
      README.md
  19. 19 0
      env/.env
  20. 6 0
      env/.env.development
  21. 6 0
      env/.env.production
  22. 4 0
      env/.env.test
  23. BIN
      favicon.ico
  24. 29 0
      index.html
  25. 28 0
      localhost+1-key.pem
  26. 26 0
      localhost+1.pem
  27. 134 0
      manifest.config.ts
  28. 152 0
      package.json
  29. 61 0
      pages.config.ts
  30. 36 0
      scripts/postupgrade.js
  31. 126 0
      src/App.vue
  32. 142 0
      src/components/TabBar/index.vue
  33. 7 0
      src/components/TabBar/type.ts
  34. 183 0
      src/components/common/Dialog/index.vue
  35. 6 0
      src/components/common/Dialog/type.ts
  36. 44 0
      src/components/common/Solana/index.vue
  37. 31 0
      src/env.d.ts
  38. 21 0
      src/hooks/moneyProcessing.ts
  39. 17 0
      src/hooks/useImgPath.ts
  40. 44 0
      src/hooks/useRequest.ts
  41. 46 0
      src/hooks/useTelegramBackButton.ts
  42. 81 0
      src/hooks/useUpload.ts
  43. 3 0
      src/interceptors/index.ts
  44. 13 0
      src/interceptors/prototype.ts
  45. 68 0
      src/interceptors/request.ts
  46. 53 0
      src/interceptors/route.ts
  47. 22 0
      src/layouts/default.vue
  48. 12 0
      src/locale/README.md
  49. 212 0
      src/locale/en.json
  50. 207 0
      src/locale/es.json
  51. 207 0
      src/locale/fa.json
  52. 203 0
      src/locale/fa.json~
  53. 86 0
      src/locale/index.ts
  54. 215 0
      src/locale/ja.json
  55. 215 0
      src/locale/ko.json
  56. 207 0
      src/locale/pt.json
  57. 216 0
      src/locale/ru.json
  58. 216 0
      src/locale/th.json
  59. 216 0
      src/locale/vi.json
  60. 210 0
      src/locale/zh-tw.json
  61. 21 0
      src/main.ts
  62. 112 0
      src/manifest.json
  63. 20 0
      src/pages-sub/demo/index.vue
  64. 61 0
      src/pages.json
  65. 54 0
      src/pages/index/index.vue
  66. 4 0
      src/pages/index/type.ts
  67. 147 0
      src/service/index/foo.ts
  68. 0 0
      src/static/Animation.json
  69. BIN
      src/static/audio/M5000016XYcc2hEve0.mp3
  70. BIN
      src/static/audio/kn.mp3
  71. BIN
      src/static/audio/missTS.mp3
  72. BIN
      src/static/audio/mzdhl.mp3
  73. BIN
      src/static/images/production/Vector.png
  74. BIN
      src/static/images/production/Wallet_fill.png
  75. BIN
      src/static/images/production/bcard.png
  76. BIN
      src/static/images/production/bg-c.png
  77. BIN
      src/static/images/production/bg-h.png
  78. BIN
      src/static/images/production/bg.png
  79. BIN
      src/static/images/production/bg1.png
  80. BIN
      src/static/images/production/card.png
  81. BIN
      src/static/images/production/char.png
  82. BIN
      src/static/images/production/en.png
  83. BIN
      src/static/images/production/es.png
  84. BIN
      src/static/images/production/fa.png
  85. BIN
      src/static/images/production/gou.png
  86. BIN
      src/static/images/production/haoyou.png
  87. BIN
      src/static/images/production/huojian.png
  88. BIN
      src/static/images/production/ja.png
  89. BIN
      src/static/images/production/jiangbei.png
  90. BIN
      src/static/images/production/jiangli.png
  91. BIN
      src/static/images/production/jiantoushang.png
  92. BIN
      src/static/images/production/jiantouxia.png
  93. BIN
      src/static/images/production/jinbi.png
  94. BIN
      src/static/images/production/jingbi.png
  95. BIN
      src/static/images/production/jita.png
  96. BIN
      src/static/images/production/jitabg.png
  97. BIN
      src/static/images/production/ko.png
  98. BIN
      src/static/images/production/libao.png
  99. BIN
      src/static/images/production/play.png
  100. BIN
      src/static/images/production/pt.png

+ 106 - 0
.commitlintrc.cjs

@@ -0,0 +1,106 @@
+const fs = require('fs')
+const path = require('path')
+const { execSync } = require('child_process')
+
+const scopes = fs
+  .readdirSync(path.resolve(__dirname, 'src'), { withFileTypes: true })
+  .filter((dirent) => dirent.isDirectory())
+  .map((dirent) => dirent.name.replace(/s$/, ''))
+
+// precomputed scope
+const scopeComplete = execSync('git status --porcelain || true')
+  .toString()
+  .trim()
+  .split('\n')
+  .find((r) => ~r.indexOf('M  src'))
+  ?.replace(/(\/)/g, '%%')
+  ?.match(/src%%((\w|-)*)/)?.[1]
+  ?.replace(/s$/, '')
+
+module.exports = {
+  ignores: [(commit) => commit.includes('init')],
+  extends: ['@commitlint/config-conventional'],
+  rules: {
+    'body-leading-blank': [2, 'always'],
+    'footer-leading-blank': [1, 'always'],
+    'header-max-length': [2, 'always', 108],
+    'subject-empty': [2, 'never'],
+    'type-empty': [2, 'never'],
+    'subject-case': [0],
+    'type-enum': [
+      2,
+      'always',
+      [
+        'feat',
+        'fix',
+        'perf',
+        'style',
+        'docs',
+        'test',
+        'refactor',
+        'build',
+        'ci',
+        'chore',
+        'revert',
+        'wip',
+        'workflow',
+        'types',
+        'release',
+      ],
+    ],
+  },
+  prompt: {
+    /** @use `pnpm commit :f` */
+    alias: {
+      f: 'docs: fix typos',
+      r: 'docs: update README',
+      s: 'style: update code format',
+      b: 'build: bump dependencies',
+      c: 'chore: update config',
+    },
+    customScopesAlign: !scopeComplete ? 'top' : 'bottom',
+    defaultScope: scopeComplete,
+    scopes: [...scopes, 'mock'],
+    allowEmptyIssuePrefixs: false,
+    allowCustomIssuePrefixs: false,
+
+    // English
+    typesAppend: [
+      { value: 'wip', name: 'wip:      work in process' },
+      { value: 'workflow', name: 'workflow: workflow improvements' },
+      { value: 'types', name: 'types:    type definition file changes' },
+    ],
+
+    // 中英文对照版
+    // messages: {
+    //   type: '选择你要提交的类型 :',
+    //   scope: '选择一个提交范围 (可选):',
+    //   customScope: '请输入自定义的提交范围 :',
+    //   subject: '填写简短精炼的变更描述 :\n',
+    //   body: '填写更加详细的变更描述 (可选)。使用 "|" 换行 :\n',
+    //   breaking: '列举非兼容性重大的变更 (可选)。使用 "|" 换行 :\n',
+    //   footerPrefixsSelect: '选择关联issue前缀 (可选):',
+    //   customFooterPrefixs: '输入自定义issue前缀 :',
+    //   footer: '列举关联issue (可选) 例如: #31, #I3244 :\n',
+    //   confirmCommit: '是否提交或修改commit ?',
+    // },
+    // types: [
+    //   { value: 'feat', name: 'feat:     新增功能' },
+    //   { value: 'fix', name: 'fix:      修复缺陷' },
+    //   { value: 'docs', name: 'docs:     文档变更' },
+    //   { value: 'style', name: 'style:    代码格式' },
+    //   { value: 'refactor', name: 'refactor: 代码重构' },
+    //   { value: 'perf', name: 'perf:     性能优化' },
+    //   { value: 'test', name: 'test:     添加疏漏测试或已有测试改动' },
+    //   { value: 'build', name: 'build:    构建流程、外部依赖变更 (如升级 npm 包、修改打包配置等)' },
+    //   { value: 'ci', name: 'ci:       修改 CI 配置、脚本' },
+    //   { value: 'revert', name: 'revert:   回滚 commit' },
+    //   { value: 'chore', name: 'chore:    对构建过程或辅助工具和库的更改 (不影响源文件、测试用例)' },
+    //   { value: 'wip', name: 'wip:      正在开发中' },
+    //   { value: 'workflow', name: 'workflow: 工作流程改进' },
+    //   { value: 'types', name: 'types:    类型定义文件修改' },
+    // ],
+    // emptyScopesAlias: 'empty:      不填写',
+    // customScopesAlias: 'custom:     自定义',
+  },
+}

+ 13 - 0
.editorconfig

@@ -0,0 +1,13 @@
+root = true
+
+[*] # 表示所有文件适用
+charset = utf-8 # 设置文件字符集为 utf-8
+indent_style = space # 缩进风格(tab | space)
+indent_size = 2 # 缩进大小
+end_of_line = lf # 控制换行类型(lf | cr | crlf)
+trim_trailing_whitespace = true # 去除行首的任意空白字符
+insert_final_newline = true # 始终在文件末尾插入一个新行
+
+[*.md] # 表示仅 md 文件适用以下规则
+max_line_length = off # 关闭最大行长度限制
+trim_trailing_whitespace = false # 关闭末尾空格修剪

+ 1 - 0
.eslintignore

@@ -0,0 +1 @@
+src/uni_modules/

+ 99 - 0
.eslintrc-auto-import.json

@@ -0,0 +1,99 @@
+{
+  "globals": {
+    "Component": true,
+    "ComponentPublicInstance": true,
+    "ComputedRef": true,
+    "EffectScope": true,
+    "ExtractDefaultPropTypes": true,
+    "ExtractPropTypes": true,
+    "ExtractPublicPropTypes": true,
+    "InjectionKey": true,
+    "PropType": true,
+    "Ref": true,
+    "VNode": true,
+    "WritableComputedRef": true,
+    "computed": true,
+    "createApp": true,
+    "customRef": true,
+    "defineAsyncComponent": true,
+    "defineComponent": true,
+    "effectScope": true,
+    "getCurrentInstance": true,
+    "getCurrentScope": true,
+    "h": true,
+    "inject": true,
+    "isProxy": true,
+    "isReactive": true,
+    "isReadonly": true,
+    "isRef": true,
+    "markRaw": true,
+    "nextTick": true,
+    "onActivated": true,
+    "onAddToFavorites": true,
+    "onBackPress": true,
+    "onBeforeMount": true,
+    "onBeforeUnmount": true,
+    "onBeforeUpdate": true,
+    "onDeactivated": true,
+    "onError": true,
+    "onErrorCaptured": true,
+    "onHide": true,
+    "onLaunch": true,
+    "onLoad": true,
+    "onMounted": true,
+    "onNavigationBarButtonTap": true,
+    "onNavigationBarSearchInputChanged": true,
+    "onNavigationBarSearchInputClicked": true,
+    "onNavigationBarSearchInputConfirmed": true,
+    "onNavigationBarSearchInputFocusChanged": true,
+    "onPageNotFound": true,
+    "onPageScroll": true,
+    "onPullDownRefresh": true,
+    "onReachBottom": true,
+    "onReady": true,
+    "onRenderTracked": true,
+    "onRenderTriggered": true,
+    "onResize": true,
+    "onScopeDispose": true,
+    "onServerPrefetch": true,
+    "onShareAppMessage": true,
+    "onShareTimeline": true,
+    "onShow": true,
+    "onTabItemTap": true,
+    "onThemeChange": true,
+    "onUnhandledRejection": true,
+    "onUnload": true,
+    "onUnmounted": true,
+    "onUpdated": true,
+    "provide": true,
+    "reactive": true,
+    "readonly": true,
+    "ref": true,
+    "resolveComponent": true,
+    "shallowReactive": true,
+    "shallowReadonly": true,
+    "shallowRef": true,
+    "toRaw": true,
+    "toRef": true,
+    "toRefs": true,
+    "toValue": true,
+    "triggerRef": true,
+    "unref": true,
+    "useAttrs": true,
+    "useCssModule": true,
+    "useCssVars": true,
+    "useRequest": true,
+    "useSlots": true,
+    "useUpload": true,
+    "useUpload2": true,
+    "watch": true,
+    "watchEffect": true,
+    "watchPostEffect": true,
+    "watchSyncEffect": true,
+    "useImgPath": true,
+    "useTelegramBackButton": true,
+    "useTelegramTheme": true,
+    "formatAmount": true,
+    "formatAmountNoFloat": true
+  }
+}

+ 97 - 0
.eslintrc.cjs

@@ -0,0 +1,97 @@
+module.exports = {
+  env: {
+    browser: true,
+    es2021: true,
+    node: true,
+  },
+  extends: [
+    'eslint:recommended',
+    'plugin:@typescript-eslint/recommended',
+    'plugin:vue/vue3-essential',
+    // eslint-plugin-import 插件, @see https://www.npmjs.com/package/eslint-plugin-import
+    'plugin:import/recommended',
+    // eslint-config-airbnb-base 插件 已经改用 eslint-config-standard 插件
+    'standard',
+    // 1. 接入 prettier 的规则
+    'prettier',
+    'plugin:prettier/recommended',
+    './.eslintrc-auto-import.json',
+  ],
+  overrides: [
+    {
+      env: {
+        node: true,
+      },
+      files: ['.eslintrc.{js,cjs}'],
+      parserOptions: {
+        sourceType: 'script',
+      },
+    },
+  ],
+  parserOptions: {
+    ecmaVersion: 'latest',
+    parser: '@typescript-eslint/parser',
+    sourceType: 'module',
+  },
+  plugins: [
+    '@typescript-eslint',
+    'vue',
+    // 2. 加入 prettier 的 eslint 插件
+    'prettier',
+    // eslint-import-resolver-typescript 插件,@see https://www.npmjs.com/package/eslint-import-resolver-typescript
+    'import',
+  ],
+  rules: {
+    // 3. 注意要加上这一句,开启 prettier 自动修复的功能
+    'prettier/prettier': 'error',
+    // turn on errors for missing imports
+    'import/no-unresolved': 'off',
+    // 对后缀的检测,否则 import 一个ts文件也会报错,需要手动添加'.ts', 增加了下面的配置后就不用了
+    'import/extensions': [
+      'error',
+      'ignorePackages',
+      { js: 'never', jsx: 'never', ts: 'never', tsx: 'never' },
+    ],
+    // 只允许1个默认导出,关闭,否则不能随意export xxx
+    'import/prefer-default-export': ['off'],
+    'no-console': ['off'],
+    // 'no-unused-vars': ['off'],
+    // '@typescript-eslint/no-unused-vars': ['off'],
+    // 解决vite.config.ts报错问题
+    'import/no-extraneous-dependencies': 'off',
+    'no-plusplus': 'off',
+    'no-shadow': 'off',
+    'vue/multi-word-component-names': 'off',
+    '@typescript-eslint/no-explicit-any': 'off',
+    'no-underscore-dangle': 'off',
+    'no-use-before-define': 'off',
+    'no-undef': 'off',
+    'no-unused-vars': 'off',
+    'no-param-reassign': 'off',
+    '@typescript-eslint/no-unused-vars': 'off',
+    // 避免 `eslint` 对于 `typescript` 函数重载的误报
+    'no-redeclare': 'off',
+    '@typescript-eslint/no-redeclare': 'error',
+  },
+  // eslint-import-resolver-typescript 插件,@see https://www.npmjs.com/package/eslint-import-resolver-typescript
+  settings: {
+    'import/parsers': {
+      '@typescript-eslint/parser': ['.ts', '.tsx'],
+    },
+    'import/resolver': {
+      typescript: {},
+    },
+  },
+  globals: {
+    $t: true,
+    uni: true,
+    UniApp: true,
+    wx: true,
+    WechatMiniprogram: true,
+    getCurrentPages: true,
+    UniHelper: true,
+    Page: true,
+    App: true,
+    NodeJS: true,
+  },
+}

+ 40 - 0
.gitignore

@@ -0,0 +1,40 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+pnpm-lock.yaml
+
+node_modules
+.DS_Store
+dist
+*.local
+
+# Editor directories and files
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+.hbuilderx
+
+.stylelintcache
+.eslintcache
+
+# lock 文件还是不要了,我主要的版本写死就好了
+# pnpm-lock.yaml
+# package-lock.json
+
+# TIPS:如果某些文件已经加入了版本管理,现在重新加入 .gitignore 是不生效的,需要执行下面的操作
+# `git rm -r --cached .` 然后提交 commit 即可。
+
+# git rm -r --cached file1 file2  ## 针对某些文件
+# git rm -r --cached dir1 dir2  ## 针对某些文件夹
+# git rm -r --cached .  ## 针对所有文件
+
+# 更新 uni-app 官方版本
+# npx @dcloudio/uvm@latest

+ 4 - 0
.husky/commit-msg

@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+npx --no-install commitlint --edit 

+ 4 - 0
.husky/pre-commit

@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+npx --no-install -- lint-staged

+ 6 - 0
.npmrc

@@ -0,0 +1,6 @@
+# registry = https://registry.npmjs.org
+registry = https://registry.npmmirror.com
+
+strict-peer-dependencies=false
+auto-install-peers=true
+shamefully-hoist=true

+ 9 - 0
.prettierignore

@@ -0,0 +1,9 @@
+# unplugin-auto-import 生成的类型文件,每次提交都改变,所以加入这里吧,与 .gitignore 配合使用
+auto-import.d.ts
+
+# vite-plugin-uni-pages 生成的类型文件,每次切换分支都一堆不同的,所以直接 .gitignore
+uni-pages.d.ts
+
+# 插件生成的文件
+src/pages.json
+src/manifest.json

+ 19 - 0
.prettierrc.cjs

@@ -0,0 +1,19 @@
+// @see https://prettier.io/docs/en/options
+module.exports = {
+  singleQuote: true,
+  printWidth: 100,
+  tabWidth: 2,
+  useTabs: false,
+  semi: false,
+  trailingComma: "all",
+  endOfLine: "auto",
+  htmlWhitespaceSensitivity: "ignore",
+  overrides: [
+    {
+      files: "*.json",
+      options: {
+        trailingComma: "none"
+      }
+    }
+  ]
+};

+ 1 - 0
.stylelintignore

@@ -0,0 +1 @@
+src/uni_modules/

+ 58 - 0
.stylelintrc.cjs

@@ -0,0 +1,58 @@
+// .stylelintrc.cjs
+
+module.exports = {
+  root: true,
+  extends: [
+    // stylelint-config-standard 替换成了更宽松的 stylelint-config-recommended
+    'stylelint-config-recommended',
+    // stylelint-config-standard-scss 替换成了更宽松的 stylelint-config-recommended-scss
+    'stylelint-config-recommended-scss',
+    'stylelint-config-recommended-vue/scss',
+    'stylelint-config-html/vue',
+    'stylelint-config-recess-order',
+  ],
+  plugins: ['stylelint-prettier'],
+  overrides: [
+    // 扫描 .vue/html 文件中的<style>标签内的样式
+    {
+      files: ['**/*.{vue,html}'],
+      customSyntax: 'postcss-html',
+    },
+    {
+      files: ['**/*.{css,scss}'],
+      customSyntax: 'postcss-scss',
+    },
+  ],
+  // 自定义规则
+  rules: {
+    'prettier/prettier': true,
+    // 允许 global 、export 、v-deep等伪类
+    'selector-pseudo-class-no-unknown': [
+      true,
+      {
+        ignorePseudoClasses: ['global', 'export', 'v-deep', 'deep'],
+      },
+    ],
+    'unit-no-unknown': [
+      true,
+      {
+        ignoreUnits: ['rpx'],
+      },
+    ],
+    // 处理小程序page标签不认识的问题
+    'selector-type-no-unknown': [
+      true,
+      {
+        ignoreTypes: ['page'],
+      },
+    ],
+    'comment-empty-line-before': 'never', // never|always|always-multi-line|never-multi-line
+    'custom-property-empty-line-before': 'never',
+    'no-empty-source': null,
+    'comment-no-empty': null,
+    'no-duplicate-selectors': null,
+    'scss/comment-no-empty': null,
+    'selector-class-pattern': null,
+    'font-family-no-missing-generic-family-keyword': null,
+  },
+}

+ 18 - 0
.vscode/extensions.json

@@ -0,0 +1,18 @@
+{
+  "recommendations": [
+    "vue.volar",
+    "stylelint.vscode-stylelint",
+    "esbenp.prettier-vscode",
+    "dbaeumer.vscode-eslint",
+    "antfu.unocss",
+    "antfu.iconify",
+    "evils.uniapp-vscode",
+    "uni-helper.uni-helper-vscode",
+    "uni-helper.uni-app-schemas-vscode",
+    "uni-helper.uni-highlight-vscode",
+    "uni-helper.uni-ui-snippets-vscode",
+    "uni-helper.uni-app-snippets-vscode",
+    "mrmlnc.vscode-json5",
+    "streetsidesoftware.code-spell-checker"
+  ]
+}

+ 65 - 0
.vscode/settings.json

@@ -0,0 +1,65 @@
+{
+  // 默认格式化工具选择prettier
+  "editor.defaultFormatter": "esbenp.prettier-vscode",
+  // 保存的时候自动格式化
+  "editor.formatOnSave": true,
+  //开启自动修复
+  "editor.codeActionsOnSave": {
+    "source.fixAll": "explicit",
+    "source.fixAll.eslint": "explicit",
+    "source.fixAll.stylelint": "explicit"
+  },
+  // 配置stylelint检查的文件类型范围
+  "stylelint.validate": ["css", "scss", "vue", "html"], // 与package.json的scripts对应
+  "stylelint.enable": true,
+  "css.validate": false,
+  "less.validate": false,
+  "scss.validate": false,
+  "[shellscript]": {
+    "editor.defaultFormatter": "foxundermoon.shell-format"
+  },
+  "[dotenv]": {
+    "editor.defaultFormatter": "foxundermoon.shell-format"
+  },
+  "[vue]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[typescript]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[jsonc]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  // 配置语言的文件关联
+  "files.associations": {
+    "pages.json": "jsonc", // pages.json 可以写注释
+    "manifest.json": "jsonc" // manifest.json 可以写注释
+  },
+  "cSpell.words": [
+    "climblee",
+    "commitlint",
+    "dcloudio",
+    "iconfont",
+    "qrcode",
+    "refresherrefresh",
+    "scrolltolower",
+    "tabbar",
+    "unibest",
+    "uvui",
+    "WechatMiniprogram"
+  ],
+  "typescript.tsdk": "node_modules\\typescript\\lib",
+  // 控制相关文件嵌套展示
+  "explorer.fileNesting.enabled": true,
+  "explorer.fileNesting.expand": false,
+  "explorer.fileNesting.patterns": {
+    "*.ts": "$(capture).test.ts, $(capture).test.tsx",
+    "*.tsx": "$(capture).test.ts, $(capture).test.tsx",
+    // "*.env": "$(capture).env.*",
+    "CHANGELOG.md": "CHANGELOG*",
+    "package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,LICENSE,.gitattributes,.gitignore,.gitpod.yml,CNAME,.npmrc,.browserslistrc",
+    ".eslintrc.cjs": ".eslintignore,.prettierignore,.stylelintignore,.commitlintrc.*,.prettierrc.*,.stylelintrc.*,.eslintrc-auto-import.json,.editorconfig,.commitlint.cjs"
+  },
+  "i18n-ally.localesPaths": ["src/locale"],
+  "i18n-ally.keystyle": "nested"
+}

+ 56 - 0
.vscode/vue3.code-snippets

@@ -0,0 +1,56 @@
+{
+  // Place your unibest 工作区 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
+  // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
+  // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
+  // used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
+  // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
+  // Placeholders with the same ids are connected.
+  // Example:
+  // "Print to console": {
+  // 	"scope": "javascript,typescript",
+  // 	"prefix": "log",
+  // 	"body": [
+  // 		"console.log('$1');",
+  // 		"$2"
+  // 	],
+  // 	"description": "Log output to console"
+  // }
+  "Print unibest Vue3 SFC": {
+    "scope": "vue",
+    "prefix": "v3",
+    "body": [
+      "<route lang=\"json5\" type=\"page\">",
+      "{",
+      "  layout: 'default',",
+      "  style: {",
+      "    navigationBarTitleText: '$1',",
+      "  },",
+      "}",
+      "</route>\n",
+      "<template>",
+      "  <view class=\"\">$2</view>",
+      "</template>\n",
+      "<script lang=\"ts\" setup>",
+      "//$3",
+      "</script>\n",
+      "<style lang=\"scss\" scoped>",
+      "//$4",
+      "</style>\n",
+    ],
+  },
+  "Print unibest style": {
+    "scope": "vue",
+    "prefix": "st",
+    "body": ["<style lang=\"scss\" scoped>", "//", "</style>\n"],
+  },
+  "Print unibest script": {
+    "scope": "vue",
+    "prefix": "sc",
+    "body": ["<script lang=\"ts\" setup>", "//$3", "</script>\n"],
+  },
+  "Print unibest template": {
+    "scope": "vue",
+    "prefix": "te",
+    "body": ["<template>", "  <view class=\"\">$1</view>", "</template>\n"],
+  },
+}

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 菲鸽
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 37 - 0
README.md

@@ -0,0 +1,37 @@
+## ⚙️ 环境
+
+- node>=18
+- pnpm>=7.30
+- Vue Official<=2.1.6
+- TypeScript<=5.5.4
+
+## &#x1F4C2; 快速开始
+
+执行 `pnpm i` 安装依赖
+
+执行 `pnpm dev` 运行 `H5`
+
+## 📦 运行(支持热更新)
+
+- web平台: `pnpm dev:h5`, 然后打开 [http://localhost:9000/](http://localhost:9000/)。
+- weixin平台:`pnpm dev:mp-weixin` 然后打开微信开发者工具,导入本地文件夹,选择本项目的`dist/dev/mp-weixin` 文件。
+- APP平台:`pnpm dev:app`, 然后打开 `HBuilderX`,导入刚刚生成的`dist/dev/app` 文件夹,选择运行到模拟器(开发时优先使用),或者运行的安卓/ios基座。
+
+## 🔗 发布
+
+- web平台: `pnpm build:h5`,打包后的文件在 `dist/build/h5`,可以放到web服务器,如nginx运行。如果最终不是放在根目录,可以在 `manifest.config.ts` 文件的 `h5.router.base` 属性进行修改。
+- weixin平台:`pnpm build:mp-weixin`, 打包后的文件在 `dist/build/mp-weixin`,然后通过微信开发者工具导入,并点击右上角的“上传”按钮进行上传。
+- APP平台:`pnpm build:app`, 然后打开 `HBuilderX`,导入刚刚生成的`dist/build/app` 文件夹,选择发行 - APP云打包。
+
+## 🔗git提交规范:
+  
+  - feat: 新功能
+  - fix: 修复bug
+  - docs: 文档修改
+  - style: 代码格式修改
+  - refactor: 代码重构
+  - perf: 性能优化
+  - test: 测试用例修改
+  - chore: 其他修改
+  - revert: 回退
+  - build: 打包

+ 19 - 0
env/.env

@@ -0,0 +1,19 @@
+VITE_APP_TITLE = 'ton-mini'
+VITE_APP_PORT = 9000
+
+VITE_UNI_APPID = 'H57F2ACE4'
+VITE_WX_APPID = 'wxa2abb91f64032a2b'
+
+# h5部署网站的base,配置到 manifest.config.ts 里的 h5.router.base
+VITE_APP_PUBLIC_BASE=/tonmini/
+
+VITE_SERVER_BASEURL = 'https://guitarcoin.app/'
+#VITE_SERVER_BASEURL = 'https://mydomainnow.xyz/'
+VITE_UPLOAD_BASEURL = 'https://guitarcoin.app/api/upload/image'
+
+# h5是否需要配置代理
+VITE_APP_PROXY=true
+VITE_APP_PROXY_PREFIX = '/api'
+
+VITE_TELEGRAM_BASEURL = 'https://guitarcoin.app'
+VITE_TELEGRAM_BOOTNAME = 'Guitarcoinapp_bot'

+ 6 - 0
env/.env.development

@@ -0,0 +1,6 @@
+# 变量必须以 VITE_ 为前缀才能暴露给外部读取
+NODE_ENV = 'development'
+# 是否去除console 和 debugger
+VITE_DELETE_CONSOLE = false
+# 是否开启sourcemap
+VITE_SHOW_SOURCEMAP = true

+ 6 - 0
env/.env.production

@@ -0,0 +1,6 @@
+# 变量必须以 VITE_ 为前缀才能暴露给外部读取
+NODE_ENV = 'development'
+# 是否去除console 和 debugger
+VITE_DELETE_CONSOLE = true
+# 是否开启sourcemap
+VITE_SHOW_SOURCEMAP = false

+ 4 - 0
env/.env.test

@@ -0,0 +1,4 @@
+# 变量必须以 VITE_ 为前缀才能暴露给外部读取
+NODE_ENV = 'development'
+# 是否去除console 和 debugger
+VITE_DELETE_CONSOLE = false

BIN
favicon.ico


+ 29 - 0
index.html

@@ -0,0 +1,29 @@
+<!doctype html>
+<html build-time="%BUILD_TIME%">
+<head>
+  <meta charset="UTF-8" />
+  <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
+  <meta http-equiv="Pragma" content="no-cache">
+  <meta http-equiv="Expires" content="0">
+  <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
+  <script>
+    var coverSupport =
+      "CSS" in window &&
+      typeof CSS.supports === "function" &&
+      (CSS.supports("top: env(a)") || CSS.supports("top: constant(a)"));
+    document.write(
+      "<meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" +
+      (coverSupport ? ", viewport-fit=cover" : "") +
+      "\" />"
+    );
+  </script>
+  <title>ton-mini</title>
+  <!--preload-links-->
+  <!--app-context-->
+</head>
+
+<body>
+<div id="app"><!--app-html--></div>
+<script type="module" src="/src/main.ts"></script>
+</body>
+</html>

+ 28 - 0
localhost+1-key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDbJig1CoTUcNkY
+u9H5xen2j6Po8gbTsQIcfoe3q4g0et/9FT28Pl/A0vddMzzk1z4B/c6CBUxzno60
+XRr8nMh9ZDsrf55NSW0lxVO7h0CG7C0Zr9lWU+JlT6Xm8ccYozloV3A3XwB6fmCL
+ksU0I2Q8up1QrHznHS5BdWDgjG7uEC6PpMsurgAj3kgFTpXrz0KDIYwrYDE6mnXS
+PqEb3J6DZKmM3zmH+ZbdLVuMvNxLvPGZLmi2hGzVRstvMD4BkS8g4oEFSgGMhJMp
+6bEIL8Qn6kAec+8H+YcBkRVof9IzUeKB7ndNUPYKJJ1tNp2YpQzVx401srLzaVGL
+KzZ1GRThAgMBAAECggEBAL24KtbAZH4Fs+xVrVIupH1vnNbtsDtT4iAI6jV3qlLE
+jWTsHqX42ax09vEYin8SV/whXcXyEF2HxsMeV16Z3HexbggaU1FVX8hzLCoMzTAB
+BopWUjEKLdTHPzjP1yzdIbXS/LLy69cf0TUDuvWILh7k74wHx5nNCV5h35yF9wLg
+JCmVjLD73yXnVGyW8O90/6gGe/lALEbQnyBzxIr9FlDwCCRtnMbtknc2sHVmIcNG
+KQpt5qVoTaHk2JRWb1e8rhybEnOb2AeT4P3YRAcacBLfXJMye2tEhzvqqhKx7P9m
+5ugho1LmsFffE4kpSJgWuhqfRANaTNl5nzxGSCk94IECgYEA266aHJ3N13QkGauc
+K9iRnNPKkeMIIGsWpdrDZggYM7qdvG/6Oc7dvgu8ik7b4ubRCc5Akl+pziyH7yXe
+is+hTIfHfcLLopCXGH/rZoj1ESwEL8lOKm6GFkv120SdGbDVWJ3LugPfOMjgMDaM
+biMcJc0wsZixe0ibGORTfOl98EMCgYEA/2D/dqiEQV5oVrBsQMBV1hF+9IId2jNN
+D/97WkVI9Z9PHYjxaS2VTp3/SzHv4tPGmQa/H3T2sIRrt8l3zUPuajVvs1jPLQKp
+ACSb9EzYRC2klhi5syN8dAc/zW2KpTpY2KjA79/Z+QnAsXjPEZCJ1MMrJon0AUm/
+YdkQl/ouFgsCgYEAlo50OlaAQz/qmdk9/+K98OBJvW/+GtGpxONH9T5o79Le1c1c
+jY/T8rJydcuT8U7FRtYe9PIxGwbz5pdqjHG+FwgbVXpSO0ii9Px+ZVhJtIoZGHL7
+aiMzLEbE6ZB9pqTFoqUKgaKzsmQhGYnY9oaDfPjCfYSrZlWdThL1kO8pC6cCgYBF
+Cb7mIBZo6ZHBZb5OHvDVhzNP/GD/nQDHQ2TgeXyI0kF8FYpVybnkX/glJuHX6zJ0
+Kgu/AEq0W4gXTkKx3hx03+9Lh8WyQFbZsAvtFl0cyU4GObbyA7TgVRlderCRjF16
+bNyDvHtbxNQv5h3sfKuWNhDTQVYShxJS7HB89WhCEwKBgBjCP9vVlLXnRI9gCWXC
+PA0Ftvcfqr0s0Qa4/3kfA8VwfTtZhuMJFX0wxtYbLKRVEjoaEmVx0y/NK/cz8k1C
+gnNI3Acf/43vJo53TLVrtfDFbt9dIQu+P0KElcuf2Vdo2ql2jRu/pJedy7kAN8oa
+UFcQNP9kC3v+Y0cv73spNcT6
+-----END PRIVATE KEY-----

+ 26 - 0
localhost+1.pem

@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE-----
+MIIEazCCAtOgAwIBAgIRAM/d9qzXbgnCa0Q4VvufUfUwDQYJKoZIhvcNAQELBQAw
+gZkxHjAcBgNVBAoTFW1rY2VydCBkZXZlbG9wbWVudCBDQTE3MDUGA1UECwwuREVT
+S1RPUC1KTzkwVUk0XGFkbWluQERFU0tUT1AtSk85MFVJNCAo5a6L5rabKTE+MDwG
+A1UEAww1bWtjZXJ0IERFU0tUT1AtSk85MFVJNFxhZG1pbkBERVNLVE9QLUpPOTBV
+STQgKOWui+a2mykwHhcNMjQxMDExMDM0NzM4WhcNMjcwMTExMDM0NzM4WjBiMScw
+JQYDVQQKEx5ta2NlcnQgZGV2ZWxvcG1lbnQgY2VydGlmaWNhdGUxNzA1BgNVBAsM
+LkRFU0tUT1AtSk85MFVJNFxhZG1pbkBERVNLVE9QLUpPOTBVSTQgKOWui+a2mykw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDbJig1CoTUcNkYu9H5xen2
+j6Po8gbTsQIcfoe3q4g0et/9FT28Pl/A0vddMzzk1z4B/c6CBUxzno60XRr8nMh9
+ZDsrf55NSW0lxVO7h0CG7C0Zr9lWU+JlT6Xm8ccYozloV3A3XwB6fmCLksU0I2Q8
+up1QrHznHS5BdWDgjG7uEC6PpMsurgAj3kgFTpXrz0KDIYwrYDE6mnXSPqEb3J6D
+ZKmM3zmH+ZbdLVuMvNxLvPGZLmi2hGzVRstvMD4BkS8g4oEFSgGMhJMp6bEIL8Qn
+6kAec+8H+YcBkRVof9IzUeKB7ndNUPYKJJ1tNp2YpQzVx401srLzaVGLKzZ1GRTh
+AgMBAAGjZDBiMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAf
+BgNVHSMEGDAWgBR4fEEizBeJCIYlMi4n83qUtg2wZzAaBgNVHREEEzARgglsb2Nh
+bGhvc3SHBH8AAAEwDQYJKoZIhvcNAQELBQADggGBAEcZw1j5nYo6cvy+GidciuN2
+zPtEXofP7xITHagDU3fDLezfAjwIFxsIVq7TCleiMglwIsN6es8hE3caBC6mmm52
+0UUBuFuch8Fehvs8noXgOjxSMew1EM+PTkRJZjQ4WEiHCXUifnB5cw3qS1sbl6DU
+g1TNoZNu901woC3A+mzPx/JkpV9Xvlo81Nk69Bc5hbtrP76221W6wwR79WXhbWD6
+6bQAvMFQ8ZtK3d9Vtw/Q1emZqW4p6rI0TKs1bLgKviSEM8LRHl5IGrZxO760QOuK
+ABdoShS4KYhypbIsUHvD0tw84f8i1FskyCGvPIk7Thj4MUgEsfUz6dRCWg32f45t
+ToZgOkB4MklsG8oj1Ifb0nwwECjkgGF2Xq3/t9iY2lTwMfq5A2V1Z+/dNBXQ46PA
+4bCRlTmH1rkBDLumIDtpX5VaEfqFZuJt1kOW2/FXyXYwGwI3tjyP0XAi/87uCpok
+r3vi4MCIcryCH2ucbbKpXD7q/hZG2GVlpnQ1JFqfBQ==
+-----END CERTIFICATE-----

+ 134 - 0
manifest.config.ts

@@ -0,0 +1,134 @@
+// manifest.config.ts
+import { defineManifestConfig } from '@uni-helper/vite-plugin-uni-manifest'
+import path from 'node:path'
+import { loadEnv } from 'vite'
+
+// 获取环境变量的范例
+const env = loadEnv(process.env.NODE_ENV!, path.resolve(process.cwd(), 'env'))
+const {
+  VITE_APP_TITLE,
+  VITE_UNI_APPID,
+  VITE_WX_APPID,
+  VITE_APP_PUBLIC_BASE,
+  VITE_FALLBACK_LOCALE,
+} = env
+export default defineManifestConfig({
+  name: VITE_APP_TITLE,
+  appid: VITE_UNI_APPID,
+  description: '',
+  versionName: '1.0.0',
+  versionCode: '100',
+  transformPx: false,
+  locale: VITE_FALLBACK_LOCALE, // 'zh-Hans'
+  h5: {
+    router: {
+      base: VITE_APP_PUBLIC_BASE,
+      mode: 'history',
+    },
+  },
+  /* 5+App特有相关 */
+  'app-plus': {
+    usingComponents: true,
+    nvueStyleCompiler: 'uni-app',
+    compilerVersion: 3,
+    compatible: {
+      ignoreVersion: true,
+    },
+    splashscreen: {
+      alwaysShowBeforeRender: true,
+      waiting: true,
+      autoclose: true,
+      delay: 0,
+    },
+    /* 模块配置 */
+    modules: {},
+    /* 应用发布信息 */
+    distribute: {
+      /* android打包配置 */
+      android: {
+        minSdkVersion: 30,
+        targetSdkVersion: 30,
+        abiFilters: ['armeabi-v7a', 'arm64-v8a'],
+        permissions: [
+          '<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>',
+          '<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>',
+          '<uses-permission android:name="android.permission.VIBRATE"/>',
+          '<uses-permission android:name="android.permission.READ_LOGS"/>',
+          '<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>',
+          '<uses-feature android:name="android.hardware.camera.autofocus"/>',
+          '<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>',
+          '<uses-permission android:name="android.permission.CAMERA"/>',
+          '<uses-permission android:name="android.permission.GET_ACCOUNTS"/>',
+          '<uses-permission android:name="android.permission.READ_PHONE_STATE"/>',
+          '<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>',
+          '<uses-permission android:name="android.permission.WAKE_LOCK"/>',
+          '<uses-permission android:name="android.permission.FLASHLIGHT"/>',
+          '<uses-feature android:name="android.hardware.camera"/>',
+          '<uses-permission android:name="android.permission.WRITE_SETTINGS"/>',
+        ],
+      },
+      /* ios打包配置 */
+      ios: {},
+      /* SDK配置 */
+      sdkConfigs: {},
+      /* 图标配置 */
+      icons: {
+        android: {
+          hdpi: 'static/app/icons/72x72.png',
+          xhdpi: 'static/app/icons/96x96.png',
+          xxhdpi: 'static/app/icons/144x144.png',
+          xxxhdpi: 'static/app/icons/192x192.png',
+        },
+        ios: {
+          appstore: 'static/app/icons/1024x1024.png',
+          ipad: {
+            app: 'static/app/icons/76x76.png',
+            'app@2x': 'static/app/icons/152x152.png',
+            notification: 'static/app/icons/20x20.png',
+            'notification@2x': 'static/app/icons/40x40.png',
+            'proapp@2x': 'static/app/icons/167x167.png',
+            settings: 'static/app/icons/29x29.png',
+            'settings@2x': 'static/app/icons/58x58.png',
+            spotlight: 'static/app/icons/40x40.png',
+            'spotlight@2x': 'static/app/icons/80x80.png',
+          },
+          iphone: {
+            'app@2x': 'static/app/icons/120x120.png',
+            'app@3x': 'static/app/icons/180x180.png',
+            'notification@2x': 'static/app/icons/40x40.png',
+            'notification@3x': 'static/app/icons/60x60.png',
+            'settings@2x': 'static/app/icons/58x58.png',
+            'settings@3x': 'static/app/icons/87x87.png',
+            'spotlight@2x': 'static/app/icons/80x80.png',
+            'spotlight@3x': 'static/app/icons/120x120.png',
+          },
+        },
+      },
+    },
+  },
+  /* 快应用特有相关 */
+  quickapp: {},
+  /* 小程序特有相关 */
+  'mp-weixin': {
+    appid: VITE_WX_APPID,
+    setting: {
+      urlCheck: false,
+    },
+    usingComponents: true,
+    // __usePrivacyCheck__: true,
+  },
+  'mp-alipay': {
+    usingComponents: true,
+    styleIsolation: 'shared',
+  },
+  'mp-baidu': {
+    usingComponents: true,
+  },
+  'mp-toutiao': {
+    usingComponents: true,
+  },
+  uniStatistics: {
+    enable: false,
+  },
+  vueVersion: '3',
+})

+ 152 - 0
package.json

@@ -0,0 +1,152 @@
+{
+  "name": "ton-mini",
+  "type": "commonjs",
+  "version": "2.4.3",
+  "description": "ton-mini",
+  "license": "MIT",
+  "engines": {
+    "node": ">=18",
+    "pnpm": ">=7.30"
+  },
+  "scripts": {
+    "preinstall": "npx only-allow pnpm",
+    "uvm": "npx @dcloudio/uvm@latest",
+    "uvm-rm": "node ./scripts/postupgrade.js",
+    "postuvm": "echo upgrade uni-app success!",
+    "dev:app": "uni -p app",
+    "dev:app-android": "uni -p app-android",
+    "dev:app-ios": "uni -p app-ios",
+    "dev:custom": "uni -p",
+    "dev": "uni",
+    "dev:h5": "uni",
+    "dev:h5:ssr": "uni --ssr",
+    "dev:mp": "uni -p mp-weixin",
+    "dev:mp-alipay": "uni -p mp-alipay",
+    "dev:mp-baidu": "uni -p mp-baidu",
+    "dev:mp-jd": "uni -p mp-jd",
+    "dev:mp-kuaishou": "uni -p mp-kuaishou",
+    "dev:mp-lark": "uni -p mp-lark",
+    "dev:mp-qq": "uni -p mp-qq",
+    "dev:mp-toutiao": "uni -p mp-toutiao",
+    "dev:mp-weixin": "uni -p mp-weixin",
+    "dev:quickapp-webview": "uni -p quickapp-webview",
+    "dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei",
+    "dev:quickapp-webview-union": "uni -p quickapp-webview-union",
+    "build:app": "uni build -p app",
+    "build:app-android": "uni build -p app-android",
+    "build:app-ios": "uni build -p app-ios",
+    "build:custom": "uni build -p",
+    "build:h5": "uni build",
+    "build": "uni build",
+    "build:h5:ssr": "uni build --ssr",
+    "build:mp-alipay": "uni build -p mp-alipay",
+    "build:mp": "uni build -p mp-weixin",
+    "build:mp-baidu": "uni build -p mp-baidu",
+    "build:mp-jd": "uni build -p mp-jd",
+    "build:mp-kuaishou": "uni build -p mp-kuaishou",
+    "build:mp-lark": "uni build -p mp-lark",
+    "build:mp-qq": "uni build -p mp-qq",
+    "build:mp-toutiao": "uni build -p mp-toutiao",
+    "build:mp-weixin": "uni build -p mp-weixin",
+    "build:quickapp-webview": "uni build -p quickapp-webview",
+    "build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
+    "build:quickapp-webview-union": "uni build -p quickapp-webview-union",
+    "prepare": "git init && husky install ",
+    "type-check": "vue-tsc --noEmit",
+    "cz": "czg"
+  },
+  "lint-staged": {
+    "**/*.{html,vue,ts,cjs,json,md}": [
+      "prettier --write"
+    ],
+    "**/*.{vue,js,ts,jsx,tsx}": [
+      "eslint --cache --fix"
+    ],
+    "**/*.{vue,css,scss,html}": [
+      "stylelint --fix"
+    ]
+  },
+  "resolutions": {
+    "bin-wrapper": "npm:bin-wrapper-china"
+  },
+  "dependencies": {
+    "@dcloudio/uni-app": "3.0.0-alpha-4010520240507001",
+    "@dcloudio/uni-app-plus": "3.0.0-alpha-4010520240507001",
+    "@dcloudio/uni-components": "3.0.0-alpha-4010520240507001",
+    "@dcloudio/uni-h5": "3.0.0-alpha-4010520240507001",
+    "@dcloudio/uni-mp-weixin": "3.0.0-alpha-4010520240507001",
+    "@solana/web3.js": "^1.95.8",
+    "@telegram-apps/sdk-vue": "^1.0.1",
+    "@twa-dev/sdk": "^7.10.1",
+    "dayjs": "1.11.10",
+    "lodash": "^4.17.21",
+    "lottie-web": "^5.12.2",
+    "nprogress": "^0.2.0",
+    "pinia": "2.0.36",
+    "pinia-plugin-persistedstate": "3.2.1",
+    "qs": "6.5.3",
+    "vconsole": "^3.15.1",
+    "vue": "3.4.21",
+    "vue-clipboard3": "^2.0.0",
+    "vue-i18n": "^9.1.9",
+    "wot-design-uni": "^1.3.12",
+    "z-paging": "^2.7.10"
+  },
+  "devDependencies": {
+    "@commitlint/cli": "^18.6.1",
+    "@commitlint/config-conventional": "^18.6.3",
+    "@dcloudio/types": "^3.4.8",
+    "@dcloudio/uni-automator": "3.0.0-alpha-4010520240507001",
+    "@dcloudio/uni-cli-shared": "3.0.0-alpha-4010520240507001",
+    "@dcloudio/uni-stacktracey": "3.0.0-alpha-4010520240507001",
+    "@dcloudio/vite-plugin-uni": "3.0.0-alpha-4010520240507001",
+    "@esbuild/darwin-arm64": "0.20.2",
+    "@esbuild/darwin-x64": "0.20.2",
+    "@iconify-json/carbon": "^1.1.35",
+    "@rollup/rollup-darwin-x64": "^4.18.0",
+    "@types/node": "^20.14.2",
+    "@types/wechat-miniprogram": "^3.4.7",
+    "@typescript-eslint/eslint-plugin": "^6.21.0",
+    "@typescript-eslint/parser": "^6.21.0",
+    "@uni-helper/uni-types": "1.0.0-alpha.3",
+    "@uni-helper/vite-plugin-uni-layouts": "^0.1.10",
+    "@uni-helper/vite-plugin-uni-manifest": "^0.2.6",
+    "@uni-helper/vite-plugin-uni-pages": "0.2.20",
+    "@uni-helper/vite-plugin-uni-platform": "^0.0.4",
+    "@unocss/preset-legacy-compat": "^0.59.4",
+    "@vue/runtime-core": "^3.4.29",
+    "@vue/tsconfig": "^0.1.3",
+    "autoprefixer": "^10.4.19",
+    "commitlint": "^18.6.1",
+    "czg": "^1.9.3",
+    "eslint": "^8.57.0",
+    "eslint-config-prettier": "^9.1.0",
+    "eslint-config-standard": "^17.1.0",
+    "eslint-import-resolver-typescript": "^3.6.1",
+    "eslint-plugin-import": "^2.29.1",
+    "eslint-plugin-prettier": "^5.1.3",
+    "eslint-plugin-vue": "^9.26.0",
+    "husky": "^8.0.3",
+    "lint-staged": "^15.2.7",
+    "postcss": "^8.4.38",
+    "postcss-html": "^1.7.0",
+    "postcss-scss": "^4.0.9",
+    "rollup-plugin-visualizer": "^5.12.0",
+    "sass": "^1.77.5",
+    "stylelint": "^16.6.1",
+    "stylelint-config-html": "^1.1.0",
+    "stylelint-config-recess-order": "^4.6.0",
+    "stylelint-config-recommended": "^14.0.0",
+    "stylelint-config-recommended-scss": "^14.0.0",
+    "stylelint-config-recommended-vue": "^1.5.0",
+    "stylelint-prettier": "^5.0.0",
+    "terser": "^5.31.1",
+    "typescript": "^5.5.4",
+    "unocss": "^0.58.9",
+    "unocss-applet": "^0.7.8",
+    "unplugin-auto-import": "^0.17.6",
+    "vite": "5.2.8",
+    "vite-plugin-restart": "^0.4.0",
+    "vue-tsc": "^1.8.27"
+  }
+}

+ 61 - 0
pages.config.ts

@@ -0,0 +1,61 @@
+import { defineUniPages } from '@uni-helper/vite-plugin-uni-pages'
+
+export default defineUniPages({
+  globalStyle: {
+    navigationStyle: 'default',
+    navigationBarTitleText: '',
+    navigationBarBackgroundColor: '#f8f8f8',
+    navigationBarTextStyle: 'black',
+    backgroundColor: '#FFFFFF',
+  },
+  easycom: {
+    autoscan: true,
+    custom: {
+      '^wd-(.*)': 'wot-design-uni/components/wd-$1/wd-$1.vue',
+      '^(?!z-paging-refresh|z-paging-load-more)z-paging(.*)':
+        'z-paging/components/z-paging$1/z-paging$1.vue',
+    },
+  },
+  tabBar: {
+    color: '#777777',
+    selectedColor: '#8AE54A',
+    backgroundColor: '#18181B',
+    borderStyle: 'black',
+    height: '120rpx',
+    fontSize: '22rpx',
+    // iconWidth: '24px',
+    // spacing: '3px',
+    list: [
+      {
+        iconPath: 'static/images/tabbar/home.png',
+        selectedIconPath: 'static/images/tabbar/home-l.png',
+        pagePath: 'pages/index/index',
+        text: '%tabbar.Home%',
+      },
+      {
+        iconPath: 'static/images/tabbar/jiangpai.png',
+        selectedIconPath: 'static/images/tabbar/jangpai-l.png',
+        pagePath: 'pages/trophy/index',
+        text: '%tabbar.Competition%',
+      },
+      {
+        iconPath: 'static/images/tabbar/people.png',
+        selectedIconPath: 'static/images/tabbar/people-l.png',
+        pagePath: 'pages/team/index',
+        text: '%tabbar.Team%',
+      },
+      {
+        iconPath: 'static/images/tabbar/group.png',
+        selectedIconPath: 'static/images/tabbar/group-l.png',
+        pagePath: 'pages/task/index',
+        text: '%tabbar.Earn%',
+      },
+      // {
+      //   // iconPath: 'static/tabbar/example.png',
+      //   // selectedIconPath: 'static/tabbar/exampleHL.png',
+      //   // pagePath: 'pages/airdrop/index',
+      //   // text: '%tabbar.about%',
+      // },
+    ],
+  },
+})

+ 36 - 0
scripts/postupgrade.js

@@ -0,0 +1,36 @@
+// # 执行 `pnpm upgrade` 后会升级 `uniapp` 相关依赖
+// # 在升级完后,会自动添加很多无用依赖,这需要删除以减小依赖包体积
+// # 只需要执行下面的命令即可
+
+// eslint-disable-next-line @typescript-eslint/no-var-requires
+const { exec } = require('child_process')
+
+// 定义要执行的命令
+const dependencies = [
+  '@dcloudio/uni-app-harmony',
+  // TODO: 如果需要某个平台的小程序,请手动删除或注释掉
+  '@dcloudio/uni-mp-alipay',
+  '@dcloudio/uni-mp-baidu',
+  '@dcloudio/uni-mp-jd',
+  '@dcloudio/uni-mp-kuaishou',
+  '@dcloudio/uni-mp-lark',
+  '@dcloudio/uni-mp-qq',
+  '@dcloudio/uni-mp-toutiao',
+  '@dcloudio/uni-mp-xhs',
+  '@dcloudio/uni-quickapp-webview',
+  // i18n模板要注释掉下面的
+  // 'vue-i18n',
+]
+
+// 使用exec执行命令
+exec(`pnpm un ${dependencies.join(' ')}`, (error, stdout, stderr) => {
+  if (error) {
+    // 如果有错误,打印错误信息
+    console.error(`执行出错: ${error}`)
+    return
+  }
+  // 打印正常输出
+  console.log(`stdout: ${stdout}`)
+  // 如果有错误输出,也打印出来
+  console.error(`stderr: ${stderr}`)
+})

+ 126 - 0
src/App.vue

@@ -0,0 +1,126 @@
+<script setup lang="ts">
+import { onLaunch, onShow, onHide } from '@dcloudio/uni-app'
+import WebApp from '@twa-dev/sdk'
+import { updateOnlineTime } from '@/service/index/foo'
+import i18n from '@/locale'
+
+// 记录开始时间
+const startTime = ref<number>(0)
+// 累计在线时长(秒)
+const totalOnlineTime = ref<number>(0)
+// 是否正在计时
+const isTracking = ref<boolean>(false)
+
+// 开始计时
+const startTracking = () => {
+  if (!isTracking.value) {
+    startTime.value = Date.now()
+    isTracking.value = true
+    console.log('开始计时:', new Date(startTime.value).toLocaleString())
+  }
+}
+
+// 停止计时并计算时长
+const stopTracking = async () => {
+  if (isTracking.value) {
+    const endTime = Date.now()
+    const duration = Math.floor((endTime - startTime.value) / 1000) // 转换为秒
+    totalOnlineTime.value += duration
+    isTracking.value = false
+
+    console.log('本次在线时长:', duration, '秒')
+    console.log('总计在线时长:', totalOnlineTime.value, '秒')
+
+    // 添加上报逻辑
+    await updateOnlineTime(totalOnlineTime.value)
+  }
+}
+
+onLaunch(() => {
+  uni.hideTabBar()
+  console.log('App Launch,111')
+})
+
+onShow(() => {
+  const lang = uni.getStorageSync('lang')
+  if (lang) {
+    uni.setLocale(lang)
+    i18n.global.locale = lang
+  }
+  console.log('App Show')
+  startTracking()
+})
+
+onHide(() => {
+  console.log('App Hide')
+  stopTracking()
+})
+
+onMounted(() => {
+  WebApp.ready()
+  WebApp.setHeaderColor('#09090B')
+  startTracking()
+
+  // 只保留最基本的关闭监听
+  WebApp.onEvent('viewportChanged', () => {
+    if (!WebApp.isExpanded) {
+      stopTracking()
+    }
+  })
+})
+
+onUnmounted(() => {
+  stopTracking()
+})
+</script>
+
+<style lang="scss">
+/* stylelint-disable selector-type-no-unknown */
+button::after {
+  border: none;
+}
+
+swiper,
+scroll-view {
+  flex: 1;
+  height: 100%;
+  overflow: hidden;
+}
+
+image {
+  width: 100%;
+  height: 100%;
+  vertical-align: middle;
+}
+
+// 单行省略,优先使用 unocss: text-ellipsis
+.ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+// 两行省略
+.ellipsis-2 {
+  display: -webkit-box;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+}
+
+// 三行省略
+.ellipsis-3 {
+  display: -webkit-box;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 3;
+  -webkit-box-orient: vertical;
+}
+
+// 全局修改
+#nprogress .bar {
+  height: 20rpx;
+  background: #8ae54a !important; /* 进度条颜色 */
+}
+</style>

+ 142 - 0
src/components/TabBar/index.vue

@@ -0,0 +1,142 @@
+<template>
+  <view class="custom-tab-bar">
+    <view class="tab-bar-content">
+      <view
+        v-for="(tab, index) in tabs"
+        :key="index"
+        class="tab-item"
+        :class="{ 'tab-active': currentTab === tab.pagePath }"
+        @tap="switchTab(tab.pagePath)"
+      >
+        <image
+          :src="currentTab === tab.pagePath ? tab.selectedIconPath : tab.iconPath"
+          class="tab-icon"
+        ></image>
+        <text class="tab-text" :class="{ 'text-active': currentTab === tab.pagePath }">
+          {{ tab.text }}
+        </text>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import i18n, { t } from '@/locale/index'
+
+const props = withDefaults(
+  defineProps<{
+    currentTab: string
+  }>(),
+  {
+    currentTab: 'pages/index/index',
+  },
+)
+
+interface TabItem {
+  pagePath: string
+  iconPath: string
+  selectedIconPath: string
+  text: string
+}
+
+const tabs = ref<TabItem[]>([])
+
+const updateLists = () => {
+  tabs.value = [
+    {
+      pagePath: 'pages/index/index',
+      text: t('tabbar.Home'),
+      iconPath: '/static/images/tabbar/home.png',
+      selectedIconPath: '/static/images/tabbar/home-l.png',
+    },
+    {
+      pagePath: 'pages/trophy/index',
+      text: t('tabbar.Competition'),
+      iconPath: '/static/images/tabbar/jiangpai.png',
+      selectedIconPath: '/static/images/tabbar/jangpai-l.png',
+    },
+    {
+      pagePath: 'pages/team/index',
+      text: t('tabbar.Team'),
+      iconPath: '/static/images/tabbar/people.png',
+      selectedIconPath: '/static/images/tabbar/people-l.png',
+    },
+    {
+      pagePath: 'pages/task/index',
+      text: t('tabbar.Earn'),
+      iconPath: '/static/images/tabbar/group.png',
+      selectedIconPath: '/static/images/tabbar/group-l.png',
+    },
+  ]
+}
+
+onMounted(() => {
+  updateLists()
+})
+
+const switchTab = (pagePath: string) => {
+  uni.switchTab({
+    url: `/${pagePath}`,
+  })
+}
+
+watch(() => i18n.global.locale, updateLists)
+</script>
+
+<style scoped>
+.custom-tab-bar {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 98rpx; /* 调整为更准确的高度 */
+}
+
+.tab-bar-content {
+  display: flex;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  background-color: #000000; /* 改为黑色背景 */
+}
+
+.tab-item {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  height: 100%;
+  padding: 12rpx 0; /* 调整内边距 */
+}
+
+.tab-icon {
+  width: 42rpx; /* 调整图标大小 */
+  height: 42rpx;
+  margin-bottom: 8rpx; /* 调整图标和文字间距 */
+}
+
+.tab-text {
+  font-size: 20rpx; /* 调整字体大小 */
+  line-height: 1;
+  color: #999999; /* 调整未选中颜色 */
+}
+
+.text-active {
+  color: #8ae54a; /* 保持选中颜色 */
+}
+/* 移除选中时的背景色变化 */
+.tab-active {
+  background: none;
+}
+/* 添加顶部边框 */
+.tab-bar-content::after {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 1px;
+  content: '';
+  background-color: rgba(255, 255, 255, 0.1); /* 添加微弱的顶部边框 */
+}
+</style>

+ 7 - 0
src/components/TabBar/type.ts

@@ -0,0 +1,7 @@
+export type Tab = {
+  currentName: string
+  text: string
+  icon: string
+  selectIcon: string
+  pagePath: string
+}

+ 183 - 0
src/components/common/Dialog/index.vue

@@ -0,0 +1,183 @@
+<template>
+  <Transition name="fade" @after-leave="onTransitionComplete">
+    <view v-show="show" class="popup-overlay" @click="closeOnOverlayClick && close()">
+      <Transition name="pop">
+        <view v-show="show" class="popup-content" :class="positionClass" @click.stop>
+          <view v-if="closable" class="popup-close" @click="close">×</view>
+          <view
+            class="bg-[#27272A] flex flex-col items-center"
+            :style="{ width: width, height: height }"
+          >
+            <view class="dialog-box-content overflow-y-scroll w-full">
+              <slot></slot>
+            </view>
+            <slot name="footer">
+              <view class="dialog-box-footer absolute bottom-70rpx">
+                <view
+                  @click="onConfirm"
+                  class="w-630rpx h-100rpx rounded-20rpx button-bg flex items-center justify-center text-white"
+                >
+                  {{ $t('production.team.joinBtn') }}
+                </view>
+              </view>
+            </slot>
+          </view>
+        </view>
+      </Transition>
+    </view>
+  </Transition>
+</template>
+
+<script setup lang="ts">
+const props = defineProps({
+  showValue: {
+    type: Boolean,
+    default: false,
+  },
+  width: {
+    type: String,
+    default: '690rpx',
+  },
+  height: {
+    type: String,
+    default: '794rpx',
+  },
+  position: {
+    type: String,
+    default: 'center',
+  },
+  closable: {
+    type: Boolean,
+    default: true,
+  },
+  closeOnOverlayClick: {
+    type: Boolean,
+    default: true,
+  },
+})
+
+const emit = defineEmits(['update:showValue', 'onConfirm'])
+
+const show = ref(props.showValue)
+
+const positionClass = computed(() => {
+  switch (props.position) {
+    case 'top':
+      return 'popup-top'
+    case 'bottom':
+      return 'popup-bottom'
+    case 'left':
+      return 'popup-left'
+    case 'right':
+      return 'popup-right'
+    default:
+      return 'popup-center'
+  }
+})
+
+const close = () => {
+  show.value = false
+}
+
+const onTransitionComplete = () => {
+  emit('update:showValue', show.value)
+}
+
+const onConfirm = () => {
+  emit('onConfirm')
+}
+
+watch(
+  () => props.showValue,
+  (newValue) => {
+    show.value = newValue
+  },
+)
+</script>
+
+<style scoped>
+.popup-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.5);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  z-index: 1000;
+}
+
+.popup-content {
+  background-color: #27272a;
+  border-radius: 30rpx;
+  position: relative;
+}
+
+.popup-close {
+  position: absolute;
+  top: 10rpx;
+  right: 10rpx;
+  font-size: 40rpx;
+  color: white;
+  cursor: pointer;
+}
+
+.popup-center {
+  /* Center positioning styles */
+}
+
+.popup-top {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+}
+
+.popup-bottom {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+
+.popup-left {
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+}
+
+.popup-right {
+  position: absolute;
+  right: 0;
+  top: 0;
+  bottom: 0;
+}
+
+.button-bg {
+  background: #8ae54a;
+}
+
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.3s ease;
+}
+
+.fade-enter-from,
+.fade-leave-to {
+  opacity: 0;
+}
+
+.pop-enter-active,
+.pop-leave-active {
+  transition: all 0.3s ease;
+}
+
+.pop-enter-from,
+.pop-leave-to {
+  opacity: 0;
+  transform: scale(0.8);
+}
+</style>

+ 6 - 0
src/components/common/Dialog/type.ts

@@ -0,0 +1,6 @@
+export type DialogType = {
+  showValue: boolean
+  width: string
+  height: string
+  position?: string
+}

+ 44 - 0
src/components/common/Solana/index.vue

@@ -0,0 +1,44 @@
+<template>
+  <view>
+    <button @click="createWallet" :disabled="!!wallet">Create Wallet</button>
+    <view v-if="wallet">
+      <p>Public Key: {{ wallet.publicKey.toString() }}</p>
+      <p>Balance: {{ balance }} SOL</p>
+      <input v-model="recipientPublicKey" placeholder="Recipient Public Key" />
+      <input v-model.number="amount" type="number" placeholder="Amount in SOL" />
+      <button @click="sendSol">Send SOL</button>
+    </view>
+  </view>
+</template>
+<script lang="ts" setup>
+import { solanaService } from '@/utils/solana'
+const wallet = solanaService.wallet
+const balance = ref(0)
+const recipientPublicKey = ref('')
+const amount = ref(0)
+
+const createWallet = async () => {
+  await solanaService.createWallet()
+  await updateBalance()
+}
+
+const updateBalance = async () => {
+  if (wallet.value) {
+    balance.value = await solanaService.getBalance(wallet.value.publicKey.toString())
+  }
+}
+
+const sendSol = async () => {
+  if (wallet.value && recipientPublicKey.value && amount.value > 0) {
+    try {
+      const signature = await solanaService.sendTransaction(recipientPublicKey.value, amount.value)
+      console.log('Transaction sent:', signature)
+      await updateBalance()
+    } catch (error) {
+      console.error('Failed to send transaction:', error)
+    }
+  }
+}
+
+onMounted(updateBalance)
+</script>

+ 31 - 0
src/env.d.ts

@@ -0,0 +1,31 @@
+/// <reference types="vite/client" />
+/// <reference types="vite-svg-loader" />
+
+declare module '*.vue' {
+  import { DefineComponent } from 'vue'
+  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
+  const component: DefineComponent<{}, {}, any>
+  export default component
+}
+
+interface ImportMetaEnv {
+  /** 网站标题,应用名称 */
+  readonly VITE_APP_TITLE: string
+  /** 服务端口号 */
+  readonly VITE_SERVER_PORT: string
+  /** 后台接口地址 */
+  readonly VITE_SERVER_BASEURL: string
+  /** H5是否需要代理 */
+  readonly VITE_APP_PROXY: 'true' | 'false'
+  /** H5是否需要代理,需要的话有个前缀 */
+  readonly VITE_APP_PROXY_PREFIX: string // 一般是/api
+  /** 上传图片地址 */
+  readonly VITE_UPLOAD_BASEURL: string
+  /** 是否清除console */
+  readonly VITE_DELETE_CONSOLE: string
+  // 更多环境变量...
+}
+
+interface ImportMeta {
+  readonly env: ImportMetaEnv
+}

+ 21 - 0
src/hooks/moneyProcessing.ts

@@ -0,0 +1,21 @@
+export const formatAmount = (amount: number): string => {
+  if (amount >= 1000000) {
+    return `${amount / 1000000}m`
+  } else if (amount >= 10000) {
+    return `${amount / 1000}k`
+  } else if (amount >= 1000) {
+    return `${amount / 1000}k`
+  } else {
+    return amount.toString()
+  }
+}
+export const formatAmountNoFloat = (number: number): string => {
+  const absNumber = Math.abs(number)
+  if (absNumber >= 1e6) {
+    return (number / 1e6).toFixed(1).replace(/\.0$/, '') + 'm'
+  } else if (absNumber >= 1e3) {
+    return (number / 1e3).toFixed(1).replace(/\.0$/, '') + 'k'
+  } else {
+    return number.toString().replace(/(\.\d*?[1-9])0+$|\.0*$/, '$1')
+  }
+}

+ 17 - 0
src/hooks/useImgPath.ts

@@ -0,0 +1,17 @@
+import { computed } from 'vue'
+
+export const useImgPath = () => {
+  const getAssetsImages = (paths: string, name: string, type = 'png') => {
+    /**
+     * 获取本地图
+     * @param name // 文件名 如 home-bg
+     * @param type // 文件类型 如 png jpg
+     * @returns {string}
+     */
+    return `/static/images/${paths}/${name}.${type}`
+  }
+
+  return {
+    getAssetsImages,
+  }
+}

+ 44 - 0
src/hooks/useRequest.ts

@@ -0,0 +1,44 @@
+import { UnwrapRef } from 'vue'
+
+type IUseRequestOptions<T> = {
+  /** 是否立即执行 */
+  immediate?: boolean
+  /** 初始化数据 */
+  initialData?: T
+}
+
+/**
+ * useRequest是一个定制化的请求钩子,用于处理异步请求和响应。
+ * @param func 一个执行异步请求的函数,返回一个包含响应数据的Promise。
+ * @param options 包含请求选项的对象 {immediate, initialData}。
+ * @param options.immediate 是否立即执行请求,默认为false。
+ * @param options.initialData 初始化数据,默认为undefined。
+ * @returns 返回一个对象{loading, error, data, run},包含请求的加载状态、错误信息、响应数据和手动触发请求的函数。
+ */
+export default function useRequest<T>(
+  func: () => Promise<IResData<T>>,
+  options: IUseRequestOptions<T> = { immediate: false },
+) {
+  const loading = ref(false)
+  const error = ref(false)
+  const data = ref<T>(options.initialData)
+  const run = async () => {
+    loading.value = true
+    return func()
+      .then((res) => {
+        data.value = res.data as UnwrapRef<T>
+        error.value = false
+        return data.value
+      })
+      .catch((err) => {
+        error.value = err
+        throw err
+      })
+      .finally(() => {
+        loading.value = false
+      })
+  }
+
+  options.immediate && run()
+  return { loading, error, data, run }
+}

+ 46 - 0
src/hooks/useTelegramBackButton.ts

@@ -0,0 +1,46 @@
+import { ref, onMounted, onUnmounted } from 'vue'
+import WebApp from '@twa-dev/sdk'
+
+export function useTelegramBackButton(onClick?: () => void) {
+  const isVisible = ref(false)
+
+  const show = () => {
+    // 直接调用 WebApp 的方法显示返回按钮
+    WebApp.BackButton.show()
+    isVisible.value = true
+  }
+
+  const hide = () => {
+    WebApp.BackButton.hide()
+    isVisible.value = false
+  }
+
+  const handleBackClick = () => {
+    if (onClick) {
+      onClick()
+    } else {
+      // 默认行为
+      history.back()
+    }
+  }
+
+  onMounted(() => {
+    // 确保 WebApp 已经加载
+    WebApp.ready()
+    // 显式调用显示方法
+    show()
+    // 绑定点击事件
+    WebApp.BackButton.onClick(handleBackClick)
+  })
+
+  onUnmounted(() => {
+    hide()
+    WebApp.BackButton.offClick(handleBackClick)
+  })
+
+  return {
+    isVisible,
+    show,
+    hide,
+  }
+}

+ 81 - 0
src/hooks/useUpload.ts

@@ -0,0 +1,81 @@
+// TODO: 别忘加更改环境变量的 VITE_UPLOAD_BASEURL 地址。
+import { getEvnBaseUploadUrl } from '@/utils'
+
+const VITE_UPLOAD_BASEURL = `${getEvnBaseUploadUrl()}`
+
+/**
+ * useUpload 是一个定制化的请求钩子,用于处理上传图片。
+ * @param formData 额外传递给后台的数据,如{name: '菲鸽'}。
+ * @returns 返回一个对象{loading, error, data, run},包含请求的加载状态、错误信息、响应数据和手动触发请求的函数。
+ */
+export default function useUpload<T = string>(formData: Record<string, any> = {}) {
+  const loading = ref(false)
+  const error = ref(false)
+  const data = ref<T>()
+  const run = () => {
+    // #ifdef MP-WEIXIN
+    // 微信小程序从基础库 2.21.0 开始, wx.chooseImage 停止维护,请使用 uni.chooseMedia 代替。
+    // 微信小程序在2023年10月17日之后,使用本API需要配置隐私协议
+    uni.chooseMedia({
+      count: 1,
+      mediaType: ['image'],
+      success: (res) => {
+        loading.value = true
+        const tempFilePath = res.tempFiles[0].tempFilePath
+        uploadFile<T>({ tempFilePath, formData, data, error, loading })
+      },
+      fail: (err) => {
+        console.error('uni.chooseMedia err->', err)
+        error.value = true
+      },
+    })
+    // #endif
+    // #ifndef MP-WEIXIN
+    uni.chooseImage({
+      count: 1,
+      success: (res) => {
+        loading.value = true
+        const tempFilePath = res.tempFilePaths[0]
+        uploadFile<T>({ tempFilePath, formData, data, error, loading })
+      },
+      fail: (err) => {
+        console.error('uni.chooseImage err->', err)
+        error.value = true
+      },
+    })
+    // #endif
+  }
+
+  return { loading, error, data, run }
+}
+
+function uploadFile<T>({ tempFilePath, formData, data, error, loading }) {
+  if (loading.value) {
+    uni.showLoading({
+      title: 'loading...',
+    })
+  }
+  const url = import.meta.env.MODE === 'development' ? '/api/upload/image' : VITE_UPLOAD_BASEURL
+  uni.uploadFile({
+    url,
+    filePath: tempFilePath,
+    name: 'file',
+    formData,
+    success: (uploadFileRes) => {
+      data.value = JSON.parse(uploadFileRes.data) as T
+    },
+    fail: (err) => {
+      if (loading.value) {
+        uni.hideLoading()
+      }
+      console.error('uni.uploadFile err->', err)
+      error.value = true
+    },
+    complete: () => {
+      if (loading.value) {
+        uni.hideLoading()
+      }
+      loading.value = false
+    },
+  })
+}

+ 3 - 0
src/interceptors/index.ts

@@ -0,0 +1,3 @@
+export { routeInterceptor } from './route'
+export { requestInterceptor } from './request'
+export { prototypeInterceptor } from './prototype'

+ 13 - 0
src/interceptors/prototype.ts

@@ -0,0 +1,13 @@
+export const prototypeInterceptor = {
+  install() {
+    // 解决低版本手机不识别 array.at() 导致运行报错的问题
+    if (typeof Array.prototype.at !== 'function') {
+      // eslint-disable-next-line no-extend-native
+      Array.prototype.at = function (index: number) {
+        if (index < 0) return this[this.length + index]
+        if (index >= this.length) return undefined
+        return this[index]
+      }
+    }
+  },
+}

+ 68 - 0
src/interceptors/request.ts

@@ -0,0 +1,68 @@
+/* eslint-disable no-param-reassign */
+import qs from 'qs'
+import { useUserStore } from '@/store'
+import { platform } from '@/utils/platform'
+import { getEvnBaseUrl } from '@/utils'
+
+export type CustomRequestOptions = UniApp.RequestOptions & {
+  query?: Record<string, any>
+  /** 出错时是否隐藏错误提示 */
+  hideErrorToast?: boolean
+} & IUniUploadFileOptions // 添加uni.uploadFile参数类型
+
+// 请求基准地址
+const baseUrl = getEvnBaseUrl()
+
+// 拦截器配置
+const httpInterceptor = {
+  // 拦截前触发
+  invoke(options: CustomRequestOptions) {
+    // 接口请求支持通过 query 参数配置 queryString
+    if (options.query) {
+      const queryStr = qs.stringify(options.query)
+      if (options.url.includes('?')) {
+        options.url += `&${queryStr}`
+      } else {
+        options.url += `?${queryStr}`
+      }
+    }
+    // 非 http 开头需拼接地址
+    if (!options.url.startsWith('http')) {
+      // #ifdef H5
+      // console.log(__VITE_APP_PROXY__)
+      if (JSON.parse(__VITE_APP_PROXY__)) {
+        // 啥都不需要做
+      } else {
+        options.url = baseUrl + options.url
+      }
+      // #endif
+      // 非H5正常拼接
+      // #ifndef H5
+      options.url = baseUrl + options.url
+      // #endif
+      // TIPS: 如果需要对接多个后端服务,也可以在这里处理,拼接成所需要的地址
+    }
+    // 1. 请求超时
+    options.timeout = 10000 // 10s
+    // 2. (可选)添加小程序端请求头标识
+    options.header = {
+      platform, // 可选,与 uniapp 定义的平台一致,告诉后台来源
+      ...options.header,
+    }
+    // 3. 添加 token 请求头标识
+    const userStore = useUserStore()
+    const { token } = userStore.userInfo as unknown as IUserInfo
+    if (token) {
+      options.header.Authorization = `Bearer ${token}`
+    }
+  },
+}
+
+export const requestInterceptor = {
+  install() {
+    // 拦截 request 请求
+    uni.addInterceptor('request', httpInterceptor)
+    // 拦截 uploadFile 文件上传
+    uni.addInterceptor('uploadFile', httpInterceptor)
+  },
+}

+ 53 - 0
src/interceptors/route.ts

@@ -0,0 +1,53 @@
+/**
+ * by 菲鸽 on 2024-03-06
+ * 路由拦截,通常也是登录拦截
+ * 可以设置路由白名单,或者黑名单,看业务需要选哪一个
+ * 我这里应为大部分都可以随便进入,所以使用黑名单
+ */
+import { useUserStore } from '@/store'
+import { getNeedLoginPages, needLoginPages as _needLoginPages } from '@/utils'
+
+// TODO Check
+const loginRoute = '/pages/login/index'
+
+const isLogined = () => {
+  const userStore = useUserStore()
+  return userStore.isLogined
+}
+
+const isDev = import.meta.env.DEV
+
+// 黑名单登录拦截器 - (适用于大部分页面不需要登录,少部分页面需要登录)
+const navigateToInterceptor = {
+  // 注意,这里的url是 '/' 开头的,如 '/pages/index/index',跟 'pages.json' 里面的 path 不同
+  invoke({ url }: { url: string }) {
+    // console.log(url) // /pages/route-interceptor/index?name=feige&age=30
+    const path = url.split('?')[0]
+    let needLoginPages: string[] = []
+    // 为了防止开发时出现BUG,这里每次都获取一下。生产环境可以移到函数外,性能更好
+    if (isDev) {
+      needLoginPages = getNeedLoginPages()
+    } else {
+      needLoginPages = _needLoginPages
+    }
+    const isNeedLogin = needLoginPages.includes(path)
+    if (!isNeedLogin) {
+      return true
+    }
+    const hasLogin = isLogined()
+    if (hasLogin) {
+      return true
+    }
+    const redirectRoute = `${loginRoute}?redirect=${encodeURIComponent(url)}`
+    uni.navigateTo({ url: redirectRoute })
+    return false
+  },
+}
+
+export const routeInterceptor = {
+  install() {
+    uni.addInterceptor('navigateTo', navigateToInterceptor)
+    uni.addInterceptor('reLaunch', navigateToInterceptor)
+    uni.addInterceptor('redirectTo', navigateToInterceptor)
+  },
+}

+ 22 - 0
src/layouts/default.vue

@@ -0,0 +1,22 @@
+<template>
+  <wd-config-provider :themeVars="themeVars">
+    <slot class="my-component" />
+    <wd-toast />
+    <wd-message-box />
+  </wd-config-provider>
+</template>
+
+<script lang="ts" setup>
+import type { ConfigProviderThemeVars } from 'wot-design-uni'
+import { Locale } from 'wot-design-uni'
+// 引入英文语言包
+import enUS from 'wot-design-uni/locale/lang/en-US'
+
+Locale.use('en-US', enUS)
+const themeVars: ConfigProviderThemeVars = {
+  // colorTheme: 'red',
+  // buttonPrimaryBgColor: '#07c160',
+  // buttonPrimaryColor: '#07c160',
+}
+</script>
+<style lang="scss"></style>

+ 12 - 0
src/locale/README.md

@@ -0,0 +1,12 @@
+# 注意事项
+
+> 文件夹名字必须为 `locale`, 这是 `uniapp` 官方约定的,如果改为别的,标题将不能正常切换多语言(其他内容还是正常)。
+>
+> `xxx.json` 的 `xxx` 多语言标识必须与 `uniapp` 官方约定的一致,否则也会出现 BUG。
+>
+> 查看截图 `screenshots/i18n.png`。
+
+## 参考文档
+
+[uniapp 国际化开发指南](https://uniapp.dcloud.net.cn/tutorial/i18n.html)
+[uniapp 国际化-注意事项](https://uniapp.dcloud.net.cn/api/ui/locale.html#onlocalechange) 最下面的注意事项

+ 212 - 0
src/locale/en.json

@@ -0,0 +1,212 @@
+{
+  "tabbar.Home": "Home",
+  "tabbar.Competition": "Competition",
+  "tabbar.Team": "Team",
+  "tabbar.Earn": "Earn",
+  "tabbar.point": "Earn Points",
+  "app.name": "Chinese Title",
+  "weight": "{heavy} kg",
+  "detail": "{0} cm, {1} kg",
+  "production.rewards.yaoqinghaoyou": "Invite {index} friends to get",
+  "production.rewards.yaoqinghaoyouDialog": "Invite {index} friends",
+  "production.purse": "Wallet",
+  "production.daily": "Daily Check-in",
+  "production.rewards": "Random Rewards",
+  "production.bounty": "Promotion",
+  "production.profit": "Hourly Profit",
+  "production.upgrade": "Upgrade",
+  "production.friends": "Friends",
+  "production.team.join": "Join Squad",
+  "production.team.joinText": "Join a squad to swlpe and eari together. Maximize profits and climb the rinkings!",
+  "production.team.creat": "Creat or Join a custom squad",
+  "production.team.list": "Recommend Squad",
+  "production.team.community": "Community",
+  "production.team.joinBtn": "Join",
+  "production.team.joinSuccess": "joinSuccess",
+  "production.team.joinError": "joinError",
+  "production.team.Friend": "Invite Friend",
+  "production.team.Squad": "Leave Squad",
+  "production.team.Cancel": "Cancel",
+  "production.team.Leave": "Leave",
+  "production.team.exit": "Are you suer you want to exit",
+  "production.rewards.rewards": "Total rewards",
+  "production.rewards.bonuses": "Invite frens to get bonuses",
+  "production.rewards.yaoqing": "Invite friends",
+  "production.rewards.huode": "You and your friends will get",
+  "production.rewards.guanzhu": "Follow our channel with your friends",
+  "production.rewards.extra": "Invite extra rewards",
+  "production.rewards.invite": "Send to invite",
+  "production.rewards.Buddy": "Buddy list",
+  "production.rewards.Contribution": "Contribution reward",
+  "production.rewards.Unlock": "Unlock",
+  "production.rewards.TapCoins": "TapCoins when you reach this level.",
+  "production.rewards.Claim": "Claim",
+  "production.rewards.ShareLink": "Share invite link",
+  "production.rewards.Share": "Share",
+  "production.rewards.secret": "secret code to invite",
+  "production.rewards.Copy": "Copy",
+  "production.rewards.Recommend": "Recommend if you shared to groups that blocks links",
+  "production.signin.Daily": "Daily Reward",
+  "production.signin.every": "The more you log in every day, the more TapCoins",
+  "production.signin.Claim": "Claim Reward",
+  "production.signin.Reward": "You can only choose one of the Reward",
+  "production.signin.TapCoins": "TapCoins",
+  "production.signin.Premium": "TapCoins Premium",
+  "production.signin.ahead": "Go ahead",
+  "production.signin.Claimbtn": "Claim",
+  "production.gifts.Luck": "Luck Code",
+  "production.gifts.Watch": "Watch this video from beginning to end at normal speed andenterthe lucky code to get a reward",
+  "production.gifts.getRewards": "Watch the video to get rewards",
+  "production.gifts.Watche": "Watche the video,find the Lucky Code and pasteit here",
+  "production.gifts.Submit": "Submit",
+  "production.gifts.WatchO": "Watch",
+  "production.rocket.balance": "Your balance",
+  "production.rocket.boosters": "Free daily boosters",
+  "production.rocket.Turbo": "Turbo",
+  "production.rocket.Energys": "Energy",
+  "production.rocket.Free": "Free",
+  "production.rocket.available": "available",
+  "production.rocket.Energy": "Full Energy",
+  "production.rocket.Boosters": "Boosters",
+  "production.rocket.Multitap": "Multitap",
+  "production.rocket.Amount": "Amount value per coin +1 for each level",
+  "production.rocket.Use": "Use",
+  "production.baron.Totalprofit": "Total profit per hour",
+  "production.baron.profit": "Profit per hour",
+  "production.baron.Ranking": "Ranking List",
+  "production.baron.Crypto": "Crypto Candlestick",
+  "task.More": "More tasks, More rewards",
+  "task.Official": "Official",
+  "task.Join": "Join",
+  "task.Check": "Check",
+  "task.Extra": "Extra Tasks",
+  "task.Daily": "Daily",
+  "bounty.profit": "Hourly profit",
+  "bounty.Hint": "Hint",
+  "bounty.TapCoins": "TapCoins bounty",
+  "bounty.Block": "Song of the Year",
+  "bounty.Appli": "Lifetime achievement",
+  "bounty.Terms": "Annual production",
+  "bounty.Event": "Album of the Year",
+  "bounty.Profit": "Profit per hour",
+  "bounty.ahead": "Go ahead",
+  "bounty.lucky": "I am lucky",
+  "bounty.hope": "I hope I am lucky",
+  "bounty.Boost": "Boost your profit",
+  "bounty.Start": "Start mining",
+  "bounty.Guess": "Guess the hint within the countdown to win the prize",
+  "bounty.Tap": "Tap the Mining menu to buy upgrades Earn even when offline up to 3 hours",
+  "bounty.Will": "Will Warren and Amir Bandeali began the development of the project in 2016, and on February 22, 2017",
+  "airdrop.title": "Earn TapCoins, Keys, USDT, TON, and more",
+  "airdrop.chets.Quest": "Crypto Quest",
+  "airdrop.chets.Victory": "Victory Belongs to the few",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "Current Prize Pool",
+  "airdrop.chets.winner": "The box with the fewest purchases will be winner",
+  "airdrop.chets.purchase": "Countdown to purchase",
+  "airdrop.chets.Perpurchase": "Per Purchase",
+  "airdrop.chets.BUY": "BUY",
+  "airdrop.chets.Balance": "Balance",
+  "airdrop.chets.How": "How to play",
+  "airdrop.chets.Ranking": "Ranking",
+  "airdrop.chets.Records": "My Records",
+  "airdrop.chets.play": "How to play",
+  "airdrop.chets.time": "Prize draw time",
+  "airdrop.chets.Win": "Win",
+  "airdrop.chets.Prize": "Prize Pool",
+  "airdrop.chets.Winning": "Winning box",
+  "airdrop.chets.Prizedraw": "Prize draw time",
+  "airdrop.chets.BOX": "BOX",
+  "airdrop.chets.Total": "Total",
+  "airdrop.chets.Purchase": "Purchase",
+  "airdrop.chets.text": "1.After the countdown ends, the box with the least number of purchases will be the winning box. 2.In the event that multiple boxes have the same number of purchases, the last box purchased will be designated as the winner. 3.The winners will share 80% of the total prize pool, with the prize distributed according to the number of boxes purchased.",
+  "airdrop.tumtable.Awards": "Awards",
+  "point.Airdrop": "Airdrop",
+  "point.Core": "Core Points",
+  "purse.Total": "Total profit per hour",
+  "purse.per": "Profit per hour",
+  "purse.Withdraw": "Withdraw",
+  "purse.amount": "Please enter a valid amount",
+  "purse.Minimum": "Minimum withdrawal amount is 0.1 TON",
+  "purse.balance": "Insufficient balance",
+  "purse.Record": "Record",
+  "play.Relaxed": "Relaxed",
+  "play.Ordinary": "Ordinary",
+  "play.Nervousness": "Nervousness",
+  "play.Duration": "Duration",
+  "play.Click": "Click",
+  "play.Increase": "Increase in profit per hour",
+  "play.Go": "Go",
+  "play.OK": "OK",
+  "play.right": "The rhythm is right",
+  "play.again": "You failed, please try again",
+
+  "trophy.Miners": "Miners",
+  "trophy.Squad": "Squad",
+
+  "team.noData": "no data",
+  "team.InviteFriends": "Invite Friends",
+  "team.GetMore": " Get More",
+  "team.GT Coin": "GT Coin",
+  "team.MyTeam": "My Team",
+  "team.Reward": "Reward",
+  "team.Total": "Total",
+  "team.TotalA": "Team.Team A , 2%",
+  "team.TotalB": "Team B , 0.2%",
+  "team.GetIt": "Get It",
+  "team.Invite": "Invite extra rewards",
+  "team.will": "You will get rewards for every invitation!",
+  "team.NewComerList": "NewComer List",
+  "team.ReceiveAll": "Receive all",
+  "team.Commission": "Commission",
+  "team.TotalTeamProduction": "Total Team Production",
+  "team.WorkingNow": "Working now",
+  "team.PleaseShare": "Please share",
+
+  "task.Tasks": "Tasks",
+  "task.GetRewardsFor": "Get Rewards For",
+  "task.CompletingQuests": "Completing Quests",
+  "task.Start": "Start",
+  "task.Claim": "Claim",
+
+  "loading.play": "Play music, Play to earn.",
+  "loading.Version": "Version:",
+  "loading.Checking": "Checking your account",
+  "loading.Continue": "Continue",
+
+  "index.Countdown": "Countdown",
+  "index.Play": "Play",
+  "index.Boosts": "Boosts",
+  "index.Speed": "Speed up the process!",
+  "index.Free": "Free",
+  "index.Got": "Got It",
+  "index.Ok": "Ok",
+  "index.Upgrade": "Upgrade",
+  "index.Popular": "Popular reward tasks",
+  "index.collect": "You can collect GT coins every 12 hours",
+  "index.collection": "The result of the last automatic collection",
+  "purse.tokens": "Total amount of tokens",
+  "purse.hour": "Profit per hour",
+  "purse.reward": "Task reward",
+  "purse.placement": "Resource placement",
+  "task.Congratulation": "Congratulations on completing the mission",
+  "purse.TeamSharing": "Team Sharing",
+  "purse.ShareRewards": "Share rewards",
+  "team.shuoming": "Team Description",
+  "team.haoyou": "Invite Friends",
+  "team.jiangli": "For each friend invited to the game, the user can receive a fixed reward of 1000GTC.",
+  "team.jianshe": "Team Building",
+  "team.shouyi": "Users can earn 2% of the revenue when their directly invited friends produce and collect GTC in Team A;",
+  "team.shouqu": "This revenue can accumulate but needs to be manually collected by the user;",
+  "team.xianshi": "Friends invited by the user's friends will become indirect friends and will be displayed in Team B;",
+  "team.lingqu": "Users can earn 0.2% of the revenue from their indirect friends' GTC production and collection, which also needs to be manually claimed;",
+  "team.eaijiangli": "Additional Invitation Rewards",
+  "team.lingquo": "When the number of friends invited by the user reaches certain stages set by the platform, they can receive additional high rewards. This reward is different from the fixed reward for inviting friends and is much higher in amount. Make sure to claim it!",
+  "index.prompt": "prompt",
+  "index.level": "You have reached the full level!",
+  "index.start": "Start mining",
+  "purse.Props": "Props",
+  "purse.Production": "Production",
+  "purse.Ticket": "Obtaining Ticket",
+  "purse.SPIN": "SPIN"
+}

+ 207 - 0
src/locale/es.json

@@ -0,0 +1,207 @@
+{
+  "tabbar.Home": "Inicio",
+  "tabbar.Competition": "Competencia",
+  "tabbar.Team": "Equipo",
+  "tabbar.Earn": "Ganar",
+  "tabbar.point": "Ganar Puntos",
+  "app.name": "Título Chino",
+  "weight": "{heavy} kg",
+  "detail": "{0} cm, {1} kg",
+  "production.rewards.yaoqinghaoyou": "Invita a {index} amigos para obtener",
+  "production.rewards.yaoqinghaoyouDialog": "Invitar a {index} amigos",
+  "production.purse": "Billetera",
+  "production.daily": "Registro Diario",
+  "production.rewards": "Recompensas Aleatorias",
+  "production.bounty": "Promoción",
+  "production.profit": "Ganancia por Hora",
+  "production.upgrade": "Mejorar",
+  "production.friends": "Amigos",
+  "production.team.join": "Unirse al Equipo",
+  "production.team.joinText": "Únete a un equipo para ganar juntos. ¡Maximiza las ganancias y sube en el ranking!",
+  "production.team.creat": "Crear o Unirse a un equipo",
+  "production.team.list": "Equipos Recomendados",
+  "production.team.community": "Comunidad",
+  "production.team.joinBtn": "Unirse",
+  "production.team.joinSuccess": "Unión exitosa",
+  "production.team.joinError": "Error al unirse",
+  "production.team.Friend": "Invitar Amigo",
+  "production.team.Squad": "Salir del Equipo",
+  "production.team.Cancel": "Cancelar",
+  "production.team.Leave": "Salir",
+  "production.team.exit": "¿Estás seguro de que quieres salir",
+  "production.rewards.rewards": "Total de recompensas",
+  "production.rewards.bonuses": "Invita amigos para obtener bonificaciones",
+  "production.rewards.yaoqing": "Invitar amigos",
+  "production.rewards.huode": "Tú y tus amigos recibirán",
+  "production.rewards.guanzhu": "Sigue nuestro canal con tus amigos",
+  "production.rewards.extra": "Recompensas extra por invitación",
+  "production.rewards.invite": "Enviar para invitar",
+  "production.rewards.Buddy": "Lista de amigos",
+  "production.rewards.Contribution": "Recompensa por contribución",
+  "production.rewards.Unlock": "Desbloquear",
+  "production.rewards.TapCoins": "TapCoins al alcanzar este nivel",
+  "production.rewards.Claim": "Reclamar",
+  "production.rewards.ShareLink": "Compartir enlace de invitación",
+  "production.rewards.Share": "Compartir",
+  "production.rewards.secret": "Código secreto para invitar",
+  "production.rewards.Copy": "Copiar",
+  "production.rewards.Recommend": "Recomendado para grupos que bloquean enlaces",
+  "production.signin.Daily": "Inicio de Sesión Diario",
+  "production.signin.every": "Cuanto más inicies sesión cada día, más TapCoins",
+  "production.signin.Claim": "Reclamar Recompensa",
+  "production.signin.Reward": "Solo puedes elegir una de las Recompensas",
+  "production.signin.TapCoins": "TapCoins",
+  "production.signin.Premium": "TapCoins Premium",
+  "production.signin.ahead": "Adelante",
+  "production.signin.Claimbtn": "Reclamar",
+  "production.gifts.Luck": "Código de Suerte",
+  "production.gifts.Watch": "Mira este video desde el principio hasta el final a velocidad normal e ingresa el código de la suerte para obtener una recompensa",
+  "production.gifts.getRewards": "Mira el video para obtener recompensas",
+  "production.gifts.Watche": "Mira el video, encuentra el Código de Suerte y pégalo aquí",
+  "production.gifts.Submit": "Enviar",
+  "production.gifts.WatchO": "Ver",
+  "production.rocket.balance": "Tu saldo",
+  "production.rocket.boosters": "Potenciadores diarios gratuitos",
+  "production.rocket.Turbo": "Turbo",
+  "production.rocket.Energys": "Energía",
+  "production.rocket.Free": "Gratis",
+  "production.rocket.available": "disponible",
+  "production.rocket.Energy": "Energía Completa",
+  "production.rocket.Boosters": "Potenciadores",
+  "production.rocket.Multitap": "Multitoque",
+  "production.rocket.Amount": "Valor por moneda +1 por cada nivel",
+  "production.rocket.Use": "Usar",
+  "production.baron.Totalprofit": "Ganancia total por hora",
+  "production.baron.profit": "Ganancia por hora",
+  "production.baron.Ranking": "Lista de Clasificación",
+  "production.baron.Crypto": "Gráfico de Criptomonedas",
+  "task.More": "Más tareas, Más recompensas",
+  "task.Official": "Oficial",
+  "task.Join": "Unirse",
+  "task.Check": "Verificar",
+  "task.Extra": "Tareas Extra",
+  "task.Daily": "Diario",
+  "bounty.profit": "Ganancia por hora",
+  "bounty.Hint": "Pista",
+  "bounty.TapCoins": "Recompensa en TapCoins",
+  "bounty.Block": "Canción del Año",
+  "bounty.Appli": "Logro de por vida",
+  "bounty.Terms": "Producción anual",
+  "bounty.Event": "Álbum del Año",
+  "bounty.Profit": "Ganancia por hora",
+  "bounty.ahead": "Adelante",
+  "bounty.lucky": "Tengo suerte",
+  "bounty.hope": "Espero tener suerte",
+  "bounty.Boost": "Aumenta tu ganancia",
+  "bounty.Start": "Comenzar minería",
+  "bounty.Guess": "Adivina la pista dentro de la cuenta regresiva para ganar el premio",
+  "bounty.Tap": "Toca el menú Minería para comprar mejoras. Gana incluso sin conexión hasta 3 horas",
+  "bounty.Will": "Will Warren y Amir Bandeali comenzaron el desarrollo del proyecto en 2016, y el 22 de febrero de 2017",
+  "airdrop.title": "Gana TapCoins, Llaves, USDT, TON y más",
+  "airdrop.chets.Quest": "Misión Crypto",
+  "airdrop.chets.Victory": "La victoria pertenece a los pocos",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "Pozo de Premios Actual",
+  "airdrop.chets.winner": "La caja con menos compras será la ganadora",
+  "airdrop.chets.purchase": "Cuenta regresiva para comprar",
+  "airdrop.chets.Perpurchase": "Por Compra",
+  "airdrop.chets.BUY": "COMPRAR",
+  "airdrop.chets.Balance": "Saldo",
+  "airdrop.chets.How": "Cómo jugar",
+  "airdrop.chets.Ranking": "Clasificación",
+  "airdrop.chets.Records": "Mis Registros",
+  "airdrop.chets.play": "Cómo jugar",
+  "airdrop.chets.time": "Hora del sorteo",
+  "airdrop.chets.Win": "Ganar",
+  "airdrop.chets.Prize": "Pozo de premios",
+  "airdrop.chets.Winning": "Caja ganadora",
+  "airdrop.chets.Prizedraw": "Hora del sorteo",
+  "airdrop.chets.BOX": "CAJA",
+  "airdrop.chets.Total": "Total",
+  "airdrop.chets.Purchase": "Compra",
+  "airdrop.chets.text": "1.Después de la cuenta regresiva, la caja con menos compras gana",
+  "airdrop.tumtable.Awards": "Premios",
+  "point.Airdrop": "Airdrop",
+  "point.Core": "Puntos principales",
+  "purse.Total": "Ganancia total por hora",
+  "purse.per": "Ganancia por hora",
+  "purse.Withdraw": "Retirar",
+  "purse.amount": "Ingrese un monto válido",
+  "purse.Minimum": "Retiro mínimo es 0.1 TON",
+  "purse.balance": "Saldo insuficiente",
+  "purse.Record": "Registro",
+  "play.Relaxed": "Relajado",
+  "play.Ordinary": "Normal",
+  "play.Nervousness": "Nervioso",
+  "play.Duration": "Duración",
+  "play.Click": "Clic",
+  "play.Increase": "Aumento en ganancia por hora",
+  "play.Go": "Ir",
+  "play.OK": "OK",
+  "play.right": "El ritmo es correcto",
+  "play.again": "Fallaste, intenta de nuevo",
+  "trophy.Miners": "Mineros",
+  "trophy.Squad": "Equipo",
+  "team.noData": "sin datos",
+  "team.InviteFriends": "Invitar Amigos",
+  "team.GetMore": "Obtener Más",
+  "team.GT Coin": "Moneda GT",
+  "team.MyTeam": "Mi Equipo",
+  "team.Reward": "Recompensa",
+  "team.Total": "Total",
+  "team.TotalA": "Equipo A, 2%",
+  "team.TotalB": "Equipo B, 0.2%",
+  "team.GetIt": "Obtener",
+  "team.Invite": "Recompensas extra por invitación",
+  "team.will": "¡Recibirás recompensas por cada invitación!",
+  "team.NewComerList": "Lista de Nuevos",
+  "team.ReceiveAll": "Recibir todo",
+  "team.Commission": "Comisión",
+  "team.TotalTeamProduction": "Producción Total del Equipo",
+  "team.WorkingNow": "Trabajando ahora",
+  "team.PleaseShare": "Por favor comparte",
+  "task.Tasks": "Tareas",
+  "task.GetRewardsFor": "Obtener Recompensas Por",
+  "task.CompletingQuests": "Completar Misiones",
+  "task.Start": "Comenzar",
+  "task.Claim": "Reclamar",
+  "loading.play": "Toca música, Gana recompensas",
+  "loading.Version": "Versión:1.0",
+  "loading.Checking": "Verificando tu cuenta",
+  "loading.Continue": "Continuar",
+  "index.Countdown": "Cuenta",
+  "index.Play": "Jugar",
+  "index.Boosts": "Impulsos",
+  "index.Speed": "¡Acelera el proceso!",
+  "index.Free": "Gratis",
+  "index.Got": "Entendido",
+  "index.Ok": "Ok",
+  "index.Upgrade": "Mejorar",
+  "index.Popular": "Tareas populares",
+  "index.collect": "Puedes recolectar monedas GT cada 12 horas",
+  "index.collection": "Resultado de la última recolección automática",
+  "purse.tokens": "Cantidad total de tokens",
+  "purse.hour": "Ganancia por hora",
+  "purse.reward": "Recompensa de tarea",
+  "purse.placement": "Colocación de recursos",
+  "task.Congratulation": "Felicitaciones por completar la misión",
+  "purse.TeamSharing": "Compartir en Equipo",
+  "purse.ShareRewards": "Compartir recompensas",
+  "team.shuoming": "Descripción del Equipo",
+  "team.haoyou": "Invitar Amigos",
+  "team.jiangli": "Por cada amigo invitado, recibe 1000GTC",
+  "team.jianshe": "Construcción del Equipo",
+  "team.shouyi": "Gana 2% de ingresos del Equipo A",
+  "team.shouqu": "Este ingreso acumula pero debe reclamarse manualmente",
+  "team.xianshi": "Amigos indirectos aparecen en Equipo B",
+  "team.lingqu": "Gana 0.2% de ingresos del Equipo B",
+  "team.eaijiangli": "Recompensas Adicionales",
+  "team.lingquo": "Recibe recompensas extra por metas de invitación",
+  "index.prompt": "prompt",
+  "index.level": "Has alcanzado el nivel máxim!",
+  "index.start": "Iniciar minería",
+  "purse.Props": "Propiedades",
+  "purse.Production": "Producción",
+  "purse.Ticket": "Obtener Ticket",
+  "purse.SPIN": "GIRO"
+}

+ 207 - 0
src/locale/fa.json

@@ -0,0 +1,207 @@
+{
+  "tabbar.Home": "خانه",
+  "tabbar.Competition": "مسابقه",
+  "tabbar.Team": "تیم",
+  "tabbar.Earn": "کسب درآمد",
+  "tabbar.point": "کسب امتیاز",
+  "app.name": "عنوان چینی",
+  "weight": "{heavy} کیلوگرم",
+  "detail": "{0} سانتی‌متر، {1} کیلوگرم",
+  "production.rewards.rewards": "کل جوایز",
+  "production.rewards.bonuses": "دوستان را دعوت کنید و جایزه بگیرید",
+  "production.rewards.yaoqing": "دعوت از دوستان",
+  "production.rewards.huode": "شما و دوستانتان دریافت خواهید کرد",
+  "production.rewards.guanzhu": "با دوستانتان کانال ما را دنبال کنید",
+  "production.rewards.extra": "جوایز اضافی دعوت",
+  "production.rewards.invite": "ارسال برای دعوت",
+  "production.rewards.Buddy": "لیست دوستان",
+  "production.rewards.Contribution": "پاداش مشارکت",
+  "production.rewards.Unlock": "باز کردن",
+  "production.rewards.TapCoins": "تپ‌کوین در این سطح",
+  "production.rewards.Claim": "دریافت",
+  "production.rewards.ShareLink": "اشتراک‌گذاری لینک دعوت",
+  "production.rewards.Share": "اشتراک‌گذاری",
+  "production.rewards.secret": "کد مخفی برای دعوت",
+  "production.rewards.Copy": "کپی",
+  "production.rewards.Recommend": "پیشنهاد برای گروه‌هایی که لینک را مسدود می‌کنند",
+  "production.signin.Daily": "ورود روزانه",
+  "production.signin.every": "هر روز بیشتر وارد شوید، تپ‌کوین بیشتری دریافت کنید",
+  "production.signin.Claim": "دریافت جایزه",
+  "production.signin.Reward": "فقط می‌توانید یکی از جوایز را انتخاب کنید",
+  "production.signin.TapCoins": "تپ‌کوین",
+  "production.signin.Premium": "تپ‌کوین پریمیوم",
+  "production.signin.ahead": "ادامه",
+  "production.signin.Claimbtn": "دریافت",
+  "production.gifts.Luck": "کد شانس",
+  "production.gifts.Watch": "این ویدیو را از ابتدا تا انتها با سرعت عادی تماشا کنید و کد شانس را وارد کنید",
+  "production.gifts.getRewards": "برای دریافت جایزه ویدیو را تماشا کنید",
+  "production.gifts.Watche": "ویدیو را تماشا کنید، کد شانس را پیدا کنید و اینجا بچسبانید",
+  "production.gifts.Submit": "ارسال",
+  "production.gifts.WatchO": "تماشا",
+  "production.rocket.balance": "موجودی شما",
+  "production.rocket.boosters": "بوسترهای رایگان روزانه",
+  "production.rocket.Turbo": "توربو",
+  "production.rocket.Energys": "انرژی",
+  "production.rocket.Free": "رایگان",
+  "production.rocket.available": "در دسترس",
+  "production.rocket.Energy": "انرژی کامل",
+  "production.rocket.Boosters": "بوسترها",
+  "production.rocket.Multitap": "چند ضربه",
+  "production.rocket.Amount": "مقدار ارزش هر سکه +۱ برای هر سطح",
+  "production.rocket.Use": "استفاده",
+  "production.baron.Totalprofit": "سود کل در ساعت",
+  "production.baron.profit": "سود در ساعت",
+  "production.baron.Ranking": "لیست رتبه‌بندی",
+  "production.baron.Crypto": "نمودار ارز دیجیتال",
+  "production.rewards.yaoqinghaoyou": "دعوت از {index} دوست برای دریافت",
+  "production.rewards.yaoqinghaoyouDialog": "دعوت از {index} دوست",
+  "production.purse": "کیف پول",
+  "production.daily": "ورود روزانه",
+  "production.rewards": "جوایز تصادفی",
+  "production.bounty": "پاداش",
+  "production.profit": "سود ساعتی",
+  "production.upgrade": "ارتقاء",
+  "production.friends": "دوستان",
+  "production.team.join": "پیوستن به تیم",
+  "production.team.joinText": "به یک تیم بپیوندید و با هم کسب درآمد کنید",
+  "production.team.creat": "ایجاد یا پیوستن",
+  "production.team.list": "تیم‌های پیشنهادی",
+  "production.team.community": "انجمن",
+  "production.team.joinBtn": "پیوستن",
+  "production.team.joinSuccess": "پیوستن موفق",
+  "production.team.joinError": "خطا در پیوستن",
+  "production.team.Friend": "دعوت دوست",
+  "production.team.Squad": "خروج از تیم",
+  "production.team.Cancel": "لغو",
+  "production.team.Leave": "خروج",
+  "production.team.exit": "آیا مطمئن هستید که می‌خواهید خارج شوید",
+  "task.More": "وظایف بیشتر، جوایز بیشتر",
+  "task.Official": "رسمی",
+  "task.Join": "پیوستن",
+  "task.Check": "بررسی",
+  "task.Extra": "وظایف اضافی",
+  "task.Daily": "روزانه",
+  "bounty.profit": "سود ساعتی",
+  "bounty.Hint": "راهنمایی",
+  "bounty.TapCoins": "پاداش TapCoins",
+  "bounty.Block": "آهنگ سال",
+  "bounty.Appli": "دستاورد مادام‌العمر",
+  "bounty.Terms": "تولید سالانه",
+  "bounty.Event": "آلبوم سال",
+  "bounty.Profit": "سود ساعتی",
+  "bounty.ahead": "ادامه",
+  "bounty.lucky": "من خوش‌شانسم",
+  "bounty.hope": "امیدوارم خوش‌شانس باشم",
+  "bounty.Boost": "افزایش سود",
+  "bounty.Start": "شروع استخراج",
+  "bounty.Guess": "حدس راهنمایی در زمان مقرر",
+  "bounty.Tap": "روی منوی استخراج ضربه بزنید",
+  "bounty.Will": "ویل وارن و امیر بندعلی شروع کردند",
+  "airdrop.title": "دریافت TapCoins، کلید، USDT، TON",
+  "airdrop.chets.Quest": "ماموریت رمزارز",
+  "airdrop.chets.Victory": "پیروزی برای تعداد کم",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "استخر جایزه فعلی",
+  "airdrop.chets.winner": "جعبه با کمترین خرید برنده می‌شود",
+  "airdrop.chets.purchase": "شمارش معکوس خرید",
+  "airdrop.chets.Perpurchase": "برای هر خرید",
+  "airdrop.chets.BUY": "خرید",
+  "airdrop.chets.Balance": "موجودی",
+  "airdrop.chets.How": "نحوه بازی",
+  "airdrop.chets.Ranking": "رتبه‌بندی",
+  "airdrop.chets.Records": "سوابق من",
+  "airdrop.chets.play": "نحوه بازی",
+  "airdrop.chets.time": "زمان قرعه‌کشی",
+  "airdrop.chets.Win": "برنده شوید",
+  "airdrop.chets.Prize": "استخر جایزه",
+  "airdrop.chets.Winning": "جعبه برنده",
+  "airdrop.chets.Prizedraw": "زمان قرعه‌کشی",
+  "airdrop.chets.BOX": "جعبه",
+  "airdrop.chets.Total": "مجموع",
+  "airdrop.chets.Purchase": "خرید",
+  "airdrop.chets.text": "۱.پس از پایان شمارش معکوس، جعبه با کمترین خرید برنده می‌شود",
+  "airdrop.tumtable.Awards": "جوایز",
+  "point.Airdrop": "ایردراپ",
+  "point.Core": "امتیازات اصلی",
+  "purse.Total": "سود کل در ساعت",
+  "purse.per": "سود در ساعت",
+  "purse.Withdraw": "برداشت",
+  "purse.amount": "لطفا مقدار معتبر وارد کنید",
+  "purse.Minimum": "حداقل برداشت ۰.۱ TON است",
+  "purse.balance": "موجودی ناکافی",
+  "purse.Record": "سابقه",
+  "play.Relaxed": "آرام",
+  "play.Ordinary": "معمولی",
+  "play.Nervousness": "مضطرب",
+  "play.Duration": "مدت زمان",
+  "play.Click": "کلیک",
+  "play.Increase": "افزایش سود در ساعت",
+  "play.Go": "شروع",
+  "play.OK": "تایید",
+  "play.right": "ریتم درست است",
+  "play.again": "شکست خوردید، دوباره تلاش کنید",
+  "trophy.Miners": "معدنچیان",
+  "trophy.Squad": "تیم",
+  "team.noData": "داده‌ای موجود نیست",
+  "team.InviteFriends": "دعوت از دوستان",
+  "team.GetMore": "دریافت بیشتر",
+  "team.GT Coin": "سکه GT",
+  "team.MyTeam": "تیم من",
+  "team.Reward": "پاداش",
+  "team.Total": "مجموع",
+  "team.TotalA": "2% A، ۱۰",
+  "team.TotalB": "0.2% B، ۱",
+  "team.GetIt": "دریافت",
+  "team.Invite": "پاداش‌های اضافی دعوت",
+  "team.will": "برای هر دعوت پاداش دریافت می‌کنید!",
+  "team.NewComerList": "لیست تازه‌واردها",
+  "team.ReceiveAll": "دریافت همه",
+  "team.Commission": "کمیسیون",
+  "team.TotalTeamProduction": "تولید کل تیم",
+  "team.WorkingNow": "در حال کار",
+  "team.PleaseShare": "لطفا به اشتراک بگذارید",
+  "task.Tasks": "وظایف",
+  "task.GetRewardsFor": "دریافت پاداش برای",
+  "task.CompletingQuests": "تکمیل ماموریت‌ها",
+  "task.Start": "شروع",
+  "task.Claim": "دریافت",
+  "loading.play": "موسیقی بنوازید، پاداش بگیرید",
+  "loading.Version": "نسخه:۱.۰",
+  "loading.Checking": "بررسی حساب شما",
+  "loading.Continue": "ادامه",
+  "index.Countdown": "معکوس",
+  "index.Play": "بازی",
+  "index.Boosts": "تقویت‌ها",
+  "index.Speed": "روند را سریع‌تر کنید!",
+  "index.Free": "رایگان",
+  "index.Got": "فهمیدم",
+  "index.Ok": "باشه",
+  "index.Upgrade": "ارتقاء",
+  "index.Popular": "وظایف محبوب",
+  "index.collect": "هر ۱۲ ساعت می‌توانید سکه GT جمع‌آوری کنید",
+  "index.collection": "نتیجه آخرین جمع‌آوری خودکار",
+  "purse.tokens": "مقدار کل توکن‌ها",
+  "purse.hour": "سود در ساعت",
+  "purse.reward": "پاداش وظیفه",
+  "purse.placement": "جایگذاری منابع",
+  "task.Congratulation": "تبریک برای تکمیل ماموریت",
+  "purse.TeamSharing": "اشتراک‌گذاری تیمی",
+  "purse.ShareRewards": "اشتراک پاداش‌ها",
+  "team.shuoming": "توضیحات تیم",
+  "team.haoyou": "دعوت دوستان",
+  "team.jiangli": "برای هر دوست دعوت شده ۱۰۰۰GTC دریافت کنید",
+  "team.jianshe": "ساخت تیم",
+  "team.shouyi": "۱۰٪2 درآمد از تیم A دریافت کنید",
+  "team.shouqu": "این درآمد جمع می‌شود اما باید دستی برداشت شود",
+  "team.xianshi": "دوستان غیرمستقیم در تیم B نمایش داده می‌شوند",
+  "team.lingqu": "0.2۱٪ درآمد از تیم B دریافت کنید",
+  "team.eaijiangli": "پاداش‌های اضافی",
+  "team.lingquo": "پاداش‌های ویژه برای اهداف دعوت دریافت کنید",
+  "index.prompt": "راهنما",
+  "index.level": ".۰+/ثانیه رسیده‌اید",
+  "index.start": "شروع استخراج",
+  "purse.Props": "ابزارها",
+  "purse.Production": "تولید",
+  "purse.Ticket": "دریافت بلیط",
+  "purse.SPIN": "چرخش"
+}

+ 203 - 0
src/locale/fa.json~

@@ -0,0 +1,203 @@
+{
+  "tabbar.Home": "خانه",
+  "tabbar.Competition": "مسابقه",
+  "tabbar.Team": "تیم",
+  "tabbar.Earn": "کسب درآمد",
+  "tabbar.point": "کسب امتیاز",
+  "app.name": "عنوان چینی",
+  "weight": "{heavy} کیلوگرم",
+  "detail": "{0} سانتی‌متر، {1} کیلوگرم",
+  "production.rewards.rewards": "کل جوایز",
+  "production.rewards.bonuses": "دوستان را دعوت کنید و جایزه بگیرید",
+  "production.rewards.yaoqing": "دعوت از دوستان",
+  "production.rewards.huode": "شما و دوستانتان دریافت خواهید کرد",
+  "production.rewards.guanzhu": "با دوستانتان کانال ما را دنبال کنید",
+  "production.rewards.extra": "جوایز اضافی دعوت",
+  "production.rewards.invite": "ارسال برای دعوت",
+  "production.rewards.Buddy": "لیست دوستان",
+  "production.rewards.Contribution": "پاداش مشارکت",
+  "production.rewards.Unlock": "باز کردن",
+  "production.rewards.TapCoins": "تپ‌کوین در این سطح",
+  "production.rewards.Claim": "دریافت",
+  "production.rewards.ShareLink": "اشتراک‌گذاری لینک دعوت",
+  "production.rewards.Share": "اشتراک‌گذاری",
+  "production.rewards.secret": "کد مخفی برای دعوت",
+  "production.rewards.Copy": "کپی",
+  "production.rewards.Recommend": "پیشنهاد برای گروه‌هایی که لینک را مسدود می‌کنند",
+  "production.signin.Daily": "ورود روزانه",
+  "production.signin.every": "هر روز بیشتر وارد شوید، تپ‌کوین بیشتری دریافت کنید",
+  "production.signin.Claim": "دریافت جایزه",
+  "production.signin.Reward": "فقط می‌توانید یکی از جوایز را انتخاب کنید",
+  "production.signin.TapCoins": "تپ‌کوین",
+  "production.signin.Premium": "تپ‌کوین پریمیوم",
+  "production.signin.ahead": "ادامه",
+  "production.signin.Claimbtn": "دریافت",
+  "production.gifts.Luck": "کد شانس",
+  "production.gifts.Watch": "این ویدیو را از ابتدا تا انتها با سرعت عادی تماشا کنید و کد شانس را وارد کنید",
+  "production.gifts.getRewards": "برای دریافت جایزه ویدیو را تماشا کنید",
+  "production.gifts.Watche": "ویدیو را تماشا کنید، کد شانس را پیدا کنید و اینجا بچسبانید",
+  "production.gifts.Submit": "ارسال",
+  "production.gifts.WatchO": "تماشا",
+  "production.rocket.balance": "موجودی شما",
+  "production.rocket.boosters": "بوسترهای رایگان روزانه",
+  "production.rocket.Turbo": "توربو",
+  "production.rocket.Energys": "انرژی",
+  "production.rocket.Free": "رایگان",
+  "production.rocket.available": "در دسترس",
+  "production.rocket.Energy": "انرژی کامل",
+  "production.rocket.Boosters": "بوسترها",
+  "production.rocket.Multitap": "چند ضربه",
+  "production.rocket.Amount": "مقدار ارزش هر سکه +۱ برای هر سطح",
+  "production.rocket.Use": "استفاده",
+  "production.baron.Totalprofit": "سود کل در ساعت",
+  "production.baron.profit": "سود در ساعت",
+  "production.baron.Ranking": "لیست رتبه‌بندی",
+  "production.baron.Crypto": "نمودار ارز دیجیتال",
+  "production.rewards.yaoqinghaoyou": "دعوت از {index} دوست برای دریافت",
+  "production.rewards.yaoqinghaoyouDialog": "دعوت از {index} دوست",
+  "production.purse": "کیف پول",
+  "production.daily": "ورود روزانه",
+  "production.rewards": "جوایز تصادفی",
+  "production.bounty": "پاداش",
+  "production.profit": "سود ساعتی",
+  "production.upgrade": "ارتقاء",
+  "production.friends": "دوستان",
+  "production.team.join": "پیوستن به تیم",
+  "production.team.joinText": "به یک تیم بپیوندید و با هم کسب درآمد کنید",
+  "production.team.creat": "ایجاد یا پیوستن",
+  "production.team.list": "تیم‌های پیشنهادی",
+  "production.team.community": "انجمن",
+  "production.team.joinBtn": "پیوستن",
+  "production.team.joinSuccess": "پیوستن موفق",
+  "production.team.joinError": "خطا در پیوستن",
+  "production.team.Friend": "دعوت دوست",
+  "production.team.Squad": "خروج از تیم",
+  "production.team.Cancel": "لغو",
+  "production.team.Leave": "خروج",
+  "production.team.exit": "آیا مطمئن هستید که می‌خواهید خارج شوید",
+  "task.More": "وظایف بیشتر، جوایز بیشتر",
+  "task.Official": "رسمی",
+  "task.Join": "پیوستن",
+  "task.Check": "بررسی",
+  "task.Extra": "وظایف اضافی",
+  "task.Daily": "روزانه",
+  "bounty.profit": "سود ساعتی",
+  "bounty.Hint": "راهنمایی",
+  "bounty.TapCoins": "پاداش TapCoins",
+  "bounty.Block": "آهنگ سال",
+  "bounty.Appli": "دستاورد مادام‌العمر",
+  "bounty.Terms": "تولید سالانه",
+  "bounty.Event": "آلبوم سال",
+  "bounty.Profit": "سود ساعتی",
+  "bounty.ahead": "ادامه",
+  "bounty.lucky": "من خوش‌شانسم",
+  "bounty.hope": "امیدوارم خوش‌شانس باشم",
+  "bounty.Boost": "افزایش سود",
+  "bounty.Start": "شروع استخراج",
+  "bounty.Guess": "حدس راهنمایی در زمان مقرر",
+  "bounty.Tap": "روی منوی استخراج ضربه بزنید",
+  "bounty.Will": "ویل وارن و امیر بندعلی شروع کردند",
+  "airdrop.title": "دریافت TapCoins، کلید، USDT، TON",
+  "airdrop.chets.Quest": "ماموریت رمزارز",
+  "airdrop.chets.Victory": "پیروزی برای تعداد کم",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "استخر جایزه فعلی",
+  "airdrop.chets.winner": "جعبه با کمترین خرید برنده می‌شود",
+  "airdrop.chets.purchase": "شمارش معکوس خرید",
+  "airdrop.chets.Perpurchase": "برای هر خرید",
+  "airdrop.chets.BUY": "خرید",
+  "airdrop.chets.Balance": "موجودی",
+  "airdrop.chets.How": "نحوه بازی",
+  "airdrop.chets.Ranking": "رتبه‌بندی",
+  "airdrop.chets.Records": "سوابق من",
+  "airdrop.chets.play": "نحوه بازی",
+  "airdrop.chets.time": "زمان قرعه‌کشی",
+  "airdrop.chets.Win": "برنده شوید",
+  "airdrop.chets.Prize": "استخر جایزه",
+  "airdrop.chets.Winning": "جعبه برنده",
+  "airdrop.chets.Prizedraw": "زمان قرعه‌کشی",
+  "airdrop.chets.BOX": "جعبه",
+  "airdrop.chets.Total": "مجموع",
+  "airdrop.chets.Purchase": "خرید",
+  "airdrop.chets.text": "۱.پس از پایان شمارش معکوس، جعبه با کمترین خرید برنده می‌شود",
+  "airdrop.tumtable.Awards": "جوایز",
+  "point.Airdrop": "ایردراپ",
+  "point.Core": "امتیازات اصلی",
+  "purse.Total": "سود کل در ساعت",
+  "purse.per": "سود در ساعت",
+  "purse.Withdraw": "برداشت",
+  "purse.amount": "لطفا مقدار معتبر وارد کنید",
+  "purse.Minimum": "حداقل برداشت ۰.۱ TON است",
+  "purse.balance": "موجودی ناکافی",
+  "purse.Record": "سابقه",
+  "play.Relaxed": "آرام",
+  "play.Ordinary": "معمولی",
+  "play.Nervousness": "مضطرب",
+  "play.Duration": "مدت زمان",
+  "play.Click": "کلیک",
+  "play.Increase": "افزایش سود در ساعت",
+  "play.Go": "شروع",
+  "play.OK": "تایید",
+  "play.right": "ریتم درست است",
+  "play.again": "شکست خوردید، دوباره تلاش کنید",
+  "trophy.Miners": "معدنچیان",
+  "trophy.Squad": "تیم",
+  "team.noData": "داده‌ای موجود نیست",
+  "team.InviteFriends": "دعوت از دوستان",
+  "team.GetMore": "دریافت بیشتر",
+  "team.GT Coin": "سکه GT",
+  "team.MyTeam": "تیم من",
+  "team.Reward": "پاداش",
+  "team.Total": "مجموع",
+  "team.TotalA": "2% A، ۱۰",
+  "team.TotalB": "0.2% B، ۱",
+  "team.GetIt": "دریافت",
+  "team.Invite": "پاداش‌های اضافی دعوت",
+  "team.will": "برای هر دعوت پاداش دریافت می‌کنید!",
+  "team.NewComerList": "لیست تازه‌واردها",
+  "team.ReceiveAll": "دریافت همه",
+  "team.Commission": "کمیسیون",
+  "team.TotalTeamProduction": "تولید کل تیم",
+  "team.WorkingNow": "در حال کار",
+  "team.PleaseShare": "لطفا به اشتراک بگذارید",
+  "task.Tasks": "وظایف",
+  "task.GetRewardsFor": "دریافت پاداش برای",
+  "task.CompletingQuests": "تکمیل ماموریت‌ها",
+  "task.Start": "شروع",
+  "task.Claim": "دریافت",
+  "loading.play": "موسیقی بنوازید، پاداش بگیرید",
+  "loading.Version": "نسخه:۱.۰",
+  "loading.Checking": "بررسی حساب شما",
+  "loading.Continue": "ادامه",
+  "index.Countdown": "معکوس",
+  "index.Play": "بازی",
+  "index.Boosts": "تقویت‌ها",
+  "index.Speed": "روند را سریع‌تر کنید!",
+  "index.Free": "رایگان",
+  "index.Got": "فهمیدم",
+  "index.Ok": "باشه",
+  "index.Upgrade": "ارتقاء",
+  "index.Popular": "وظایف محبوب",
+  "index.collect": "هر ۱۲ ساعت می‌توانید سکه GT جمع‌آوری کنید",
+  "index.collection": "نتیجه آخرین جمع‌آوری خودکار",
+  "purse.tokens": "مقدار کل توکن‌ها",
+  "purse.hour": "سود در ساعت",
+  "purse.reward": "پاداش وظیفه",
+  "purse.placement": "جایگذاری منابع",
+  "task.Congratulation": "تبریک برای تکمیل ماموریت",
+  "purse.TeamSharing": "اشتراک‌گذاری تیمی",
+  "purse.ShareRewards": "اشتراک پاداش‌ها",
+  "team.shuoming": "توضیحات تیم",
+  "team.haoyou": "دعوت دوستان",
+  "team.jiangli": "برای هر دوست دعوت شده ۱۰۰۰GTC دریافت کنید",
+  "team.jianshe": "ساخت تیم",
+  "team.shouyi": "۱۰٪2 درآمد از تیم A دریافت کنید",
+  "team.shouqu": "این درآمد جمع می‌شود اما باید دستی برداشت شود",
+  "team.xianshi": "دوستان غیرمستقیم در تیم B نمایش داده می‌شوند",
+  "team.lingqu": "0.2۱٪ درآمد از تیم B دریافت کنید",
+  "team.eaijiangli": "پاداش‌های اضافی",
+  "team.lingquo": "پاداش‌های ویژه برای اهداف دعوت دریافت کنید",
+  "index.prompt": "راهنما",
+  "index.level": ".۰+/ثانیه رسیده‌اید",
+  "index.start":"شروع استخراج"
+}

+ 86 - 0
src/locale/index.ts

@@ -0,0 +1,86 @@
+import { createI18n } from 'vue-i18n'
+
+import en from './en.json'
+import zhTW from './zh-tw.json' // 繁体中文
+import th from './th.json'
+import vi from './vi.json'
+import ru from './ru.json'
+import ko from './ko.json'
+import ja from './ja.json'
+import es from './es.json'
+import fa from './fa.json'
+import pt from './pt.json'
+
+const messages = {
+  en,
+  'zh-TW': zhTW, // key 不能乱写,查看截图 screenshots/i18n.png
+  th,
+  vi,
+  ru,
+  ko,
+  ja,
+  es,
+  fa,
+  pt,
+}
+const i18n = createI18n({
+  locale: 'en', // 获取已设置的语言,fallback 语言需要再 manifest.config.ts 中设置
+  messages,
+  allowComposition: true,
+})
+
+console.log(uni.getLocale(), 11)
+console.log(i18n.global.locale)
+
+/**
+ * 可以拿到原始的语言模板,非 vue 文件使用这个方法,
+ * @param { string } key 多语言的key,eg: "app.name"
+ * @returns {string} 返回原始的多语言模板,eg: "{heavy}KG"
+ */
+export const getTemplateByKey = (key: string) => {
+  if (!key) {
+    console.error(`[i18n] Function getTemplateByKey(), key param is required`)
+    return ''
+  }
+  const locale = i18n.global.locale
+
+  const message = messages[locale] // 拿到某个多语言的所有模板(是一个对象)
+  if (Object.keys(message).includes(key)) {
+    return message[key]
+  }
+  console.error(`[i18n] Function getTemplateByKey(), key param ${key} is not existed.`)
+  return ''
+}
+
+/**
+ * formatI18n('我是{name},身高{detail.height},体重{detail.weight}',{name:'张三',detail:{height:178,weight:'75kg'}})
+ * 暂不支持数组
+ * @param template 多语言模板字符串,eg: `我是{name}`
+ * @param {Object|undefined} data 需要传递的数据对象,里面的key与多语言字符串对应,eg: `{name:'菲鸽'}`
+ * @returns
+ */
+function formatI18n(template: string, data?: any) {
+  return template.replace(/\{([^}]+)\}/g, function (match, key: string) {
+    // console.log( match, key) // => { detail.height }  detail.height
+    const arr = key.trim().split('.')
+    let result = data
+    while (arr.length) {
+      const first = arr.shift()
+      result = result[first]
+    }
+    return result
+  })
+}
+
+/**
+ * t('introduction',{name:'张三',detail:{height:178,weight:'75kg'}})
+ * => formatI18n('我是{name},身高{detail.height},体重{detail.weight}',{name:'张三',detail:{height:178,weight:'75kg'}})
+ * 没有key的,可以不传 data;暂不支持数组
+ * @param template 多语言模板字符串,eg: `我是{name}`
+ * @param {Object|undefined} data 需要传递的数据对象,里面的key与多语言字符串对应,eg: `{name:'菲鸽'}`
+ * @returns
+ */
+export function t(key, data?) {
+  return formatI18n(getTemplateByKey(key), data)
+}
+export default i18n

+ 215 - 0
src/locale/ja.json

@@ -0,0 +1,215 @@
+{
+  "tabbar.Home": "ホーム",
+  "tabbar.Competition": "競技",
+  "tabbar.Team": "チーム",
+  "tabbar.Earn": "収益",
+  "tabbar.production": "生産",
+  "tabbar.task": "タスク",
+  "tabbar.rd": "R&D",
+  "tabbar.airdrop": "エアドロップ",
+  "tabbar.point": "ポイント獲得",
+  "app.name": "中国語タイトル",
+  "weight": "{heavy} kg",
+  "detail": "{0} cm, {1} kg",
+  "production.rewards.yaoqinghaoyou": "{index}人の友達を招待して獲得",
+  "production.rewards.yaoqinghaoyouDialog": "{index}人の友達を招待",
+  "production.purse": "財布",
+  "production.daily": "毎日チェックイン",
+  "production.rewards": "ランダム報酬",
+  "production.bounty": "プロモーション",
+  "production.profit": "時間あたりの利益",
+  "production.upgrade": "アップグレード",
+  "production.friends": "友達",
+  "production.team.join": "チームに参加",
+  "production.team.joinText": "チームに参加して一緒にスワイプし、利益を最大化してランキングを上げましょう!",
+  "production.team.creat": "カスタムチームを作成または参加",
+  "production.team.list": "おすすめチーム",
+  "production.team.community": "コミュニティ",
+  "production.team.joinBtn": "参加",
+  "production.team.joinSuccess": "参加成功",
+  "production.team.joinError": "参加エラー",
+  "production.team.Friend": "友達を招待",
+  "production.team.Squad": "チームを脱退",
+  "production.team.Cancel": "キャンセル",
+  "production.team.Leave": "脱退",
+  "production.team.exit": "本当に脱退しますか",
+  "production.rewards.rewards": "総報酬",
+  "production.rewards.bonuses": "友達を招待してボーナスを獲得",
+  "production.rewards.yaoqing": "友達を招待",
+  "production.rewards.huode": "あなたと友達が獲得",
+  "production.rewards.guanzhu": "友達と一緒にチャンネルをフォロー",
+  "production.rewards.extra": "追加報酬を招待",
+  "production.rewards.invite": "招待状を送信",
+  "production.rewards.Buddy": "バディリスト",
+  "production.rewards.Contribution": "貢献報酬",
+  "production.rewards.Unlock": "アンロック",
+  "production.rewards.TapCoins": "このレベルに到達したときにTapCoinsをタップ。",
+  "production.rewards.Claim": "請求",
+  "production.rewards.ShareLink": "招待リンクを共有",
+  "production.rewards.Share": "共有",
+  "production.rewards.secret": "招待コード",
+  "production.rewards.Copy": "コピー",
+  "production.rewards.Recommend": "リンクをブロックするグループに共有した場合は推奨",
+  "production.signin.Daily": "毎日ログイン",
+  "production.signin.every": "毎日ログインするほど多くのTapCoins",
+  "production.signin.Claim": "報酬を請求",
+  "production.signin.Reward": "報酬のうち1つを選択できます",
+  "production.signin.TapCoins": "TapCoins",
+  "production.signin.Premium": "TapCoinsプレミアム",
+  "production.signin.ahead": "先に進む",
+  "production.signin.Claimbtn": "請求",
+  "production.gifts.Luck": "ラッキーコード",
+  "production.gifts.Watch": "通常速度で動画を最後まで見て、ラッキーコードを入力して報酬を獲得",
+  "production.gifts.getRewards": "動画を見て報酬を獲得",
+  "production.gifts.Watche": "動画を見て、ラッキーコードを見つけてここに貼り付け",
+  "production.gifts.Submit": "送信",
+  "production.gifts.WatchO": "見る",
+  "production.rocket.balance": "あなたの残高",
+  "production.rocket.boosters": "毎日無料ブースター",
+  "production.rocket.Turbo": "ターボ",
+  "production.rocket.Energys": "エネルギー",
+  "production.rocket.Free": "無料",
+  "production.rocket.available": "利用可能",
+  "production.rocket.Energy": "フルエネルギー",
+  "production.rocket.Boosters": "ブースター",
+  "production.rocket.Multitap": "マルチタップ",
+  "production.rocket.Amount": "コインあたりの金額 +1 レベルごと",
+  "production.rocket.Use": "使用",
+  "production.baron.Totalprofit": "時間あたりの総利益",
+  "production.baron.profit": "時間あたりの利益",
+  "production.baron.Ranking": "ランキングリスト",
+  "production.baron.Crypto": "暗号ローソク足",
+  "task.More": "より多くのタスク、より多くの報酬",
+  "task.Official": "公式",
+  "task.Join": "参加",
+  "task.Check": "確認",
+  "task.Extra": "追加タスク",
+  "task.Daily": "毎日",
+  "bounty.profit": "時間あたりの利益",
+  "bounty.Hint": "ヒント",
+  "bounty.TapCoins": "TapCoinsバウンティ",
+  "bounty.Block": "今年の曲",
+  "bounty.Appli": "生涯功績",
+  "bounty.Terms": "今年のアルバム",
+  "bounty.Event": "イベント",
+  "bounty.Profit": "時間あたりの利益",
+  "bounty.ahead": "先に進む",
+  "bounty.lucky": "私はラッキー",
+  "bounty.hope": "私はラッキーだと思う",
+  "bounty.Boost": "利益をブースト",
+  "bounty.Start": "マイニング開始",
+  "bounty.Guess": "カウントダウン内にヒントを推測して賞品を獲得",
+  "bounty.Tap": "マイニングメニューをタップしてアップグレードを購入 オフライン時でも最大3時間獲得",
+  "bounty.Will": "Will WarrenとAmir Bandealiは2016年にプロジェクトの開発を開始し、2017年2月22日に",
+  "airdrop.title": "TapCoins、キー、USDT、TONなどを獲得",
+  "airdrop.chets.Quest": "暗号クエスト",
+  "airdrop.chets.Victory": "勝利は少数派に属する",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "現在の賞金プール",
+  "airdrop.chets.winner": "購入数が最も少ないボックスが勝者",
+  "airdrop.chets.purchase": "購入のカウントダウン",
+  "airdrop.chets.Perpurchase": "購入あたり",
+  "airdrop.chets.BUY": "購入",
+  "airdrop.chets.Balance": "残高",
+  "airdrop.chets.How": "遊び方",
+  "airdrop.chets.Ranking": "ランキング",
+  "airdrop.chets.Records": "私の記録",
+  "airdrop.chets.play": "遊び方",
+  "airdrop.chets.time": "賞品引き出し時間",
+  "airdrop.chets.Win": "勝つ",
+  "airdrop.chets.Prize": "賞金プール",
+  "airdrop.chets.Winning": "勝利ボックス",
+  "airdrop.chets.Prizedraw": "賞品引き出し時間",
+  "airdrop.chets.BOX": "BOX",
+  "airdrop.chets.Total": "合計",
+  "airdrop.chets.Purchase": "購入",
+  "airdrop.chets.text": "1.カウントダウン終了後、購入数が最も少ないボックスが勝利ボックスになります。2.複数のボックスが同じ購入数の場合、最後に購入されたボックスが勝者になります。3.勝者は賞金プールの80%を共有し、購入したボックスの数に応じて賞品が分配されます。",
+  "airdrop.tumtable.Awards": "賞品",
+  "point.Airdrop": "エアドロップ",
+  "point.Core": "コアポイント",
+  "purse.Total": "時間あたりの総利益",
+  "purse.per": "時間あたりの利益",
+  "purse.Withdraw": "引き出し",
+  "purse.amount": "有効な金額を入力してください",
+  "purse.Minimum": "最低引き出し額は0.1 TON",
+  "purse.balance": "残高不足",
+  "purse.Record": "記録",
+  "play.Relaxed": "リラックス",
+  "play.Ordinary": "普通",
+  "play.Nervousness": "緊張",
+  "play.Duration": "期間",
+  "play.Click": "クリック",
+  "play.Increase": "時間あたりの利益の増加",
+  "play.Go": "行く",
+  "play.OK": "OK",
+  "play.right": "リズムが正しい",
+  "play.again": "失敗しました、もう一度お試しください",
+
+  "trophy.Miners": "鉱夫",
+  "trophy.Squad": "部隊",
+
+  "team.noData": "データなし",
+  "team.InviteFriends": "友達を招待",
+  "team.GetMore": "もっとゲット",
+  "team.GT Coin": "GT Coin",
+  "team.MyTeam": "マイチーム",
+  "team.Reward": "報酬",
+  "team.Total": "合計",
+  "team.TotalA": "チームA, 2%",
+  "team.TotalB": "チームB, 0.2%",
+  "team.GetIt": "ゲット",
+  "team.Invite": "招待報酬",
+  "team.will": "招待ごとに報酬がもらえます!",
+  "team.NewComerList": "新規リスト",
+  "team.ReceiveAll": "すべて受け取る",
+  "team.Commission": "コミッション",
+  "team.TotalTeamProduction": "チーム総生産",
+  "team.WorkingNow": "現在作業中",
+  "team.PleaseShare": "共有してください",
+
+  "task.Tasks": "タスク",
+  "task.GetRewardsFor": "報酬を得るために",
+  "task.CompletingQuests": "クエストを完了する",
+  "task.Start": "開始",
+  "task.Claim": "請求",
+
+  "loading.play": "音楽を再生, 再生して稼ぐ.",
+  "loading.Version": "バージョン:",
+  "loading.Checking": "アカウントを確認中",
+  "loading.Continue": "続行",
+  "index.Countdown": "カウントダウン",
+  "index.Play": "プレイ",
+  "index.Boosts": "ブースト",
+  "index.Speed": "プロセスをスピードアップ!",
+  "index.Free": "無料",
+  "index.Got": "了解",
+  "index.Ok": "OK",
+  "index.Upgrade": "アップグレード",
+  "index.Popular": "人気の報酬タスク",
+  "index.collect": "12時間ごとにGTコインを収集できます",
+  "index.collection": "最後の自動収集の結果",
+  "purse.tokens": "トークンの総量",
+  "purse.hour": "1時間の利益",
+  "purse.reward": "タスク報酬",
+  "purse.placement": "リソース配置",
+  "task.Congratulation": "ミッションを完了することを祝福します",
+  "purse.TeamSharing": "チーム共有",
+  "purse.ShareRewards": "報酬を共有",
+  "team.shuoming": "チーム説明",
+  "team.haoyou": "友達を招待",
+  "team.jiangli": "ゲームに友達を招待するたびに、ユーザーは1000GTCの固定報酬を受け取ることができます。",
+  "team.jianshe": "チーム構築",
+  "team.shouyi": "直接招待した友達がチームAでGTCを生成し収集すると、ユーザーは2%の収益を得ることができます;",
+  "team.shouqu": "この収益は累積できますが、ユーザーが手動で収集する必要があります;",
+  "team.xianshi": "ユーザーの友達が招待した友達は、間接的な友達としてチームBに表示されます;",
+  "team.lingqu": "間接的な友達がGTCを生成し収集するたびに、ユーザーは0.2%の収益を得ることができます。この収益も手動で請求する必要があります;",
+  "team.eaijiangli": "追加招待報酬",
+  "team.lingquo": "ユーザーが招待した友達の数がプラットフォームで設定された段階に達すると、さらに高額な報酬を受け取ることができます。この報酬は友達招待の固定報酬とは異なり、額も大きく異なります。忘れずに請求してください!",
+  "index.prompt": "プロンプト",
+  "index.level": "最大レベルに達しました!",
+  "index.start":"採掘を開始",
+  "purse.Props": "プロップ",
+  "purse.Production": "生産",
+  "purse.Ticket": "チケットを取得",
+  "purse.SPIN": "スピン"
+}

+ 215 - 0
src/locale/ko.json

@@ -0,0 +1,215 @@
+{
+  "tabbar.Home": "홈",
+  "tabbar.Competition": "대회",
+  "tabbar.Team": "팀",
+  "tabbar.Earn": "수익",
+  "tabbar.production": "생산",
+  "tabbar.task": "작업",
+  "tabbar.rd": "R&D",
+  "tabbar.airdrop": "에어드롭",
+  "tabbar.point": "포인트 획득",
+  "app.name": "중국어 제목",
+  "weight": "{heavy} kg",
+  "detail": "{0} cm, {1} kg",
+  "production.rewards.yaoqinghaoyou": "{index}명의 친구를 초대하여 받기",
+  "production.rewards.yaoqinghaoyouDialog": "{index}명의 친구 초대",
+  "production.purse": "지갑",
+  "production.daily": "매일 체크인",
+  "production.rewards": "랜덤 보상",
+  "production.bounty": "프로모션",
+  "production.profit": "시간당 이익",
+  "production.upgrade": "업그레이드",
+  "production.friends": "친구",
+  "production.team.join": "팀 가입",
+  "production.team.joinText": "팀에 가입하여 함께 스와이프하고 이익을 극대화하여 랭킹을 올리세요!",
+  "production.team.creat": "사용자 지정 팀 생성 또는 가입",
+  "production.team.list": "추천 팀",
+  "production.team.community": "커뮤니티",
+  "production.team.joinBtn": "가입",
+  "production.team.joinSuccess": "가입 성공",
+  "production.team.joinError": "가입 오류",
+  "production.team.Friend": "친구 초대",
+  "production.team.Squad": "팀 탈퇴",
+  "production.team.Cancel": "취소",
+  "production.team.Leave": "탈퇴",
+  "production.team.exit": "정말 탈퇴하시겠습니까",
+  "production.rewards.rewards": "총 보상",
+  "production.rewards.bonuses": "친구를 초대하여 보너스 받기",
+  "production.rewards.yaoqing": "친구 초대",
+  "production.rewards.huode": "당신과 친구가 받을 것",
+  "production.rewards.guanzhu": "친구와 함께 채널 팔로우",
+  "production.rewards.extra": "추가 보상 초대",
+  "production.rewards.invite": "초대장 보내기",
+  "production.rewards.Buddy": "버디 목록",
+  "production.rewards.Contribution": "기여 보상",
+  "production.rewards.Unlock": "잠금 해제",
+  "production.rewards.TapCoins": "이 레벨에 도달하면 TapCoins 탭.",
+  "production.rewards.Claim": "청구",
+  "production.rewards.ShareLink": "초대 링크 공유",
+  "production.rewards.Share": "공유",
+  "production.rewards.secret": "초대 코드",
+  "production.rewards.Copy": "복사",
+  "production.rewards.Recommend": "링크를 차단하는 그룹에 공유한 경우 추천",
+  "production.signin.Daily": "매일 로그인",
+  "production.signin.every": "매일 로그인할수록 더 많은 TapCoins",
+  "production.signin.Claim": "보상 청구",
+  "production.signin.Reward": "보상 중 하나를 선택할 수 있습니다",
+  "production.signin.TapCoins": "TapCoins",
+  "production.signin.Premium": "TapCoins 프리미엄",
+  "production.signin.ahead": "앞으로 가기",
+  "production.signin.Claimbtn": "청구",
+  "production.gifts.Luck": "행운 코드",
+  "production.gifts.Watch": "일반 속도로 동영상을 끝까지 시청하고 행운 코드를 입력하여 보상 받기",
+  "production.gifts.getRewards": "동영상 시청으로 보상 받기",
+  "production.gifts.Watche": "동영상을 시청하여 행운 코드를 찾아 여기에 붙여넣기",
+  "production.gifts.Submit": "제출",
+  "production.gifts.WatchO": "시청",
+  "production.rocket.balance": "당신의 잔액",
+  "production.rocket.boosters": "매일 무료 부스터",
+  "production.rocket.Turbo": "터보",
+  "production.rocket.Energys": "에너지",
+  "production.rocket.Free": "무료",
+  "production.rocket.available": "사용 가능",
+  "production.rocket.Energy": "풀 에너지",
+  "production.rocket.Boosters": "부스터",
+  "production.rocket.Multitap": "멀티탭",
+  "production.rocket.Amount": "코인당 금액 +1 레벨당",
+  "production.rocket.Use": "사용",
+  "production.baron.Totalprofit": "시간당 총 이익",
+  "production.baron.profit": "시간당 이익",
+  "production.baron.Ranking": "랭킹 리스트",
+  "production.baron.Crypto": "암호화폐 캔들스틱",
+  "task.More": "더 많은 작업, 더 많은 보상",
+  "task.Official": "공식",
+  "task.Join": "가입",
+  "task.Check": "확인",
+  "task.Extra": "추가 작업",
+  "task.Daily": "매일",
+  "bounty.profit": "시간당 이익",
+  "bounty.Hint": "힌트",
+  "bounty.TapCoins": "TapCoins 바운티",
+  "bounty.Block": "올해의 노래",
+  "bounty.Appli": "평생 공로",
+  "bounty.Terms": "연간 생산",
+  "bounty.Event": "올해의 앨범",
+  "bounty.Profit": "시간당 이익",
+  "bounty.ahead": "앞으로 가기",
+  "bounty.lucky": "나는 행운",
+  "bounty.hope": "나는 행운이라고 생각해",
+  "bounty.Boost": "이익 부스트",
+  "bounty.Start": "채굴 시작",
+  "bounty.Guess": "카운트다운 내에 힌트를 추측하여 상품 받기",
+  "bounty.Tap": "채굴 메뉴를 탭하여 업그레이드 구매 오프라인 상태에서도 최대 3시간 동안 수익 창출",
+  "bounty.Will": "Will Warren과 Amir Bandeali는 2016년에 프로젝트 개발을 시작하여 2017년 2월 22일에",
+  "airdrop.title": "TapCoins, 키, USDT, TON 등 획득",
+  "airdrop.chets.Quest": "암호화폐 퀘스트",
+  "airdrop.chets.Victory": "승리는 소수에게 속한다",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "현재 상금 풀",
+  "airdrop.chets.winner": "구매 수가 가장 적은 박스가 승자",
+  "airdrop.chets.purchase": "구매 카운트다운",
+  "airdrop.chets.Perpurchase": "구매당",
+  "airdrop.chets.BUY": "구매",
+  "airdrop.chets.Balance": "잔액",
+  "airdrop.chets.How": "플레이 방법",
+  "airdrop.chets.Ranking": "랭킹",
+  "airdrop.chets.Records": "내 기록",
+  "airdrop.chets.play": "플레이 방법",
+  "airdrop.chets.time": "상품 추첨 시간",
+  "airdrop.chets.Win": "이기다",
+  "airdrop.chets.Prize": "상금 풀",
+  "airdrop.chets.Winning": "승리 박스",
+  "airdrop.chets.Prizedraw": "상품 추첨 시간",
+  "airdrop.chets.BOX": "BOX",
+  "airdrop.chets.Total": "총",
+  "airdrop.chets.Purchase": "구매",
+  "airdrop.chets.text": "1.카운트다운이 끝나면 구매 수가 가장 적은 박스가 승리 박스가 됩니다. 2.여러 박스가 동일한 구매 수를 가진 경우, 마지막으로 구매된 박스가 승자가 됩니다. 3.승자는 상금 풀의 80%를 공유하며, 구매한 박스 수에 따라 상품이 분배됩니다.",
+  "airdrop.tumtable.Awards": "상품",
+  "point.Airdrop": "에어드롭",
+  "point.Core": "코어 포인트",
+  "purse.Total": "시간당 총 이익",
+  "purse.per": "시간당 이익",
+  "purse.Withdraw": "인출",
+  "purse.amount": "유효한 금액을 입력하세요",
+  "purse.Minimum": "최소 인출 금액은 0.1 TON",
+  "purse.balance": "잔액 부족",
+  "purse.Record": "기록",
+  "play.Relaxed": "편안",
+  "play.Ordinary": "보통",
+  "play.Nervousness": "긴장",
+  "play.Duration": "기간",
+  "play.Click": "클릭",
+  "play.Increase": "시간당 이익 증가",
+  "play.Go": "가기",
+  "play.OK": "OK",
+  "play.right": "리듬이 맞습니다",
+  "play.again": "실패했습니다, 다시 시도해 주세요",
+
+  "trophy.Miners": "광부",
+  "trophy.Squad": "분대",
+
+  "team.noData": "데이터 없음",
+  "team.InviteFriends": "친구 초대",
+  "team.GetMore": "더 받기",
+  "team.GT Coin": "GT Coin",
+  "team.MyTeam": "내 팀",
+  "team.Reward": "보상",
+  "team.Total": "총",
+  "team.TotalA": "팀 A, 2%",
+  "team.TotalB": "팀 B, 0.2%",
+  "team.GetIt": "받기",
+  "team.Invite": "초대 보너스",
+  "team.will": "초대할 때마다 보상을 받을 수 있습니다!",
+  "team.NewComerList": "신규 목록",
+  "team.ReceiveAll": "모두 받기",
+  "team.Commission": "수수료",
+  "team.TotalTeamProduction": "팀 총 생산",
+  "team.WorkingNow": "현재 작업 중",
+  "team.PleaseShare": "공유해주세요",
+
+  "task.Tasks": "작업",
+  "task.GetRewardsFor": "보상을 받기 위해",
+  "task.CompletingQuests": "퀘스트 완료",
+  "task.Start": "시작",
+  "task.Claim": "청구",
+
+  "loading.play": "음악 재생, 재생하여 수익 창출.",
+  "loading.Version": "버전:",
+  "loading.Checking": "계정 확인 중",
+  "loading.Continue": "계속",
+  "index.Countdown": "카운트다운",
+  "index.Play": "플레이",
+  "index.Boosts": "부스트",
+  "index.Speed": "프로세스 가속!",
+  "index.Free": "무료",
+  "index.Got": "알겠습니다",
+  "index.Ok": "확인",
+  "index.Upgrade": "업그레이드",
+  "index.Popular": "인기 보상 작업",
+  "index.collect": "12시간마다 GT 코인을 수집할 수 있습니다",
+  "index.collection": "마지막 자동 수집 결과",
+  "purse.tokens": "토큰 총량",
+  "purse.hour": "시간당 이익",
+  "purse.reward": "작업 보상",
+  "purse.placement": "자원 배치",
+  "task.Congratulation": "미션을 완료하신 것을 축하합니다",
+  "purse.TeamSharing": "팀 공유",
+  "purse.ShareRewards": "보상 공유",
+  "team.shuoming": "팀 설명",
+  "team.haoyou": "친구 초대",
+  "team.jiangli": "게임에 친구를 한 명씩 초대할 때마다, 사용자는 고정된 1000GTC의 보상을 받을 수 있습니다.",
+  "team.jianshe": "팀 구축",
+  "team.shouyi": "직접 초대한 친구가 A팀에서 GTC를 생산하고 수령할 때마다, 사용자는 2%의 수익을 얻을 수 있습니다;",
+  "team.shouqu": "이 수익은 누적할 수 있지만, 사용자가 수동으로 수령해야 합니다;",
+  "team.xianshi": "사용자가 초대한 친구가 초대한 다른 친구는 B팀에 표시됩니다;",
+  "team.lingqu": "간접 친구가 GTC를 생산하고 수확할 때마다, 사용자는 0.2%의 수익을 얻을 수 있으며, 이 수익도 사용자가 수령해야 합니다;",
+  "team.eaijiangli": "추가 초대 보상",
+  "team.lingquo": "초대한 친구 수가 플랫폼에서 설정한 몇 가지 단계에 도달할 때마다, 더 많은 고액 보상을 받을 수 있습니다. 이 보상은 친구 초대의 고정 보상과는 다르며, 양도 훨씬 더 많습니다. 꼭 수령하세요!",
+  "index.prompt": "프롬프트",
+  "index.level": "초로 최고 레벨에 도달했습니다!",
+  "index.start":"채굴 시작",
+  "purse.Props": "프로퍼티",
+  "purse.Production": "생산",
+  "purse.Ticket": "티켓 구하기",
+  "purse.SPIN": "스핀"
+}

+ 207 - 0
src/locale/pt.json

@@ -0,0 +1,207 @@
+{
+  "tabbar.Home": "Início",
+  "tabbar.Competition": "Competição",
+  "tabbar.Team": "Equipe",
+  "tabbar.Earn": "Ganhar",
+  "tabbar.point": "Ganhar Pontos",
+  "app.name": "Título Chinês",
+  "weight": "{heavy} kg",
+  "detail": "{0} cm, {1} kg",
+  "production.rewards.rewards": "Total de recompensas",
+  "production.rewards.bonuses": "Convide amigos para receber bônus",
+  "production.rewards.yaoqing": "Convidar amigos",
+  "production.rewards.huode": "Você e seus amigos receberão",
+  "production.rewards.guanzhu": "Siga nosso canal com seus amigos",
+  "production.rewards.extra": "Recompensas extras por convite",
+  "production.rewards.invite": "Enviar para convidar",
+  "production.rewards.Buddy": "Lista de amigos",
+  "production.rewards.Contribution": "Recompensa por contribuição",
+  "production.rewards.Unlock": "Desbloquear",
+  "production.rewards.TapCoins": "TapCoins ao atingir este nível",
+  "production.rewards.Claim": "Resgatar",
+  "production.rewards.ShareLink": "Compartilhar link de convite",
+  "production.rewards.Share": "Compartilhar",
+  "production.rewards.secret": "Código secreto para convidar",
+  "production.rewards.Copy": "Copiar",
+  "production.rewards.Recommend": "Recomendado para grupos que bloqueiam links",
+  "production.signin.Daily": "Login Diário",
+  "production.signin.every": "Quanto mais você logar todos os dias, mais TapCoins",
+  "production.signin.Claim": "Resgatar Recompensa",
+  "production.signin.Reward": "Você só pode escolher uma das Recompensas",
+  "production.signin.TapCoins": "TapCoins",
+  "production.signin.Premium": "TapCoins Premium",
+  "production.signin.ahead": "Prosseguir",
+  "production.signin.Claimbtn": "Resgatar",
+  "production.gifts.Luck": "Código da Sorte",
+  "production.gifts.Watch": "Assista este vídeo do início ao fim em velocidade normal e insira o código da sorte para receber uma recompensa",
+  "production.gifts.getRewards": "Assista o vídeo para receber recompensas",
+  "production.gifts.Watche": "Assista o vídeo, encontre o Código da Sorte e cole aqui",
+  "production.gifts.Submit": "Enviar",
+  "production.gifts.WatchO": "Assistir",
+  "production.rocket.balance": "Seu saldo",
+  "production.rocket.boosters": "Aceleradores diários gratuitos",
+  "production.rocket.Turbo": "Turbo",
+  "production.rocket.Energys": "Energia",
+  "production.rocket.Free": "Grátis",
+  "production.rocket.available": "disponível",
+  "production.rocket.Energy": "Energia Completa",
+  "production.rocket.Boosters": "Aceleradores",
+  "production.rocket.Multitap": "Multitoque",
+  "production.rocket.Amount": "Valor por moeda +1 para cada nível",
+  "production.rocket.Use": "Usar",
+  "production.baron.Totalprofit": "Lucro total por hora",
+  "production.baron.profit": "Lucro por hora",
+  "production.baron.Ranking": "Lista de Classificação",
+  "production.baron.Crypto": "Gráfico de Criptomoedas",
+  "production.rewards.yaoqinghaoyou": "Convide {index} amigos para obter",
+  "production.rewards.yaoqinghaoyouDialog": "Convide {index} amigos",
+  "production.purse": "Carteira",
+  "production.daily": "Check-in Diário",
+  "production.rewards": "Recompensas Aleatórias",
+  "production.bounty": "Promoção",
+  "production.profit": "Lucro por Hora",
+  "production.upgrade": "Atualizar",
+  "production.friends": "Amigos",
+  "production.team.join": "Entrar no Grupo",
+  "production.team.joinText": "Junte-se a um grupo para ganhar junto",
+  "production.team.creat": "Criar ou Juntar-se",
+  "production.team.list": "Grupos Recomendados",
+  "production.team.community": "Comunidade",
+  "production.team.joinBtn": "Entrar",
+  "production.team.joinSuccess": "Entrada com Sucesso",
+  "production.team.joinError": "Erro ao Entrar",
+  "production.team.Friend": "Convidar Amigo",
+  "production.team.Squad": "Sair do Grupo",
+  "production.team.Cancel": "Cancelar",
+  "production.team.Leave": "Sair",
+  "production.team.exit": "Deseja realmente sair",
+  "task.More": "Mais tarefas, Mais recompensas",
+  "task.Official": "Oficial",
+  "task.Join": "Participar",
+  "task.Check": "Verificar",
+  "task.Extra": "Tarefas Extra",
+  "task.Daily": "Diário",
+  "bounty.profit": "Lucro por hora",
+  "bounty.Hint": "Dica",
+  "bounty.TapCoins": "Recompensa TapCoins",
+  "bounty.Block": "Música do Ano",
+  "bounty.Appli": "Conquista Vitalícia",
+  "bounty.Terms": "Produção Anual",
+  "bounty.Event": "Álbum do Ano",
+  "bounty.Profit": "Lucro por hora",
+  "bounty.ahead": "Avançar",
+  "bounty.lucky": "Estou com sorte",
+  "bounty.hope": "Espero ter sorte",
+  "bounty.Boost": "Aumentar seu lucro",
+  "bounty.Start": "Começar mineração",
+  "bounty.Guess": "Adivinhe a dica dentro do tempo",
+  "bounty.Tap": "Toque no menu Mineração",
+  "bounty.Will": "Will Warren e Amir Bandeali iniciaram",
+  "airdrop.title": "Ganhe TapCoins, Chaves, USDT, TON",
+  "airdrop.chets.Quest": "Missão Crypto",
+  "airdrop.chets.Victory": "Vitória para poucos",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "Pool de Prêmios Atual",
+  "airdrop.chets.winner": "A caixa com menos compras vence",
+  "airdrop.chets.purchase": "Contagem para compra",
+  "airdrop.chets.Perpurchase": "Por Compra",
+  "airdrop.chets.BUY": "COMPRAR",
+  "airdrop.chets.Balance": "Saldo",
+  "airdrop.chets.How": "Como jogar",
+  "airdrop.chets.Ranking": "Classificação",
+  "airdrop.chets.Records": "Meus Registros",
+  "airdrop.chets.play": "Como jogar",
+  "airdrop.chets.time": "Hora do sorteio",
+  "airdrop.chets.Win": "Vencer",
+  "airdrop.chets.Prize": "Pool de Prêmios",
+  "airdrop.chets.Winning": "Caixa vencedora",
+  "airdrop.chets.Prizedraw": "Hora do sorteio",
+  "airdrop.chets.BOX": "CAIXA",
+  "airdrop.chets.Total": "Total",
+  "airdrop.chets.Purchase": "Compra",
+  "airdrop.chets.text": "1.Após o fim da contagem, a caixa com menos compras vence",
+  "airdrop.tumtable.Awards": "Prêmios",
+  "point.Airdrop": "Airdrop",
+  "point.Core": "Pontos Principais",
+  "purse.Total": "Lucro total por hora",
+  "purse.per": "Lucro por hora",
+  "purse.Withdraw": "Sacar",
+  "purse.amount": "Digite um valor válido",
+  "purse.Minimum": "Saque mínimo é 0.1 TON",
+  "purse.balance": "Saldo insuficiente",
+  "purse.Record": "Registro",
+  "play.Relaxed": "Relaxado",
+  "play.Ordinary": "Normal",
+  "play.Nervousness": "Nervoso",
+  "play.Duration": "Duração",
+  "play.Click": "Clique",
+  "play.Increase": "Aumento no lucro por hora",
+  "play.Go": "Ir",
+  "play.OK": "OK",
+  "play.right": "O ritmo está certo",
+  "play.again": "Falhou, tente novamente",
+  "trophy.Miners": "Mineradores",
+  "trophy.Squad": "Equipe",
+  "team.noData": "sem dados",
+  "team.InviteFriends": "Convidar Amigos",
+  "team.GetMore": "Obter Mais",
+  "team.GT Coin": "GT Coin",
+  "team.MyTeam": "Minha Equipe",
+  "team.Reward": "Recompensa",
+  "team.Total": "Total",
+  "team.TotalA": "Equipe A, 2%",
+  "team.TotalB": "Equipe B, 0.2%",
+  "team.GetIt": "Obter",
+  "team.Invite": "Recompensas extras por convite",
+  "team.will": "Você receberá recompensas por cada convite!",
+  "team.NewComerList": "Lista de Novatos",
+  "team.ReceiveAll": "Receber tudo",
+  "team.Commission": "Comissão",
+  "team.TotalTeamProduction": "Produção Total da Equipe",
+  "team.WorkingNow": "Trabalhando agora",
+  "team.PleaseShare": "Por favor compartilhe",
+  "task.Tasks": "Tarefas",
+  "task.GetRewardsFor": "Obter Recompensas Por",
+  "task.CompletingQuests": "Completar Missões",
+  "task.Start": "Começar",
+  "task.Claim": "Resgatar",
+  "loading.play": "Toque música, Ganhe recompensas",
+  "loading.Version": "Versão:1.0",
+  "loading.Checking": "Verificando sua conta",
+  "loading.Continue": "Continuar",
+  "index.Countdown": "Contagem",
+  "index.Play": "Jogar",
+  "index.Boosts": "Impulsos",
+  "index.Speed": "Acelere o processo!",
+  "index.Free": "Grátis",
+  "index.Got": "Entendi",
+  "index.Ok": "Ok",
+  "index.Upgrade": "Atualizar",
+  "index.Popular": "Tarefas populares",
+  "index.collect": "Você pode coletar GT coins a cada 12 horas",
+  "index.collection": "Resultado da última coleta automática",
+  "purse.tokens": "Quantidade total de tokens",
+  "purse.hour": "Lucro por hora",
+  "purse.reward": "Recompensa da tarefa",
+  "purse.placement": "Colocação de recursos",
+  "task.Congratulation": "Parabéns por completar a missão",
+  "purse.TeamSharing": "Compartilhamento em Equipe",
+  "purse.ShareRewards": "Compartilhar recompensas",
+  "team.shuoming": "Descrição da Equipe",
+  "team.haoyou": "Convidar Amigos",
+  "team.jiangli": "Por cada amigo convidado, receba 1000GTC",
+  "team.jianshe": "Construção da Equipe",
+  "team.shouyi": "Ganhe 2% da receita da Equipe A",
+  "team.shouqu": "Esta receita acumula mas precisa ser coletada manualmente",
+  "team.xianshi": "Amigos indiretos aparecem na Equipe B",
+  "team.lingqu": "Ganhe 0.2% da receita da Equipe B",
+  "team.eaijiangli": "Recompensas Adicionais",
+  "team.lingquo": "Receba recompensas extras por metas de convites",
+  "index.prompt": "prompt",
+  "index.level": "Você atingiu o nível máximo!",
+  "index.start": "Iniciar mineração",
+  "purse.Props": "Props",
+  "purse.Production": "Produção",
+  "purse.Ticket": "Obter Ticket",
+  "purse.SPIN": "GIRO"
+}

+ 216 - 0
src/locale/ru.json

@@ -0,0 +1,216 @@
+{
+  "tabbar.Home": "Главная",
+  "tabbar.Competition": "Соревнование",
+  "tabbar.Team": "Команда",
+  "tabbar.Earn": "Заработок",
+  "tabbar.production": "Производство",
+  "tabbar.task": "Задача",
+  "tabbar.rd": "R&D",
+  "tabbar.airdrop": "Аирдроп",
+  "tabbar.point": "Заработать очки",
+  "app.name": "Китайское название",
+  "weight": "{heavy} кг",
+  "detail": "{0} см, {1} кг",
+  "production.rewards.yaoqinghaoyou": "Пригласите {index} друзей, чтобы получить",
+  "production.rewards.yaoqinghaoyouDialog": "Пригласите {index} друзей",
+  "production.purse": "Кошелек",
+  "production.daily": "Ежедневная проверка",
+  "production.rewards": "Случайные награды",
+  "production.bounty": "Промо",
+  "production.profit": "Почасовая прибыль",
+  "production.upgrade": "Обновление",
+  "production.friends": "Друзья",
+  "production.team.join": "Присоединиться к команде",
+  "production.team.joinText": "Присоединитесь к команде, чтобы вместе свайпать и зарабатывать. Максимизируйте прибыль и поднимайтесь в рейтинге!",
+  "production.team.creat": "Создайте или присоединитесь к пользовательской команде",
+  "production.team.list": "Рекомендуемые команды",
+  "production.team.community": "Сообщество",
+  "production.team.joinBtn": "Присоединиться",
+  "production.team.joinSuccess": "Успешное присоединение",
+  "production.team.joinError": "Ошибка присоединения",
+  "production.team.Friend": "Пригласить друга",
+  "production.team.Squad": "Покинуть команду",
+  "production.team.Cancel": "Отмена",
+  "production.team.Leave": "Покинуть",
+  "production.team.exit": "Вы уверены, что хотите выйти",
+  "production.rewards.rewards": "Общие награды",
+  "production.rewards.bonuses": "Пригласите друзей, чтобы получить бонусы",
+  "production.rewards.yaoqing": "Пригласить друзей",
+  "production.rewards.huode": "Вы и ваши друзья получите",
+  "production.rewards.guanzhu": "Следите за нашим каналом вместе с друзьями",
+  "production.rewards.extra": "Пригласите дополнительные награды",
+  "production.rewards.invite": "Отправить приглашение",
+  "production.rewards.Buddy": "Список друзей",
+  "production.rewards.Contribution": "Награда за вклад",
+  "production.rewards.Unlock": "Разблокировать",
+  "production.rewards.TapCoins": "Нажмите TapCoins, когда достигнете этого уровня.",
+  "production.rewards.Claim": "Запросить",
+  "production.rewards.ShareLink": "Поделиться пригласительной ссылкой",
+  "production.rewards.Share": "Поделиться",
+  "production.rewards.secret": "Секретный код для приглашения",
+  "production.rewards.Copy": "Копировать",
+  "production.rewards.Recommend": "Рекомендуется, если вы поделились в группах, которые блокируют ссылки",
+  "production.signin.Daily": "Ежедневный вход",
+  "production.signin.every": "Чем больше вы входите каждый день, тем больше TapCoins",
+  "production.signin.Claim": "Запросить награду",
+  "production.signin.Reward": "Вы можете выбрать только одну из наград",
+  "production.signin.TapCoins": "TapCoins",
+  "production.signin.Premium": "TapCoins Premium",
+  "production.signin.ahead": "Идти вперед",
+  "production.signin.Claimbtn": "Запросить",
+  "production.gifts.Luck": "Код удачи",
+  "production.gifts.Watch": "Посмотрите это видео с начала до конца в обычном темпе и введите код удачи, чтобы получить награду",
+  "production.gifts.getRewards": "Посмотрите видео, чтобы получить награды",
+  "production.gifts.Watche": "Посмотрите видео, найдите код удачи и вставьте его здесь",
+  "production.gifts.Submit": "Отправить",
+  "production.gifts.WatchO": "Смотреть",
+  "production.rocket.balance": "Ваш баланс",
+  "production.rocket.boosters": "Ежедневные бесплатные бустеры",
+  "production.rocket.Turbo": "Турбо",
+  "production.rocket.Energys": "Энергия",
+  "production.rocket.Free": "Бесплатно",
+  "production.rocket.available": "доступно",
+  "production.rocket.Energy": "Полная энергия",
+  "production.rocket.Boosters": "Бустеры",
+  "production.rocket.Multitap": "Мультитап",
+  "production.rocket.Amount": "Значение за монету +1 за каждый уровень",
+  "production.rocket.Use": "Использовать",
+  "production.baron.Totalprofit": "Общий доход в час",
+  "production.baron.profit": "Доход в час",
+  "production.baron.Ranking": "Рейтинг",
+  "production.baron.Crypto": "Крипто свечной график",
+  "task.More": "Больше задач, больше наград",
+  "task.Official": "Официальный",
+  "task.Join": "Присоединиться",
+  "task.Check": "Проверить",
+  "task.Extra": "Дополнительные задачи",
+  "task.Daily": "Ежедневные",
+  "bounty.profit": "Почасовая прибыль",
+  "bounty.Hint": "Подсказка",
+  "bounty.TapCoins": "TapCoins баунти",
+  "bounty.Block": " Песня года",
+  "bounty.Appli": " Пожизненные достижения",
+  "bounty.Terms": "Годовое производство",
+  "bounty.Event": "Альбом года",
+  "bounty.Profit": "Доход в час",
+  "bounty.ahead": "Идти вперед",
+  "bounty.lucky": "Я счастливчик",
+  "bounty.hope": "Надеюсь, я счастливчик",
+  "bounty.Boost": "Увеличьте вашу прибыль",
+  "bounty.Start": "Начать майнинг",
+  "bounty.Guess": "Угадайте подсказку в течение обратного отсчета, чтобы выиграть приз",
+  "bounty.Tap": "Нажмите на меню майнинга, чтобы купить обновления. Зарабатывайте даже в автономном режиме до 3 часов",
+  "bounty.Will": "Will Warren и Amir Bandeali начали разработку проекта в 2016 году, и 22 февраля 2017 года",
+  "airdrop.title": "Заработайте TapCoins, ключи, USDT, TON и многое другое",
+  "airdrop.chets.Quest": "Крипто квест",
+  "airdrop.chets.Victory": "Победа принадлежит немногим",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "Текущий призовой фонд",
+  "airdrop.chets.winner": "Коробка с наименьшим количеством покупок будет победителем",
+  "airdrop.chets.purchase": "Обратный отсчет до покупки",
+  "airdrop.chets.Perpurchase": "За покупку",
+  "airdrop.chets.BUY": "КУПИТЬ",
+  "airdrop.chets.Balance": "Баланс",
+  "airdrop.chets.How": "Как играть",
+  "airdrop.chets.Ranking": "Рейтинг",
+  "airdrop.chets.Records": "Мои записи",
+  "airdrop.chets.play": "Как играть",
+  "airdrop.chets.time": "Время розыгрыша приза",
+  "airdrop.chets.Win": "Выиграть",
+  "airdrop.chets.Prize": "Призовой фонд",
+  "airdrop.chets.Winning": "Победная коробка",
+  "airdrop.chets.Prizedraw": "Время розыгрыша приза",
+  "airdrop.chets.BOX": "КОРОБКА",
+  "airdrop.chets.Total": "Всего",
+  "airdrop.chets.Purchase": "Покупка",
+  "airdrop.chets.text": "1. После окончания обратного отсчета коробка с наименьшим количеством покупок станет победной коробкой. 2. В случае, если несколько коробок имеют одинаковое количество покупок, последняя купленная коробка будет признана победителем. 3. Победители разделят 80% от общего призового фонда, приз будет распределен в зависимости от количества купленных коробок.",
+  "airdrop.tumtable.Awards": "Награды",
+  "point.Airdrop": "Аирдроп",
+  "point.Core": "Основные очки",
+  "purse.Total": "Общий доход в час",
+  "purse.per": "Доход в час",
+  "purse.Withdraw": "Вывести",
+  "purse.amount": "Пожалуйста, введите действительную сумму",
+  "purse.Minimum": "Минимальная сумма вывода составляет 0.1 TON",
+  "purse.balance": "Недостаточный баланс",
+  "purse.Record": "Запись",
+  "play.Relaxed": "Расслабленный",
+  "play.Ordinary": "Обычный",
+  "play.Nervousness": "Нервозность",
+  "play.Duration": "Продолжительность",
+  "play.Click": "Клик",
+  "play.Increase": "Увеличение дохода в час",
+  "play.Go": "Идти",
+  "play.OK": "OK",
+  "play.right": "Ритм правильный",
+  "play.again": "Вы проиграли, попробуйте еще раз",
+
+  "trophy.Miners": "Шахтёры",
+  "trophy.Squad": "Отряд",
+
+  "team.noData": "нет данных",
+  "team.InviteFriends": "Пригласить друзей",
+  "team.GetMore": "Получить больше",
+  "team.GT Coin": "GT Coin",
+  "team.MyTeam": "Моя команда",
+  "team.Reward": "Награда",
+  "team.Total": "Всего",
+  "team.TotalA": "Команда A, 2%",
+  "team.TotalB": "Команда B, 0.2%",
+  "team.GetIt": "Получить",
+  "team.Invite": "Пригласить награду",
+  "team.will": "Вы получите награду за каждое приглашение!",
+  "team.NewComerList": "Список новичков",
+  "team.ReceiveAll": "Получить все",
+  "team.Commission": "Комиссия",
+  "team.TotalTeamProduction": "Общая продукция команды",
+  "team.WorkingNow": "Сейчас работает",
+  "team.PleaseShare": "Поделитесь, пожалуйста",
+
+  "task.Tasks": "Задания",
+  "task.GetRewardsFor": "Получить награды за",
+  "task.CompletingQuests": "Выполнение квестов",
+  "task.Start": "Начать",
+  "task.Claim": "Забрать",
+
+  "loading.play": "Играть музыку, Играть и зарабатывать.",
+  "loading.Version": "Версия:",
+  "loading.Checking": "Проверка вашего аккаунта",
+  "loading.Continue": "Продолжить",
+  "index.Countdown": "Обратный",
+  "index.Play": "Играть",
+  "index.Boosts": "Бусты",
+  "index.Speed": "Ускорьте процесс!",
+  "index.Free": "Бесплатно",
+  "index.Got": "Понятно",
+  "index.Ok": "ОК",
+  "index.Upgrade": "Обновить",
+  "index.Popular": "Популярные задания с наградами",
+  "index.collect": "Вы можете собирать GT монеты каждые 12 часов",
+  "index.collection": "Результат последнего автоматического сбора",
+  "purse.tokens": "Общее количество токенов",
+  "purse.hour": "Доход в час",
+  "purse.reward": "Награда за задание",
+  "purse.placement": "Размещение ресурсов",
+  "task.Congratulation": "Поздравляем с завершением миссии",
+  "purse.TeamSharing": "Совместное использование командой",
+  "purse.ShareRewards": "Поделиться наградами",
+
+  "team.shuoming": "Описание команды",
+  "team.haoyou": "Пригласить друзей",
+  "team.jiangli": "Приглашая друга в игру, пользователь может получить фиксированное вознаграждение в размере 1000GTC.",
+  "team.jianshe": "Строительство команды",
+  "team.shouyi": "Пользователь может получить 2% дохода, когда его непосредственно приглашенный друг производит и собирает GTC в команде A;",
+  "team.shouqu": "Этот доход может накапливаться, но пользователь должен собирать его вручную;",
+  "team.xianshi": "Друзья, приглашенные друзьями пользователя, станут косвенными друзьями и будут отображены в команде B;",
+  "team.lingqu": "Пользователь может получить 0.2% дохода от косвенных друзей за производство и сбор GTC, который также нужно собирать вручную;",
+  "team.eaijiangli": "Дополнительные награды за приглашение",
+  "team.lingquo": "Когда количество приглашенных друзей пользователя достигает определенных стадий, установленных платформой, он может получить дополнительные высокие награды. Эта награда отличается от фиксированной награды за приглашение друзей и значительно выше. Не забудьте её получить!",
+  "index.prompt": "подсказка",
+  "index.level": "Вы достигли полного уровня!",
+  "index.start":"Начать добычу",
+  "purse.Props": "Предметы",
+  "purse.Production": "Производство",
+  "purse.Ticket": "Получение билета",
+  "purse.SPIN": "Вращение"
+}

+ 216 - 0
src/locale/th.json

@@ -0,0 +1,216 @@
+{
+  "tabbar.Home": "หน้าแรก",
+  "tabbar.Competition": "แข่งขัน",
+  "tabbar.Team": "ทีม",
+  "tabbar.Earn": "รายได้",
+  "tabbar.production": "การผลิต",
+  "tabbar.task": "งาน",
+  "tabbar.rd": "R&D",
+  "tabbar.airdrop": "Airdrop",
+  "tabbar.point": "รับคะแนน",
+  "app.name": "ชื่อภาษาจีน",
+  "weight": "{heavy} กก.",
+  "detail": "{0} ซม., {1} กก.",
+  "production.rewards.yaoqinghaoyou": "เชิญเพื่อน {index} คนเพื่อรับ",
+  "production.rewards.yaoqinghaoyouDialog": "เชิญเพื่อน {index} คน",
+  "production.purse": "กระเป๋าเงิน",
+  "production.daily": "เช็คอินรายวัน",
+  "production.rewards": "รางวัลแบบสุ่ม",
+  "production.bounty": "โปรโมชั่น",
+  "production.profit": "กำไรต่อชั่วโมง",
+  "production.upgrade": "อัปเกรด",
+  "production.friends": "เพื่อน",
+  "production.team.join": "เข้าร่วมทีม",
+  "production.team.joinText": "เข้าร่วมทีมเพื่อร่วมสวิปและรับผลกำไรร่วมกัน เพิ่มผลกำไรและปีนอันดับ!",
+  "production.team.creat": "สร้างหรือเข้าร่วมทีมที่กำหนดเอง",
+  "production.team.list": "ทีมแนะนำ",
+  "production.team.community": "ชุมชน",
+  "production.team.joinBtn": "เข้าร่วม",
+  "production.team.joinSuccess": "เข้าร่วมสำเร็จ",
+  "production.team.joinError": "เข้าร่วมผิดพลาด",
+  "production.team.Friend": "เชิญเพื่อน",
+  "production.team.Squad": "ออกจากทีม",
+  "production.team.Cancel": "ยกเลิก",
+  "production.team.Leave": "ออก",
+  "production.team.exit": "คุณแน่ใจหรือไม่ว่าต้องการออก",
+  "production.rewards.rewards": "รางวัลรวม",
+  "production.rewards.bonuses": "เชิญเพื่อนเพื่อรับโบนัส",
+  "production.rewards.yaoqing": "เชิญเพื่อน",
+  "production.rewards.huode": "คุณและเพื่อนของคุณจะได้รับ",
+  "production.rewards.guanzhu": "ติดตามช่องของเราพร้อมเพื่อนของคุณ",
+  "production.rewards.extra": "เชิญรางวัลเพิ่มเติม",
+  "production.rewards.invite": "ส่งคำเชิญ",
+  "production.rewards.Buddy": "รายชื่อเพื่อน",
+  "production.rewards.Contribution": "รางวัลสำหรับการมีส่วนร่วม",
+  "production.rewards.Unlock": "ปลดล็อก",
+  "production.rewards.TapCoins": "แตะ TapCoins เมื่อคุณถึงระดับนี้",
+  "production.rewards.Claim": "ขอรับ",
+  "production.rewards.ShareLink": "แชร์ลิงก์เชิญ",
+  "production.rewards.Share": "แชร์",
+  "production.rewards.secret": "รหัสลับเพื่อเชิญ",
+  "production.rewards.Copy": "คัดลอก",
+  "production.rewards.Recommend": "แนะนำหากคุณแชร์ในกลุ่มที่บล็อกลิงก์",
+  "production.signin.Daily": "เข้าสู่ระบบรายวัน",
+  "production.signin.every": "ยิ่งเข้าสู่ระบบทุกวันมากเท่าไหร่ TapCoins ก็จะยิ่งมากขึ้น",
+  "production.signin.Claim": "ขอรับรางวัล",
+  "production.signin.Reward": "คุณสามารถเลือกรางวัลได้เพียงหนึ่งในนั้น",
+  "production.signin.TapCoins": "TapCoins",
+  "production.signin.Premium": "TapCoins Premium",
+  "production.signin.ahead": "ไปข้างหน้า",
+  "production.signin.Claimbtn": "ขอรับ",
+  "production.gifts.Luck": "รหัสโชคดี",
+  "production.gifts.Watch": "ดูวิดีโอนี้ตั้งแต่ต้นจนจบด้วยความเร็วปกติและป้อนรหัสโชคดีเพื่อรับรางวัล",
+  "production.gifts.getRewards": "ดูวิดีโอเพื่อรับรางวัล",
+  "production.gifts.Watche": "ดูวิดีโอหารหัสโชคดีและวางที่นี่",
+  "production.gifts.Submit": "ส่ง",
+  "production.gifts.WatchO": "ดู",
+  "production.rocket.balance": "ยอดคงเหลือของคุณ",
+  "production.rocket.boosters": "บูสเตอร์ฟรีรายวัน",
+  "production.rocket.Turbo": "เทอร์โบ",
+  "production.rocket.Energys": "พลังงาน",
+  "production.rocket.Free": "ฟรี",
+  "production.rocket.available": "พร้อมใช้งาน",
+  "production.rocket.Energy": "พลังงานเต็ม",
+  "production.rocket.Boosters": "บูสเตอร์",
+  "production.rocket.Multitap": "การแตะหลายครั้ง",
+  "production.rocket.Amount": "มูลค่าต่อเหรียญ +1 ต่อระดับ",
+  "production.rocket.Use": "ใช้",
+  "production.baron.Totalprofit": "กำไรรวมต่อชั่วโมง",
+  "production.baron.profit": "กำไรต่อชั่วโมง",
+  "production.baron.Ranking": "อันดับ",
+  "production.baron.Crypto": "แท่งเทียนคริปโต",
+  "task.More": "งานมากขึ้น รางวัลมากขึ้น",
+  "task.Official": "ทางการ",
+  "task.Join": "เข้าร่วม",
+  "task.Check": "ตรวจสอบ",
+  "task.Extra": "งานเพิ่มเติม",
+  "task.Daily": "รายวัน",
+  "bounty.profit": "กำไรต่อชั่วโมง",
+  "bounty.Hint": "คำใบ้",
+  "bounty.TapCoins": "TapCoins บาวน์ตี้",
+  "bounty.Block": "เพลงประจำปี",
+  "bounty.Appli": "ความสำเร็จตลอดชีวิต",
+  "bounty.Terms": "การผลิตประจำปี",
+  "bounty.Event": "อัลบั้มประจำปี",
+  "bounty.Profit": "กำไรต่อชั่วโมง",
+  "bounty.ahead": "ไปข้างหน้า",
+  "bounty.lucky": "ฉันโชคดี",
+  "bounty.hope": "ฉันหวังว่าฉันจะโชคดี",
+  "bounty.Boost": "เพิ่มกำไรของคุณ",
+  "bounty.Start": "เริ่มขุด",
+  "bounty.Guess": "คาดเดาคำใบ้ภายในการนับถอยหลังเพื่อชนะรางวัล",
+  "bounty.Tap": "แตะเมนูการขุดเพื่อซื้อการอัปเกรด รับผลกำไรแม้เมื่อออฟไลน์สูงสุด 3 ชั่วโมง",
+  "bounty.Will": "Will Warren และ Amir Bandeali เริ่มพัฒนาโครงการในปี 2016 และในวันที่ 22 กุมภาพันธ์ 2017",
+  "airdrop.title": "รับ TapCoins, กุญแจ, USDT, TON และอื่น ๆ",
+  "airdrop.chets.Quest": "ภารกิจคริปโต",
+  "airdrop.chets.Victory": "ชัยชนะเป็นของคนน้อย",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "กองทุนรางวัลปัจจุบัน",
+  "airdrop.chets.winner": "กล่องที่มีการซื้อน้อยที่สุดจะเป็นผู้ชนะ",
+  "airdrop.chets.purchase": "นับถอยหลังการซื้อ",
+  "airdrop.chets.Perpurchase": "ต่อการซื้อ",
+  "airdrop.chets.BUY": "ซื้อ",
+  "airdrop.chets.Balance": "ยอดคงเหลือ",
+  "airdrop.chets.How": "วิธีเล่น",
+  "airdrop.chets.Ranking": "อันดับ",
+  "airdrop.chets.Records": "บันทึกของฉัน",
+  "airdrop.chets.play": "วิธีเล่น",
+  "airdrop.chets.time": "เวลาการจับรางวัล",
+  "airdrop.chets.Win": "ชนะ",
+  "airdrop.chets.Prize": "กองทุนรางวัล",
+  "airdrop.chets.Winning": "กล่องชนะ",
+  "airdrop.chets.Prizedraw": "เวลาการจับรางวัล",
+  "airdrop.chets.BOX": "กล่อง",
+  "airdrop.chets.Total": "รวม",
+  "airdrop.chets.Purchase": "ซื้อ",
+  "airdrop.chets.text": "1. หลังจากนับถอยหลังจบ กล่องที่มีการซื้อน้อยที่สุดจะเป็นกล่องชนะ 2. ในกรณีที่กล่องหลายกล่องมีจำนวนการซื้อเท่ากัน กล่องที่ซื้อล่าสุดจะเป็นผู้ชนะ 3. ผู้ชนะจะแบ่งรางวัลรวม 80% ตามจำนวนกล่องที่ซื้อ",
+  "airdrop.tumtable.Awards": "รางวัล",
+  "point.Airdrop": "Airdrop",
+  "point.Core": "คะแนนหลัก",
+  "purse.Total": "กำไรรวมต่อชั่วโมง",
+  "purse.per": "กำไรต่อชั่วโมง",
+  "purse.Withdraw": "ถอน",
+  "purse.amount": "กรุณาใส่จำนวนที่ถูกต้อง",
+  "purse.Minimum": "จำนวนขั้นต่ำสำหรับการถอนคือ 0.1 TON",
+  "purse.balance": "ยอดคงเหลือไม่เพียงพอ",
+  "purse.Record": "บันทึก",
+  "play.Relaxed": "ผ่อนคลาย",
+  "play.Ordinary": "ธรรมดา",
+  "play.Nervousness": "กังวล",
+  "play.Duration": "ระยะเวลา",
+  "play.Click": "คลิก",
+  "play.Increase": "เพิ่มกำไรต่อชั่วโมง",
+  "play.Go": "ไป",
+  "play.OK": "ตกลง",
+  "play.right": "จังหวะถูกต้อง",
+  "play.again": "คุณล้มเหลว กรุณาลองอีกครั้ง",
+
+  "trophy.Miners": "ผู้ขุดแร่",
+  "trophy.Squad": "ทีม",
+
+  "team.noData": "ไม่มีข้อมูล",
+  "team.InviteFriends": "เชิญเพื่อน",
+  "team.GetMore": "รับเพิ่ม",
+  "team.GT Coin": "GT Coin",
+  "team.MyTeam": "ทีมของฉัน",
+  "team.Reward": "รางวัล",
+  "team.Total": "รวม",
+  "team.TotalA": "ทีม A, 2%",
+  "team.TotalB": "ทีม B, 0.2%",
+  "team.GetIt": "รับ",
+  "team.Invite": "เชิญรางวัลเพิ่ม",
+  "team.will": "คุณจะได้รับรางวัลสำหรับการเชิญทุกครั้ง!",
+  "team.NewComerList": "รายชื่อผู้ใหม่",
+  "team.ReceiveAll": "รับทั้งหมด",
+  "team.Commission": "คอมมิชชั่น",
+  "team.TotalTeamProduction": "ผลิตภัณฑ์ทีมรวม",
+  "team.WorkingNow": "กำลังทำงาน",
+  "team.PleaseShare": "กรุณาส่งต่อ",
+
+  "task.Tasks": "งาน",
+  "task.GetRewardsFor": "รับรางวัลสำหรับ",
+  "task.CompletingQuests": "ทำภารกิจให้เสร็จ",
+  "task.Start": "เริ่ม",
+  "task.Claim": "รับ",
+
+  "loading.play": "เล่นเพลง, เล่นเพื่อรับรางวัล.",
+  "loading.Version": "เวอร์ชัน:",
+  "loading.Checking": "กำลังตรวจสอบบัญชีของคุณ",
+  "loading.Continue": "ดำเนินการต่อ",
+  "index.Countdown": "นับถอยหลัง",
+  "index.Play": "เล่น",
+  "index.Boosts": "บูสต์",
+  "index.Speed": "เร่งกระบวนการ!",
+  "index.Free": "ฟรี",
+  "index.Got": "เข้าใจแล้ว",
+  "index.Ok": "ตกลง",
+  "index.Upgrade": "อัปเกรด",
+  "index.Popular": "งานรางวัลยอดนิยม",
+  "index.collect": "คุณสามารถรวบรวมเหรียญ GT ทุก 12 ชั่วโมง",
+  "index.collection": "ผลลัพธ์ของการรวบรวมอัตโนมัติครั้งล่าสุด",
+  "purse.tokens": "จำนวนเต็มของโทเค็น",
+  "purse.hour": "ผลตอบแทนต่อชั่วโมง",
+  "purse.reward": "รางวัลงาน",
+  "purse.placement": "จัดวางทรัพยากร",
+  "task.Congratulation": "ขอแสดงความยินดีที่คุณทำเป็นที่สำเร็จ",
+  "purse.TeamSharing": "แบ่งปันทีม",
+  "purse.ShareRewards": "แบ่งปันรางวัล",
+
+  "team.shuoming": "คำอธิบายทีม",
+  "team.haoyou": "เชิญเพื่อน",
+  "team.jiangli": "ผู้ใช้สามารถรับรางวัลคงที่ 1000GTC ทุกครั้งที่เชิญเพื่อนเข้าเล่นเกม",
+  "team.jianshe": "การสร้างทีม",
+  "team.shouyi": "ผู้ใช้สามารถรับรายได้ 2% เมื่อเพื่อนที่เชิญโดยตรงผลิตและรวบรวม GTC ในทีม A;",
+  "team.shouqu": "รายได้นี้สามารถรวมเพิ่มได้ แต่จะต้องรวบรวมเองโดยผู้ใช้;",
+  "team.xianshi": "เพื่อนที่เชิญโดยเพื่อนของคุณจะเป็นเพื่อนอ้อมเกลือมาแสดงในทีม B;",
+  "team.lingqu": "ผู้ใช้สามารถรับรายได้ 0.2% จากการผลิตและรวบรวม GTC ของเพื่อนอ้อม ซึ่งต้องรวบรวมเองด้วย;",
+  "team.eaijiangli": "รางวัลเพิ่มเติมสำหรับการเชิญ",
+  "team.lingquo": "เมื่อมีจำนวนเพื่อนที่คุณเชิญถึงขั้นตอนที่กำหนดไว้บนแพลตฟอร์ม คุณจะสามารถรับรางวัลเพิ่มเติมที่มีมูลค่าสูงมากได้ รางวัลนี้แตกต่างจากรางวัลคงที่สำหรับการเชิญเพื่อน และมีมูลค่าที่สูงขึ้นมาก อย่าลืมรับรางวัลนี้!",
+  "index.prompt": "พรอมต์",
+  "index.level": "คุณได้ถึงระดับสูงสุดแล้ว!",
+  "index.start":"เริ่มขุดเหมือง",
+  "purse.Props": "เครื่องมือ",
+  "purse.Production": "การผลิต",
+  "purse.Ticket": "รับตั๋ว",
+  "purse.SPIN": "วงจรเครื่องผลิต"
+}

+ 216 - 0
src/locale/vi.json

@@ -0,0 +1,216 @@
+{
+  "tabbar.Home": "Trang chủ",
+  "tabbar.Competition": "Thi đấu",
+  "tabbar.Team": "Đội",
+  "tabbar.Earn": "Kiếm tiền",
+  "tabbar.production": "Sản xuất",
+  "tabbar.task": "Nhiệm vụ",
+  "tabbar.rd": "R&D",
+  "tabbar.airdrop": "Airdrop",
+  "tabbar.point": "Nhận Điểm",
+  "app.name": "Tiêu đề Tiếng Trung",
+  "weight": "{heavy} kg",
+  "detail": "{0} cm, {1} kg",
+  "production.rewards.yaoqinghaoyou": "Mời {index} bạn bè để nhận",
+  "production.rewards.yaoqinghaoyouDialog": "Mời {index} bạn bè",
+  "production.purse": "Ví",
+  "production.daily": "Điểm danh hàng ngày",
+  "production.rewards": "Phần thưởng Ngẫu nhiên",
+  "production.bounty": "Khuyến mãi",
+  "production.profit": "Lợi nhuận Mỗi Giờ",
+  "production.upgrade": "Nâng Cấp",
+  "production.friends": "Bạn bè",
+  "production.team.join": "Tham gia Đội",
+  "production.team.joinText": "Tham gia đội để vuốt và kiếm tiền cùng nhau. Tối đa hóa lợi nhuận và leo lên bảng xếp hạng!",
+  "production.team.creat": "Tạo hoặc Tham gia Đội tùy chỉnh",
+  "production.team.list": "Đội Được Đề xuất",
+  "production.team.community": "Cộng đồng",
+  "production.team.joinBtn": "Tham gia",
+  "production.team.joinSuccess": "Tham gia Thành công",
+  "production.team.joinError": "Tham gia Lỗi",
+  "production.team.Friend": "Mời Bạn bè",
+  "production.team.Squad": "Rời Đội",
+  "production.team.Cancel": "Hủy",
+  "production.team.Leave": "Rời",
+  "production.team.exit": "Bạn có chắc chắn muốn thoát",
+  "production.rewards.rewards": "Tổng Phần thưởng",
+  "production.rewards.bonuses": "Mời bạn bè để nhận tiền thưởng",
+  "production.rewards.yaoqing": "Mời bạn bè",
+  "production.rewards.huode": "Bạn và bạn bè của bạn sẽ nhận được",
+  "production.rewards.guanzhu": "Theo dõi kênh của chúng tôi cùng với bạn bè",
+  "production.rewards.extra": "Mời Phần thưởng Thêm",
+  "production.rewards.invite": "Gửi lời mời",
+  "production.rewards.Buddy": "Danh sách Bạn bè",
+  "production.rewards.Contribution": "Phần thưởng Đóng góp",
+  "production.rewards.Unlock": "Mở Khóa",
+  "production.rewards.TapCoins": "Nhấn TapCoins khi bạn đạt đến cấp độ này.",
+  "production.rewards.Claim": "Yêu cầu",
+  "production.rewards.ShareLink": "Chia sẻ liên kết mời",
+  "production.rewards.Share": "Chia sẻ",
+  "production.rewards.secret": "Mã bí mật để mời",
+  "production.rewards.Copy": "Sao chép",
+  "production.rewards.Recommend": "Đề xuất nếu bạn chia sẻ vào các nhóm chặn liên kết",
+  "production.signin.Daily": "Đăng nhập Hàng ngày",
+  "production.signin.every": "Càng đăng nhập hàng ngày nhiều hơn, càng nhận được nhiều TapCoins",
+  "production.signin.Claim": "Yêu cầu Phần thưởng",
+  "production.signin.Reward": "Bạn chỉ có thể chọn một trong các Phần thưởng",
+  "production.signin.TapCoins": "TapCoins",
+  "production.signin.Premium": "TapCoins Premium",
+  "production.signin.ahead": "Tiến lên",
+  "production.signin.Claimbtn": "Yêu cầu",
+  "production.gifts.Luck": "Mã May mắn",
+  "production.gifts.Watch": "Xem video này từ đầu đến cuối ở tốc độ bình thường và nhập mã may mắn để nhận phần thưởng",
+  "production.gifts.getRewards": "Xem video để nhận phần thưởng",
+  "production.gifts.Watche": "Xem video, tìm mã may mắn và dán vào đây",
+  "production.gifts.Submit": "Gửi",
+  "production.gifts.WatchO": "Xem",
+  "production.rocket.balance": "Số dư của bạn",
+  "production.rocket.boosters": "Booster miễn phí hàng ngày",
+  "production.rocket.Turbo": "Turbo",
+  "production.rocket.Energys": "Năng lượng",
+  "production.rocket.Free": "Miễn phí",
+  "production.rocket.available": "có sẵn",
+  "production.rocket.Energy": "Năng lượng đầy",
+  "production.rocket.Boosters": "Booster",
+  "production.rocket.Multitap": "Nhiều lần nhấn",
+  "production.rocket.Amount": "Giá trị mỗi đồng +1 cho mỗi cấp độ",
+  "production.rocket.Use": "Sử dụng",
+  "production.baron.Totalprofit": "Tổng lợi nhuận mỗi giờ",
+  "production.baron.profit": "Lợi nhuận mỗi giờ",
+  "production.baron.Ranking": "Bảng xếp hạng",
+  "production.baron.Crypto": "Nến Crypto",
+  "task.More": "Nhiều nhiệm vụ hơn, Nhiều phần thưởng hơn",
+  "task.Official": "Chính thức",
+  "task.Join": "Tham gia",
+  "task.Check": "Kiểm tra",
+  "task.Extra": "Nhiệm vụ Thêm",
+  "task.Daily": "Hàng ngày",
+  "bounty.profit": "Lợi nhuận mỗi giờ",
+  "bounty.Hint": "Gợi ý",
+  "bounty.TapCoins": "TapCoins Bounty",
+  "bounty.Block": "Bài hát năm",
+  "bounty.Appli": "Thành tựu suốt đời",
+  "bounty.Terms": "Sản xuất hàng năm",
+  "bounty.Event": "Album năm",
+  "bounty.Profit": "Lợi nhuận mỗi giờ",
+  "bounty.ahead": "Tiến lên",
+  "bounty.lucky": "Tôi may mắn",
+  "bounty.hope": "Tôi hy vọng tôi may mắn",
+  "bounty.Boost": "Tăng lợi nhuận của bạn",
+  "bounty.Start": "Bắt đầu đào",
+  "bounty.Guess": "Đoán gợi ý trong thời gian đếm ngược để giành giải thưởng",
+  "bounty.Tap": "Nhấn vào menu Đào để mua nâng cấp. Kiếm tiền ngay cả khi ngoại tuyến lên đến 3 giờ",
+  "bounty.Will": "Will Warren và Amir Bandeali bắt đầu phát triển dự án vào năm 2016, và vào ngày 22 tháng 2 năm 2017",
+  "airdrop.title": "Nhận TapCoins, Khóa, USDT, TON và nhiều hơn nữa",
+  "airdrop.chets.Quest": "Cuộc phiêu lưu Crypto",
+  "airdrop.chets.Victory": "Chiến thắng thuộc về ít người",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "Quỹ giải thưởng hiện tại",
+  "airdrop.chets.winner": "Hộp có số lượng mua ít nhất sẽ là người chiến thắng",
+  "airdrop.chets.purchase": "Đếm ngược mua",
+  "airdrop.chets.Perpurchase": "Mỗi lần mua",
+  "airdrop.chets.BUY": "MUA",
+  "airdrop.chets.Balance": "Số dư",
+  "airdrop.chets.How": "Cách chơi",
+  "airdrop.chets.Ranking": "Xếp hạng",
+  "airdrop.chets.Records": "Kết quả của tôi",
+  "airdrop.chets.play": "Cách chơi",
+  "airdrop.chets.time": "Thời gian quay giải thưởng",
+  "airdrop.chets.Win": "Thắng",
+  "airdrop.chets.Prize": "Quỹ giải thưởng",
+  "airdrop.chets.Winning": "Hộp thắng",
+  "airdrop.chets.Prizedraw": "Thời gian quay giải thưởng",
+  "airdrop.chets.BOX": "HỘP",
+  "airdrop.chets.Total": "Tổng",
+  "airdrop.chets.Purchase": "Mua",
+  "airdrop.chets.text": "1. Sau khi đếm ngược kết thúc, hộp có số lượng mua ít nhất sẽ là hộp thắng. 2. Trong trường hợp nhiều hộp có cùng số lượng mua, hộp mua cuối cùng sẽ được chọn là người thắng. 3. Người thắng sẽ chia sẻ 80% tổng quỹ giải thưởng, giải thưởng sẽ được phân phối theo số lượng hộp mua.",
+  "airdrop.tumtable.Awards": "Giải thưởng",
+  "point.Airdrop": "Airdrop",
+  "point.Core": "Điểm Trung tâm",
+  "purse.Total": "Tổng lợi nhuận mỗi giờ",
+  "purse.per": "Lợi nhuận mỗi giờ",
+  "purse.Withdraw": "Rút tiền",
+  "purse.amount": "Vui lòng nhập số tiền hợp lệ",
+  "purse.Minimum": "Số tiền rút tối thiểu là 0.1 TON",
+  "purse.balance": "Số dư không đủ",
+  "purse.Record": "Kết quả",
+  "play.Relaxed": "Thư giãn",
+  "play.Ordinary": "Thông thường",
+  "play.Nervousness": "Lo lắng",
+  "play.Duration": "Thời lượng",
+  "play.Click": "Nhấn",
+  "play.Increase": "Tăng lợi nhuận mỗi giờ",
+  "play.Go": "Đi",
+  "play.OK": "OK",
+  "play.right": "Nhịp đúng",
+  "play.again": "Bạn thất bại, vui lòng thử lại",
+
+  "trophy.Miners": "Thợ mỏ",
+  "trophy.Squad": "Đội",
+
+  "team.noData": "không có dữ liệu",
+  "team.InviteFriends": "Mời bạn bè",
+  "team.GetMore": "Nhận thêm",
+  "team.GT Coin": "GT Coin",
+  "team.MyTeam": "Đội của tôi",
+  "team.Reward": "Món quà",
+  "team.Total": "Tổng",
+  "team.TotalA": "Đội A, 2%",
+  "team.TotalB": "Đội B, 0.2%",
+  "team.GetIt": "Nhận",
+  "team.Invite": "Mời thưởng thêm",
+  "team.will": "Bạn sẽ nhận được thưởng cho mỗi lần mời!",
+  "team.NewComerList": "Danh sách người mới",
+  "team.ReceiveAll": "Nhận tất cả",
+  "team.Commission": "Hoa hồng",
+  "team.TotalTeamProduction": "Tổng sản xuất đội",
+  "team.WorkingNow": "Đang làm việc",
+  "team.PleaseShare": "Vui lòng chia sẻ",
+
+  "task.Tasks": "Nhiệm vụ",
+  "task.GetRewardsFor": "Nhận phần thưởng cho",
+  "task.CompletingQuests": "Hoàn thành nhiệm vụ",
+  "task.Start": "Bắt đầu",
+  "task.Claim": "Nhận",
+
+  "loading.play": "Phát nhạc, Phát để kiếm tiền.",
+  "loading.Version": "Phiên bản:",
+  "loading.Checking": "Đang kiểm tra tài khoản của bạn",
+  "loading.Continue": "Tiếp tục",
+  "index.Countdown": "Đếm ngược",
+  "index.Play": "Chơi",
+  "index.Boosts": "Tăng tốc",
+  "index.Speed": "Tăng tốc quá trình!",
+  "index.Free": "Miễn phí",
+  "index.Got": "Hiểu rồi",
+  "index.Ok": "OK",
+  "index.Upgrade": "Nâng cấp",
+  "index.Popular": "Nhiệm vụ thưởng phổ biến",
+  "index.collect": "Bạn có thể thu thập đồng GT mỗi 12 giờ",
+  "index.collection": "Kết quả của lần thu thập tự động cuối cùng",
+  "purse.tokens": "Tổng số token",
+  "purse.hour": "Lợi nhuận mỗi giờ",
+  "purse.reward": "Phần thưởng nhiệm vụ",
+  "purse.placement": "Định vị tài nguyên",
+  "task.Congratulation": "Chúc mừng bạn đã hoàn thành nhiệm vụ",
+  "purse.TeamSharing": "Chia sẻ đội",
+  "purse.ShareRewards": "Chia sẻ phần thưởng",
+
+  "team.shuoming": "Giới thiệu về đội",
+  "team.haoyou": "Mời bạn bè",
+  "team.jiangli": "Mời bạn bè chơi trò chơi, người dùng có thể nhận được phần thưởng cố định 1000GTC.",
+  "team.jianshe": "Xây dựng đội",
+  "team.shouyi": "Khi bạn mời trực tiếp mất người chơi sản xuất và thu thập GTC trong đội A, bạn có thể nhận được 2% lợi nhuận;",
+  "team.shouqu": "Lợi nhuận này có thể tích lũy, nhưng cần bạn tự động nhận;",
+  "team.xianshi": "Bạn bè mà bạn mời mời sẽ trở thành bạn bè gián tiếp và hiển thị trong đội B;",
+  "team.lingqu": "Bạn có thể nhận được 0.2% lợi nhuận từ sản xuất và thu thập GTC của bạn bè gián tiếp, cũng cần tự động nhận;",
+  "team.eaijiangli": "Phần thưởng mời thêm",
+  "team.lingquo": "Khi số lượng bạn bè mà bạn mời đạt đến một số giai đoạn được thiết lập trên nền tảng, bạn có thể nhận được phần thưởng phong phú hơn. Phần thưởng này khác với phần thưởng cố định cho việc mời bạn bè, và giá trị cũng lớn hơn. Đừng quên nhận phần thưởng này!",
+  "index.prompt": "lời nhắc",
+  "index.level": "Bạn đã đạt đến cấp độ tối đa!",
+  "index.start":"Bắt đầu khai thác",
+  "purse.Props": "Vật phẩm",
+  "purse.Production": "Sản xuất",
+  "purse.Ticket": "Lấy vé",
+  "purse.SPIN": "Quay"
+}

+ 210 - 0
src/locale/zh-tw.json

@@ -0,0 +1,210 @@
+{
+  "tabbar.Home": "首頁",
+  "tabbar.Competition": "競賽",
+  "tabbar.Team": "隊伍",
+  "tabbar.Earn": "收益",
+  "app.name": "中文標題",
+  "weight": "{heavy} 公斤",
+  "detail": "{0} 公分, {1} 公斤",
+  "production.rewards.yaoqinghaoyou": "邀請 {index} 位好友獲得",
+  "production.rewards.yaoqinghaoyouDialog": "邀請 {index} 位好友",
+  "production.purse": "錢包",
+  "production.daily": "每日簽到",
+  "production.rewards": "隨機獎勵",
+  "production.bounty": "推廣",
+  "production.profit": "每小時收益",
+  "production.upgrade": "升級",
+  "production.friends": "好友",
+  "production.team.join": "加入團隊",
+  "production.team.joinText": "加入團隊一起滑動和賺錢。最大化收益並提升排名!",
+  "production.team.creat": "創建或加入自定義團隊",
+  "production.team.list": "推薦團隊",
+  "production.team.community": "社群",
+  "production.team.joinBtn": "加入",
+  "production.team.joinSuccess": "加入成功",
+  "production.team.joinError": "加入錯誤",
+  "production.team.Friend": "邀請好友",
+  "production.team.Squad": "離開團隊",
+  "production.team.Cancel": "取消",
+  "production.team.Leave": "離開",
+  "production.team.exit": "您確定要退出嗎",
+  "production.rewards.rewards": "總獎勵",
+  "production.rewards.bonuses": "邀請好友獲得獎金",
+  "production.rewards.yaoqing": "邀請好友",
+  "production.rewards.huode": "您和您的好友將獲得",
+  "production.rewards.guanzhu": "與好友一起關注我們的頻道",
+  "production.rewards.extra": "邀請額外獎勵",
+  "production.rewards.invite": "發送邀請",
+  "production.rewards.Buddy": "好友列表",
+  "production.rewards.Contribution": "貢獻獎勵",
+  "production.rewards.Unlock": "解鎖",
+  "production.rewards.TapCoins": "達到此等級時點擊 TapCoins。",
+  "production.rewards.Claim": "領取",
+  "production.rewards.ShareLink": "分享邀請鏈接",
+  "production.rewards.Share": "分享",
+  "production.rewards.secret": "邀請碼",
+  "production.rewards.Copy": "複製",
+  "production.rewards.Recommend": "推薦如果您分享到阻止鏈接的群組",
+  "production.signin.Daily": "每日登錄",
+  "production.signin.every": "每天登錄越多,獲得更多 TapCoins",
+  "production.signin.Claim": "領取獎勵",
+  "production.signin.Reward": "您只能選擇其中一個獎勵",
+  "production.signin.TapCoins": "TapCoins",
+  "production.signin.Premium": "TapCoins 高級",
+  "production.signin.ahead": "繼續前進",
+  "production.signin.Claimbtn": "領取",
+  "production.gifts.Luck": "幸運碼",
+  "production.gifts.Watch": "以正常速度觀看此視頻從頭到尾並輸入幸運碼以獲得獎勵",
+  "production.gifts.getRewards": "觀看視頻獲得獎勵",
+  "production.gifts.Watche": "觀看視頻,找到幸運碼並粘貼到這裡",
+  "production.gifts.Submit": "提交",
+  "production.gifts.WatchO": "觀看",
+  "production.rocket.balance": "您的餘額",
+  "production.rocket.boosters": "每日免費助推器",
+  "production.rocket.Turbo": "渦輪",
+  "production.rocket.Energys": "能量",
+  "production.rocket.Free": "免費",
+  "production.rocket.available": "可用",
+  "production.rocket.Energy": "滿能量",
+  "production.rocket.Boosters": "助推器",
+  "production.rocket.Multitap": "多點擊",
+  "production.rocket.Amount": "每枚硬幣的價值 +1 每級",
+  "production.rocket.Use": "使用",
+  "production.baron.Totalprofit": "每小時總收益",
+  "production.baron.profit": "每小時收益",
+  "production.baron.Ranking": "排名列表",
+  "production.baron.Crypto": "加密蠟燭圖",
+  "task.More": "更多任務,更多獎勵",
+  "task.Official": "官方",
+  "task.Join": "加入",
+  "task.Check": "檢查",
+  "task.Extra": "額外任務",
+  "task.Daily": "每日",
+  "bounty.profit": "每小時收益",
+  "bounty.Hint": "提示",
+  "bounty.TapCoins": "TapCoins 懸賞",
+  "bounty.Block": "年度歌曲",
+  "bounty.Appli": "年度專輯",
+  "bounty.Terms": "年度製作",
+  "bounty.Event": "最佳新人",
+  "bounty.Profit": "每小時收益",
+  "bounty.ahead": "繼續前進",
+  "bounty.lucky": "我是幸運的",
+  "bounty.hope": "我希望我是幸運的",
+  "bounty.Boost": "提升您的收益",
+  "bounty.Start": "開始挖礦",
+  "bounty.Guess": "在倒計時內猜測提示以贏得獎品",
+  "bounty.Tap": "點擊挖礦菜單購買升級。即使在離線狀態下也能賺取最多 3 小時",
+  "bounty.Will": "Will Warren 和 Amir Bandeali 於 2016 年開始開發該項目,並於 2017 年 2 月 22 日",
+  "airdrop.title": "賺取 TapCoins、鑰匙、USDT、TON 等",
+  "airdrop.chets.Quest": "加密任務",
+  "airdrop.chets.Victory": "勝利屬於少數人",
+  "airdrop.chets.Tapcoins": "Tapcoins",
+  "airdrop.chets.Pool": "當前獎池",
+  "airdrop.chets.winner": "購買數量最少的盒子將是贏家",
+  "airdrop.chets.purchase": "購買倒計時",
+  "airdrop.chets.Perpurchase": "每購買",
+  "airdrop.chets.BUY": "購買",
+  "airdrop.chets.Balance": "餘額",
+  "airdrop.chets.How": "如何玩",
+  "airdrop.chets.Ranking": "排名",
+  "airdrop.chets.Records": "我的記錄",
+  "airdrop.chets.play": "如何玩",
+  "airdrop.chets.time": "抽獎時間",
+  "airdrop.chets.Win": "贏",
+  "airdrop.chets.Prize": "獎池",
+  "airdrop.chets.Winning": "獲勝盒子",
+  "airdrop.chets.Prizedraw": "抽獎時間",
+  "airdrop.chets.BOX": "盒子",
+  "airdrop.chets.Total": "總計",
+  "airdrop.chets.Purchase": "購買",
+  "airdrop.chets.text": "1.倒計時結束後,購買數量最少的盒子將成為獲勝盒子。2.如果多個盒子有相同的購買數量,最後購買的盒子將被指定為獲勝者。3.獲勝者將分享總獎池的 80%,獎品將根據購買的盒子數量進行分配。",
+  "airdrop.tumtable.Awards": "獎品",
+  "point.Airdrop": "空投",
+  "point.Core": "核心點數",
+  "purse.Total": "每小時總收益",
+  "purse.per": "每小時收益",
+  "purse.Withdraw": "提款",
+  "purse.amount": "請輸入有效金額",
+  "purse.Minimum": "最低提款金額為 0.1 TON",
+  "purse.balance": "餘額不足",
+  "purse.Record": "記錄",
+  "play.Relaxed": "放鬆",
+  "play.Ordinary": "普通",
+  "play.Nervousness": "緊張",
+  "play.Duration": "持續時間",
+  "play.Click": "點擊",
+  "play.Increase": "每小時收益增加",
+  "play.Go": "去",
+  "play.OK": "確定",
+  "play.right": "節奏正確",
+  "play.again": "你失敗了,請再試一次",
+
+  "trophy.Miners": "礦工",
+  "trophy.Squad": "小隊",
+
+  "team.noData": "無數據",
+  "team.InviteFriends": "邀請朋友",
+  "team.GetMore": "獲取更多",
+  "team.GT Coin": "GT Coin",
+  "team.MyTeam": "我的隊伍",
+  "team.Reward": "獎勵",
+  "team.Total": "總計",
+  "team.TotalA": "隊伍 A, 2%",
+  "team.TotalB": "隊伍 B, 0.2%",
+  "team.GetIt": "獲取",
+  "team.Invite": "邀請額外獎勵",
+  "team.will": "每次邀請都將獲得獎勵!",
+  "team.NewComerList": "新成員列表",
+  "team.ReceiveAll": "全部接收",
+  "team.Commission": "佣金",
+  "team.TotalTeamProduction": "隊伍總產出",
+  "team.WorkingNow": "正在工作",
+  "team.PleaseShare": "請分享",
+
+  "task.Tasks": "任務",
+  "task.GetRewardsFor": "獲取獎勵以",
+  "task.CompletingQuests": "完成任務",
+  "task.Start": "開始",
+  "task.Claim": "領取",
+
+  "loading.play": "播放音樂, 播放以賺取.",
+  "loading.Version": "版本:",
+  "loading.Checking": "正在檢查您的帳戶",
+  "loading.Continue": "繼續",
+  "index.Countdown": "倒數計時",
+  "index.Play": "遊玩",
+  "index.Boosts": "加速",
+  "index.Speed": "加速過程!",
+  "index.Free": "免費",
+  "index.Got": "知道了",
+  "index.Ok": "確定",
+  "index.Upgrade": "升級",
+  "index.Popular": "熱門獎勵任務",
+  "index.collect": "您可以每12小時收集GT代幣",
+  "index.collection": "上次自動收集的結果",
+  "purse.tokens": "代幣總量",
+  "purse.hour": "每小時收益",
+  "purse.reward": "任務獎勵",
+  "purse.placement": "資源配置",
+  "task.Congratulation": "恭喜完成任務",
+  "purse.TeamSharing": "團隊分享",
+  "purse.ShareRewards": "分享獎勵",
+  "team.shuoming": "團隊說明",
+  "team.haoyou": "邀請好友",
+  "team.jiangli": "邀請好友玩遊戲,用戶可以獲得固定獎勵1000GTC。",
+  "team.jianshe": "建設團隊",
+  "team.shouyi": "當用戶直接邀請的好友在團隊A中生產和收集GTC時,用戶可以獲得2%的收入;",
+  "team.shouqu": "這筆收入可以累積,但需要用戶手動領取;",
+  "team.xianshi": "用戶邀請的好友邀請的朋友將成為間接好友,並顯示在團隊B中;",
+  "team.lingqu": "用戶可以從間接好友生產和收集GTC中獲得0.2%的收入,也需要手動領取;",
+  "team.eaijiangli": "額外邀請獎勵",
+  "team.lingquo": "當用戶邀請的好友數量達到平台設定的幾個階段時,可以獲得更多的豐厚獎勵。這個獎勵與邀請好友的固定獎勵不同,數額更為可觀。別忘了領取!",
+  "index.prompt": "提示",
+  "index.level": "您已達到滿等級!",
+  "index.start": "開始挖礦",
+  "purse.Props": "道具",
+  "purse.Production": "生產",
+  "purse.Ticket": "獲取門票",
+  "purse.SPIN": "旋轉"
+}

+ 21 - 0
src/main.ts

@@ -0,0 +1,21 @@
+import { createSSRApp } from 'vue'
+import App from './App.vue'
+import store from './store'
+import i18n from './locale/index'
+import { routeInterceptor, requestInterceptor, prototypeInterceptor } from './interceptors'
+
+import 'virtual:uno.css'
+import '@/style/index.scss'
+import '@/utils/vConsole'
+
+export function createApp() {
+  const app = createSSRApp(App)
+  app.use(store)
+  app.use(i18n)
+  app.use(routeInterceptor)
+  app.use(requestInterceptor)
+  app.use(prototypeInterceptor)
+  return {
+    app,
+  }
+}

+ 112 - 0
src/manifest.json

@@ -0,0 +1,112 @@
+{
+  "name": "ton-mini",
+  "appid": "H57F2ACE4",
+  "description": "",
+  "versionName": "1.0.0",
+  "versionCode": "100",
+  "transformPx": false,
+  "app-plus": {
+    "usingComponents": true,
+    "nvueStyleCompiler": "uni-app",
+    "compilerVersion": 3,
+    "splashscreen": {
+      "alwaysShowBeforeRender": true,
+      "waiting": true,
+      "autoclose": true,
+      "delay": 0
+    },
+    "modules": {},
+    "distribute": {
+      "android": {
+        "permissions": [
+          "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+          "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+          "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+          "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+          "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+          "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+          "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+          "<uses-feature android:name=\"android.hardware.camera\"/>",
+          "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+        ],
+        "minSdkVersion": 30,
+        "targetSdkVersion": 30,
+        "abiFilters": [
+          "armeabi-v7a",
+          "arm64-v8a"
+        ]
+      },
+      "ios": {},
+      "sdkConfigs": {},
+      "icons": {
+        "android": {
+          "hdpi": "static/app/icons/72x72.png",
+          "xhdpi": "static/app/icons/96x96.png",
+          "xxhdpi": "static/app/icons/144x144.png",
+          "xxxhdpi": "static/app/icons/192x192.png"
+        },
+        "ios": {
+          "appstore": "static/app/icons/1024x1024.png",
+          "ipad": {
+            "app": "static/app/icons/76x76.png",
+            "app@2x": "static/app/icons/152x152.png",
+            "notification": "static/app/icons/20x20.png",
+            "notification@2x": "static/app/icons/40x40.png",
+            "proapp@2x": "static/app/icons/167x167.png",
+            "settings": "static/app/icons/29x29.png",
+            "settings@2x": "static/app/icons/58x58.png",
+            "spotlight": "static/app/icons/40x40.png",
+            "spotlight@2x": "static/app/icons/80x80.png"
+          },
+          "iphone": {
+            "app@2x": "static/app/icons/120x120.png",
+            "app@3x": "static/app/icons/180x180.png",
+            "notification@2x": "static/app/icons/40x40.png",
+            "notification@3x": "static/app/icons/60x60.png",
+            "settings@2x": "static/app/icons/58x58.png",
+            "settings@3x": "static/app/icons/87x87.png",
+            "spotlight@2x": "static/app/icons/80x80.png",
+            "spotlight@3x": "static/app/icons/120x120.png"
+          }
+        }
+      }
+    },
+    "compatible": {
+      "ignoreVersion": true
+    }
+  },
+  "quickapp": {},
+  "mp-weixin": {
+    "appid": "wxa2abb91f64032a2b",
+    "setting": {
+      "urlCheck": false
+    },
+    "usingComponents": true
+  },
+  "mp-alipay": {
+    "usingComponents": true,
+    "styleIsolation": "shared"
+  },
+  "mp-baidu": {
+    "usingComponents": true
+  },
+  "mp-toutiao": {
+    "usingComponents": true
+  },
+  "uniStatistics": {
+    "enable": false
+  },
+  "vueVersion": "3",
+  "h5": {
+    "router": {
+      "base": "/tonmini/",
+      "mode": "history"
+    }
+  }
+}

+ 20 - 0
src/pages-sub/demo/index.vue

@@ -0,0 +1,20 @@
+<route lang="json5" type="page">
+{
+  style: { navigationBarTitleText: '分包页面 标题' },
+}
+</route>
+
+<template>
+  <view class="text-center">
+    <view class="m-8">http://localhost:9000/#/pages-sub/demo/index</view>
+    <view class="text-green-500">分包页面demo</view>
+  </view>
+</template>
+
+<script lang="ts" setup>
+// code here
+</script>
+
+<style lang="scss" scoped>
+//
+</style>

+ 61 - 0
src/pages.json

@@ -0,0 +1,61 @@
+{
+  "globalStyle": {
+    "navigationStyle": "default",
+    "navigationBarTitleText": "",
+    "navigationBarBackgroundColor": "#f8f8f8",
+    "navigationBarTextStyle": "black",
+    "backgroundColor": "#FFFFFF"
+  },
+  "easycom": {
+    "autoscan": true,
+    "custom": {
+      "^wd-(.*)": "wot-design-uni/components/wd-$1/wd-$1.vue",
+      "^(?!z-paging-refresh|z-paging-load-more)z-paging(.*)": "z-paging/components/z-paging$1/z-paging$1.vue"
+    }
+  },
+  "tabBar": {
+    "color": "#777777",
+    "selectedColor": "#8AE54A",
+    "backgroundColor": "#18181B",
+    "borderStyle": "black",
+    "height": "120rpx",
+    "fontSize": "22rpx",
+    "list": [
+      {
+        "iconPath": "static/images/tabbar/home.png",
+        "selectedIconPath": "static/images/tabbar/home-l.png",
+        "pagePath": "pages/index/index",
+        "text": "%tabbar.Home%"
+      },
+      {
+        "iconPath": "static/images/tabbar/jiangpai.png",
+        "selectedIconPath": "static/images/tabbar/jangpai-l.png",
+        "pagePath": "pages/trophy/index",
+        "text": "%tabbar.Competition%"
+      },
+      {
+        "iconPath": "static/images/tabbar/people.png",
+        "selectedIconPath": "static/images/tabbar/people-l.png",
+        "pagePath": "pages/team/index",
+        "text": "%tabbar.Team%"
+      },
+      {
+        "iconPath": "static/images/tabbar/group.png",
+        "selectedIconPath": "static/images/tabbar/group-l.png",
+        "pagePath": "pages/task/index",
+        "text": "%tabbar.Earn%"
+      }
+    ]
+  },
+  "pages": [
+    {
+      "path": "pages/index/index",
+      "type": "home",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": ""
+      }
+    }
+  ],
+  "subPackages": []
+}

+ 54 - 0
src/pages/index/index.vue

@@ -0,0 +1,54 @@
+<route lang="json5" type="home">
+{
+  style: {
+    navigationStyle: 'custom',
+    navigationBarTitleText: '',
+  },
+}
+</route>
+
+<template>
+  <view>
+    <view id="lottieContainer" class="box"></view>
+    <button @click="show = !show">Solana Wallet</button>
+    <Dialog :showValue="show"></Dialog>
+  </view>
+</template>
+<script setup lang="ts">
+import lottie from 'lottie-web'
+import animationData from '@/static/Animation.json'
+import Dialog from '@/components/common/Dialog/index.vue'
+
+const containerRef = ref(null)
+const show = ref(false)
+
+onShow(() => {
+  nextTick(() => {
+    const query = uni.createSelectorQuery()
+    query
+      .select('#lottieContainer')
+      .boundingClientRect((rect) => {
+        if (rect) {
+          lottie.loadAnimation({
+            container: document.getElementById('lottieContainer'),
+            renderer: 'svg',
+            loop: true,
+            autoplay: true,
+            animationData,
+          })
+        } else {
+          console.error('Container element not found')
+        }
+      })
+      .exec()
+  })
+})
+</script>
+
+<style lang="scss" scoped>
+.box {
+  width: 690rpx;
+  height: 500rpx;
+  overflow: hidden; /* 如果动画超出容器大小,确保它不会溢出 */
+}
+</style>

+ 4 - 0
src/pages/index/type.ts

@@ -0,0 +1,4 @@
+export type card = {
+  icon: string
+  text: string
+}

+ 147 - 0
src/service/index/foo.ts

@@ -0,0 +1,147 @@
+import { http, httpGet } from '@/utils/http'
+
+export interface IFooItem {
+  id: string
+  name: string
+}
+
+export interface UserT {
+  token: string
+  nickname: string
+  login_telegram: string
+  register_status: number
+}
+
+export interface LoginI {
+  coin_address?: string
+  scene?: string
+  terminal?: string
+  share_code?: string
+  firstName: string
+  id: string | number
+  languageCode: string
+  lastName: string
+  username: string
+  token?: string
+}
+
+export interface UserCenter {
+  id: number
+  sn: number
+  account: string
+  nickname: string
+  real_name: string
+  avatar: string
+  create_time: string
+  gold_coin: number
+  key: number
+  development_gold_coin: number
+  history_gold_coin: number
+  history_key: number
+  usdt: number
+  total_development_gold: number
+  stamina: number
+  total_share_reward: number
+  total_task_reward: number
+  total_team_reward: number
+  total_development_reward: number
+  total_resource_reward: number
+}
+interface LoginCheck {
+  show: number
+}
+export interface JinbiT {
+  id: number
+  sn: number
+  account: string
+  nickname: string
+  real_name: string
+  avatar: string
+  create_time: string
+  gold_coin: number
+  key: number
+  development_gold_coin: number
+  history_gold_coin: number
+  history_key: number
+  usdt: number | null
+  stamina: number
+  temporary_status: number
+  temporary_start_time: number
+  temporary_coin: number
+  temporary_time: number
+  total_development_gold: number
+}
+
+export interface ProductionIncreaseInterface {
+  id: number
+  name: string
+  level: number
+  gold_coin: number
+  value: number
+  image: string
+  upgrades: boolean
+}
+/** GET 请求 */
+export const getFooAPI = (name: string) => {
+  return http.get<IFooItem>('/foo', { name })
+}
+
+/** POST 请求 */
+export const postFooAPI = (name: string) => {
+  return http.post<IFooItem>('/foo', { name }, { name })
+}
+// 登录接口
+export const coinLoginApi = (data: LoginI) => {
+  return httpGet<UserT>('/api/login/coinLogin', data)
+}
+
+// 获取当前登录用户金币数量
+export const getUserCoinApi = () => {
+  return httpGet<UserCenter>('/api/development/center')
+}
+
+// 统计用户在线时长
+export const updateOnlineTime = (onlineTime: number) => {
+  return http.post<UserCenter>('/api/user/updateOnlineTime', { online_time: onlineTime })
+}
+// 设置金币
+export const updateClikckAddCoin = (goldCoin: number) => {
+  return http.post<any>('/api/user/clikckAddCoin', { gold_coin: goldCoin })
+}
+// 设置体力
+export const updateStamina = (stamina: number) => {
+  return http.post<any>('/api/user/updateStamina', { stamina })
+}
+
+// 检查是否注册过
+export const coinLoginCheck = (id: number) => {
+  return http.get<LoginCheck>('/api/login/coinLoginCheck', { terminal: 3, id })
+}
+
+// 开始金币活动
+export const startCoinGame = (startTime: string) => {
+  return http.post<LoginCheck>('/api/user/startCoinGame', { start_time: startTime })
+}
+
+// 获取当前金币数量改版
+export const getDevelopmentCenter = () => {
+  return http.get<JinbiT>('/api/development/center')
+}
+// 设置金币
+export const stageCoinAdd = () => {
+  return http.post<any>('/api/user/stageCoinAdd')
+}
+
+// 获取推进器信息
+export const propellerAllTwo = () => {
+  return http.get<ProductionIncreaseInterface[]>('/api/propeller/propellerAllTwo')
+}
+// 升级推进器
+export const prepellerDeduction = (id: number) => {
+  return http.post<any>('/api/propeller/prepellerDeduction', { id })
+}
+
+// 存入当前语言 user/checkLanguage
+export const postCheckLang = (lang: string) => {
+  return http.post<any>('/api/user/checkLanguage', { lang })
+}

File diff suppressed because it is too large
+ 0 - 0
src/static/Animation.json


BIN
src/static/audio/M5000016XYcc2hEve0.mp3


BIN
src/static/audio/kn.mp3


BIN
src/static/audio/missTS.mp3


BIN
src/static/audio/mzdhl.mp3


BIN
src/static/images/production/Vector.png


BIN
src/static/images/production/Wallet_fill.png


BIN
src/static/images/production/bcard.png


BIN
src/static/images/production/bg-c.png


BIN
src/static/images/production/bg-h.png


BIN
src/static/images/production/bg.png


BIN
src/static/images/production/bg1.png


BIN
src/static/images/production/card.png


BIN
src/static/images/production/char.png


BIN
src/static/images/production/en.png


BIN
src/static/images/production/es.png


BIN
src/static/images/production/fa.png


BIN
src/static/images/production/gou.png


BIN
src/static/images/production/haoyou.png


BIN
src/static/images/production/huojian.png


BIN
src/static/images/production/ja.png


BIN
src/static/images/production/jiangbei.png


BIN
src/static/images/production/jiangli.png


BIN
src/static/images/production/jiantoushang.png


BIN
src/static/images/production/jiantouxia.png


BIN
src/static/images/production/jinbi.png


BIN
src/static/images/production/jingbi.png


BIN
src/static/images/production/jita.png


BIN
src/static/images/production/jitabg.png


BIN
src/static/images/production/ko.png


BIN
src/static/images/production/libao.png


BIN
src/static/images/production/play.png


BIN
src/static/images/production/pt.png


Some files were not shown because too many files changed in this diff