Browse Source

support dynamic translate - review by Loki

melon.yin 2 years ago
parent
commit
7fbdc618e1

+ 7 - 2
assets/en_US.json

@@ -572,7 +572,9 @@
         "universalHumanTemplate": "General template of human ultrsound report",
         "animalTemplate": "Classic template of animal ultrasound report",
         "humanTemplate": "Classic template of human ultrasound report",
-        "createTemplate": "Create a template"
+        "createTemplate": "Create a template",
+        "editReportTemplate":"Edit template",
+        "userCenter":"User center"
     },
     "remedical": {
         "leftNeck": "Left neck",
@@ -819,7 +821,10 @@
         "batchExport": "Batch Export",
         "patientExportSelectionTip": "Select the patients to export.",
         "selectAll": "Select All",
-        "hasNoChooseAgain": "No doctors can be transferred, please select another hospital"
+        "hasNoChooseAgain": "No doctors can be transferred, please select another hospital",
+        "measure": "Measure",
+        "previewReport": "Preview report",
+        "editReport": "Edit report"
     },
     "organization": {
         "privacyProtection": "Privacy protection",

+ 7 - 2
assets/zh_CN.json

@@ -572,7 +572,9 @@
         "emailUsed": "邮箱已被其他用户绑定!",
         "deviceUsed": "该设备已经绑定过其他机构!请联系管理员解绑。",
         "deviceShared": "当前设备已分享{0}个用户,请先备份或导出已有用户信息及其数据,再移除。",
-        "editOrgConfirm": "修改当前所在机构将失去其角色权限及业务数据,确定修改吗?"
+        "editOrgConfirm": "修改当前所在机构将失去其角色权限及业务数据,确定修改吗?",
+        "editReportTemplate":"编辑模板",
+        "userCenter":"个人中心"
     },
     "remedical": {
         "leftNeck": "左颈",
@@ -819,7 +821,10 @@
         "batchExport": "批量导出",
         "patientExportSelectionTip": "请选择您要导出的病人",
         "selectAll": "全选",
-        "hasNoChooseAgain": "未找到可转诊的医生,请重新选择转入机构"
+        "hasNoChooseAgain": "未找到可转诊的医生,请重新选择转入机构",
+        "measure": "图像测量",
+        "previewReport":"报告预览",
+        "editReport": "编辑报告"
     },
     "organization": {
         "privacyProtection": "隐私保护",

+ 42 - 20
lib/key_book.dart

@@ -4,7 +4,9 @@ import 'dart:ui';
 import 'package:flutter/cupertino.dart';
 
 import 'modules/index.dart';
-import 'types.dart' show IPropQueryable, ModuleBase, StringLocaleExtensions;
+import 'types.dart'
+    show FTrStr, IPropQueryable, ModuleBase, StringLocaleExtensions;
+import 'types.dart' as t show StringMapUtils;
 
 /// 翻译字典
 class FTrKeybook implements IPropQueryable {
@@ -22,11 +24,14 @@ class FTrKeybook implements IPropQueryable {
     required this.measure,
     required this.upload,
     required this.errorCodes,
+    this.moduleMap,
   });
 
   /// 当前是否中文
   bool get isCurrentChinese => locale.languageCode.toLowerCase() == "zh";
 
+  Map<String, dynamic>? moduleMap;
+
   /// 字典语言
   final Locale locale;
 
@@ -76,24 +81,27 @@ class FTrKeybook implements IPropQueryable {
       throw ArgumentError(
           "FTrKeybook .ctor: argument-map must be a not null Map<String, dynamic>.");
 
-    return FTrKeybook._(locale,
-        auth: map.pick(AuthModule.ModuleName, (v) => AuthModule(v)),
-        bodyParts:
-            map.pick(BodyPartsModule.ModuleName, (v) => BodyPartsModule(v)),
-        common: map.pick(CommonModule.ModuleName, (v) => CommonModule(v)),
-        homePage: map.pick(HomePageModule.ModuleName, (v) => HomePageModule(v)),
-        profileComplete: map.pick(
-            ProfileCompleteModule.ModuleName, (v) => ProfileCompleteModule(v)),
-        setting: map.pick(SettingModule.ModuleName, (v) => SettingModule(v)),
-        user: map.pick(UserModule.ModuleName, (v) => UserModule(v)),
-        remedical:
-            map.pick(RemedicalModule.ModuleName, (v) => RemedicalModule(v)),
-        organization: map.pick(
-            OrganizationModule.ModuleName, (v) => OrganizationModule(v)),
-        measure: map.pick(MeasureModule.ModuleName, (v) => MeasureModule(v)),
-        errorCodes:
-            map.pick(ErrorCodesModule.ModuleName, (v) => ErrorCodesModule(v)),
-        upload: map.pick(UploadModule.ModuleName, (v) => UploadModule(v)));
+    return FTrKeybook._(
+      locale,
+      auth: map.pick(AuthModule.ModuleName, (v) => AuthModule(v)),
+      bodyParts:
+          map.pick(BodyPartsModule.ModuleName, (v) => BodyPartsModule(v)),
+      common: map.pick(CommonModule.ModuleName, (v) => CommonModule(v)),
+      homePage: map.pick(HomePageModule.ModuleName, (v) => HomePageModule(v)),
+      profileComplete: map.pick(
+          ProfileCompleteModule.ModuleName, (v) => ProfileCompleteModule(v)),
+      setting: map.pick(SettingModule.ModuleName, (v) => SettingModule(v)),
+      user: map.pick(UserModule.ModuleName, (v) => UserModule(v)),
+      remedical:
+          map.pick(RemedicalModule.ModuleName, (v) => RemedicalModule(v)),
+      organization:
+          map.pick(OrganizationModule.ModuleName, (v) => OrganizationModule(v)),
+      measure: map.pick(MeasureModule.ModuleName, (v) => MeasureModule(v)),
+      errorCodes:
+          map.pick(ErrorCodesModule.ModuleName, (v) => ErrorCodesModule(v)),
+      upload: map.pick(UploadModule.ModuleName, (v) => UploadModule(v)),
+      moduleMap: map,
+    );
   }
 
   /// 通过json字符串构造创建字典
@@ -111,7 +119,7 @@ class FTrKeybook implements IPropQueryable {
   }
 
   @override
-  getProp(String propName) {
+  dynamic getProp(String propName) {
     switch (propName) {
       case AuthModule.ModuleName:
         return auth;
@@ -120,6 +128,20 @@ class FTrKeybook implements IPropQueryable {
     }
     return null;
   }
+
+  /// 获取翻译单元
+  ///
+  /// [moduleName] 模块名
+  ///
+  /// [key] 翻译键
+  FTrStr? getTrItem(String moduleName, String key) {
+    if (moduleMap?.containsKey(moduleName) == false) {
+      return null;
+    }
+    final map = moduleMap![moduleName]! as Map<String, dynamic>;
+    final item = t.StringMapUtils.pickTrStr(map, key);
+    return item;
+  }
 }
 
 typedef T _ModuleBuilder<T>(Map<String, dynamic> v);

+ 0 - 8
lib/modules/error_codes.dart

@@ -2,9 +2,7 @@ import 'package:fis_i18n/types.dart';
 
 /// 错误码模块
 class ErrorCodesModule extends ModuleBase {
-  Map<String, dynamic> map;
   ErrorCodesModule._({
-    required this.map,
     required this.errorCodeUN,
     required this.errorCode0,
     required this.errorCode1,
@@ -215,7 +213,6 @@ class ErrorCodesModule extends ModuleBase {
 
   factory ErrorCodesModule(Map<String, dynamic> map) {
     return ErrorCodesModule._(
-      map: map,
       errorCodeUN: map.pick("errorCodeUN"),
       errorCode0: map.pick("errorCode0"),
       errorCode1: map.pick("errorCode1"),
@@ -423,11 +420,6 @@ class ErrorCodesModule extends ModuleBase {
     );
   }
 
-  ///根据指定Key翻译
-  String translate(String key) {
-    return map.pick(key).t;
-  }
-
   /// 未知错误
   final FTrStr errorCodeUN;
 

+ 1 - 1
lib/modules/measure.dart

@@ -553,7 +553,7 @@ class MeasureModule extends ModuleBase {
   /// 帧数:
   final FTrStr playLocationFrameCountLabel;
 
-  ///  时长:
+  /// 时长:
   final FTrStr playLocationDurationLabel;
 
   @override

+ 15 - 0
lib/modules/remedical.dart

@@ -248,6 +248,9 @@ class RemedicalModule extends ModuleBase {
     required this.patientExportSelectionTip,
     required this.selectAll,
     required this.hasNoChooseAgain,
+    required this.measure,
+    required this.previewReport,
+    required this.editReport,
   });
 
   static const ModuleName = "remedical";
@@ -501,6 +504,9 @@ class RemedicalModule extends ModuleBase {
       patientExportSelectionTip: map.pick("patientExportSelectionTip"),
       selectAll: map.pick("selectAll"),
       hasNoChooseAgain: map.pick("hasNoChooseAgain"),
+      measure: map.pick("measure"),
+      previewReport: map.pick("previewReport"),
+      editReport: map.pick("editReport"),
     );
   }
 
@@ -1239,6 +1245,15 @@ class RemedicalModule extends ModuleBase {
   /// 未找到可转诊的医生,请重新选择转入机构
   final FTrStr hasNoChooseAgain;
 
+  /// 图像测量
+  final FTrStr measure;
+
+  /// 报告预览
+  final FTrStr previewReport;
+
+  /// 编辑报告
+  final FTrStr editReport;
+
   @override
   getProp(String propName) {
     // TODO: implement getProp

+ 10 - 0
lib/modules/user.dart

@@ -180,6 +180,8 @@ class UserModule extends ModuleBase {
     required this.deviceUsed,
     required this.deviceShared,
     required this.editOrgConfirm,
+    required this.editReportTemplate,
+    required this.userCenter,
   });
 
   static const ModuleName = "user";
@@ -367,6 +369,8 @@ class UserModule extends ModuleBase {
       deviceUsed: map.pick("deviceUsed"),
       deviceShared: map.pick("deviceShared"),
       editOrgConfirm: map.pick("editOrgConfirm"),
+      editReportTemplate: map.pick("editReportTemplate"),
+      userCenter: map.pick("userCenter"),
     );
   }
 
@@ -901,6 +905,12 @@ class UserModule extends ModuleBase {
   /// 修改当前所在机构将失去其角色权限及业务数据,确定修改吗?
   final FTrStr editOrgConfirm;
 
+  /// 编辑模板
+  final FTrStr editReportTemplate;
+
+  /// 个人中心
+  final FTrStr userCenter;
+
   @override
   getProp(String propName) {
     // TODO: implement getProp

+ 14 - 3
lib/types.dart

@@ -67,14 +67,15 @@ abstract class IPropQueryable {
   dynamic getProp(String propName);
 }
 
-extension FTrMapPickExtension on Map<String, dynamic> {
+class StringMapUtils {
   /// 剥取翻译值
   ///
   /// [key] 字典键
   ///
   /// [defaultValue] 默认翻译
-  FTrStr pick(String key, [String? defaultValue]) {
-    dynamic value = this[key];
+  static FTrStr pickTrStr(Map<String, dynamic> map, String key,
+      [String? defaultValue]) {
+    dynamic value = map[key];
     if (value == null) value = defaultValue;
     if (value == null)
       throw UnimplementedError(
@@ -83,6 +84,16 @@ extension FTrMapPickExtension on Map<String, dynamic> {
   }
 }
 
+extension FTrMapPickExtension on Map<String, dynamic> {
+  /// 剥取翻译值
+  ///
+  /// [key] 字典键
+  ///
+  /// [defaultValue] 默认翻译
+  FTrStr pick(String key, [String? defaultValue]) =>
+      StringMapUtils.pickTrStr(this, key, defaultValue);
+}
+
 extension LocaleExtensions on Locale {
   String toCodeString([String separator = '_']) =>
       '${this.languageCode}$separator${this.countryCode ?? ""}';