weizhengliang пре 2 година
родитељ
комит
5f1b2b1816
84 измењених фајлова са 1905 додато и 727 уклоњено
  1. 2 2
      app/src/main/AndroidManifest.xml
  2. 15 4
      app/src/main/code/com/wdkl/app/ncs/application/Application.kt
  3. 1 1
      build.gradle
  4. 5 0
      common/src/main/code/com/wdkl/ncs/android/lib/utils/ExtendMethods.kt
  5. 0 1
      home/src/main/AndroidManifest.xml
  6. 9 12
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/AppUpdateActivity.kt
  7. 6 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/BaseActivity.kt
  8. 17 8
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/ChannelImActivity.kt
  9. 10 9
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/NewEventListActivity.kt
  10. 2 2
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/TakeoverActivity.kt
  11. 17 9
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/VoiceMsgActivity.kt
  12. 4 4
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchCallRecordsActivity.kt
  13. 2 2
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchContactsActivity.kt
  14. 0 340
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt
  15. 68 40
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt
  16. 56 6
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchUserSettingActivity.java
  17. 1 1
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/ChannelImItemAdapter.kt
  18. 5 5
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/NewEventItemAdapter.kt
  19. 22 19
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/TakeoverItemAdapter.kt
  20. 23 17
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/TakeoverItemSearchAdapter.kt
  21. 8 44
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchCallRecordsItemAdapter.kt
  22. 2 2
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchContactsItemAdapter.kt
  23. 12 1
      home/src/main/code/com/wdkl/ncs/android/component/home/broadcast/BatteryBroadcastReceiver.java
  24. 0 2
      home/src/main/code/com/wdkl/ncs/android/component/home/di/HomeComponent.kt
  25. 3 2
      home/src/main/code/com/wdkl/ncs/android/component/home/service/PhoneStateReceiver.java
  26. 35 12
      home/src/main/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt
  27. 21 0
      home/src/main/code/com/wdkl/ncs/android/component/home/settingconfig/SettingConfig.java
  28. 8 2
      home/src/main/code/com/wdkl/ncs/android/component/home/ui/CallSingleActivity.java
  29. 4 3
      home/src/main/code/com/wdkl/ncs/android/component/home/ui/FragmentAudio.java
  30. 15 15
      home/src/main/code/com/wdkl/ncs/android/component/home/ui/SingleCallFragment.java
  31. 140 0
      home/src/main/code/com/wdkl/ncs/android/component/home/util/LanguageSetDialogHelper.java
  32. 83 0
      home/src/main/code/com/wdkl/ncs/android/component/home/util/LocaleMangerUtils.java
  33. 28 12
      home/src/main/code/com/wdkl/ncs/android/component/home/util/RecordHelper.java
  34. 3 3
      home/src/main/code/com/wdkl/ncs/android/component/home/util/ServerConfigDialogHelper.java
  35. 3 2
      home/src/main/code/com/wdkl/ncs/android/component/home/util/SoundPoolManager.java
  36. 2 2
      home/src/main/res/layout/activity_app_update.xml
  37. 1 1
      home/src/main/res/layout/activity_channel_im_list.xml
  38. 2 2
      home/src/main/res/layout/activity_sip_voip_audio.xml
  39. 3 3
      home/src/main/res/layout/activity_sip_voip_audio_ringing.xml
  40. 1 1
      home/src/main/res/layout/activity_sos_emergency_call.xml
  41. 1 1
      home/src/main/res/layout/activity_takeover.xml
  42. 1 1
      home/src/main/res/layout/activity_voice_msg.xml
  43. 2 2
      home/src/main/res/layout/activity_web_rtc_voip_audio.xml
  44. 3 3
      home/src/main/res/layout/activity_web_rtc_voip_audio_ringing.xml
  45. 2 2
      home/src/main/res/layout/adapter_client_list.xml
  46. 10 9
      home/src/main/res/layout/adapter_watch_contacts_item.xml
  47. 3 3
      home/src/main/res/layout/av_p2p_audio_incoming.xml
  48. 3 3
      home/src/main/res/layout/av_p2p_audio_outgoing.xml
  49. 3 3
      home/src/main/res/layout/av_p2p_video_connected_action.xml
  50. 3 3
      home/src/main/res/layout/av_p2p_video_incoming_action.xml
  51. 2 2
      home/src/main/res/layout/av_p2p_video_outgoing_action.xml
  52. 1 1
      home/src/main/res/layout/back_layout.xml
  53. 3 3
      home/src/main/res/layout/clerk_dialog_lay.xml
  54. 3 3
      home/src/main/res/layout/event_list_item.xml
  55. 1 1
      home/src/main/res/layout/float_call_window_layout.xml
  56. 1 1
      home/src/main/res/layout/fragment_audio.xml
  57. 1 1
      home/src/main/res/layout/fragment_video.xml
  58. 2 2
      home/src/main/res/layout/im_dialog_lay.xml
  59. 1 1
      home/src/main/res/layout/im_play_dialog_lay.xml
  60. 79 0
      home/src/main/res/layout/language_set_dialog.xml
  61. 6 6
      home/src/main/res/layout/server_config_dialog_lay.xml
  62. 9 0
      home/src/main/res/layout/spinner_item.xml
  63. 9 7
      home/src/main/res/layout/takeover_item.xml
  64. 86 29
      home/src/main/res/layout/user_setting_layout.xml
  65. 1 1
      home/src/main/res/layout/watch_activity_call_records.xml
  66. 2 2
      home/src/main/res/layout/watch_activity_dialing_voice.xml
  67. 7 7
      home/src/main/res/layout/watch_activity_event.xml
  68. 3 3
      home/src/main/res/layout/watch_activity_event_detail.xml
  69. 19 13
      home/src/main/res/layout/watch_activity_home2.xml
  70. 18 14
      home/src/main/res/layout/watch_activity_register.xml
  71. 3 3
      home/src/main/res/layout/watch_activity_voice_calls.xml
  72. 5 5
      keepalive/src/main/java/com/wdkl/ncs/keepbackground/utils/ForegroundNotificationUtils.java
  73. 10 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/ServerIpInfo.java
  74. 10 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/StringUtil.java
  75. BIN
      resource/src/main/res/raw/im_start.wav
  76. BIN
      resource/src/main/res/raw/low_battery.wav
  77. 47 0
      resource/src/main/res/values-es/arrays.xml
  78. 204 0
      resource/src/main/res/values-es/string.xml
  79. 47 0
      resource/src/main/res/values-ru/arrays.xml
  80. 204 0
      resource/src/main/res/values-ru/strings.xml
  81. 47 0
      resource/src/main/res/values-zh/arrays.xml
  82. 204 0
      resource/src/main/res/values-zh/strings.xml
  83. 47 0
      resource/src/main/res/values/arrays.xml
  84. 153 1
      resource/src/main/res/values/strings.xml

+ 2 - 2
app/src/main/AndroidManifest.xml

@@ -27,8 +27,8 @@
 
     <application
         android:allowBackup="true"
-        android:icon="@mipmap/launcher"
-        android:label="维鼎移动"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/wdkl_app_name"
         android:supportsRtl="true"
         tools:replace="android:label"
         tools:remove="android:requestLegacyExternalStorage"

+ 15 - 4
app/src/main/code/com/wdkl/app/ncs/application/Application.kt

@@ -1,10 +1,14 @@
 package com.wdkl.app.ncs.application
 
 //import android.content.Context
+import android.content.Context
+import android.content.res.Configuration
 import com.enation.javashop.android.jrouter.JRouter
 import com.enation.javashop.net.engine.config.NetEngineConfig
 import com.enation.javashop.net.engine.plugin.exception.RestfulExceptionInterceptor
 import com.enation.javashop.utils.base.config.BaseConfig
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
+import com.wdkl.ncs.android.component.home.util.LocaleMangerUtils
 import com.wdkl.ncs.android.lib.base.BaseApplication
 //import me.weishu.reflection.Reflection
 
@@ -80,8 +84,15 @@ class Application : BaseApplication() {
                 .addNetInterceptor(RestfulExceptionInterceptor())
     }
 
-//    override fun attachBaseContext(base: Context?) {
-//        super.attachBaseContext(base)
-//        Reflection.unseal(base)
-//    }
+    override fun attachBaseContext(base: Context) {
+        val languageId: Int = SettingConfig.getLanguageId(base)
+        LocaleMangerUtils.setApplicationLanguageByIndex(base, languageId)
+        super.attachBaseContext(base)
+    }
+
+    override fun onConfigurationChanged(newConfig: Configuration) {
+        super.onConfigurationChanged(newConfig)
+        val languageId: Int = SettingConfig.getLanguageId(baseContext)
+        LocaleMangerUtils.setApplicationLanguageByIndex(baseContext, languageId)
+    }
 }

+ 1 - 1
build.gradle

@@ -27,7 +27,7 @@ buildscript {
     /**
      * SDK最小支持版本
      */
-    ext.min_sdk_version = 22
+    ext.min_sdk_version = 24
 
     /**
      * SDK目标支持版本

+ 5 - 0
common/src/main/code/com/wdkl/ncs/android/lib/utils/ExtendMethods.kt

@@ -96,6 +96,11 @@ fun showMessage(message: String) {
     }
 }
 
+fun showMessage(resId: Int) {
+    val msg = BaseApplication.appContext.getString(resId)
+    showMessage(msg)
+}
+
 /**
  * @author  LDD
  * @From   com.wdkl.ncs.android.lib.utils ExtendMethods.kt

+ 0 - 1
home/src/main/AndroidManifest.xml

@@ -37,7 +37,6 @@
         <!--<activity android:screenOrientation="portrait" android:name=".activity.WatchHome2Activity"/>-->
         <activity android:screenOrientation="portrait" android:name=".activity.WatchContactsActivity" />
         <activity android:screenOrientation="portrait" android:name=".activity.WatchCallRecordsActivity" />
-        <activity android:screenOrientation="portrait" android:name=".activity.WatchEventDetailActivity" />
         <activity android:screenOrientation="portrait" android:name=".activity.WatchUserSettingActivity" />
         <activity android:screenOrientation="portrait" android:name=".activity.TakeoverActivity" />
         <activity android:screenOrientation="portrait" android:name=".activity.AppUpdateActivity" />

+ 9 - 12
home/src/main/code/com/wdkl/ncs/android/component/home/activity/AppUpdateActivity.kt

@@ -68,12 +68,12 @@ class AppUpdateActivity : BaseActivity<AppUpdatePresenter, ActivityAppUpdateBind
             if (!TextUtils.isEmpty(appInfo.appPath)) {
                 downLoadAPK(urlManager.base + ":8006/" + appInfo.appPath)
             } else {
-                showMessage("下载路径异常")
+                showMessage(R.string.download_error)
                 finish()
             }
         } else {
-            showMessage("本机已经是最新版本")
-            activity_calling_bed_text_download.text = "本机已经是最新版本"
+            showMessage(R.string.update_no_required)
+            activity_calling_bed_text_download.setText(R.string.update_no_required)
             activity_appupdate_dialog_progressview.visibility = View.GONE
             WdKeepAliveService.updateLastTime = System.currentTimeMillis() / 1000
             AppTool.Time.delay(1000){
@@ -96,9 +96,9 @@ class AppUpdateActivity : BaseActivity<AppUpdatePresenter, ActivityAppUpdateBind
         activity_appupdate_dialog_progressview.setCurProgress(0)
         HttpHelper.download(url, object : HttpHelper.DownloadListener {
             override fun onDownloadSuccess() {
-                Log.d("download", "onDownloadSuccess==" + "成功")
+                Log.d("download", "onDownloadSuccess==")
                 runOnUiThread {
-                    activity_calling_bed_text_download.text = "正在安装,请稍后..."
+                    activity_calling_bed_text_download.setText(R.string.updating)
                 }
                 startInstallApk()
             }
@@ -110,7 +110,7 @@ class AppUpdateActivity : BaseActivity<AppUpdatePresenter, ActivityAppUpdateBind
             }
 
             override fun onDownloadFailed() {
-                Log.d("download", "onDownloadFailed==" + "失败")
+                Log.d("download", "onDownloadFailed==")
                 finish()
             }
         })
@@ -121,18 +121,15 @@ class AppUpdateActivity : BaseActivity<AppUpdatePresenter, ActivityAppUpdateBind
             AppUpdateHelper.updateApp(this, object : AppUpdateHelper.UpdateCallBack {
                 override fun onFailed() {
                     runOnUiThread {
-                        showMessage("升级失败")
+                        showMessage(R.string.update_fail)
                         finish()
                     }
                 }
 
                 override fun onSuccess() {
                     runOnUiThread {
-                        showMessage("升级成功")
+                        showMessage(R.string.update_success)
                         finish()
-                        //有root权限用这个
-//                        android.os.Process.killProcess(android.os.Process.myPid())
-//                        System.exit(0)
                     }
                 }
             })
@@ -156,7 +153,7 @@ class AppUpdateActivity : BaseActivity<AppUpdatePresenter, ActivityAppUpdateBind
 
     //数据加载错误
     override fun onError(message: String, type: Int) {
-        showMessage("获取升级数据失败")
+        showMessage(message)
         finish()
     }
 

+ 6 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/BaseActivity.kt

@@ -13,6 +13,8 @@ import android.view.View
 import android.view.inputmethod.InputMethodManager
 import com.enation.javashop.android.jrouter.JRouter
 import com.enation.javashop.utils.base.tool.BaseToolActivity
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
+import com.wdkl.ncs.android.component.home.util.LocaleMangerUtils
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
 import com.wdkl.ncs.android.component.home.util.RecordHelper
 import com.wdkl.ncs.android.component.home.util.SoundPoolManager
@@ -78,6 +80,10 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
      * @Note   Activity创建时进行相关的配置
      */
     override fun onCreate(savedInstanceState: Bundle?) {
+        //切换语言
+        val languageId: Int = SettingConfig.getLanguageId(this)
+        LocaleMangerUtils.setApplicationLanguageByIndex(this, languageId)
+
         try {
             JRouter.prepare().inject(this)
         }catch (e :Exception){

+ 17 - 8
home/src/main/code/com/wdkl/ncs/android/component/home/activity/ChannelImActivity.kt

@@ -15,6 +15,7 @@ import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.adapter.ChannelImItemAdapter
 import com.wdkl.ncs.android.component.home.databinding.ActivityChannelImListBinding
 import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.home.util.*
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.lib.vo.MessageEvent
@@ -36,6 +37,8 @@ import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import java.io.File
+import java.util.*
+import kotlin.collections.ArrayList
 
 class ChannelImActivity : BaseActivity<ChannelImPresenter, ActivityChannelImListBinding>(), ChannelImContract.View, ChannelImItemAdapter.CallBack {
     val TAG = ChannelImActivity::class.java.simpleName
@@ -52,6 +55,8 @@ class ChannelImActivity : BaseActivity<ChannelImPresenter, ActivityChannelImList
     var cancel : Boolean = false
     var voiceFile : String? = null
 
+    private var language = "zh"
+
     lateinit var loadingDialog: LoadingDialog
     var retry: Int = 0
     var uploading = false
@@ -94,6 +99,8 @@ class ChannelImActivity : BaseActivity<ChannelImPresenter, ActivityChannelImList
         if (RecordHelper.getInstance().isRecording()) {
             IMDialogHelper.showIMDialog(activity)
         }
+
+        language = LocaleMangerUtils.getApplicationLocale().language
     }
 
     @SuppressLint("ClickableViewAccessibility")
@@ -121,7 +128,7 @@ class ChannelImActivity : BaseActivity<ChannelImPresenter, ActivityChannelImList
                     MediaPlayHelper.getInstance().stopMusic(true)
                     //EventBus.getDefault().post(MessageEvent(false, Constants.EVENT_CLEAR_IM))
                     RecordHelper.getInstance().startRecord()
-                    tv_channel_text.text = "松开留言,上滑取消"
+                    tv_channel_text.setText(R.string.str_voice_msg_btn_title)
                     voiceFile = RecordHelper.getInstance().audiofilePath
 
                     //按下时保持常亮
@@ -138,14 +145,14 @@ class ChannelImActivity : BaseActivity<ChannelImPresenter, ActivityChannelImList
                 MotionEvent.ACTION_UP -> {
                     upTime = System.currentTimeMillis()
                     RecordHelper.getInstance().stopRecord()
-                    tv_channel_text.text = "按住说话"
+                    tv_channel_text.setText(R.string.str_voice_msg_btn_text)
 
                     if (Math.abs(upTime - downTime) <= 1000) {
                         RecordHelper.getInstance().deleteAudioFile(voiceFile)
-                        showMessage("说话时间太短")
+                        showMessage(R.string.str_voice_msg_record_loss)
                     } else if(cancel) {
                         RecordHelper.getInstance().deleteAudioFile(voiceFile)
-                        showMessage("语音留言已取消")
+                        showMessage(R.string.str_voice_msg_record_cancel)
                     } else {
                         //上传语音留言
                         if (voiceFile != null) {
@@ -182,13 +189,15 @@ class ChannelImActivity : BaseActivity<ChannelImPresenter, ActivityChannelImList
         val tcpModel = ChannelImUtil.channelImMsg(deviceId, channelImDO)
         instance.sendMsg(tcpModel.toJson()).subscribe { it: Boolean ->
             if (it) {
-                SoundPoolManager.getInstance().playSound(3)
-                showMessage("留言发送成功!")
+                if (Locale.CHINESE.getLanguage().equals(language)) {
+                    SoundPoolManager.getInstance().playSound(3)
+                }
+                showMessage(R.string.str_voice_msg_send_success)
                 //刷新列表
                 page = 1
                 presenter.getChannelIm(page, page_size, memberId!!, channelId)
             } else {
-                showMessage("留言发送失败!")
+                showMessage(R.string.str_voice_msg_send_fail)
             }
         }
     }
@@ -215,7 +224,7 @@ class ChannelImActivity : BaseActivity<ChannelImPresenter, ActivityChannelImList
 
             if (uploading) {
                 runOnUiThread {
-                    showMessage("语音留言失败")
+                    showMessage(R.string.str_voice_msg_send_fail)
                     btn_channel_msg.isEnabled = true
                     loadingDialog.dismiss()
                 }

+ 10 - 9
home/src/main/code/com/wdkl/ncs/android/component/home/activity/NewEventListActivity.kt

@@ -85,7 +85,7 @@ class NewEventListActivity : BaseActivity<NewEventListPresenter, ActivityEventLi
         adapter.setOnItemClickListener { data, position ->
             if (Constants.assignRole) {
                 if (eventHandle) {
-                    showMessage("加载中,请稍后")
+                    showMessage(R.string.str_loading)
                     return@setOnItemClickListener
                 }
 
@@ -147,11 +147,11 @@ class NewEventListActivity : BaseActivity<NewEventListPresenter, ActivityEventLi
                 if (eventId != -1) {
                     presenter.updateInteraction(eventId, it.memberId)
                 } else {
-                    showMessage("设定处理人错误")
+                    showMessage(R.string.str_select_resposible_err)
                 }
             }
         } else {
-            showMessage("没有相关人员")
+            showMessage(R.string.str_no_resposible)
         }
     }
 
@@ -168,10 +168,10 @@ class NewEventListActivity : BaseActivity<NewEventListPresenter, ActivityEventLi
         }
 
         if (update) {
-            showMessage("已分配处理人")
+            showMessage(R.string.str_set_resposible_success)
             this.renderData(Constants.eventList)
         } else {
-            showMessage("分配处理人失败")
+            showMessage(R.string.str_set_resposible_fail)
         }
     }
 
@@ -195,7 +195,7 @@ class NewEventListActivity : BaseActivity<NewEventListPresenter, ActivityEventLi
 
     override fun onBackPressed() {
         if (!Constants.oldEvent) {
-            showMessage("您还有事件未处理")
+            showMessage(R.string.str_event_handle_warning)
         } else {
             super.onBackPressed()
         }
@@ -207,14 +207,14 @@ class NewEventListActivity : BaseActivity<NewEventListPresenter, ActivityEventLi
             if (mVibrator!=null) mVibrator.cancel()
             val resTcpModel = messageEvent.getMessage() as TcpModel
             if (resTcpModel.type === TcpType.CALLBACK && resTcpModel.action === TcpAction.VoiceAction.FAILED) {
-                showMessage("呼叫失败,可能对方不在线")
+                showMessage(R.string.call_failed)
                 dismissDialog()
             }
         } else if (messageEvent.tag == 2) {
             if (mVibrator!=null) mVibrator.cancel()
             val resTcpModel = messageEvent.getMessage() as TcpModel
             if (resTcpModel.action == TcpAction.VoiceAction.CALLING) {
-                showMessage("对方通话中")
+                showMessage(R.string.call_busy)
             }
         } else if (messageEvent.tag == 4) {
             val resTcpModel = messageEvent.getMessage() as TcpModel
@@ -223,7 +223,8 @@ class NewEventListActivity : BaseActivity<NewEventListPresenter, ActivityEventLi
                     dismissDialog()
                     if (mVibrator!=null) mVibrator.cancel()
                     val responseInteractionVO = Gson().fromJson<InteractionVO>(resTcpModel.data.toString(), InteractionVO::class.java)
-                    showMessage("已响应"+responseInteractionVO.fromFrameFullName + " " + responseInteractionVO.data)
+                    val text = getString(R.string.str_event_response, responseInteractionVO.fromFrameFullName, responseInteractionVO.data)
+                    showMessage(text)
 
                     var doFinish = false
                     var iterator = Constants.eventList.iterator()

+ 2 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/activity/TakeoverActivity.kt

@@ -152,9 +152,9 @@ class TakeoverActivity: BaseActivity<TakeoverPresenter, ActivityTakeoverBinding>
         if (messageEvent.tag == 2) {
             val resTcpModel = messageEvent.getMessage() as TcpModel
             if (resTcpModel.action  == TcpAction.VoiceAction.FAILED){
-                showMessage("呼叫失败,可能对方不在线")
+                showMessage(R.string.call_failed)
             } else if (resTcpModel.action == TcpAction.VoiceAction.CALLING){
-                showMessage("对方通话中")
+                showMessage(R.string.call_busy)
             }
         }
     }

+ 17 - 9
home/src/main/code/com/wdkl/ncs/android/component/home/activity/VoiceMsgActivity.kt

@@ -13,6 +13,7 @@ import com.enation.javashop.utils.base.widget.LoadingDialog
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.databinding.ActivityVoiceMsgBinding
 import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.home.util.*
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.lib.vo.MessageEvent
@@ -32,6 +33,7 @@ import okhttp3.RequestBody
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import java.io.File
+import java.util.*
 
 class VoiceMsgActivity:BaseActivity<VoiceMsgPresenter,ActivityVoiceMsgBinding>(), VoiceMsgContract.View {
     var TAG = VoiceMsgActivity::class.java.simpleName
@@ -51,6 +53,8 @@ class VoiceMsgActivity:BaseActivity<VoiceMsgPresenter,ActivityVoiceMsgBinding>()
     var retry: Int = 0
     var uploading = false
 
+    private var language = "zh"
+
     @Autowired(name = TO_DEVICE_ID, required = true)
     @JvmField
     var toDeviceId = 0
@@ -75,6 +79,8 @@ class VoiceMsgActivity:BaseActivity<VoiceMsgPresenter,ActivityVoiceMsgBinding>()
         // 获取WakeLock对象
         val powerManager= getSystemService(Context.POWER_SERVICE) as PowerManager
         wakeLock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP or PowerManager.SCREEN_DIM_WAKE_LOCK, "voice_msg_on")
+
+        language = LocaleMangerUtils.getApplicationLocale().language
     }
 
     override fun enableHeadsetVoiceMsg(): Boolean {
@@ -95,7 +101,7 @@ class VoiceMsgActivity:BaseActivity<VoiceMsgPresenter,ActivityVoiceMsgBinding>()
                     MediaPlayHelper.getInstance().stopMusic(true)
                     //EventBus.getDefault().post(MessageEvent(false, Constants.EVENT_CLEAR_IM))
                     RecordHelper.getInstance().startRecord()
-                    tv_voice_text.text = "松开留言,上滑取消"
+                    tv_voice_text.setText(R.string.str_voice_msg_btn_title)
                     voice_call_timer.base = SystemClock.elapsedRealtime()
                     voice_call_timer.start()
                     voiceFile = RecordHelper.getInstance().audiofilePath
@@ -114,16 +120,16 @@ class VoiceMsgActivity:BaseActivity<VoiceMsgPresenter,ActivityVoiceMsgBinding>()
                 MotionEvent.ACTION_UP -> {
                     upTime = System.currentTimeMillis()
                     RecordHelper.getInstance().stopRecord()
-                    tv_voice_text.text = "按住说话"
+                    tv_voice_text.setText(R.string.str_voice_msg_btn_text)
                     voice_call_timer.base = SystemClock.elapsedRealtime()
                     voice_call_timer.stop()
 
                     if (Math.abs(upTime - downTime) <= 1000) {
                         RecordHelper.getInstance().deleteAudioFile(voiceFile)
-                        showMessage("说话时间太短")
+                        showMessage(R.string.str_voice_msg_record_loss)
                     } else if(cancel) {
                         RecordHelper.getInstance().deleteAudioFile(voiceFile)
-                        showMessage("语音留言已取消")
+                        showMessage(R.string.str_voice_msg_record_cancel)
                     } else {
                         //上传语音留言
                         if (voiceFile != null) {
@@ -166,7 +172,7 @@ class VoiceMsgActivity:BaseActivity<VoiceMsgPresenter,ActivityVoiceMsgBinding>()
 
             if (uploading) {
                 runOnUiThread {
-                    showMessage("语音留言失败")
+                    showMessage(R.string.str_voice_msg_send_fail)
                     tv_voice_button.isEnabled = true
                     loadingDialog.dismiss()
                 }
@@ -196,10 +202,12 @@ class VoiceMsgActivity:BaseActivity<VoiceMsgPresenter,ActivityVoiceMsgBinding>()
         val tcpModel = ImUtil.imMsg(Constants.deviceId, toDeviceId, result)
         NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe{
             if (it){
-                SoundPoolManager.getInstance().playSound(3)
-                showMessage("留言发送成功!")
+                if (Locale.CHINESE.getLanguage().equals(language)) {
+                    SoundPoolManager.getInstance().playSound(3)
+                }
+                showMessage(R.string.str_voice_msg_send_success)
             } else {
-                showMessage("留言发送失败!")
+                showMessage(R.string.str_voice_msg_send_fail)
             }
             finish()
         }
@@ -234,7 +242,7 @@ class VoiceMsgActivity:BaseActivity<VoiceMsgPresenter,ActivityVoiceMsgBinding>()
         }
         RecordHelper.getInstance().stopRecord()
         RecordHelper.getInstance().deleteAudioFile(voiceFile)
-        showMessage("语音留言已取消")
+        showMessage(R.string.str_voice_msg_record_cancel)
         finish()
     }
 

+ 4 - 4
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchCallRecordsActivity.kt

@@ -157,10 +157,10 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
                                         }
                                     }
                             } else {
-                                showMessage("呼叫失败,可能手机号异常")
+                                showMessage(R.string.call_phone_failed)
                             }
                         } catch (e: Exception) {
-                            showMessage("呼叫失败,请检查手机号")
+                            showMessage(R.string.call_phone_failed)
                         }
                     } else {
                         DeviceChannel.calling = true
@@ -299,9 +299,9 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
                     call_relyout.isEnabled = true
                     DeviceChannel.calling = false
                     DeviceChannel.callId = 0
-                    showMessage("呼叫失败,可能对方不在线")
+                    showMessage(R.string.call_failed)
                 }else if (tcpModel.action == TcpAction.VoiceAction.CALLING){
-                    showMessage("对方通话中")
+                    showMessage(R.string.call_busy)
                     DeviceChannel.calling = false
                 }
             }

+ 2 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchContactsActivity.kt

@@ -150,9 +150,9 @@ class WatchContactsActivity : BaseActivity<WatchActivityPresenter, WatchContacts
         if (messageEvent.tag == 2) {
             val resTcpModel = messageEvent.getMessage() as TcpModel
             if (resTcpModel.action  == TcpAction.VoiceAction.FAILED){
-                showMessage("呼叫失败,可能对方不在线")
+                showMessage(R.string.call_failed)
             } else if (resTcpModel.action == TcpAction.VoiceAction.CALLING){
-                showMessage("对方通话中")
+                showMessage(R.string.call_busy)
             }
         }
     }

+ 0 - 340
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt

@@ -1,340 +0,0 @@
-package com.wdkl.ncs.android.component.home.activity
-
-import android.content.Context
-import android.content.Intent
-import android.os.CountDownTimer
-import android.os.VibrationEffect
-import android.os.Vibrator
-import android.util.Log
-import android.view.View
-import com.enation.javashop.android.jrouter.external.annotation.Autowired
-import com.enation.javashop.android.jrouter.external.annotation.Router
-import com.enation.javashop.net.engine.model.NetState
-import com.enation.javashop.utils.base.tool.CommonTool
-import com.enation.javashop.utils.base.widget.LoadingDialog
-import com.google.gson.Gson
-import com.wdkl.ncs.android.component.home.R
-import com.wdkl.ncs.android.component.home.databinding.WatchActivityEventDetailBinding
-import com.wdkl.ncs.android.component.home.launch.HomeLaunch
-import com.wdkl.ncs.android.component.home.ui.CallSingleActivity
-import com.wdkl.ncs.android.component.home.util.HandleTcpConnect
-import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
-import com.wdkl.ncs.android.component.home.util.RingPlayHelper
-import com.wdkl.ncs.android.component.home.util.SpeechUtil
-import com.wdkl.ncs.android.middleware.common.Constants
-import com.wdkl.ncs.android.component.home.util.TimeTransition
-import com.wdkl.ncs.android.lib.utils.AppTool
-import com.wdkl.ncs.android.lib.utils.showMessage
-import com.wdkl.ncs.android.lib.vo.MessageEvent
-import com.wdkl.ncs.android.middleware.api.ApiManager
-import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
-import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
-import com.wdkl.ncs.android.middleware.model.ServerIpInfo
-import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
-import com.wdkl.ncs.android.middleware.model.dos.ChannelDO
-import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
-import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
-import com.wdkl.ncs.android.middleware.model.vo.DeviceVO
-import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
-import com.wdkl.ncs.android.middleware.model.vo.WatchContactVO
-import com.wdkl.ncs.android.middleware.tcp.NettyClient
-import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
-import com.wdkl.ncs.android.middleware.tcp.channel.EventUtil
-import com.wdkl.ncs.android.middleware.tcp.channel.ImUtil
-import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
-import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
-import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
-import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
-import kotlinx.android.synthetic.main.watch_activity_event_detail.*
-import org.greenrobot.eventbus.Subscribe
-import org.greenrobot.eventbus.ThreadMode
-
-@Router(path = "/event/detail")
-class WatchEventDetailActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityEventDetailBinding>(), WatchHomeActivityContract.View {
-
-    var TAG = WatchEventDetailActivity::class.java.getSimpleName()
-    //参数自动注入
-    @Autowired(name = "tcpModelStr", required = true)
-    @JvmField
-    var tcpModelStr: String = ""
-    @Autowired(name = "boolVibrator", required = false)
-    @JvmField
-    var boolVibrator = false
-
-    var interactionVO: InteractionVO? = null
-    var tcpModel: TcpModel? = null
-    private var CALL_TIMEOUT = 2 //多久可以再次点击
-
-
-    lateinit var countDownTimer: CountDownTimer
-    private lateinit var loadingDialog: LoadingDialog
-    lateinit var mVibrator: Vibrator
-
-    override fun getLayId(): Int {
-        return R.layout.watch_activity_event_detail
-    }
-
-    override fun enableHeadsetVoiceMsg(): Boolean {
-        return false
-    }
-
-    override fun setDeviceSettingData(partSettingDO: PartSettingDO) {
-    }
-
-    override fun onError(message: String, type: Int) {
-    }
-
-    override fun complete(message: String, type: Int) {
-    }
-
-    override fun start() {
-    }
-
-    override fun networkMonitor(state: NetState) {
-    }
-
-    override fun bindDagger() {
-        HomeLaunch.component.inject(this)
-    }
-
-    override fun bindEvent() {
-        back.setOnClickListener {
-            //            push("/watch/callrecords", { postcard ->
-//                postcard.withString("action","UNREAD")
-//                postcard.withString("customer_id","")
-            finish()
-//            })
-        }
-
-        call_relyout.setOnClickListener {
-
-            call_relyout.isEnabled = false
-            Log.i(TAG, "当前界面 tcpModel " + this.tcpModel?.toJson())
-            var tcpModel: TcpModel? = null
-            if (interactionVO?.fromDeviceMemberId==null){
-                tcpModel = VoiceUtil.voiceCall(Constants.deviceId, interactionVO?.fromDeviceId)
-            } else if (interactionVO?.fromDeviceMemberId != Constants.memberId) {
-                tcpModel = VoiceUtil.voiceCall(Constants.deviceId, interactionVO?.fromDeviceId)
-            } else {
-                tcpModel = VoiceUtil.voiceCall(Constants.deviceId, interactionVO?.toDeviceId)
-            }
-
-
-            DeviceChannel.calling = true
-
-            val intent = Intent(this@WatchEventDetailActivity, CallSingleActivity::class.java)
-            intent.putExtra(CallSingleActivity.EXTRA_ROOM_ID, Constants.sipId)
-            intent.putExtra(CallSingleActivity.EXTRA_MO, true)
-            intent.putExtra(CallSingleActivity.EXTRA_AUDIO_ONLY, true)
-            intent.putExtra(CallSingleActivity.EXTRA_TCPMODEL, tcpModel);
-            //intent.putExtra(CallSingleActivity.EXTRA_SHOWNAME, receivedData!!.frameFullName + " "+receivedData!!.customerNamed)
-            //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            startActivity(intent)
-
-            countDownTimer.start()
-            SpeechUtil.getInstance().stopSpeak()
-        }
-
-        event_status_img.setOnClickListener {
-            event_status_img.isEnabled = false
-            countDownTimer.start()
-            if (tcpModel?.type == TcpType.EVENT) {
-                loadingDialog.show()
-                val tcpModel = EventUtil.eventResponse(Constants.deviceId, interactionVO!!.fromDeviceId, interactionVO!!.id)
-                NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
-                    if (it) {
-                        Log.d(TAG, "TCP.发送消息完成")
-                    } else {
-                        Log.e(TAG, "TCP.发送消息失败")
-                        HandleTcpConnect.instance.tcpReConnectWithMsgShow()
-                    }
-                    loadingDialog.dismiss()
-                }
-            } else if (tcpModel?.type == TcpType.IM) {
-                if (!Constants.deviceId.equals("")) {
-                    if (interactionVO!!.actionEnd == null) {
-                        var imUtilTcpModel = ImUtil.imRead(Constants.deviceId, interactionVO!!.fromDeviceId, interactionVO!!.id)
-                        NettyClient.instance.sendMsg(imUtilTcpModel.toJson()).subscribe {
-                            if (it) {
-                                Log.d(TAG, "TCP.发送消息完成")
-                            } else {
-                                Log.e(TAG, "TCP.发送消息失败")
-                                HandleTcpConnect.instance.tcpReConnectWithMsgShow()
-                            }
-                        }
-                        MediaPlayHelper.getInstance().stopMusic(false)
-                        MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url + interactionVO!!.data, 1f, false)
-                    } else {
-                        MediaPlayHelper.getInstance().stopMusic(false)
-                        MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url + interactionVO!!.data, 1f, false)
-                    }
-                } else {
-                    showMessage("获取不到当给前设备id")
-                }
-            }
-        }
-    }
-
-    override fun destory() {
-        if(countDownTimer != null){
-            countDownTimer.cancel()
-        }
-        MediaPlayHelper.getInstance().stopMusic(true)
-        RingPlayHelper.stopRingTone()
-    }
-
-    override fun init() {
-        loadingDialog = CommonTool.createLoadingDialog(this, R.layout.custom_loading,R.id.loadding_image)
-        initCountDownTimer()
-        //震动
-        mVibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
-        if (boolVibrator){
-            mVibrator.cancel()
-            //开启振动后 等待0.1s振动 振动2s 等待1s 振动2s 等待1s
-            val pattern = longArrayOf(100, 2000, 1000, 2000)
-            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
-                mVibrator.vibrate(VibrationEffect.createWaveform(pattern, -1))
-            } else {
-                mVibrator.vibrate(pattern, -1)
-            }
-        }
-
-        Log.i(TAG, "参数 tcpModelStr : " + tcpModelStr)
-        tcpModel = TcpModel.getModelByJson(tcpModelStr)
-        //var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
-        interactionVO = Gson().fromJson(tcpModel?.data.toString(), InteractionVO::class.java)
-
-        if (interactionVO != null) {
-            tv_frame_name.setText(interactionVO?.fromFrameFullName)
-            if (interactionVO?.fromDeviceMemberId == Constants.memberId){
-                baby_mother_name.setText(interactionVO?.toMemberName)
-            } else {
-                baby_mother_name.setText(interactionVO?.fromMemberName)
-            }
-
-            if (tcpModel?.type == TcpType.IM) {
-                event_text.setText("语音留言")
-                event_status_img.setImageResource(R.drawable.icon_hd_live)
-                if (interactionVO?.actionEnd != null) {
-                    event_end_text.setText("响应时间:" + TimeTransition().stampToDate(interactionVO!!.actionEnd * 1000))
-                    //event_status_img.isEnabled = false
-                    //event_status_img.setImageResource(com.starrtc.demo.R.drawable.icon_hd_live_item)
-                } /*else {
-                    event_status_img.setImageResource(com.starrtc.demo.R.drawable.icon_hd_live)
-                }*/
-            } else if (tcpModel?.type == TcpType.EVENT) {
-                event_text.setText(interactionVO?.data)
-
-                if (interactionVO?.actionEnd != null) {
-                    event_end_text.setText("响应时间:" + TimeTransition().stampToDate(interactionVO!!.actionEnd * 1000))
-                    event_status_img.isEnabled = false
-                    event_status_img.setImageResource(R.drawable.icon_switch_on)
-                }
-            } else {
-                event_status_img.visibility = View.GONE
-//                call_relyout.visibility = View.VISIBLE
-                if (tcpModel?.type == TcpType.VOICE) {
-                    //todo 腕表没有按主机这边设计 没数据
-                    if (interactionVO?.actionEnd != null) {
-                        //判断是呼入还是呼出 1 分机到主机 2主机到分机
-                        if (interactionVO?.actionDirectionType == 1) {
-                            event_text.setText("语音呼入已接")
-                        } else if (interactionVO?.actionDirectionType == 2 || interactionVO?.actionDirectionType == 3) {
-                            event_text.setText("语音呼出已接")
-                        }
-                    } else {
-                        //判断是呼入还是呼出 1 分机到主机 2主机到分机
-                        if (interactionVO?.actionDirectionType == 1) {
-                            event_text.setText("语音呼入未接")
-                        } else if (interactionVO?.actionDirectionType == 2 || interactionVO?.actionDirectionType == 3) {
-                            event_text.setText("语音呼出未接")
-                        }
-                    }
-//                    event_text.setText("语音呼叫")
-
-                } else if (tcpModel?.type == TcpType.VIDEO) {
-
-                    event_text.setText("视频呼叫")
-                } else if (tcpModel?.type == TcpType.SOS) {
-                    event_text.setText("SOS紧急呼叫")
-                }
-            }
-        }
-    }
-
-
-    fun initCountDownTimer() {
-        countDownTimer = object : CountDownTimer(CALL_TIMEOUT * 1000L, 1000) {
-            override fun onTick(millisUntilFinished: Long) {
-            }
-
-            override fun onFinish() {
-                loadingDialog.dismiss()
-                call_relyout.isEnabled = true
-                event_status_img.isEnabled = true
-
-            }
-        }
-    }
-
-    override fun handleAppVersion(appInfo: AppVersionDO) {
-    }
-
-    override fun setDeviceDo(data: DeviceVO) {
-    }
-
-    override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
-    }
-
-    override fun setDeviceVoiceChannel(channelList: ArrayList<ChannelDO>) {
-    }
-
-    override fun setPhoneNumberWhiteList(phoneList: ArrayList<String>) {
-    }
-
-    override fun setContact(contactsVOs: List<WatchContactVO>) {
-
-    }
-
-    override fun setServerInfo(serverIpInfo: ServerIpInfo) {
-
-    }
-
-    @Subscribe(threadMode = ThreadMode.MAIN)
-    fun onMoonEvent(messageEvent: MessageEvent) {
-        if (messageEvent.tag == 4) {
-            val resTcpModel = messageEvent.getMessage() as TcpModel
-            if (resTcpModel.type == TcpType.DATA && resTcpModel.action == TcpAction.DataAction.INTERACTION) {
-                if (resTcpModel.data != null) {
-                    loadingDialog.dismiss()
-                    val responseInteractionVO = Gson().fromJson<InteractionVO>(resTcpModel.getData().toString(), InteractionVO::class.java)
-
-                    if (tcpModel?.type == TcpType.IM) {
-                        event_status_img.setImageResource(R.drawable.icon_hd_live_item)
-                        showMessage("已播放")
-                    } else if (tcpModel?.type == TcpType.EVENT) {
-                        event_status_img.setImageResource(R.drawable.icon_switch_on)
-                        showMessage("已响应")
-                        AppTool.Time.delay(1500){
-                            finish()
-                        }
-                    }
-
-                    mVibrator.cancel()
-                    event_end_text.setText("响应时间:" + TimeTransition().stampToDate(responseInteractionVO.actionEnd * 1000))
-                }
-            }
-        } else if (messageEvent.tag == 1) {
-            loadingDialog.dismiss()
-            mVibrator.cancel()
-            //具体逻辑在TcpHandleService中处理
-        } else if (messageEvent.tag == 2) {
-            val resTcpModel = messageEvent.getMessage() as TcpModel
-            if (resTcpModel.action  == TcpAction.VoiceAction.FAILED){
-                showMessage("呼叫失败,可能对方不在线")
-            } else if (resTcpModel.action == TcpAction.VoiceAction.CALLING){
-                showMessage("对方通话中")
-            }
-        }
-    }
-}

+ 68 - 40
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt

@@ -31,10 +31,8 @@ import com.wdkl.ncs.android.component.home.service.WdKeepAliveService
 import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.home.util.*
 import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.utils.*
 import com.wdkl.ncs.android.lib.utils.Util
-import com.wdkl.ncs.android.lib.utils.joinManager
-import com.wdkl.ncs.android.lib.utils.push
-import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.lib.vo.MessageEvent
 import com.wdkl.ncs.android.middleware.common.Constants
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
@@ -59,6 +57,8 @@ import kotlinx.android.synthetic.main.watch_activity_home2.*
 import kotlinx.android.synthetic.main.watch_activity_register.*
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
+import java.util.*
+import kotlin.collections.ArrayList
 
 //@Router(path = "/watch/home")
 class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivityHome2Binding>(), WatchHomeActivityContract.View, View.OnClickListener {
@@ -78,6 +78,8 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
 
     private var clickTime: Long = 0
 
+    private var language = "zh"
+
     private lateinit var netWorkChangeReceiver: NetWorkChangeReceiver
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -125,7 +127,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
 -100 to -109 dBm, then it's generally considered poor signal (1 to 2 bars).
 -110 to -120 dBm, then it's generally considered very poor signal (0 to 1 bar)
          */
-        if (netType == NetHelper.NETWORK_4G) {
+        /*if (netType == NetHelper.NETWORK_4G) {
             if (teleManager != null) {
                 teleManager.listen(object : PhoneStateListener() {
                     override fun onSignalStrengthsChanged(signalStrength: SignalStrength) {
@@ -153,10 +155,11 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                     }
                 }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
             }
-        }
+        }*/
 
         requestPermissions()
 
+        language = LocaleMangerUtils.getApplicationLocale().language
     }
 
     private fun permissionGranted() {
@@ -276,6 +279,37 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
 
             presenter.getDeviceVO(Constants.imei)
         }
+
+
+        //通过服务端设置语言
+        if (SettingConfig.getLanguageMode(activity) == 0) {
+            var needReboot = false
+            if ("cn".equals(serverIpInfo.lang)) {
+                //中文
+                if (SettingConfig.getLanguageId(activity) != 2) {
+                    needReboot = true
+                }
+                SettingConfig.setLanguageId(activity, 2)
+            } else if ("en".equals(serverIpInfo.lang)) {
+                //英文
+                if (SettingConfig.getLanguageId(activity) != 1) {
+                    needReboot = true
+                }
+                SettingConfig.setLanguageId(activity, 1)
+            } else if ("es".equals(serverIpInfo.lang)) {
+                //西班牙语
+                if (SettingConfig.getLanguageId(activity) != 3) {
+                    needReboot = true
+                }
+                SettingConfig.setLanguageId(activity, 3)
+            }
+
+            if (needReboot) {
+                AppTool.Time.delay(5000) {
+                    AppUtils.restartApp()
+                }
+            }
+        }
     }
 
     private fun requestPermissions() {
@@ -301,7 +335,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                     )
                     .subscribe {
                         if (!it) {
-                            showMessage("请重新授权,进入App")
+                            showMessage(R.string.permission_tips)
                             requestPermissions()
                         } else {
                             permissionGranted()
@@ -328,7 +362,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                     )
                     .subscribe {
                         if (!it) {
-                            showMessage("请重新授权,进入App")
+                            showMessage(R.string.permission_tips)
                             requestPermissions()
                         } else {
                             permissionGranted()
@@ -339,7 +373,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
 
     override fun handleAppVersion(appInfo: AppVersionDO) {
         if (BuildConfig.VERSION_CODE < appInfo.versionNo && !AppUpdateActivity.opened) {
-            showMessage("有新版本")
+            showMessage(R.string.new_version_tips)
             val intent = Intent()
             intent.setClass(this, AppUpdateActivity::class.java)
             startActivity(intent)
@@ -352,8 +386,8 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
     override fun setDeviceDo(data: DeviceVO) {
         if (data.id == null || data.id <= 0) {
             loadingDialog.dismiss()
-            showMessage("本机未注册,请将识别码发给管理员")
-            tv_register_status.text = "本机未注册,请将识别码发给管理员。管理员注册本机后请点击注册完成进入"
+            showMessage(R.string.device_not_register)
+            tv_register_status.setText(R.string.device_not_register_tips)
             if (DaemonEnv.app != null) {
                 SpManager.getInstance().putBoolean(Constants.SYSTEM_REGISTERED, false)
             }
@@ -372,7 +406,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         watch_activity_home_linyout.visibility = View.VISIBLE
         tv_register_ok.visibility = View.GONE
 
-        tv_register_status.text = "本机已注册,进入系统中"
+        tv_register_status.text = "Loading..."
         tv_register_status.setTextColor(Color.GREEN)
 
         isUnRegister = false
@@ -388,12 +422,12 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         presenter.getWatchContacts(Constants.deviceId)
 
         if (Constants.deviceId <= 0 || TextUtils.isEmpty(Constants.sipId)) {
-            showMessage("初始化数据时服务器返回数据不全,请联系管理员")
-            tv_feedback_device_info.text = "初始化数据时服务器返回数据不全,请联系管理员"
+            showMessage(R.string.init_data_error)
+            tv_feedback_device_info.setText(R.string.init_data_error)
             return
         } else if (TextUtils.isEmpty(Constants.tcpServer)) {
-            showMessage("初始化tcp连接数据为null")
-            tv_feedback_device_info.text = "初始化tcp连接数据为null"
+            showMessage(R.string.init_server_data_error)
+            tv_feedback_device_info.setText(R.string.init_server_data_error)
             return
         }
 
@@ -406,7 +440,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         //onTcpConnectSuccess()
 
         if (Strings.isNullOrEmpty(Constants.userName)) {
-            watch_name_tv.text = "重载"
+            watch_name_tv.setText(R.string.str_reload)
             watch_name_tv.setTextColor(Color.BLACK)
             watch_name_tv.textSize = 13f
             watch_name_tv.setBackgroundResource(R.drawable.javashop_btn_balck_line_bg)
@@ -416,7 +450,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                 return@setOnClickListener
             }
 
-            watch_role_name_tv.text = "请使用PC设置使用人"
+            watch_role_name_tv.setText(R.string.device_user_empty)
             watch_role_name_tv.textSize = 12f
         } else {
             watch_name_tv.text = Constants.userName
@@ -428,6 +462,10 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                 }
                 watch_user_phone_tv.text = data.phoneNumber
             }
+
+            if (Locale.CHINESE.getLanguage().equals(language)) {
+                watch_role_name_tv.visibility = View.VISIBLE
+            }
         }
 
         //获取频道列表
@@ -446,7 +484,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         //加载电话号码白名单
         presenter.getPhoneNumberWhiteList(Constants.deviceId)
 
-        showMessage("载入完成")
+        showMessage("Load complete")
     }
 
     override fun setDeviceVoiceChannel(channelList: ArrayList<ChannelDO>) {
@@ -515,7 +553,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         runOnUiThread(Runnable {
             Log.i(TAG, "连接成功设置UI")
             tv_net_reconnect_text.visibility = View.GONE
-            tv_signal_strength.text = "网络正常"
+            tv_signal_strength.setText(R.string.tcp_connect_success)
             netOffLoadingDialog.dismiss()
             sip_state_tv.setBackgroundColor(Color.parseColor("#00FFFF"))
         })
@@ -525,7 +563,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         Log.w(TAG, "网络断开")
 
         runOnUiThread(Runnable {
-            tv_signal_strength.text = "网络断开"
+            tv_signal_strength.setText(R.string.tcp_connect_failed)
             tv_net_reconnect_text.visibility = View.VISIBLE
             netOffLoadingDialog.show()
             sip_state_tv.setBackgroundColor(Color.parseColor("#FF0000"))
@@ -571,6 +609,10 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         tv_config_server.setOnClickListener {
             ServerConfigDialogHelper.showPasswordDialog(activity)
         }
+
+        tv_language_settings.setOnClickListener {
+            LanguageSetDialogHelper.showDialog(activity)
+        }
     }
 
     override fun enableHeadsetVoiceMsg(): Boolean {
@@ -601,7 +643,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
 
             if (NetHelper.getInstance().getNetworkState(this) == NetHelper.NETWORK_NONE) {
                 runOnUiThread(Runnable {
-                    showMessage("未能正确连接,请重试")
+                    showMessage(R.string.net_disconnect)
                 })
             }
         }).start()
@@ -688,9 +730,9 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             R.id.channel_im_layout -> {
                 //群留言
                 if (Constants.channelId == -1) {
-                    showMessage("请先建立频道")
+                    showMessage(R.string.str_im_no_channel)
                 } else if (TextUtils.isEmpty(Constants.userName)) {
-                    showMessage("设备未绑定")
+                    showMessage(R.string.device_user_not_register)
                 } else {
                     var intent = Intent(this, ChannelImActivity::class.java)
                     startActivity(intent)
@@ -704,7 +746,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             }
             R.id.other_linyout -> {
                 if (System.currentTimeMillis() - clickTime > 2000) {
-                    showMessage("再点一次进入设置")
+                    showMessage(R.string.click_twice_start_settings)
                 } else {
                     val intent = Intent(this, WatchUserSettingActivity::class.java)
                     startActivity(intent)
@@ -714,20 +756,6 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         }
     }
 
-    /*override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
-        Log.i(TAG, "keyup keyCode " + keyCode)
-        return if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) {
-            //不执行父类点击事件
-            true
-        } else super.onKeyUp(keyCode, event)
-        //继续执行父类其他点击事件
-    }
-
-    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
-        Log.i(TAG, "keydown keyCode " + keyCode)
-        return super.onKeyDown(keyCode, event)
-    }*/
-
 
     override fun onBackPressed() {
         //禁用返回
@@ -755,12 +783,12 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                 electric_quantity_tv.text = "" + message
                 battery_warning_tv.setTextColor(Color.parseColor("#FF3030"))
                 battery_warning_tv.visibility = View.VISIBLE
-                battery_warning_tv.text = "低电量,请注意充电"
+                battery_warning_tv.setText(R.string.low_power)
             } else if (10 > message) {
                 electric_quantity_tv.text = "" + message
                 battery_warning_tv.setTextColor(Color.parseColor("#8B2323"))
                 battery_warning_tv.visibility = View.VISIBLE
-                battery_warning_tv.text = "电量过低,请充电"
+                battery_warning_tv.setText(R.string.low_power)
             } else {
                 battery_warning_tv.visibility = View.GONE
                 electric_quantity_tv.text = "" + message

+ 56 - 6
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchUserSettingActivity.java

@@ -8,9 +8,12 @@ import android.provider.Settings;
 import android.support.annotation.Nullable;
 import android.util.Log;
 import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
 import android.widget.Button;
 import android.widget.RadioButton;
 import android.widget.RadioGroup;
+import android.widget.Spinner;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -19,6 +22,7 @@ import com.wdkl.ncs.android.component.home.R;
 import com.wdkl.ncs.android.component.home.service.WdKeepAliveService;
 import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig;
 import com.wdkl.ncs.android.component.home.util.AppUtils;
+import com.wdkl.ncs.android.component.home.util.LocaleMangerUtils;
 import com.wdkl.ncs.android.component.home.util.NetHelper;
 import com.wdkl.ncs.android.middleware.common.Constants;
 import com.wdkl.ncs.android.lib.base.BaseApplication;
@@ -43,6 +47,10 @@ public class WatchUserSettingActivity extends Activity {
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
+        //切换语言
+        int languageId = SettingConfig.getLanguageId(this);
+        LocaleMangerUtils.setApplicationLanguageByIndex(this, languageId);
+
         super.onCreate(savedInstanceState);
         setContentView(R.layout.user_setting_layout);
 
@@ -76,7 +84,9 @@ public class WatchUserSettingActivity extends Activity {
         tvDeviceImei.setText(Constants.Companion.getImei());
         tvDeviceIp.setText(NetHelper.getInstance().getLocalIP());
         tvServerIp.setText(Constants.Companion.getTcpServer());
-        tvPhoneType.setText("手机-" + Constants.Companion.getPhoneType() + ", 分机-" + Constants.Companion.getBedPhoneType() + ", 主机-" + Constants.Companion.getNursePhoneType());
+
+        String type = getString(R.string.phone_type, Constants.Companion.getPhoneType(), Constants.Companion.getBedPhoneType(), Constants.Companion.getNursePhoneType());
+        tvPhoneType.setText(type);
 
         if (SettingConfig.getVoiceCallType(BaseApplication.appContext) == SettingConfig.VOICE_CALL) {
             callYes.setChecked(true);
@@ -96,6 +106,46 @@ public class WatchUserSettingActivity extends Activity {
             imChannelNo.setChecked(true);
         }
 
+        int mode = SettingConfig.getLanguageMode(BaseApplication.appContext);
+        RadioGroup languageMode = findViewById(R.id.group_language_mode);
+        RadioButton languageYes = findViewById(R.id.rb_language_yes);
+        RadioButton languageNo = findViewById(R.id.rb_language_no);
+        if (mode == 0) {
+            languageYes.setChecked(true);
+        } else {
+            languageNo.setChecked(true);
+        }
+        languageMode.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup group, int checkedId) {
+                if (checkedId == R.id.rb_language_yes) {
+                    SettingConfig.setLanguageMode(BaseApplication.appContext, 0);
+                } else {
+                    SettingConfig.setLanguageMode(BaseApplication.appContext, 1);
+                }
+            }
+        });
+
+        int originIndex = LocaleMangerUtils.getCurrentLocaleIndex();
+        Spinner spinner = findViewById(R.id.spinner_language_select);
+        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
+                R.array.language_list, R.layout.spinner_item);
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        spinner.setAdapter(adapter);
+        spinner.setSelection(originIndex);
+        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                Log.d("languageId", "pos: " + position + ", originIndex: " + originIndex);
+                SettingConfig.setLanguageId(BaseApplication.appContext, position);
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+
+            }
+        });
+
 
         btnChange.setOnClickListener(new View.OnClickListener() {
             @Override
@@ -104,11 +154,11 @@ public class WatchUserSettingActivity extends Activity {
                 NettyClient.Companion.getInstance().sendMsg(userChangeModel.toJson()).subscribe(it->{
                     if (it) {
                         Log.d(TAG, "TCP.发送消息完成");
-                        ExtendMethodsKt.showMessage("换班通知发送成功,请等待处理...");
+                        ExtendMethodsKt.showMessage(R.string.user_change_success);
                         WatchUserSettingActivity.this.finish();
                     } else {
                         Log.e(TAG, "TCP.发送消息失败");
-                        ExtendMethodsKt.showMessage("换班通知发送失败,请重试");
+                        ExtendMethodsKt.showMessage(R.string.user_change_failed);
                     }
                 });
             }
@@ -130,7 +180,7 @@ public class WatchUserSettingActivity extends Activity {
                     intent.setClass(_this, AppUpdateActivity.class);
                     startActivity(intent);
                 } else {
-                    Toast.makeText(_this, "请10秒后再尝试", Toast.LENGTH_SHORT).show();
+                    ExtendMethodsKt.showMessage(R.string.retry_tips);
                 }
             }
         });
@@ -181,9 +231,9 @@ public class WatchUserSettingActivity extends Activity {
 
         Log.d(TAG, "tts state: " + Constants.Companion.getTtsState());
         if (Constants.Companion.getTtsState() == 2) {
-            tvTtsStatus.setText("正常");
+            tvTtsStatus.setText(R.string.tts_init_success);
         } else {
-            tvTtsStatus.setText("异常");
+            tvTtsStatus.setText(R.string.tts_init_failed);
         }
     }
 }

+ 1 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/ChannelImItemAdapter.kt

@@ -90,7 +90,7 @@ class ChannelImItemAdapter(val data: ArrayList<ChannelIMVO>, val imActivity: Act
 
 
             binding.imPlayTv.setOnClickListener {
-                showMessage("播放:" + itemData.audioPath)
+                showMessage("play:" + itemData.audioPath)
                 EventBus.getDefault().post(MessageEvent(false, Constants.EVENT_CLEAR_IM))
                 MediaPlayHelper.getInstance().stopMusic(false)
                 MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url + itemData.audioPath, 1f, false)

+ 5 - 5
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/NewEventItemAdapter.kt

@@ -115,7 +115,7 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val activity: Activ
                     //}
                 }
                 TcpType.IM.name->{
-                    binding.eliEventName.text = "语音留言"
+                    binding.eliEventName.setText(R.string.event_voice_msg)
                     binding.eliEventResponse.visibility = View.GONE
                     if (itemData.actionEnd!=null){
                         binding.eliEventResponse.visibility = View.GONE
@@ -123,7 +123,7 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val activity: Activ
                         binding.eliEventName.setTextColor(Color.GREEN)
 
                         binding.eliImRead.setOnClickListener {
-                            showMessage("播放:" + itemData.data)
+                            showMessage("play:" + itemData.data)
                             MediaPlayHelper.getInstance().stopMusic(false)
                             MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url + itemData.data, 1f, false)
                             ImPlayDialogHelper.showImPlayDialog(activity, itemData.fromFrameFullName, TimeTransition().stampToTime(itemData.createDate*1000))
@@ -133,7 +133,7 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val activity: Activ
                         binding.eliImRead.visibility = View.VISIBLE
 
                         binding.eliImRead.setOnClickListener {
-                            showMessage("播放:" + itemData.data)
+                            showMessage("play:" + itemData.data)
                             MediaPlayHelper.getInstance().stopMusic(false)
                             MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url + itemData.data, 1f, false)
                             ImPlayDialogHelper.showImPlayDialog(activity, itemData.fromFrameFullName, TimeTransition().stampToTime(itemData.createDate*1000))
@@ -181,11 +181,11 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val activity: Activ
                     }
                 }
                 TcpType.VOICE.name->{
-                    binding.eliEventName.text = "通话"
+                    binding.eliEventName.setText(R.string.event_voice_call)
                     binding.eliEventResponse.visibility = View.GONE
                 }
                 TcpType.PHONE.name->{
-                    binding.eliEventName.text = "通话"
+                    binding.eliEventName.setText(R.string.event_voice_call)
                     binding.eliEventResponse.visibility = View.GONE
                 }
             }

+ 22 - 19
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/TakeoverItemAdapter.kt

@@ -29,6 +29,7 @@ import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.PhoneUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import com.wdkl.ncs.android.middleware.tcp.enums.CommunicationEnum
+import com.wdkl.ncs.android.middleware.utils.StringUtil
 
 class TakeoverItemAdapter(var data:ArrayList<JsonObject>, val context: Context) : BaseDelegateAdapter<BaseRecyclerViewHolder<TakeoverItemBinding>, JsonObject>(){
     val TAG = "TakeoverItemAdapter"
@@ -61,8 +62,8 @@ class TakeoverItemAdapter(var data:ArrayList<JsonObject>, val context: Context)
         holder?.bind {
             binding ->
             val itemData = getItem(position)
-            binding.clerkName.text = "未知"
-            binding.tvPhoneNumber.text = "暂无"
+            binding.clerkName.setText(R.string.str_null)
+            binding.tvPhoneNumber.setText(R.string.str_empty)
             try {
                 binding.clerkName.text = itemData.get("clerk_name").asString
                 binding.tvPhoneNumber.text = itemData.get("phone_number").asString
@@ -73,24 +74,26 @@ class TakeoverItemAdapter(var data:ArrayList<JsonObject>, val context: Context)
             if (Strings.isNullOrEmpty(Constants.userName)){
                 binding.btnCallOut.visibility = View.GONE
                 binding.btnUserChange.setOnClickListener {
-                    CommonTool.createVerifyDialog("确认切换吗","取消","确定",context,object : CommonTool.DialogInterface{
-                        override fun yes() {
-                            loadingDialog.show()
-                            showMessage("切换中,请稍候")
-                            var tcpModel = DeviceUtil.deviceChange(Constants.deviceId, itemData.get("id").asInt)
-                            NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
-                                if (it) {
-                                    Log.d(TAG, "TCP.发送消息完成")
-                                } else {
-                                    Log.e(TAG, "TCP.发送消息失败")
-                                    HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                    CommonTool.createVerifyDialog(
+                        StringUtil.getResString(R.string.device_change_check),
+                        StringUtil.getResString(R.string.str_cancel),
+                        StringUtil.getResString(R.string.str_confirm),
+                        context,object : CommonTool.DialogInterface{
+                            override fun yes() {
+                                showMessage(R.string.device_change_tips)
+                                var tcpModel = DeviceUtil.deviceChange(Constants.deviceId, itemData.get("id").asInt)
+                                NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                                    if (it) {
+                                        Log.d(TAG, "TCP.发送消息完成")
+                                    } else {
+                                        Log.e(TAG, "TCP.发送消息失败")
+                                        HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                                    }
                                 }
-                                loadingDialog.dismiss()
                             }
-                        }
-                        override fun no() {
-                        }
-                    }).show()
+                            override fun no() {
+                            }
+                        }).show()
                 }
             } else {
                 binding.btnUserChange.visibility = View.GONE
@@ -115,7 +118,7 @@ class TakeoverItemAdapter(var data:ArrayList<JsonObject>, val context: Context)
                                 }
                             }
                         } catch (e: Exception) {
-                            showMessage("呼叫失败,请检查手机号")
+                            showMessage(R.string.call_phone_failed)
                         }
 
                         //直接呼叫

+ 23 - 17
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/TakeoverItemSearchAdapter.kt

@@ -27,6 +27,7 @@ import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.PhoneUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import com.wdkl.ncs.android.middleware.tcp.enums.CommunicationEnum
+import com.wdkl.ncs.android.middleware.utils.StringUtil
 
 class TakeoverItemSearchAdapter : FuzzySearchBaseAdapter<ContactItemEntity, TakeoverItemSearchAdapter.ItemHolder> {
     val TAG = "TakeoverItem"
@@ -50,8 +51,9 @@ class TakeoverItemSearchAdapter : FuzzySearchBaseAdapter<ContactItemEntity, Take
 
     override fun onBindViewHolder(p0: ItemHolder, p1: Int) {
         val itemData = mDataList[p1]
-        p0.clerkName.text = "未知"
-        p0.phoneNumber.text = "暂无"
+        p0.clerkName.setText(R.string.str_null)
+        p0.phoneNumber.setText(R.string.str_empty)
+
         try {
             p0.clerkName.text = itemData.value
             p0.phoneNumber.text = itemData.number
@@ -62,22 +64,26 @@ class TakeoverItemSearchAdapter : FuzzySearchBaseAdapter<ContactItemEntity, Take
         if (Strings.isNullOrEmpty(Constants.userName)){
             p0.btnCallOut.visibility = View.GONE
             p0.btnUserChange.setOnClickListener {
-                CommonTool.createVerifyDialog("确认切换吗","取消","确定",context,object : CommonTool.DialogInterface{
-                    override fun yes() {
-                        showMessage("切换中,请稍候")
-                        var tcpModel = DeviceUtil.deviceChange(Constants.deviceId, itemData.id)
-                        NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
-                            if (it) {
-                                Log.d(TAG, "TCP.发送消息完成")
-                            } else {
-                                Log.e(TAG, "TCP.发送消息失败")
-                                HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                CommonTool.createVerifyDialog(
+                    StringUtil.getResString(R.string.device_change_check),
+                    StringUtil.getResString(R.string.str_cancel),
+                    StringUtil.getResString(R.string.str_confirm),
+                    context,object : CommonTool.DialogInterface{
+                        override fun yes() {
+                            showMessage(R.string.device_change_tips)
+                            val tcpModel = DeviceUtil.deviceChange(Constants.deviceId, itemData.id)
+                            NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                                if (it) {
+                                    Log.d(TAG, "TCP.发送消息完成")
+                                } else {
+                                    Log.e(TAG, "TCP.发送消息失败")
+                                    HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                                }
                             }
                         }
-                    }
-                    override fun no() {
-                    }
-                }).show()
+                        override fun no() {
+                        }
+                    }).show()
             }
         } else {
             p0.btnUserChange.visibility = View.GONE
@@ -102,7 +108,7 @@ class TakeoverItemSearchAdapter : FuzzySearchBaseAdapter<ContactItemEntity, Take
                             }
                         }
                     } catch (e: Exception) {
-                        showMessage("呼叫失败,请检查手机号")
+                        showMessage(R.string.call_phone_failed)
                     }
 
                     //直接呼叫

+ 8 - 44
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchCallRecordsItemAdapter.kt

@@ -112,17 +112,16 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
                     binding.projectTv.setBackgroundResource(R.drawable.sp_event_do)
                     binding.callStatusImagev.setImageResource(R.drawable.event_do)
                 }else if (itemData.actionType == TcpType.IM.name){//语音已播放
-
                     binding.projectTv.visibility = View.GONE
                     binding.playTv.visibility = View.VISIBLE
                     binding.conductorNameTv.visibility = View.GONE
                     binding.playTv.setBackgroundResource(R.drawable.yi_bo_fang)
-                    if (Constants.memberId == itemData.fromDeviceMemberId) {
+                    /*if (Constants.memberId == itemData.fromDeviceMemberId) {
                         binding.processingTimeTv.text = "对方已播放"
                     } else {
                         binding.processingTimeTv.text = "已播放"
-                    }
-
+                    }*/
+                    binding.processingTimeTv.visibility = View.GONE
                 }else if(itemData.actionType == TcpType.VOICE.name || itemData.actionType == TcpType.PHONE.name){ //语音呼叫已接听
                     binding.projectTv.visibility = View.GONE
                     binding.playTv.visibility = View.GONE
@@ -161,7 +160,7 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
                     binding.projectTv.visibility = View.VISIBLE
                     binding.projectTv.text = "SOS"
                     binding.projectTv.setBackgroundResource(R.drawable.sp_event_undo)
-                    binding.processingTimeTv.text = "未处理"
+                    binding.processingTimeTv.setText(R.string.event_undo)
                     binding.callStatusImagev.setImageResource(R.drawable.sos_96)
                 }else if(itemData.actionType == TcpType.EVENT.name){//事件未处理
                     binding.playTv.visibility = View.GONE
@@ -169,16 +168,17 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
                     binding.projectTv.text = itemData.data
                     binding.projectTv.setBackgroundResource(R.drawable.sp_event_undo)
                     binding.callStatusImagev.setImageResource(R.drawable.event_undo)
-                    binding.processingTimeTv.text = "未处理"
+                    binding.processingTimeTv.setText(R.string.event_undo)
                 }else if (itemData.actionType == TcpType.IM.name){//语音未播放
                     binding.projectTv.visibility = View.GONE
                     binding.playTv.visibility = View.VISIBLE
                     binding.playTv.setBackgroundResource(R.drawable.wei_bo_fang)
-                    if (Constants.memberId == itemData.fromDeviceMemberId) {
+                    /*if (Constants.memberId == itemData.fromDeviceMemberId) {
                         binding.processingTimeTv.text = "对方未播放"
                     } else {
                         binding.processingTimeTv.text = "未播放"
-                    }
+                    }*/
+                    binding.processingTimeTv.visibility = View.GONE
                 }else if(itemData.actionType == TcpType.VOICE.name || itemData.actionType == TcpType.PHONE.name){ //语音呼叫未接听
                     binding.projectTv.visibility = View.GONE
                     binding.playTv.visibility = View.GONE
@@ -193,42 +193,6 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
                 }
             }
 
-//            binding.projectTv.setOnClickListener {
-//                if (itemData.actionEnd != null)return@setOnClickListener
-//                Log.i(TAG, "点击了事件按钮")
-//
-//                Thread(Runnable {
-//                    run {
-//                        if (!Constants.deviceId.equals("")) {
-//                            var eventTcpModel = EventUtil.eventResponse(Constants.deviceId.toInt(), itemData.fromDeviceId, itemData.id)
-//                            NettyClient.Companion.getInstance().sendMsg(eventTcpModel.toJson())
-//                        } else {
-//                            showMessage("获取不到当给前设备id")
-//                        }
-//                    }
-//                }).start()
-//
-//                //处理完之后要刷新数据
-//            }
-//            binding.playTv.setOnClickListener {
-//                if (itemData.actionEnd != null)return@setOnClickListener
-//                //点击之后播放语音留言
-//                showMessage("点击了播放留言")
-//                Thread(Runnable {
-//                    run {
-//                        if (!Constants.deviceId.equals("")) {
-//                            var imUtilTcpModel = ImUtil.imRead(Constants.deviceId.toInt(), itemData.fromDeviceId, itemData.id)
-//                            NettyClient.Companion.getInstance().sendMsg(imUtilTcpModel.toJson())
-//                            MediaPlayHelper.getInstance().playUrlMusic(UrlManager.build().device_url+itemData.data,0.8f,false)
-//                        } else {
-//                            showMessage("获取不到当给前设备id")
-//                        }
-//                    }
-//                }).start()
-//
-//                //处理完之后要刷新数据
-//            }
-
         }
     }
 

+ 2 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchContactsItemAdapter.kt

@@ -99,10 +99,10 @@ class WatchContactsItemAdapter(val data:ArrayList<WatchContactsVO>, val context:
                                     }
                                 }
                         } else {
-                            showMessage("呼叫失败,可能手机号异常")
+                            showMessage(R.string.call_phone_failed)
                         }
                     } catch (e: Exception) {
-                        showMessage("呼叫失败,请检查手机号")
+                        showMessage(R.string.call_phone_failed)
                     }
                 } else {
                     DeviceChannel.calling = true

+ 12 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/broadcast/BatteryBroadcastReceiver.java

@@ -6,12 +6,18 @@ import android.content.Context;
 import android.content.Intent;
 import android.widget.TextView;
 
+import com.wdkl.ncs.android.component.home.R;
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig;
+import com.wdkl.ncs.android.component.home.util.LocaleMangerUtils;
+import com.wdkl.ncs.android.component.home.util.RingPlayHelper;
 import com.wdkl.ncs.android.component.home.util.SpeechUtil;
 import com.wdkl.ncs.android.middleware.common.Constants;
 import com.wdkl.ncs.android.lib.vo.MessageEvent;
 
 import org.greenrobot.eventbus.EventBus;
 
+import java.util.Locale;
+
 
 public class BatteryBroadcastReceiver extends BroadcastReceiver {
     private String TAG = BatteryBroadcastReceiver.class.getSimpleName();
@@ -31,7 +37,12 @@ public class BatteryBroadcastReceiver extends BroadcastReceiver {
             int power = level * 100 / scale;
             if (power<15){
                 if (Constants.Companion.getEVENT_BATTERY_ALARM()) {
-                    SpeechUtil.getInstance().newSpeech("电池电量低,请注意!电池电量低,请注意!电池电量低,请注意!", false);
+                    String language = LocaleMangerUtils.getApplicationLocale().getLanguage();
+                    if (Locale.CHINESE.getLanguage().equals(language)) {
+                        SpeechUtil.getInstance().newSpeech("电池电量低,请注意!电池电量低,请注意!电池电量低,请注意!", false);
+                    } else {
+                        RingPlayHelper.playRingTone(context, R.raw.low_battery, false);
+                    }
                     Constants.Companion.setEVENT_BATTERY_ALARM(false);
                 }
             } else {

+ 0 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/di/HomeComponent.kt

@@ -22,8 +22,6 @@ interface HomeComponent {
 
     fun inject(activity: WatchCallRecordsActivity)
 
-    fun inject(activity: WatchEventDetailActivity)
-
     fun inject(activity: TakeoverActivity)
 
     fun inject(service: WdKeepAliveService)

+ 3 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/service/PhoneStateReceiver.java

@@ -6,6 +6,7 @@ import android.content.Intent;
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
+import com.wdkl.ncs.android.component.home.R;
 import com.wdkl.ncs.android.component.home.util.HandleTcpConnect;
 import com.wdkl.ncs.android.component.home.util.PhoneCallUtil;
 import com.wdkl.ncs.android.component.home.util.RecordHelper;
@@ -71,7 +72,7 @@ public class PhoneStateReceiver extends BroadcastReceiver {
                         }
                     }
                     //循环结束,说明来电号码不在白名单内,挂断来电
-                    showMessage("非法号码:" + extraIncomingNumber);
+                    showMessage(context.getString(R.string.invalid_phone_number, extraIncomingNumber));
                     boolean res = PhoneCallUtil.endCall(context);
                     Log.d(TAG, "end call result: " + res);
                     PhoneCallUtil.deleteCallLog(context, extraIncomingNumber);
@@ -111,7 +112,7 @@ public class PhoneStateReceiver extends BroadcastReceiver {
                         }
                     }
                     //循环结束,说明来电号码不在白名单内,挂断来电
-                    showMessage("非法号码:" + extraIncomingNumber);
+                    showMessage(context.getString(R.string.invalid_phone_number, extraIncomingNumber));
                     Constants.Companion.setPhoneState(Constants.PHONE_IDLE);
                     boolean res = PhoneCallUtil.endCall(context);
                     Log.d(TAG, "end call result: " + res);

+ 35 - 12
home/src/main/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt

@@ -45,6 +45,7 @@ import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.utils.CommonUtils
 import com.wdkl.ncs.android.middleware.utils.ContactHelper
+import com.wdkl.ncs.android.middleware.utils.StringUtil
 import com.wdkl.ncs.keepbackground.work.AbsWorkService
 import com.wdkl.rtc.rtc.AudioFocusManager
 import org.greenrobot.eventbus.EventBus
@@ -81,6 +82,8 @@ class WdKeepAliveService : AbsWorkService() {
     private var running = true
     private var playThread: ImPlayThread? = null
 
+    private var language = "zh"
+
     private var warningTips = false
     private val keepHandler: Handler = object : Handler(Looper.getMainLooper()) {
         override fun handleMessage(msg: Message) {
@@ -138,6 +141,8 @@ class WdKeepAliveService : AbsWorkService() {
         initMediaSession()
 
         //setDefaultLauncher()
+
+        language = LocaleMangerUtils.getApplicationLocale().language
     }
 
     private fun setDefaultLauncher() {
@@ -382,7 +387,11 @@ class WdKeepAliveService : AbsWorkService() {
                                 }
 
                                 Util.wakeUpAndUnlock()
-                                SoundPoolManager.getInstance().playSound(1)
+                                if (Locale.CHINESE.getLanguage().equals(language)) {
+                                    SoundPoolManager.getInstance().playSound(1)
+                                } else {
+                                    SoundPoolManager.getInstance().playSound(4)
+                                }
 
                                 val intent = Intent()
                                 intent.setClass(this, NewEventListActivity::class.java)
@@ -516,9 +525,9 @@ class WdKeepAliveService : AbsWorkService() {
                     }
 
                     if (!Strings.isNullOrEmpty(sosInteractionVO.toRoleName)) {
-                        showMessage(sosInteractionVO.toRoleName + " " + sosInteractionVO.toMemberName + " 已响应")
+                        showMessage(sosInteractionVO.toRoleName + " " + sosInteractionVO.toMemberName + " " + StringUtil.getResString(R.string.event_responded))
                     } else {
-                        showMessage("已响应")
+                        showMessage(R.string.event_responded)
                     }
 
                     var iterator = Constants.eventList.iterator()
@@ -684,7 +693,11 @@ class WdKeepAliveService : AbsWorkService() {
 
     private fun eventSpeechOut(model: TcpModel) {
         if (model.type == TcpType.IM && model.action == TcpAction.IMAction.MSG) {
-            SoundPoolManager.getInstance().playSound(1)
+            if (Locale.CHINESE.getLanguage().equals(language)) {
+                SoundPoolManager.getInstance().playSound(1)
+            } else {
+                SoundPoolManager.getInstance().playSound(4)
+            }
             return
         }
 
@@ -705,7 +718,11 @@ class WdKeepAliveService : AbsWorkService() {
             val eventStr = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ",")) + ", " + interactionVO.data
 
             if (Constants.ttsState == 2) {
-                SpeechUtil.getInstance().newSpeech("您有新的事件待处理, " + eventStr, false)
+                if (Locale.CHINESE.getLanguage().equals(language)) {
+                    SpeechUtil.getInstance().newSpeech("您有新的事件待处理, " + eventStr, false)
+                } else {
+                    RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
+                }
             } else {
                 //MediaPlayHelper.getInstance().playResMusic(R.raw.new_event, 1.0f, false)
                 RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.new_event, false)
@@ -716,7 +733,8 @@ class WdKeepAliveService : AbsWorkService() {
                 RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.sos, false)
             }
         } else if (model.type == TcpType.EVENT && model.action == TcpAction.EventAction.CANCEL) { // 事件取消
-            val eventStr = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ",")) + ",已取消 " + interactionVO.data + "事件"
+            val eventStr = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ",")) + ", " +
+                    interactionVO.data + StringUtil.getResString(R.string.str_event_cancel)
 
             if (Constants.ttsState == 2) {
                 SpeechUtil.getInstance().newSpeech(eventStr, false)
@@ -727,7 +745,8 @@ class WdKeepAliveService : AbsWorkService() {
                 }
             }
         } else if (model.type == TcpType.EVENT && model.action == TcpAction.EventAction.COMPLETED) { //事件完成
-            val eventStr = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ",")) + ", " + interactionVO.data + "事件已完成"
+            val eventStr = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ",")) + ", " +
+                    interactionVO.data + StringUtil.getResString(R.string.str_event_done)
 
             if (Constants.ttsState == 2) {
                 SpeechUtil.getInstance().newSpeech(eventStr, false)
@@ -754,7 +773,7 @@ class WdKeepAliveService : AbsWorkService() {
     private fun playVoiceMsg(interactionVO: InteractionVO) {
         //synchronized(this) {
             //channelImList.clear()
-            showMessage("播放留言...")
+            showMessage(R.string.str_voice_msg_play)
             MediaPlayHelper.getInstance().stopMusic(true)
             SoundPoolManager.getInstance().playSound(4)
             MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url + interactionVO.data, 1f, false)
@@ -873,12 +892,12 @@ class WdKeepAliveService : AbsWorkService() {
                                     else if (!DeviceChannel.calling && Constants.allowVoiceMsg && !TextUtils.isEmpty(Constants.userName)) {
                                         if (SettingConfig.getImChannel(BaseApplication.appContext) == SettingConfig.IM_CHANNEL_ON) {
                                             if (Constants.channelId == -1) {
-                                                showMessage("请先建立频道")
+                                                showMessage(R.string.str_im_no_channel)
                                             } else {
                                                 RecordHelper.getInstance().execRecordVoiceMsg()
                                             }
                                         } else {
-                                            showMessage("未开启按键留言")
+                                            showMessage(R.string.str_im_no_media_button)
                                         }
                                     } else {
                                         if (SettingConfig.getImChannel(BaseApplication.appContext) == SettingConfig.IM_CHANNEL_ON) {
@@ -891,9 +910,13 @@ class WdKeepAliveService : AbsWorkService() {
                                                 if (!warningTips) {
                                                     warningTips = true
                                                     keepHandler.sendEmptyMessageDelayed(0, 3000)
-                                                    SoundPoolManager.getInstance().playSound(5)
+                                                    if (Locale.CHINESE.getLanguage().equals(language)) {
+                                                        SoundPoolManager.getInstance().playSound(5)
+                                                    } else {
+                                                        SoundPoolManager.getInstance().playSound(6)
+                                                    }
                                                 }
-                                                showMessage("请使用屏幕按钮留言")
+                                                showMessage(R.string.str_im_media_button_unuseful)
                                             }
                                         }
                                     }

+ 21 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/settingconfig/SettingConfig.java

@@ -24,6 +24,27 @@ public class SettingConfig {
     public static final int IM_CHANNEL_ON = 1;
     public static final int IM_CHANNEL_OFF = 2;
 
+    //默认语言
+    private static final String KEY_LANGUAGE_ID = "KEY_LANGUAGE_ID";
+    private static final String KEY_LANGUAGE_MODE = "KEY_LANGUAGE_MODE";
+
+    public static int getLanguageId(Context context) {
+        //0--auto, 1--English, 2--中文, 3--西班牙语, 4--俄语
+        return getSP(context).getInt(KEY_LANGUAGE_ID, 0);
+    }
+
+    public static void setLanguageId(Context context, int id) {
+        getEditor(context).putInt(KEY_LANGUAGE_ID, id).apply();
+    }
+
+    public static int getLanguageMode(Context context) {
+        return getSP(context).getInt(KEY_LANGUAGE_MODE, 0);
+    }
+
+    public static void setLanguageMode(Context context, int mode) {
+        getEditor(context).putInt(KEY_LANGUAGE_MODE, mode).apply();
+    }
+
 
     /**
      * 获取转发时间

+ 8 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/ui/CallSingleActivity.java

@@ -29,9 +29,11 @@ import com.enation.javashop.utils.base.widget.LoadingDialog;
 import com.google.gson.Gson;
 import com.wdkl.ncs.android.component.home.R;
 import com.wdkl.ncs.android.component.home.service.FloatingService;
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig;
 import com.wdkl.ncs.android.component.home.util.ActivityStackUtil;
 import com.wdkl.ncs.android.component.home.util.HandleTcpConnect;
 import com.wdkl.ncs.android.component.home.util.HomeWatcher;
+import com.wdkl.ncs.android.component.home.util.LocaleMangerUtils;
 import com.wdkl.ncs.android.component.home.util.LogUpload;
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper;
 import com.wdkl.ncs.android.component.home.util.RecordHelper;
@@ -107,6 +109,10 @@ public class CallSingleActivity extends AppCompatActivity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
+        //切换语言
+        int languageId = SettingConfig.getLanguageId(this);
+        LocaleMangerUtils.setApplicationLanguageByIndex(this, languageId);
+
         super.onCreate(savedInstanceState);
         setStatusBarOrScreenStatus(this);
         setContentView(R.layout.activity_single_call);
@@ -137,7 +143,7 @@ public class CallSingleActivity extends AppCompatActivity {
             perms = new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA};
         }
         if (!EasyPermissions.hasPermissions(CallSingleActivity.this, perms)) {
-            EasyPermissions.requestPermissions(CallSingleActivity.this, "需要相机和录音权限",
+            EasyPermissions.requestPermissions(CallSingleActivity.this, "need record, camera permissions",
                     100, perms);
         } else {
             //初始化 engine
@@ -175,7 +181,7 @@ public class CallSingleActivity extends AppCompatActivity {
         //先检查权限
         if (Build.VERSION.SDK_INT >= 23) {
             if (!Settings.canDrawOverlays(this)) {
-                Toast.makeText(CallSingleActivity.this, "请开启悬浮窗权限", Toast.LENGTH_LONG).show();
+                Toast.makeText(CallSingleActivity.this, "need floating window permission", Toast.LENGTH_LONG).show();
                 return;
             }
         }

+ 4 - 3
home/src/main/code/com/wdkl/ncs/android/component/home/ui/FragmentAudio.java

@@ -25,6 +25,7 @@ import com.wdkl.ncs.android.middleware.model.vo.InteractionVO;
 import com.wdkl.ncs.android.middleware.tcp.NettyClient;
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
+import com.wdkl.ncs.android.middleware.utils.StringUtil;
 import com.wdkl.rtc.entity.Publisher;
 import com.wdkl.rtc.entity.Room;
 import com.wdkl.rtc.rtc.WebRTCEngine;
@@ -98,12 +99,12 @@ public class FragmentAudio extends SingleCallFragment implements View.OnClickLis
         } else {
             // 如果未接通
             if (isOutgoing) {
-                descTextView.setText("正在向 "+getShowName()+" 请求通话");
+                descTextView.setText(getShowName() + "\n" + StringUtil.getResString(R.string.call_in_calling));
                 outgoingActionContainer.setVisibility(View.VISIBLE);
                 incomingActionContainer.setVisibility(View.GONE);
                 //MediaPlayHelper.getInstance().playResMusic(R.raw.outgoing_call, 0.8f, true);
             } else {
-                descTextView.setText(getShowName() + " 请求通话");
+                descTextView.setText(getShowName() + "\n" + StringUtil.getResString(R.string.call_incoming));
                 outgoingActionContainer.setVisibility(View.GONE);
                 incomingActionContainer.setVisibility(View.VISIBLE);
             }
@@ -246,7 +247,7 @@ public class FragmentAudio extends SingleCallFragment implements View.OnClickLis
                 }
             } else if (msg.what == CHECK) {
                 if (callSingleActivity!=null && callSingleActivity.janusClient.getCallState()!= EnumType.CallState.Connected && !isHandoff){
-                    Toast.makeText(callSingleActivity, "通话连接失败", Toast.LENGTH_LONG).show();
+                    Toast.makeText(callSingleActivity, R.string.call_disconnect, Toast.LENGTH_LONG).show();
                 }
             } else if (msg.what == CALL) {
                 currentState = callSingleActivity.janusClient.getCallState();

+ 15 - 15
home/src/main/code/com/wdkl/ncs/android/component/home/ui/SingleCallFragment.java

@@ -222,13 +222,13 @@ public abstract class SingleCallFragment extends Fragment {
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                Toast.makeText(SingleCallFragment.this.getContext(), "呼叫成功", Toast.LENGTH_SHORT).show();
+                Toast.makeText(SingleCallFragment.this.getContext(), R.string.call_success, Toast.LENGTH_SHORT).show();
             }
         });
     }
 
     // ======================================界面回调================================
-    public void didCallEndWithReason(EnumType.CallEndReason callEndReason) {
+    /*public void didCallEndWithReason(EnumType.CallEndReason callEndReason) {
         switch (callEndReason) {
             case Busy: {
                 tvStatus.setText("对方忙线中");
@@ -278,7 +278,7 @@ public abstract class SingleCallFragment extends Fragment {
             }
 
         }, 11);
-    }
+    }*/
 
     public void didChangeState(EnumType.CallState state) {
 
@@ -352,7 +352,7 @@ public abstract class SingleCallFragment extends Fragment {
                     break;
                 case WHAT_DELAY_CHECK_CALL:
                     if (callSingleActivity != null && !callSuccess) {
-                        Toast.makeText(SingleCallFragment.this.getContext(), "服务器无响应,请检查网络状态!", Toast.LENGTH_SHORT).show();
+                        Toast.makeText(SingleCallFragment.this.getContext(), R.string.net_error, Toast.LENGTH_SHORT).show();
                     }
                     break;
                 case FINISH_CURRENT:
@@ -412,7 +412,7 @@ public abstract class SingleCallFragment extends Fragment {
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
-                        Toast.makeText(SingleCallFragment.this.getContext(),"对方已离开",Toast.LENGTH_SHORT).show();
+                        Toast.makeText(SingleCallFragment.this.getContext(),R.string.call_end,Toast.LENGTH_SHORT).show();
                     }
                 });
             }
@@ -428,7 +428,7 @@ public abstract class SingleCallFragment extends Fragment {
             runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
-                    Toast.makeText(SingleCallFragment.this.getContext(), "创建通话错误", Toast.LENGTH_SHORT).show();
+                    Toast.makeText(SingleCallFragment.this.getContext(), "Room error", Toast.LENGTH_SHORT).show();
                 }
             });
 
@@ -442,7 +442,7 @@ public abstract class SingleCallFragment extends Fragment {
             runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
-                    Toast.makeText(SingleCallFragment.this.getContext(), "连接超时", Toast.LENGTH_SHORT).show();
+                    Toast.makeText(SingleCallFragment.this.getContext(), "Connect timeout", Toast.LENGTH_SHORT).show();
                 }
             });
 
@@ -458,7 +458,7 @@ public abstract class SingleCallFragment extends Fragment {
                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
-                            Toast.makeText(SingleCallFragment.this.getContext(), "连接超时,请重试", Toast.LENGTH_SHORT).show();
+                            Toast.makeText(SingleCallFragment.this.getContext(), "Connect timeout", Toast.LENGTH_SHORT).show();
                         }
                     });
 
@@ -479,7 +479,7 @@ public abstract class SingleCallFragment extends Fragment {
             runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
-                    Toast.makeText(SingleCallFragment.this.getContext(), "对方离开", Toast.LENGTH_SHORT).show();
+                    Toast.makeText(SingleCallFragment.this.getContext(), R.string.call_end, Toast.LENGTH_SHORT).show();
                 }
             });
 
@@ -489,7 +489,7 @@ public abstract class SingleCallFragment extends Fragment {
             runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
-                    Toast.makeText(SingleCallFragment.this.getContext(), "网络情况差", Toast.LENGTH_SHORT).show();
+                    Toast.makeText(SingleCallFragment.this.getContext(), R.string.net_error, Toast.LENGTH_SHORT).show();
                 }
             });
         }
@@ -519,7 +519,7 @@ public abstract class SingleCallFragment extends Fragment {
                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
-                            Toast.makeText(SingleCallFragment.this.getContext(), "对方挂断", Toast.LENGTH_SHORT).show();
+                            Toast.makeText(SingleCallFragment.this.getContext(), R.string.call_end, Toast.LENGTH_SHORT).show();
                         }
                     });
 
@@ -532,7 +532,7 @@ public abstract class SingleCallFragment extends Fragment {
                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
-                            Toast.makeText(SingleCallFragment.this.getContext(), "对方拒绝", Toast.LENGTH_SHORT).show();
+                            Toast.makeText(SingleCallFragment.this.getContext(), R.string.call_reject, Toast.LENGTH_SHORT).show();
                         }
                     });
                 }
@@ -542,7 +542,7 @@ public abstract class SingleCallFragment extends Fragment {
                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
-                            Toast.makeText(SingleCallFragment.this.getContext(), "对方通话中", Toast.LENGTH_SHORT).show();
+                            Toast.makeText(SingleCallFragment.this.getContext(), R.string.call_busy, Toast.LENGTH_SHORT).show();
                         }
                     });
                 }
@@ -552,7 +552,7 @@ public abstract class SingleCallFragment extends Fragment {
                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
-                            Toast.makeText(SingleCallFragment.this.getContext(), "呼叫失败,对方可能不在线", Toast.LENGTH_SHORT).show();
+                            Toast.makeText(SingleCallFragment.this.getContext(), R.string.call_failed, Toast.LENGTH_SHORT).show();
                         }
                     });
                 //}
@@ -562,7 +562,7 @@ public abstract class SingleCallFragment extends Fragment {
                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
-                            Toast.makeText(SingleCallFragment.this.getContext(), "取消", Toast.LENGTH_SHORT).show();
+                            Toast.makeText(SingleCallFragment.this.getContext(), R.string.str_cancel, Toast.LENGTH_SHORT).show();
                         }
                     });
                 }

+ 140 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/LanguageSetDialogHelper.java

@@ -0,0 +1,140 @@
+package com.wdkl.ncs.android.component.home.util;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.os.Handler;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.Spinner;
+import android.widget.Toast;
+
+import com.wdkl.ncs.android.component.home.R;
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig;
+
+
+public class LanguageSetDialogHelper {
+
+    private static AlertDialog dialog;
+    private static int selectIndex;
+
+    public static void showDialog(final Activity activity) {
+        if (dialog != null && dialog.isShowing()) {
+            return;
+        }
+
+        final int originIndex = LocaleMangerUtils.getCurrentLocaleIndex();
+        selectIndex = originIndex;
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.language_set_dialog, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        RadioButton btnYes = contentView.findViewById(R.id.rb_language_yes);
+        RadioButton btnNo = contentView.findViewById(R.id.rb_language_no);
+        final int mode = SettingConfig.getLanguageMode(activity);
+        if (mode == 0) {
+            btnYes.setChecked(true);
+        } else {
+            btnNo.setChecked(true);
+        }
+
+        Button buttonCancel = contentView.findViewById(R.id.cancel_button);
+        Button buttonConfirm = contentView.findViewById(R.id.confirm_button);
+        Spinner spinner = contentView.findViewById(R.id.spinner_language_select);
+        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(activity,
+                R.array.language_list, R.layout.spinner_item);
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        spinner.setAdapter(adapter);
+        spinner.setSelection(originIndex);
+        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                Log.d("languageId", "pos: " + position + ", originIndex: " + originIndex);
+                selectIndex = position;
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+
+            }
+        });
+
+        RadioGroup languageGroup = contentView.findViewById(R.id.group_language_mode);
+        languageGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup group, int checkedId) {
+                if (checkedId == R.id.rb_language_yes) {
+                    SettingConfig.setLanguageMode(activity, 0);
+                } else {
+                    SettingConfig.setLanguageMode(activity, 1);
+                }
+            }
+        });
+
+        buttonCancel.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (dialog != null) {
+                    dialog.dismiss();
+                }
+            }
+        });
+
+        buttonConfirm.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                SettingConfig.setLanguageId(activity, selectIndex);
+
+                if (SettingConfig.getLanguageMode(activity) == 1) {
+                    if (selectIndex != originIndex) {
+                        Toast.makeText(activity, "restart now...", Toast.LENGTH_LONG).show();
+                        new Handler().postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                AppUtils.restartApp();
+                            }
+                        }, 3000);
+                    }
+                } else {
+                    Toast.makeText(activity, "restart now...", Toast.LENGTH_LONG).show();
+                    new Handler().postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            AppUtils.restartApp();
+                        }
+                    }, 3000);
+                }
+
+                if (dialog != null) {
+                    dialog.dismiss();
+                }
+            }
+        });
+
+        dialog = builder.create();
+        //dialog.setCanceledOnTouchOutside(false);
+        //dialog.setCancelable(false);
+        dialog.show();
+
+        //设置dialog宽高及位置
+        try {
+            Window window = dialog.getWindow();
+            WindowManager.LayoutParams lp = window.getAttributes();
+            lp.width = 480;
+            lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
+            lp.gravity = Gravity.CENTER;
+            window.setAttributes(lp);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 83 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/LocaleMangerUtils.java

@@ -0,0 +1,83 @@
+package com.wdkl.ncs.android.component.home.util;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.os.Build;
+import android.util.DisplayMetrics;
+import android.util.Log;
+
+import androidx.annotation.RequiresApi;
+
+import com.wdkl.ncs.android.component.home.R;
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig;
+import com.wdkl.ncs.android.lib.base.BaseApplication;
+
+import java.util.Locale;
+
+public class LocaleMangerUtils {
+
+    public static Locale getSystemLocale() {
+        return Locale.getDefault();
+    }
+
+    //获取当前语言id: 0--auto, 1--English, 2--中文, 3--西班牙语, 4--俄语
+    public static int getCurrentLocaleIndex() {
+        int languageSize = BaseApplication.appContext.getResources().getStringArray(R.array.language_list).length;
+        int index = SettingConfig.getLanguageId(BaseApplication.appContext);
+        //Log.d("wzl", "current language index: " + index);
+        if (index >= 0 && index <languageSize) {
+            return index;
+        } else {
+            return 0;
+        }
+    }
+
+    public static void setApplicationLanguageByIndex(Context context, int index) {
+        Locale locale = Locale.getDefault();
+        switch (index) {
+            case 0:
+                //
+                break;
+            case 1:
+                locale = Locale.ENGLISH;
+                break;
+            case 2:
+                locale = Locale.CHINESE;
+                break;
+            case 3:
+                locale = new Locale("es");
+                break;
+            case 4:
+                locale = new Locale("ru");
+                break;
+        }
+
+        setApplicationLanguage(context, locale);
+    }
+
+    public static void setApplicationLanguage(Context context, Locale locale) {
+        Log.d("locale", "set locale language: " + locale.getLanguage());
+        Configuration configuration = context.getResources().getConfiguration();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            configuration.setLocale(locale);
+        } else {
+            configuration.locale = locale;
+        }
+        // 更新context中的语言设置
+        Resources resources = context.getResources();
+        DisplayMetrics dm = resources.getDisplayMetrics();
+        resources.updateConfiguration(configuration, dm);
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.N)
+    public static Locale getApplicationLocale() {
+        Configuration config = BaseApplication.appContext.getResources().getConfiguration();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            return config.locale;
+        } else {
+            return config.getLocales().get(0);
+        }
+    }
+
+}

+ 28 - 12
home/src/main/code/com/wdkl/ncs/android/component/home/util/RecordHelper.java

@@ -14,8 +14,10 @@ import android.util.Log;
 
 import androidx.annotation.NonNull;
 
+import com.wdkl.ncs.android.component.home.R;
 import com.wdkl.ncs.android.component.home.helper.HttpHelper;
 import com.wdkl.ncs.android.component.home.service.WdKeepAliveService;
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig;
 import com.wdkl.ncs.android.lib.base.BaseApplication;
 import com.wdkl.ncs.android.lib.vo.MessageEvent;
 import com.wdkl.ncs.android.middleware.common.Constants;
@@ -30,6 +32,7 @@ import org.greenrobot.eventbus.EventBus;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Locale;
 
 import static com.wdkl.ncs.android.lib.utils.ExtendMethodsKt.showMessage;
 
@@ -49,6 +52,7 @@ public class RecordHelper {
     private AudioManager audioManager;
     private boolean uploading = false;
     private int retry = 0;
+    private String language = "zh";
 
     private final static Object lock = new Object();
 
@@ -84,6 +88,8 @@ public class RecordHelper {
     }
 
     public void startRecord() {
+        language = LocaleMangerUtils.getApplicationLocale().getLanguage();
+
         //如果正在录音则先停止录音
         if (recording) {
             stopRecord();
@@ -148,7 +154,7 @@ public class RecordHelper {
     //耳机线控按键双击留言,单击结束
     public void execRecordVoiceMsg() {
         if (uploading) {
-            showMessage("留言上传中");
+            showMessage("voice msg uploading...");
             SoundPoolManager.getInstance().playSound(6);
             return;
         }
@@ -156,14 +162,18 @@ public class RecordHelper {
         //连续点击2次开始留言
         long curTime = System.currentTimeMillis();
         if (!recordRunning && curTime - clickTime > 200 && curTime - clickTime < 1500 && curTime - pressDownTime > 3500 && curTime - pressUpTime > 2500) {
-            showMessage("开始留言");
+            showMessage(R.string.str_voice_msg_start);
             //先停止其他语音或铃声
             RingPlayHelper.stopRingTone();
             SpeechUtil.getInstance().stopSpeak();
             MediaPlayHelper.getInstance().stopMusic(true);
             //EventBus.getDefault().post(new MessageEvent(false, Constants.EVENT_CLEAR_IM));
             //播放提示
-            SoundPoolManager.getInstance().playSound(2);
+            if (Locale.CHINESE.getLanguage().equals(language)) {
+                SoundPoolManager.getInstance().playSound(2);
+            } else {
+                SoundPoolManager.getInstance().playSound(7);
+            }
             recordRunning = true;
             pressDownTime = curTime;
             handler.removeCallbacksAndMessages(null);
@@ -175,7 +185,7 @@ public class RecordHelper {
                 stopRecord();
                 if (Math.abs(pressUpTime - pressDownTime) <= 2000) {
                     deleteAudioFile(audiofilePath);
-                    showMessage("说话时间太短");
+                    showMessage(R.string.str_voice_msg_record_loss);
                     SoundPoolManager.getInstance().playSound(6);
                 } else {
                     sendChannelVoiceMsg(audiofilePath);
@@ -201,7 +211,11 @@ public class RecordHelper {
             MediaPlayHelper.getInstance().stopMusic(true);
             //EventBus.getDefault().post(new MessageEvent(false, Constants.EVENT_CLEAR_IM));
             //播放提示
-            SoundPoolManager.getInstance().playSound(2);
+            if (Locale.CHINESE.getLanguage().equals(language)) {
+                SoundPoolManager.getInstance().playSound(2);
+            } else {
+                SoundPoolManager.getInstance().playSound(7);
+            }
             recordRunning = true;
             pressDownTime = timeMillis;
             handler.removeCallbacksAndMessages(null);
@@ -213,7 +227,7 @@ public class RecordHelper {
                 stopRecord();
                 if (Math.abs(pressUpTime - pressDownTime) <= 2000) {
                     deleteAudioFile(audiofilePath);
-                    showMessage("说话时间太短");
+                    showMessage(R.string.str_voice_msg_record_loss);
                     SoundPoolManager.getInstance().playSound(6);
                 } else {
                     sendChannelVoiceMsg(audiofilePath);
@@ -251,7 +265,7 @@ public class RecordHelper {
                     if (uploading) {
                         uploading = false;
                         retry = 0;
-                        handler.post(() -> showMessage("群留言失败!"));
+                        handler.post(() -> showMessage(R.string.str_voice_msg_send_fail));
                     }
                 }
             }).start();
@@ -275,7 +289,9 @@ public class RecordHelper {
                 retry = 0;
                 //上传完成后删除本地文件
                 deleteAudioFile(file);
-                SoundPoolManager.getInstance().playSound(3);
+                if (Locale.CHINESE.getLanguage().equals(language)) {
+                    SoundPoolManager.getInstance().playSound(3);
+                }
                 ChannelImDO channelImDO = new ChannelImDO();
                 channelImDO.setChannelId(Constants.Companion.getChannelId());
                 channelImDO.setSenderMemberId(Constants.Companion.getMemberId());
@@ -284,9 +300,9 @@ public class RecordHelper {
                 NettyClient.Companion.getInstance().sendMsg(tcpModel.toJson()).subscribe(it -> {
                     handler.post(() -> {
                         if (it) {
-                            showMessage("留言发送成功!");
+                            showMessage(R.string.str_voice_msg_send_success);
                         } else {
-                            showMessage("留言发送失败!");
+                            showMessage(R.string.str_voice_msg_send_fail);
                         }
                     });
                 });
@@ -302,12 +318,12 @@ public class RecordHelper {
             recordRunning = false;
 
             if (cancel) {
-                showMessage("留言取消");
+                showMessage(R.string.str_voice_msg_record_cancel);
                 deleteAudioFile(audiofilePath);
             } else {
                 if (Math.abs(pressUpTime - pressDownTime) <= 2000) {
                     deleteAudioFile(audiofilePath);
-                    showMessage("说话时间太短");
+                    showMessage(R.string.str_voice_msg_record_loss);
                     SoundPoolManager.getInstance().playSound(6);
                 } else {
                     sendChannelVoiceMsg(audiofilePath);

+ 3 - 3
home/src/main/code/com/wdkl/ncs/android/component/home/util/ServerConfigDialogHelper.java

@@ -64,7 +64,7 @@ public class ServerConfigDialogHelper {
                 } else {
                     pwd = "";
                     password.setText(pwd);
-                    password.setHint("请输入密码");
+                    password.setHint(R.string.input_password);
                 }
             }
         });
@@ -83,7 +83,7 @@ public class ServerConfigDialogHelper {
                     llPwd.setVisibility(View.GONE);
                     llServer.setVisibility(View.VISIBLE);
                 } else {
-                    Toast.makeText(activity, "密码错误", Toast.LENGTH_SHORT).show();
+                    Toast.makeText(activity, R.string.invalid_password, Toast.LENGTH_SHORT).show();
                 }
             }
         });
@@ -104,7 +104,7 @@ public class ServerConfigDialogHelper {
                 String url = editUrl.getText().toString();
                 String port = editPort.getText().toString();
                 if (TextUtils.isEmpty(url) || TextUtils.isEmpty(port)) {
-                    ExtendMethodsKt.showMessage("参数不能为空");
+                    ExtendMethodsKt.showMessage(R.string.input_empty);
                 } else {
                     //保存配置
                     CommonUtils.setUrl(BaseApplication.appContext, url);

+ 3 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/util/SoundPoolManager.java

@@ -28,7 +28,7 @@ public class SoundPoolManager {
         if(Build.VERSION.SDK_INT > 21){
             SoundPool.Builder builder = new SoundPool.Builder();
             //传入音频数量
-            builder.setMaxStreams(6);
+            builder.setMaxStreams(7);
             //AudioAttributes是一个封装音频各种属性的方法
             AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
             //设置音频流的合适的属性
@@ -37,7 +37,7 @@ public class SoundPoolManager {
             builder.setAudioAttributes(attrBuilder.build());
             soundPool = builder.build();
         }else{
-            soundPool = new SoundPool(6, AudioManager.STREAM_SYSTEM, 0);
+            soundPool = new SoundPool(7, AudioManager.STREAM_SYSTEM, 0);
         }
 
         soundID.put(1, soundPool.load(BaseApplication.appContext, R.raw.new_msg, 1));
@@ -46,6 +46,7 @@ public class SoundPoolManager {
         soundID.put(4, soundPool.load(BaseApplication.appContext, R.raw.ding, 1));
         soundID.put(5, soundPool.load(BaseApplication.appContext, R.raw.im_disable, 1));
         soundID.put(6, soundPool.load(BaseApplication.appContext, R.raw.dong, 1));
+        soundID.put(7, soundPool.load(BaseApplication.appContext, R.raw.im_start, 1));
 
         soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
             @Override

+ 2 - 2
home/src/main/res/layout/activity_app_update.xml

@@ -13,7 +13,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerInParent="true"
-            android:text="正在升级中,请勿操作..."
+            android:text="@string/updating"
             android:textColor="#3D3D63"
             android:textSize="18sp" />
 
@@ -29,7 +29,7 @@
             app:isShowDesc="false"
             app:max="100"
             app:progress="0"
-            app:progressDesc="进度:"
+            app:progressDesc="progress:"
             app:progressRadius="10dp" />
 
     </RelativeLayout>

+ 1 - 1
home/src/main/res/layout/activity_channel_im_list.xml

@@ -36,7 +36,7 @@
                 android:id="@+id/tv_channel_text"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="按住说话"
+                android:text="@string/str_voice_msg_btn_text"
                 android:textColor="#B4B4B4"
                 android:textSize="16sp"/>
 

+ 2 - 2
home/src/main/res/layout/activity_sip_voip_audio.xml

@@ -24,7 +24,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="房号"
+            android:text=""
             android:textSize="18sp" />
         <TextView
             android:id="@+id/bao_mother_name_tv"
@@ -32,7 +32,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="宝妈名字"
+            android:text=""
             android:textSize="20sp" />
 
     </LinearLayout>

+ 3 - 3
home/src/main/res/layout/activity_sip_voip_audio_ringing.xml

@@ -23,7 +23,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="房号"
+            android:text=""
             android:textSize="18sp" />
         <TextView
             android:id="@+id/bao_mother_name_tv"
@@ -31,7 +31,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="宝妈名字"
+            android:text=""
             android:textSize="20sp" />
 
         <TextView
@@ -82,7 +82,7 @@
                 android:layout_centerInParent="true"
                 android:textSize="14dp"
                 android:textColor="#ffffff"
-                android:text="转接"/>
+                android:text=""/>
 
         </RelativeLayout>
         <ImageView

+ 1 - 1
home/src/main/res/layout/activity_sos_emergency_call.xml

@@ -26,7 +26,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="宝妈名字"
+            android:text=""
             android:textSize="20sp" />
 
         <TextView

+ 1 - 1
home/src/main/res/layout/activity_takeover.xml

@@ -11,7 +11,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             app:iconifiedByDefault="false"
-            app:queryHint="搜索" />
+            app:queryHint="@string/str_search" />
 
         <TextView
             android:id="@+id/tv_empty_takeover"

+ 1 - 1
home/src/main/res/layout/activity_voice_msg.xml

@@ -29,7 +29,7 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="20dp"
         android:gravity="center"
-        android:text="按住说话"
+        android:text="@string/str_voice_msg_btn_text"
         android:textColor="#B4B4B4"
         android:textSize="28dp"/>
 </LinearLayout>

+ 2 - 2
home/src/main/res/layout/activity_web_rtc_voip_audio.xml

@@ -25,7 +25,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="房号"
+            android:text=""
             android:textSize="18sp" />
         <TextView
             android:id="@+id/bao_mother_name_tv"
@@ -33,7 +33,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="宝妈名字"
+            android:text=""
             android:textSize="20sp" />
 
     </LinearLayout>

+ 3 - 3
home/src/main/res/layout/activity_web_rtc_voip_audio_ringing.xml

@@ -24,7 +24,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="房号"
+            android:text=""
             android:textSize="18sp" />
         <TextView
             android:id="@+id/bao_mother_name_tv"
@@ -32,7 +32,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="宝妈名字"
+            android:text=""
             android:textSize="20sp" />
 
         <TextView
@@ -83,7 +83,7 @@
                 android:layout_centerInParent="true"
                 android:textSize="14dp"
                 android:textColor="#ffffff"
-                android:text="转接"/>
+                android:text=""/>
 
         </RelativeLayout>
         <ImageView

+ 2 - 2
home/src/main/res/layout/adapter_client_list.xml

@@ -13,7 +13,7 @@
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
             android:layout_marginLeft="13px"
-            android:text="玫瑰房"
+            android:text=""
             android:textColor="#F78B8F"
             android:textSize="16px" />
 
@@ -24,7 +24,7 @@
             android:layout_centerVertical="true"
             android:layout_marginLeft="20px"
             android:layout_toRightOf="@+id/room_number_tv"
-            android:text="张女士"
+            android:text=""
             android:textColor="#F78B8F"
             android:textSize="16px" />
 

+ 10 - 9
home/src/main/res/layout/adapter_watch_contacts_item.xml

@@ -21,7 +21,7 @@
                 android:layout_height="wrap_content"
                 android:layout_centerVertical="true"
                 android:layout_marginLeft="5dp"
-                android:text="玫瑰房"
+                android:text=""
                 android:textColor="@color/header"
                 android:textSize="12dp" />
 
@@ -32,7 +32,7 @@
                 android:layout_centerVertical="true"
                 android:layout_marginLeft="5dp"
                 android:layout_toRightOf="@+id/room_number_tv"
-                android:text="张女士"
+                android:text=""
                 android:textColor="#F78B8F"
                 android:textSize="16dp" />
 
@@ -40,21 +40,22 @@
                 android:id="@+id/awci_voice_recorder"
                 android:src="@drawable/voice_recorder"
                 android:layout_toLeftOf="@+id/awci_btn_call_out"
-                android:layout_marginEnd="15dp"
+                android:layout_marginEnd="10dp"
                 android:layout_centerVertical="true"
-                android:layout_width="35dp"
+                android:layout_width="32dp"
                 android:layout_height="22dp"/>
             <Button
                 android:id="@+id/awci_btn_call_out"
-                android:layout_marginRight="15dp"
+                android:layout_marginRight="10dp"
                 android:layout_toLeftOf="@+id/right_arrow"
-                android:textSize="13dp"
+                android:textSize="12sp"
                 android:layout_centerVertical="true"
                 android:textColor="@color/grgray"
-                android:layout_width="38dp"
+                android:layout_width="50dp"
                 android:layout_height="22dp"
                 android:background="@drawable/javashop_btn_balck_line_bg"
-                android:text="呼叫" />
+                android:text="@string/str_call"
+                android:singleLine="true"/>
 
             <ImageView
                 android:id="@+id/right_arrow"
@@ -62,7 +63,7 @@
                 android:layout_height="wrap_content"
                 android:layout_alignParentRight="true"
                 android:layout_centerVertical="true"
-                android:layout_marginRight="10dp"
+                android:layout_marginRight="6dp"
                 android:src="@drawable/zhe_die" />
 
         </RelativeLayout>

+ 3 - 3
home/src/main/res/layout/av_p2p_audio_incoming.xml

@@ -33,7 +33,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="转接"
+                android:text=""
                 android:textColor="@android:color/white" />
 
         </LinearLayout>
@@ -57,7 +57,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="挂断"
+                android:text=""
                 android:textColor="@android:color/white" />
 
         </LinearLayout>
@@ -80,7 +80,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="接听"
+                android:text=""
                 android:textColor="@android:color/white" />
 
         </LinearLayout>

+ 3 - 3
home/src/main/res/layout/av_p2p_audio_outgoing.xml

@@ -39,7 +39,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="静音"
+                android:text="@string/str_call_mute"
                 android:textColor="@android:color/white" />
 
         </LinearLayout>
@@ -61,7 +61,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="挂断"
+                android:text="@string/str_call_handoff"
                 android:textColor="@android:color/white" />
 
         </LinearLayout>
@@ -85,7 +85,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="免提"
+                android:text="@string/str_call_speaker"
                 android:textColor="@android:color/white" />
 
         </LinearLayout>

+ 3 - 3
home/src/main/res/layout/av_p2p_video_connected_action.xml

@@ -36,7 +36,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="切到语音通话"
+                android:text="Voice"
                 android:textColor="@android:color/white" />
 
         </LinearLayout>
@@ -58,7 +58,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="挂断"
+                android:text="@string/str_call_speaker"
                 android:textColor="@android:color/white" />
 
         </LinearLayout>
@@ -81,7 +81,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="旋转摄像头"
+                android:text="Camera"
                 android:textColor="@android:color/white" />
 
         </LinearLayout>

+ 3 - 3
home/src/main/res/layout/av_p2p_video_incoming_action.xml

@@ -28,7 +28,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="10dp"
-            android:text="切换到语音接听"
+            android:text="Voice"
             android:textColor="@android:color/white" />
 
     </LinearLayout>
@@ -54,7 +54,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="10dp"
-            android:text="挂断"
+            android:text="@string/str_call_handoff"
             android:textColor="@android:color/white" />
 
     </LinearLayout>
@@ -80,7 +80,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="10dp"
-            android:text="接听"
+            android:text="@string/str_call_accept"
             android:textColor="@android:color/white" />
 
     </LinearLayout>

+ 2 - 2
home/src/main/res/layout/av_p2p_video_outgoing_action.xml

@@ -22,7 +22,7 @@
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="切换到语音"
+            android:text="Voice"
             android:textColor="@android:color/white"
             android:textSize="10sp" />
 
@@ -45,7 +45,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="5dp"
-            android:text="取消"
+            android:text="@string/str_cancel"
             android:textColor="@android:color/white"
             android:textSize="12sp" />
 

+ 1 - 1
home/src/main/res/layout/back_layout.xml

@@ -13,5 +13,5 @@
         android:gravity="center_vertical"
         android:drawableLeft="@drawable/ic_arrow_back"
         android:drawablePadding="10dp"
-        android:text="返回" />
+        android:text="Back" />
 </LinearLayout>

+ 3 - 3
home/src/main/res/layout/clerk_dialog_lay.xml

@@ -8,7 +8,7 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:gravity="center"
-        android:text="请选择处理人"
+        android:text="@string/str_select_responsible_title"
         android:textSize="20sp" />
 
     <View
@@ -33,7 +33,7 @@
             android:id="@+id/btn_select_confirm"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="确定"
+            android:text="@string/str_confirm"
             android:textSize="20sp"/>
 
         <Button
@@ -41,7 +41,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginLeft="20dp"
-            android:text="取消"
+            android:text="@string/str_cancel"
             android:textSize="20sp"/>
     </LinearLayout>
 

+ 3 - 3
home/src/main/res/layout/event_list_item.xml

@@ -35,7 +35,7 @@
                         android:layout_marginStart="3dp"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:text="房号"
+                        android:text=""
                         android:textSize="14sp"/>
 
                 </LinearLayout>
@@ -45,14 +45,14 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_marginTop="4dp"
-                    android:text="客户姓名"
+                    android:text=""
                     android:textSize="12sp"/>
                 <TextView
                     android:id="@+id/eli_event_time"
                     android:layout_marginTop="4dp"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="事件时间"
+                    android:text=""
                     android:textSize="12sp"/>
             </LinearLayout>
 

+ 1 - 1
home/src/main/res/layout/float_call_window_layout.xml

@@ -15,7 +15,7 @@
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="有通话"
+        android:text="@string/call_window_title"
         android:textSize="24sp"
         android:textColor="@color/color_red" />
 

+ 1 - 1
home/src/main/res/layout/fragment_audio.xml

@@ -41,7 +41,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="5dp"
-            android:text="邀请你进行语音通话"
+            android:text=""
             android:textColor="@android:color/white" />
     </LinearLayout>
 

+ 1 - 1
home/src/main/res/layout/fragment_video.xml

@@ -64,7 +64,7 @@
                     android:id="@+id/descTextView"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="等待对方接通..."
+                    android:text=""
                     android:textColor="@android:color/white" />
             </LinearLayout>
         </LinearLayout>

+ 2 - 2
home/src/main/res/layout/im_dialog_lay.xml

@@ -10,7 +10,7 @@
         android:layout_height="wrap_content"
         android:paddingTop="20dp"
         android:gravity="center"
-        android:text="留言中..."
+        android:text="@string/str_voice_msg_started"
         android:textSize="24sp" />
 
     <Button
@@ -18,7 +18,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="20dp"
-        android:text="结束"
+        android:text="@string/str_voice_msg_end"
         android:textSize="20sp"/>
 
 </LinearLayout>

+ 1 - 1
home/src/main/res/layout/im_play_dialog_lay.xml

@@ -37,7 +37,7 @@
         android:id="@+id/btn_im_stop"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="停止"
+        android:text="@string/str_im_stop"
         android:textSize="18sp"/>
 
 </LinearLayout>

+ 79 - 0
home/src/main/res/layout/language_set_dialog.xml

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="10dp"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/tv_language_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:text="@string/language_set_mode"
+        android:textSize="18sp" />
+
+    <RadioGroup
+        android:id="@+id/group_language_mode"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="10dp"
+        android:orientation="horizontal">
+        <RadioButton
+            android:id="@+id/rb_language_yes"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/str_yes"/>
+        <RadioButton
+            android:id="@+id/rb_language_no"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="4dp"
+            android:text="@string/str_no"/>
+    </RadioGroup>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:text="@string/language_set_title"
+            android:textSize="18sp" />
+
+        <Spinner
+            android:id="@+id/spinner_language_select"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"/>
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:gravity="center_horizontal"
+        android:orientation="vertical">
+        <Button
+            android:id="@+id/confirm_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="8dp"
+            android:text="@string/str_confirm"
+            android:textSize="18sp" />
+
+        <Button
+            android:id="@+id/cancel_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="8dp"
+            android:text="@string/str_cancel"
+            android:textSize="18sp" />
+    </LinearLayout>
+
+</LinearLayout>

+ 6 - 6
home/src/main/res/layout/server_config_dialog_lay.xml

@@ -17,7 +17,7 @@
             android:layout_height="wrap_content"
             android:gravity="center"
             android:textSize="16sp"
-            android:hint="请输入密码"
+            android:hint="@string/input_password"
             android:textColor="@color/main_color"/>
 
         <GridView
@@ -41,7 +41,7 @@
                 android:layout_weight="1"
                 android:padding="4dp"
                 android:gravity="center_horizontal"
-                android:text="删除"
+                android:text="@string/str_delete"
                 android:textSize="16sp"
                 android:textColor="@color/main_color"/>
 
@@ -52,7 +52,7 @@
                 android:layout_weight="1"
                 android:padding="4dp"
                 android:gravity="center_horizontal"
-                android:text="取消"
+                android:text="@string/str_cancel"
                 android:textSize="16sp"
                 android:textColor="@color/main_color"/>
             <TextView
@@ -62,7 +62,7 @@
                 android:layout_weight="1"
                 android:padding="4dp"
                 android:gravity="center_horizontal"
-                android:text="确定"
+                android:text="@string/str_confirm"
                 android:textSize="16sp"
                 android:textColor="@color/main_color"/>
         </LinearLayout>
@@ -170,7 +170,7 @@
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
                 android:gravity="center"
-                android:text="取消"
+                android:text="@string/str_cancel"
                 android:textSize="16sp"
                 android:textColor="@color/black"/>
 
@@ -180,7 +180,7 @@
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
                 android:gravity="center"
-                android:text="保存"
+                android:text="@string/str_save"
                 android:textSize="16sp"
                 android:textColor="@color/black" />
         </LinearLayout>

+ 9 - 0
home/src/main/res/layout/spinner_item.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:singleLine="true"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    android:ellipsize="marquee"
+    android:textAlignment="inherit"
+    android:textSize="16sp"/>

+ 9 - 7
home/src/main/res/layout/takeover_item.xml

@@ -27,7 +27,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginLeft="10dp"
-                android:text="暂无"
+                android:text="@string/str_empty"
                 android:textSize="12sp" />
         </LinearLayout>
 
@@ -48,22 +48,24 @@
 
             <Button
                 android:id="@id/btn_user_change"
-                android:layout_width="38dp"
+                android:layout_width="54dp"
                 android:layout_height="22dp"
                 android:background="@drawable/javashop_btn_balck_line_bg"
-                android:text="替换"
+                android:text="@string/str_replace"
                 android:textColor="@color/grgray"
-                android:textSize="13dp" />
+                android:textSize="12sp"
+                android:singleLine="true"/>
 
             <Button
                 android:id="@+id/btn_call_out"
-                android:layout_width="38dp"
+                android:layout_width="54dp"
                 android:layout_height="22dp"
                 android:layout_marginLeft="5dp"
                 android:background="@drawable/javashop_btn_balck_line_bg"
-                android:text="呼叫"
+                android:text="@string/str_call"
                 android:textColor="@color/grgray"
-                android:textSize="13dp" />
+                android:textSize="12sp"
+                android:singleLine="true"/>
 
         </LinearLayout>
 

+ 86 - 29
home/src/main/res/layout/user_setting_layout.xml

@@ -9,7 +9,7 @@
 
         <LinearLayout
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
+            android:layout_height="wrap_content"
             android:orientation="vertical">
 
             <LinearLayout
@@ -21,7 +21,8 @@
                 <ImageView
                     android:src="@mipmap/launcher"
                     android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"/>
+                    android:layout_height="wrap_content"
+                    android:visibility="gone"/>
             </LinearLayout>
 
             <LinearLayout
@@ -35,7 +36,7 @@
                     android:layout_height="wrap_content"
                     android:orientation="horizontal">
                     <TextView
-                        android:text="版本"
+                        android:text="@string/version_title"
                         android:textSize="14dp"
                         android:textColor="@color/javashop_color_searcher_tv_gray"
                         android:layout_width="wrap_content"
@@ -58,7 +59,7 @@
                     android:layout_height="wrap_content"
                     android:orientation="horizontal">
                     <TextView
-                        android:text="设备ID"
+                        android:text="@string/device_id"
                         android:textSize="14dp"
                         android:textColor="@color/javashop_color_searcher_tv_gray"
                         android:layout_width="wrap_content"
@@ -82,7 +83,7 @@
                     android:layout_height="wrap_content"
                     android:orientation="horizontal">
                     <TextView
-                        android:text="设备标识码"
+                        android:text="@string/device_identifier"
                         android:textSize="14dp"
                         android:textColor="@color/javashop_color_searcher_tv_gray"
                         android:layout_width="wrap_content"
@@ -106,7 +107,7 @@
                     android:layout_height="wrap_content"
                     android:orientation="horizontal">
                     <TextView
-                        android:text="服务器"
+                        android:text="@string/server_title"
                         android:textSize="14dp"
                         android:textColor="@color/javashop_color_searcher_tv_gray"
                         android:layout_width="wrap_content"
@@ -130,7 +131,7 @@
                     android:layout_height="wrap_content"
                     android:orientation="horizontal">
                     <TextView
-                        android:text="设备IP"
+                        android:text="@string/device_ip"
                         android:textSize="14dp"
                         android:textColor="@color/javashop_color_searcher_tv_gray"
                         android:layout_width="wrap_content"
@@ -157,7 +158,7 @@
                     <TextView
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:text="TTS状态"
+                        android:text="@string/tts_state"
                         android:textColor="@color/javashop_color_searcher_tv_gray"
                         android:textSize="14dp" />
 
@@ -179,7 +180,7 @@
                     <TextView
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:text="通话方式"
+                        android:text="@string/call_type"
                         android:textColor="@color/javashop_color_searcher_tv_gray"
                         android:textSize="14dp" />
 
@@ -201,48 +202,58 @@
                 android:padding="20dp"
                 android:orientation="vertical">
 
+                <View
+                    android:id="@+id/view_center_base"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_centerInParent="true"/>
+
                 <Button
                     android:id="@+id/btn_user_change"
-                    android:layout_width="wrap_content"
+                    android:layout_width="match_parent"
                     android:layout_height="wrap_content"
+                    android:layout_toLeftOf="@id/view_center_base"
+                    android:layout_marginRight="10dp"
                     android:layout_gravity="center_horizontal"
                     android:background="@drawable/javashop_btn_balck_line_bg"
-                    android:text="PC关联"
+                    android:text="@string/str_user_change"
                     android:textSize="14dp" />
 
                 <Button
                     android:id="@+id/btn_app_restart"
-                    android:layout_width="wrap_content"
+                    android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="20dp"
+                    android:layout_marginLeft="10dp"
                     android:layout_gravity="center_horizontal"
-                    android:layout_toRightOf="@id/btn_user_change"
+                    android:layout_toRightOf="@id/view_center_base"
                     android:background="@drawable/javashop_btn_balck_line_bg"
-                    android:text="APP重启"
+                    android:text="@string/register_restart"
                     android:textSize="14dp" />
 
                 <Button
                     android:id="@+id/btn_check_update"
-                    android:layout_marginTop="10dp"
-                    android:layout_width="wrap_content"
+                    android:layout_width="match_parent"
                     android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_toLeftOf="@id/view_center_base"
                     android:layout_gravity="center_horizontal"
                     android:layout_below="@id/btn_user_change"
                     android:background="@drawable/javashop_btn_balck_line_bg"
-                    android:text="检查升级"
+                    android:text="@string/check_update"
                     android:textSize="14dp" />
 
                 <Button
                     android:id="@+id/btn_system_setting"
-                    android:layout_marginTop="10dp"
-                    android:layout_width="wrap_content"
+                    android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="20dp"
+                    android:layout_marginLeft="10dp"
+                    android:layout_marginTop="10dp"
                     android:layout_gravity="center_horizontal"
                     android:layout_below="@id/btn_user_change"
-                    android:layout_toRightOf="@id/btn_check_update"
+                    android:layout_toRightOf="@id/view_center_base"
                     android:background="@drawable/javashop_btn_balck_line_bg"
-                    android:text="系统设置"
+                    android:text="@string/str_system_settings"
                     android:textSize="14dp" />
 
                 <TextView
@@ -317,31 +328,77 @@
                     android:layout_height="wrap_content"
                     android:layout_below="@id/tv_call_title"
                     android:layout_marginTop="16dp"
-                    android:text="开启按键留言:"
+                    android:text="@string/media_button_message"
                     android:textSize="16sp" />
 
                 <RadioGroup
                     android:id="@+id/group_im_channel"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_below="@id/tv_forward_title"
-                    android:layout_toRightOf="@id/tv_im_channel_title"
+                    android:layout_below="@id/tv_im_channel_title"
                     android:layout_marginTop="10dp"
-                    android:layout_marginLeft="4dp"
                     android:orientation="horizontal">
                     <RadioButton
                         android:id="@+id/rb_im_channel_yes"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:text=""/>
+                        android:text="@string/str_yes"/>
                     <RadioButton
                         android:id="@+id/rb_im_channel_no"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_marginLeft="4dp"
-                        android:text="否"/>
+                        android:text="@string/str_no"/>
+                </RadioGroup>
+
+                <TextView
+                    android:id="@+id/tv_language_title"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@id/group_im_channel"
+                    android:layout_marginTop="10dp"
+                    android:text="@string/language_set_mode"
+                    android:textSize="16sp" />
+
+                <RadioGroup
+                    android:id="@+id/group_language_mode"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@id/tv_language_title"
+                    android:layout_marginTop="10dp"
+                    android:orientation="horizontal">
+                    <RadioButton
+                        android:id="@+id/rb_language_yes"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/str_yes"/>
+                    <RadioButton
+                        android:id="@+id/rb_language_no"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="4dp"
+                        android:text="@string/str_no"/>
                 </RadioGroup>
 
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:layout_below="@id/group_language_mode"
+                    android:orientation="vertical">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/language_set_title"
+                        android:textSize="16sp" />
+
+                    <Spinner
+                        android:id="@+id/spinner_language_select"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content" />
+                </LinearLayout>
+
             </RelativeLayout>
 
         </LinearLayout>

+ 1 - 1
home/src/main/res/layout/watch_activity_call_records.xml

@@ -19,7 +19,7 @@
                 android:id="@+id/call_records_recyv"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:background="#FFBDC3"></android.support.v7.widget.RecyclerView>
+                android:background="#FFBDC3"/>
         </com.scwang.smartrefresh.layout.SmartRefreshLayout>
 
         <RelativeLayout

+ 2 - 2
home/src/main/res/layout/watch_activity_dialing_voice.xml

@@ -24,7 +24,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="房号"
+            android:text=""
             android:textSize="18sp" />
         <TextView
             android:id="@+id/bao_mother_name_tv"
@@ -32,7 +32,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="宝妈名字"
+            android:text=""
             android:textSize="20sp" />
 
     </LinearLayout>

+ 7 - 7
home/src/main/res/layout/watch_activity_event.xml

@@ -45,7 +45,7 @@
                     android:id="@+id/sickbed_tv"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="05房01床"
+                    android:text=""
                     android:textSize="14px" />
 
                 <TextView
@@ -53,7 +53,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignParentRight="true"
-                    android:text="12:00:00"
+                    android:text="--:--"
                     android:textSize="12px" />
 
             </RelativeLayout>
@@ -71,7 +71,7 @@
                     android:id="@+id/name_tv"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="zhangx"
+                    android:text=""
                     android:textSize="14px" />
 
                 <LinearLayout
@@ -97,7 +97,7 @@
                         android:layout_height="20px"
                         android:background="@drawable/sp_event_undo"
                         android:gravity="center"
-                        android:text="啊哈哈"
+                        android:text=""
                         android:textSize="12px" />
 
                     <ImageView
@@ -124,7 +124,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_marginRight="10px"
-                    android:text="处理人"
+                    android:text=""
                     android:textSize="12px"
                     android:visibility="gone" />
 
@@ -132,7 +132,7 @@
                     android:id="@+id/processing_time_tv"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="12:00:00"
+                    android:text="--:--"
                     android:textSize="12px" />
             </LinearLayout>
         </RelativeLayout>
@@ -150,7 +150,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_centerInParent="true"
-                android:text="未处理"
+                android:text=""
                 android:textSize="8sp" />
 
 

+ 3 - 3
home/src/main/res/layout/watch_activity_event_detail.xml

@@ -19,7 +19,7 @@
                     android:layout_width="30dp"
                     android:layout_height="30dp"
                     android:layout_gravity="left|center_vertical"
-                    android:layout_marginLeft="3.0dip"
+                    android:layout_marginLeft="4dp"
                     android:src="@drawable/btn_back" />
             </LinearLayout>
             <LinearLayout
@@ -107,7 +107,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_gravity="left|center_vertical"
-                    android:layout_marginLeft="3.0dip"
+                    android:layout_marginLeft="4dp"
                     android:background="@drawable/yu_yin_jie_ting" />
                 <LinearLayout
                     android:layout_width="match_parent"
@@ -121,7 +121,7 @@
                         android:layout_width="120dp"
                         android:layout_height="55dp"
                         android:layout_gravity="right|center_vertical"
-                        android:layout_marginRight="3.0dip"
+                        android:layout_marginRight="4dp"
                         android:src="@drawable/icon_switch_off" />
                 </LinearLayout>
             </LinearLayout>

+ 19 - 13
home/src/main/res/layout/watch_activity_home2.xml

@@ -39,9 +39,9 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_marginTop="10dp"
-                        android:text="顾客列表"
+                        android:text="@string/custom_title"
                         android:textColor="#ffffff"
-                        android:textSize="16dp" />
+                        android:textSize="16sp" />
 
                 </LinearLayout>
 
@@ -63,9 +63,9 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_marginTop="10dp"
-                        android:text="通话记录"
+                        android:text="@string/call_list"
                         android:textColor="#ffffff"
-                        android:textSize="16dp" />
+                        android:textSize="16sp" />
 
                 </LinearLayout>
 
@@ -92,12 +92,18 @@
                         android:textColor="#FF3030"
                         android:textSize="12sp" />
 
+                    <View
+                        android:id="@+id/view_center_line"
+                        android:layout_width="match_parent"
+                        android:layout_height="0dp"
+                        android:layout_centerInParent="true"/>
+
                     <LinearLayout
                         android:id="@+id/channel_im_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="134dp"
+                        android:layout_height="match_parent"
+                        android:layout_below="@id/view_center_line"
                         android:gravity="center"
-                        android:layout_alignParentBottom="true"
                         android:background="#F78B8F"
                         android:orientation="vertical">
 
@@ -106,7 +112,7 @@
                             android:layout_height="wrap_content"
                             android:textColor="#ffffff"
                             android:textSize="16sp"
-                            android:text="群留言"/>
+                            android:text="@string/group_message"/>
 
                         <TextView
                             android:id="@+id/tv_im_count"
@@ -218,9 +224,9 @@
                             <TextView
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
-                                android:text="同事"
+                                android:text="@string/colleague"
                                 android:textColor="#ffffff"
-                                android:textSize="14dp" />
+                                android:textSize="12sp" />
 
                         </LinearLayout>
 
@@ -251,9 +257,9 @@
                                 android:id="@+id/electric_quantity_tv"
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
-                                android:text="100%"
+                                android:text="-"
                                 android:textColor="#ffffff"
-                                android:textSize="16dp" />
+                                android:textSize="16sp" />
 
                             <TextView
                                 android:id="@+id/battery_warning_tv"
@@ -261,7 +267,7 @@
                                 android:layout_height="wrap_content"
                                 android:text=""
                                 android:textColor="#ffffff"
-                                android:textSize="16dp"
+                                android:textSize="16sp"
                                 android:visibility="gone" />
                         </LinearLayout>
 
@@ -291,7 +297,7 @@
                             <TextView
                                 android:id="@+id/tv_net_reconnect_text"
                                 android:visibility="gone"
-                                android:text="重连中"
+                                android:text="@string/reconnect"
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:textColor="@color/warn_orange"

+ 18 - 14
home/src/main/res/layout/watch_activity_register.xml

@@ -17,19 +17,10 @@
             android:orientation="vertical">
 
             <TextView
-                android:id="@+id/tv_register_nonet"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:text="没有网络"
-                android:textColor="@color/warn_orange"
-                android:visibility="gone" />
-
-            <TextView
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="服务器IP: "
+                android:text="@string/register_server_ip"
                 android:textColor="@color/grgray"
                 android:textSize="15sp" />
 
@@ -46,7 +37,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="10dp"
-                android:text="识别码: "
+                android:text="@string/register_device_identifier"
                 android:textColor="@color/grgray"
                 android:textSize="15sp" />
 
@@ -76,7 +67,7 @@
                 android:layout_marginBottom="20dp"
                 android:background="#ffffff"
                 android:gravity="center"
-                android:text="注册完成"
+                android:text="@string/register_done"
                 android:textSize="18sp" />
 
             <TextView
@@ -89,7 +80,7 @@
                 android:layout_marginBottom="20dp"
                 android:background="#ffffff"
                 android:gravity="center"
-                android:text="重启app"
+                android:text="@string/register_restart"
                 android:textSize="18sp" />
 
             <TextView
@@ -102,7 +93,20 @@
                 android:layout_marginBottom="20dp"
                 android:background="#ffffff"
                 android:gravity="center"
-                android:text="配置服务器"
+                android:text="@string/register_config_server"
+                android:textSize="18sp" />
+
+            <TextView
+                android:id="@+id/tv_language_settings"
+                android:layout_width="match_parent"
+                android:layout_height="40dp"
+                android:layout_marginLeft="30dp"
+                android:layout_marginTop="20dp"
+                android:layout_marginRight="30dp"
+                android:layout_marginBottom="20dp"
+                android:background="#ffffff"
+                android:gravity="center"
+                android:text="@string/str_language_settings"
                 android:textSize="18sp" />
         </LinearLayout>
     </ScrollView>

+ 3 - 3
home/src/main/res/layout/watch_activity_voice_calls.xml

@@ -23,7 +23,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="房号"
+            android:text=""
             android:textSize="18sp" />
         <TextView
             android:id="@+id/bao_mother_name_tv"
@@ -31,7 +31,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="8px"
-            android:text="宝妈名字"
+            android:text=""
             android:textSize="20sp" />
 
         <TextView
@@ -82,7 +82,7 @@
           android:layout_centerInParent="true"
           android:textSize="14px"
           android:textColor="#ffffff"
-          android:text="转接"/>
+          android:text=""/>
 
       </RelativeLayout>
         <ImageView

+ 5 - 5
keepalive/src/main/java/com/wdkl/ncs/keepbackground/utils/ForegroundNotificationUtils.java

@@ -20,7 +20,7 @@ public class ForegroundNotificationUtils {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
             //启动前台服务而不显示通知的漏洞已在 API Level 25 修复
             NotificationManager manager = (NotificationManager)service.getSystemService(Context.NOTIFICATION_SERVICE);
-            NotificationChannel channel = new NotificationChannel(CHANNEL_ID,"主服务",NotificationManager.IMPORTANCE_HIGH);
+            NotificationChannel channel = new NotificationChannel(CHANNEL_ID,"Service",NotificationManager.IMPORTANCE_HIGH);
             channel.enableLights(true);//设置提示灯
             channel.setLightColor(Color.GREEN);//设置提示灯颜色
             channel.setShowBadge(true);//显示logo
@@ -31,8 +31,8 @@ public class ForegroundNotificationUtils {
             manager.createNotificationChannel(channel);
 
             Notification notification = new Notification.Builder(service,CHANNEL_ID)
-                    .setContentTitle("主服务")//标题
-                    .setContentText("运行中...")//内容
+                    .setContentTitle("Service")//标题
+                    .setContentText("running...")//内容
                     .setWhen(System.currentTimeMillis())
                     .setSmallIcon(R.drawable.icon1)//小图标一定需要设置,否则会报错(如果不设置它启动服务前台化不会报错,但是你会发现这个通知不会启动),如果是普通通知,不设置必然报错
                     .setLargeIcon(BitmapFactory.decodeResource(service.getResources(),R.drawable.icon1))
@@ -42,8 +42,8 @@ public class ForegroundNotificationUtils {
             //利用漏洞在 API Level 18 及以上的 Android 系统中,启动前台服务而不显示通知
 //            service.startForeground(Foreground_ID, new Notification());
             Notification notification = new Notification.Builder(service)
-                    .setContentTitle("主服务")//设置标题
-                    .setContentText("运行中...")//设置内容
+                    .setContentTitle("Service")//设置标题
+                    .setContentText("running...")//设置内容
                     .setWhen(System.currentTimeMillis())//设置创建时间
                     .setSmallIcon(R.drawable.icon1)//设置状态栏图标
                     .setLargeIcon(BitmapFactory.decodeResource(service.getResources(),R.drawable.icon1))//设置通知栏图标

+ 10 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/ServerIpInfo.java

@@ -64,6 +64,8 @@ public class ServerIpInfo implements Serializable {
 
     private Long serverTime;
 
+    private String lang;
+
     public String getTcpLocalIp() {
         return tcpLocalIp;
     }
@@ -175,4 +177,12 @@ public class ServerIpInfo implements Serializable {
     public void setServerTime(Long serverTime) {
         this.serverTime = serverTime;
     }
+
+    public String getLang() {
+        return lang;
+    }
+
+    public void setLang(String lang) {
+        this.lang = lang;
+    }
 }

+ 10 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/StringUtil.java

@@ -0,0 +1,10 @@
+package com.wdkl.ncs.android.middleware.utils;
+
+import com.wdkl.ncs.android.lib.base.BaseApplication;
+
+public class StringUtil {
+
+    public static String getResString(int resId) {
+        return BaseApplication.appContext.getString(resId);
+    }
+}

BIN
resource/src/main/res/raw/im_start.wav


BIN
resource/src/main/res/raw/low_battery.wav


+ 47 - 0
resource/src/main/res/values-es/arrays.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+    <string-array name="language_list">
+        <item value="0">Automático</item>
+        <item value="1">Inglés</item>
+        <item value="2">Chino</item>
+        <item value="3">Español</item>
+        <item value="4">Ruso</item>
+    </string-array>
+
+    <string-array name="time_zones">
+        <item>GMT-11:00</item>
+        <item>GMT-10:00</item>
+        <item>GMT-09:00</item>
+        <item>GMT-08:00</item>
+        <item>GMT-07:00</item>
+        <item>GMT-06:00</item>
+        <item>GMT-05:00</item>
+        <item>GMT-04:00</item>
+        <item>GMT-03:30</item>
+        <item>GMT-02:00</item>
+        <item>GMT-01:00</item>
+        <item>GMT+00:00</item>
+        <item>GMT+01:00</item>
+        <item>GMT+02:00</item>
+        <item>GMT+03:00</item>
+        <item>GMT+03:30</item>
+        <item>GMT+04:00</item>
+        <item>GMT+04:30</item>
+        <item>GMT+05:00</item>
+        <item>GMT+05:30</item>
+        <item>GMT+05:45</item>
+        <item>GMT+06:00</item>
+        <item>GMT+06:30</item>
+        <item>GMT+07:00</item>
+        <item>GMT+08:00</item>
+        <item>GMT+09:00</item>
+        <item>GMT+09:30</item>
+        <item>GMT+10:00</item>
+        <item>GMT+10:30</item>
+        <item>GMT+11:00</item>
+        <item>GMT+12:00</item>
+        <item>GMT+13:00</item>
+        <item>GMT+14:00</item>
+    </string-array>
+
+</resources>

+ 204 - 0
resource/src/main/res/values-es/string.xml

@@ -0,0 +1,204 @@
+<resources>
+    <string name="javashop_app_name">NCS-extension_5inch</string>
+    <string name="javashop_qrcode_name">扫啊扫</string>
+    <string name="javashop_navigation_home_title">首页</string>
+    <string name="javashop_navigation_category_title">分类</string>
+    <string name="javashop_navigation_cart_title">购物车</string>
+    <string name="javashop_navigation_persion_title">我的</string>
+    <string name="javashop_cart_shop_item_title">优惠券</string>
+    <string name="javashop_group_promotion_fulldiscount">满折</string>
+    <string name="javashop_group_promotion_fullminus">满减</string>
+    <string name="javashop_group_promotion_point">积分</string>
+    <string name="javashop_group_promotion_freeship">免邮</string>
+    <string name="javashop_group_promotion_gift">赠品</string>
+    <string name="javashop_group_promotion_bonus">赠券</string>
+    <string name="javashop_group_not_full_tobuy">再逛逛</string>
+    <string name="javashop_promotion_string">促销</string>
+    <string name="javashop_singgle_promotion_edit_string">修改</string>
+    <string name="javashop_member_action_order_wait_pay">待付款</string>
+    <string name="javashop_member_action_order_wait_rog">待收货</string>
+    <string name="javashop_member_action_order_wait_comment">待评论</string>
+    <string name="javashop_member_action_aftersale">退换/售后</string>
+    <string name="javashop_member_action_order_all">我的订单</string>
+    <string name="javashop_member_action_point">积分</string>
+    <string name="javashop_member_action_bouns">优惠券</string>
+    <string name="javashop_member_action_goods">收藏商品</string>
+    <string name="javashop_member_action_shop">收藏店铺</string>
+    <string name="javashop_member_action_security">账户安全</string>
+    <string name="javashop_member_action_history">我的足迹</string>
+    <string name="javashop_member_action_address">我的地址</string>
+    <string name="javashop_member_action_user_service">客户服务</string>
+    <string name="javashop_setting_action_receipt">我的发票</string>
+    <string name="javashop_setting_action_privacy">隐私设置</string>
+    <string name="javashop_setting_action_share">应用分享</string>
+    <string name="javashop_setting_action_about">关于</string>
+    <string name="javashop_setting_action_logout">退出登录</string>
+    <string name="javashop_setting_action_cache">清除缓存</string>
+    <string name="javashop_goods_filter_all">全部</string>
+    <string name="javashop_all_brand">全部品牌</string>
+    <string name="javashop_confrim">确定</string>
+    <string name="javashop_cancel">取消</string>
+    <string name="javashop_add_cart">加入购物车</string>
+    <string name="javashop_shop">店铺</string>
+    <string name="javashop_self">自营</string>
+    <string name="javashop_collect">关注</string>
+    <string name="javashop_cart">购物车</string>
+    <string name="javashop_login">登录</string>
+    <string name="javashop_send_message">发送验证码</string>
+    <string name="javashop_use">立即使用</string>
+    <string name="javashop_get">立即领取</string>
+
+    <string name="wdkl_app_name">Aplicación móvil</string>
+    <string name="data_empty">Vacío</string>
+    <string name="register_server_ip">IP del servidor:</string>
+    <string name="register_device_identifier">Identificador:</string>
+    <string name="register_done">Registrar Aceptar</string>
+    <string name="register_restart">Reiniciar aplicación</string>
+    <string name="register_config_server">Servidor de configuración</string>
+    <string name="custom_title">Clientes</string>
+    <string name="call_list">llamadas</string>
+    <string name="colleague">Colegas</string>
+    <string name="group_message">Mensaje de grupo</string>
+    <string name="reconnect">Reconectar</string>
+
+    <string name="str_empty">Nulo</string>
+    <string name="str_null">Nulo</string>
+    <string name="device_disable">Dispositivo deshabilitado</string>
+    <string name="str_disable">Activar dispositivo</string>
+    <string name="str_enable">Habilitado</string>
+    <string name="setting_params_error">Error de configuración de parámetros:</string>
+    <string name="support_sent">Refuerzos enviados</string>
+    <string name="net_error">Error de red</string>
+    <string name="call_init_error">Error de red o sip, espere</string>
+    <string name="call_fail">Llamada fallida</string>
+    <string name="tips_reboot">Reinicie el dispositivo</string>
+    <string name="str_replace">Reemplazar</string>
+    <string name="call_window_title">Llamar</string>
+
+    <string name="no_response">Sin respuesta</string>
+    <string name="call_success">Llamada exitosa</string>
+    <string name="call_in_calling">Llamando…</string>
+    <string name="call_connecting">Conectando…</string>
+    <string name="call_in_call">Conectado…</string>
+    <string name="call_disconnect">Desconectar</string>
+    <string name="call_error">Error de conexión</string>
+    <string name="call_reject">Rechazar</string>
+    <string name="call_busy">Ocupado</string>
+    <string name="call_incoming">Nueva llamada…</string>
+    <string name="call_failed">Error de llamada</string>
+    <string name="call_end">Fin de llamada</string>
+    <string name="str_call_mute">Silencio</string>
+    <string name="str_call_handoff">Transferencia</string>
+    <string name="str_call_accept">Respuesta</string>
+    <string name="str_call_speaker">Altavoz</string>
+    <string name="voice_call_speech">%s llamando</string>
+
+    <string name="countdown_time">%ds</string>
+    <string name="input_password">Introducir contrase?a</string>
+    <string name="invalid_password">Error de contrase?a</string>
+    <string name="input_empty">Error de parámetros</string>
+    <string name="str_confirm">Confirmar</string>
+    <string name="str_cancel">Cancelar</string>
+    <string name="str_delete">Eliminar</string>
+    <string name="str_save">Guardar</string>
+    <string name="str_loading">Cargando</string>
+    <string name="str_yes">Sí</string>
+    <string name="str_no">No</string>
+
+    <string name="download_error">Error de descarga!</string>
+    <string name="download_cancel">Cancelar descarga</string>
+    <string name="update_success">Actualización exitosa</string>
+    <string name="update_fail">Actualización fallida</string>
+    <string name="downloading">Descargar…</string>
+    <string name="updating">Actualizando, espere</string>
+    <string name="update_no_required">Actualmente es la última versión</string>
+    <string name="detect_new_version">Nueva versión detectada, ?actualizar ahora?</string>
+    <string name="new_version_tips">Nueva versión detectada</string>
+
+    <string name="str_home">Inicio</string>
+    <string name="str_fees">Tarifas</string>
+    <string name="str_more">Más</string>
+    <string name="str_support">Reforzar</string>
+    <string name="str_call">Llamar</string>
+
+    <string name="doctor_title">Doctor</string>
+    <string name="nurse_title">Enfermera</string>
+    <string name="reboot_device">Reiniciar</string>
+    <string name="check_update">Comprobar actualización</string>
+    <string name="server_config">Configuración del servidor</string>
+    <string name="product_desc">Producto:</string>
+    <string name="device_error">Error del dispositivo, reinicie!</string>
+
+    <string name="str_voice_msg_start">Iniciar registro</string>
+    <string name="str_voice_msg_started">Grabación de voz</string>
+    <string name="str_voice_msg_end">Fin</string>
+    <string name="str_voice_msg_btn_title">Liberar para enviar mensaje</string>
+    <string name="str_voice_msg_btn_text">Presione para grabar el mensaje</string>
+    <string name="str_voice_msg_record_loss">el tiempo es demasiado corto</string>
+    <string name="str_voice_msg_record_cancel">Mensaje de voz cancelado</string>
+    <string name="str_voice_msg_send_success">envío exitoso</string>
+    <string name="str_voice_msg_send_fail">envío fallido</string>
+    <string name="str_voice_msg_play">reproducir mensaje de voz</string>
+    <string name="str_im_no_channel">Por favor ingrese el canal del mensaje</string>
+    <string name="str_im_no_media_button">botón multimedia para mensaje de voz deshabilitado</string>
+    <string name="str_im_media_button_unuseful">Presione el botón de grabación</string>
+    <string name="str_im_stop">Parar</string>
+
+    <string name="str_select_responsible_title">Seleccionar responsable</string>
+    <string name="str_select_resposible_err">Error responsable</string>
+    <string name="str_no_resposible">Sin responsabilidad</string>
+    <string name="str_set_resposible_success">Establecer éxito responsable</string>
+    <string name="str_set_resposible_fail">Error al establecer responsable</string>
+    <string name="str_event_handle_warning">el evento necesita ser manejado</string>
+    <string name="str_event_response">Respondido: %s %s</string>
+    <string name="str_event_cancel">Evento cancelado</string>
+    <string name="str_event_done">Evento realizado</string>
+    <string name="str_search">Buscar</string>
+
+    <string name="call_phone_failed">Llamada fallida, verifique el número de teléfono</string>
+    <string name="phone_type">Móvil-%d; Extender-%d; Anfitrión-%d</string>
+    <string name="user_change_success">Cambio exitoso, por favor espere.</string>
+    <string name="user_change_failed">Cambio fallido, vuelva a intentarlo.</string>
+    <string name="retry_tips">Vuelve a intentarlo más tarde</string>
+    <string name="tts_init_success">éxito</string>
+    <string name="tts_init_failed">error</string>
+
+    <string name="event_voice_msg">Mensaje de voz</string>
+    <string name="event_voice_call">Llamar</string>
+    <string name="event_undo">Deshacer</string>
+    <string name="event_responded">Respondido</string>
+    <string name="device_change_check">Confirmar cambio?</string>
+    <string name="device_change_tips">Cambiando, espera</string>
+    <string name="invalid_phone_number">Teléfono no válido: %s</string>
+
+    <string name="version_title">Versión:</string>
+    <string name="device_id">ID:</string>
+    <string name="device_identifier">Identificador:</string>
+    <string name="server_title">Servidor:</string>
+    <string name="device_ip">IP:</string>
+    <string name="tts_state">TTS:</string>
+    <string name="call_type">Tipo de llamada:</string>
+    <string name="str_user_change">Cambio de usuario</string>
+    <string name="str_check_update">Comprobar actualización</string>
+    <string name="str_system_settings">Configuración del sistema</string>
+    <string name="media_button_message">Habilitar mensaje de botón multimedia:</string>
+
+    <string name="permission_tips">Otorgue permisos</string>
+    <string name="device_not_register">Dispositivo no registrado, comuníquese con su administrador</string>
+    <string name="device_not_register_tips">Dispositivo no registrado, comuníquese con su administrador, luego haga clic en el botón Registrar Aceptar</string>
+    <string name="init_data_error">Error de datos de inicio, comuníquese con su administrador</string>
+    <string name="init_server_data_error">Error de datos del servidor de inicio</string>
+    <string name="str_reload">Recargar</string>
+    <string name="device_user_empty">Configure el usuario del dispositivo</string>
+    <string name="tcp_connect_success">Conectado</string>
+    <string name="tcp_connect_failed">Desconectado</string>
+    <string name="net_disconnect">Desconectado, verifique la red</string>
+    <string name="device_user_not_register">Usuario no registrado</string>
+    <string name="click_twice_start_settings">Hacer clic dos veces para abrir la configuración</string>
+    <string name="click_twice_to_back">Click again to back</string>
+    <string name="low_power">Poca potencia</string>
+
+    <string name="language_set_title">Conjunto de idiomas:</string>
+    <string name="language_set_mode">Sincronizar idioma del servidor:</string>
+    <string name="str_language_settings">Conjunto de idiomas</string>
+</resources>

+ 47 - 0
resource/src/main/res/values-ru/arrays.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+
+    <string-array name="language_list">
+        <item value="0">Авто</item>
+        <item value="1">Английский</item>
+        <item value="2">Китайский</item>
+        <item value="3">Испанский</item>
+        <item value="4">Русский</item>
+    </string-array>
+
+    <string-array name="time_zones">
+        <item>GMT-11:00</item>
+        <item>GMT-10:00</item>
+        <item>GMT-09:00</item>
+        <item>GMT-08:00</item>
+        <item>GMT-07:00</item>
+        <item>GMT-06:00</item>
+        <item>GMT-05:00</item>
+        <item>GMT-04:00</item>
+        <item>GMT-03:30</item>
+        <item>GMT-02:00</item>
+        <item>GMT-01:00</item>
+        <item>GMT+00:00</item>
+        <item>GMT+01:00</item>
+        <item>GMT+02:00</item>
+        <item>GMT+03:00</item>
+        <item>GMT+03:30</item>
+        <item>GMT+04:00</item>
+        <item>GMT+04:30</item>
+        <item>GMT+05:00</item>
+        <item>GMT+05:30</item>
+        <item>GMT+05:45</item>
+        <item>GMT+06:00</item>
+        <item>GMT+06:30</item>
+        <item>GMT+07:00</item>
+        <item>GMT+08:00</item>
+        <item>GMT+09:00</item>
+        <item>GMT+09:30</item>
+        <item>GMT+10:00</item>
+        <item>GMT+10:30</item>
+        <item>GMT+11:00</item>
+        <item>GMT+12:00</item>
+        <item>GMT+13:00</item>
+        <item>GMT+14:00</item>
+    </string-array>
+</resources>

+ 204 - 0
resource/src/main/res/values-ru/strings.xml

@@ -0,0 +1,204 @@
+<resources>
+    <string name="javashop_app_name">NCS-腕表</string>
+    <string name="javashop_qrcode_name">扫啊扫</string>
+    <string name="javashop_navigation_home_title">首页</string>
+    <string name="javashop_navigation_category_title">分类</string>
+    <string name="javashop_navigation_cart_title">购物车</string>
+    <string name="javashop_navigation_persion_title">我的</string>
+    <string name="javashop_cart_shop_item_title">优惠券</string>
+    <string name="javashop_group_promotion_fulldiscount">满折</string>
+    <string name="javashop_group_promotion_fullminus">满减</string>
+    <string name="javashop_group_promotion_point">积分</string>
+    <string name="javashop_group_promotion_freeship">免邮</string>
+    <string name="javashop_group_promotion_gift">赠品</string>
+    <string name="javashop_group_promotion_bonus">赠券</string>
+    <string name="javashop_group_not_full_tobuy">再逛逛</string>
+    <string name="javashop_promotion_string">促销</string>
+    <string name="javashop_singgle_promotion_edit_string">修改</string>
+    <string name="javashop_member_action_order_wait_pay">待付款</string>
+    <string name="javashop_member_action_order_wait_rog">待收货</string>
+    <string name="javashop_member_action_order_wait_comment">待评论</string>
+    <string name="javashop_member_action_aftersale">退换/售后</string>
+    <string name="javashop_member_action_order_all">我的订单</string>
+    <string name="javashop_member_action_point">积分</string>
+    <string name="javashop_member_action_bouns">优惠券</string>
+    <string name="javashop_member_action_goods">收藏商品</string>
+    <string name="javashop_member_action_shop">收藏店铺</string>
+    <string name="javashop_member_action_security">账户安全</string>
+    <string name="javashop_member_action_history">我的足迹</string>
+    <string name="javashop_member_action_address">我的地址</string>
+    <string name="javashop_member_action_user_service">客户服务</string>
+    <string name="javashop_setting_action_receipt">我的发票</string>
+    <string name="javashop_setting_action_privacy">隐私设置</string>
+    <string name="javashop_setting_action_share">应用分享</string>
+    <string name="javashop_setting_action_about">关于</string>
+    <string name="javashop_setting_action_logout">退出登录</string>
+    <string name="javashop_setting_action_cache">清除缓存</string>
+    <string name="javashop_goods_filter_all">全部</string>
+    <string name="javashop_all_brand">全部品牌</string>
+    <string name="javashop_confrim">确定</string>
+    <string name="javashop_cancel">取消</string>
+    <string name="javashop_add_cart">加入购物车</string>
+    <string name="javashop_shop">店铺</string>
+    <string name="javashop_self">自营</string>
+    <string name="javashop_collect">关注</string>
+    <string name="javashop_cart">购物车</string>
+    <string name="javashop_login">登录</string>
+    <string name="javashop_send_message">发送验证码</string>
+    <string name="javashop_use">立即使用</string>
+    <string name="javashop_get">立即领取</string>
+
+    <string name="wdkl_app_name">Mobile App</string>
+    <string name="data_empty">Empty</string>
+    <string name="register_server_ip">Server IP:</string>
+    <string name="register_device_identifier">Identifier:</string>
+    <string name="register_done">Register OK</string>
+    <string name="register_restart">Restart app</string>
+    <string name="register_config_server">Config server</string>
+    <string name="custom_title">Customers</string>
+    <string name="call_list">Call logs</string>
+    <string name="colleague">Colleagues</string>
+    <string name="group_message">Group message</string>
+    <string name="reconnect">Reconnect</string>
+
+    <string name="str_empty">Null</string>
+    <string name="str_null">Null</string>
+    <string name="device_disable">Device disabled</string>
+    <string name="str_disable">Device enable</string>
+    <string name="str_enable">Enabled</string>
+    <string name="setting_params_error">Setting params error:</string>
+    <string name="support_sent">Reinforcements sent</string>
+    <string name="net_error">Network error</string>
+    <string name="call_init_error">Network or sip error, please wait</string>
+    <string name="call_fail">Call failed</string>
+    <string name="tips_reboot">Please reboot device</string>
+    <string name="str_replace">Replace</string>
+    <string name="call_window_title">Call</string>
+
+    <string name="no_response">No response</string>
+    <string name="call_success">Call success</string>
+    <string name="call_in_calling">Calling…</string>
+    <string name="call_connecting">Connecting…</string>
+    <string name="call_in_call">Connected…</string>
+    <string name="call_disconnect">Disconnect</string>
+    <string name="call_error">Connect error</string>
+    <string name="call_reject">Reject</string>
+    <string name="call_busy">Busy</string>
+    <string name="call_incoming">New call…</string>
+    <string name="call_failed">Call error</string>
+    <string name="call_end">Call end</string>
+    <string name="str_call_mute">Mute</string>
+    <string name="str_call_handoff">Handoff</string>
+    <string name="str_call_accept">Accept</string>
+    <string name="str_call_speaker">Speaker</string>
+    <string name="voice_call_speech">%s calling</string>
+
+    <string name="countdown_time">%ds</string>
+    <string name="input_password">Input password</string>
+    <string name="invalid_password">Password error</string>
+    <string name="input_empty">Params error</string>
+    <string name="str_confirm">Confirm</string>
+    <string name="str_cancel">Cancel</string>
+    <string name="str_delete">Delete</string>
+    <string name="str_save">Save</string>
+    <string name="str_loading">Loading</string>
+    <string name="str_yes">Yes</string>
+    <string name="str_no">No</string>
+
+    <string name="download_error">Download error!</string>
+    <string name="download_cancel">Download cancel</string>
+    <string name="update_success">Update success</string>
+    <string name="update_fail">Update failed</string>
+    <string name="downloading">Download…</string>
+    <string name="updating">Updating, please wait</string>
+    <string name="update_no_required">It is currently the latest version</string>
+    <string name="detect_new_version">Detected new version, update now?</string>
+    <string name="new_version_tips">detected new version</string>
+
+    <string name="str_home">Home</string>
+    <string name="str_fees">Fees</string>
+    <string name="str_more">More</string>
+    <string name="str_support">Reinforce</string>
+    <string name="str_call">Call</string>
+
+    <string name="doctor_title">Doctor</string>
+    <string name="nurse_title">Nurse</string>
+    <string name="reboot_device">Reboot</string>
+    <string name="check_update">Check update</string>
+    <string name="server_config">Server config</string>
+    <string name="product_desc">Product:</string>
+    <string name="device_error">Device error, please reboot!</string>
+
+    <string name="str_voice_msg_start">Start record</string>
+    <string name="str_voice_msg_started">Voice recording</string>
+    <string name="str_voice_msg_end">End</string>
+    <string name="str_voice_msg_btn_title">Release to send message</string>
+    <string name="str_voice_msg_btn_text">Press to record message</string>
+    <string name="str_voice_msg_record_loss">time is too short</string>
+    <string name="str_voice_msg_record_cancel">Voice msg canceled</string>
+    <string name="str_voice_msg_send_success">send success</string>
+    <string name="str_voice_msg_send_fail">send failed</string>
+    <string name="str_voice_msg_play">play voice msg</string>
+    <string name="str_im_no_channel">Please enter IM channel</string>
+    <string name="str_im_no_media_button">media button for voice msg disabled</string>
+    <string name="str_im_media_button_unuseful">Please press record button</string>
+    <string name="str_im_stop">Stop</string>
+
+    <string name="str_select_responsible_title">Select responsible</string>
+    <string name="str_select_resposible_err">Responsible error</string>
+    <string name="str_no_resposible">No responsible</string>
+    <string name="str_set_resposible_success">Set responsible success</string>
+    <string name="str_set_resposible_fail">Set responsible failed</string>
+    <string name="str_event_handle_warning">Event need todo</string>
+    <string name="str_event_response">Responsed: %s %s</string>
+    <string name="str_event_cancel">Event canceled</string>
+    <string name="str_event_done">Event done</string>
+    <string name="str_search">Search</string>
+
+    <string name="call_phone_failed">Call failed, please check phone number</string>
+    <string name="phone_type">Mobile-%d; Extend-%d; Host-%d</string>
+    <string name="user_change_success">Change success, please wait.</string>
+    <string name="user_change_failed">Change failed, please retry.</string>
+    <string name="retry_tips">Please retry later</string>
+    <string name="tts_init_success">success</string>
+    <string name="tts_init_failed">fail</string>
+
+    <string name="event_voice_msg">Voice msg</string>
+    <string name="event_voice_call">Call</string>
+    <string name="event_undo">Undo</string>
+    <string name="event_responded">Responded</string>
+    <string name="device_change_check">Change confirm?</string>
+    <string name="device_change_tips">Changing, wait</string>
+    <string name="invalid_phone_number">Invalid phone: %s</string>
+
+    <string name="version_title">Version:</string>
+    <string name="device_id">ID:</string>
+    <string name="device_identifier">Identifier:</string>
+    <string name="server_title">Server:</string>
+    <string name="device_ip">IP:</string>
+    <string name="tts_state">TTS:</string>
+    <string name="call_type">Call type:</string>
+    <string name="str_user_change">User change</string>
+    <string name="str_check_update">Check update</string>
+    <string name="str_system_settings">System settings</string>
+    <string name="media_button_message">Enable media button message:</string>
+
+    <string name="permission_tips">Please grant permissions</string>
+    <string name="device_not_register">Device not registered, please contact your administrator</string>
+    <string name="device_not_register_tips">Device not registered, please contact your administrator, than click register OK button</string>
+    <string name="init_data_error">Init data error, please contact your administrator</string>
+    <string name="init_server_data_error">Init server data error</string>
+    <string name="str_reload">Reload</string>
+    <string name="device_user_empty">Please set device user</string>
+    <string name="tcp_connect_success">Connected</string>
+    <string name="tcp_connect_failed">Disconnected</string>
+    <string name="net_disconnect">Disconnected, please check net</string>
+    <string name="device_user_not_register">User not register</string>
+    <string name="click_twice_start_settings">Click twice open settings</string>
+    <string name="click_twice_to_back">Click again to back</string>
+    <string name="low_power">Low power</string>
+
+    <string name="language_set_title">Language set:</string>
+    <string name="language_set_mode">Sync language from server:</string>
+    <string name="str_language_settings">Language set</string>
+</resources>

+ 47 - 0
resource/src/main/res/values-zh/arrays.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+
+    <string-array name="language_list">
+        <item value="0">跟随系统</item>
+        <item value="1">英语</item>
+        <item value="2">中文</item>
+        <item value="3">西班牙语</item>
+        <item value="4">俄语</item>
+    </string-array>
+
+    <string-array name="time_zones">
+        <item>GMT-11:00</item>
+        <item>GMT-10:00</item>
+        <item>GMT-09:00</item>
+        <item>GMT-08:00</item>
+        <item>GMT-07:00</item>
+        <item>GMT-06:00</item>
+        <item>GMT-05:00</item>
+        <item>GMT-04:00</item>
+        <item>GMT-03:30</item>
+        <item>GMT-02:00</item>
+        <item>GMT-01:00</item>
+        <item>GMT+00:00</item>
+        <item>GMT+01:00</item>
+        <item>GMT+02:00</item>
+        <item>GMT+03:00</item>
+        <item>GMT+03:30</item>
+        <item>GMT+04:00</item>
+        <item>GMT+04:30</item>
+        <item>GMT+05:00</item>
+        <item>GMT+05:30</item>
+        <item>GMT+05:45</item>
+        <item>GMT+06:00</item>
+        <item>GMT+06:30</item>
+        <item>GMT+07:00</item>
+        <item>GMT+08:00</item>
+        <item>GMT+09:00</item>
+        <item>GMT+09:30</item>
+        <item>GMT+10:00</item>
+        <item>GMT+10:30</item>
+        <item>GMT+11:00</item>
+        <item>GMT+12:00</item>
+        <item>GMT+13:00</item>
+        <item>GMT+14:00</item>
+    </string-array>
+</resources>

+ 204 - 0
resource/src/main/res/values-zh/strings.xml

@@ -0,0 +1,204 @@
+<resources>
+    <string name="javashop_app_name">NCS-5寸床头机</string>
+    <string name="javashop_qrcode_name">扫啊扫</string>
+    <string name="javashop_navigation_home_title">首页</string>
+    <string name="javashop_navigation_category_title">分类</string>
+    <string name="javashop_navigation_cart_title">购物车</string>
+    <string name="javashop_navigation_persion_title">我的</string>
+    <string name="javashop_cart_shop_item_title">优惠券</string>
+    <string name="javashop_group_promotion_fulldiscount">满折</string>
+    <string name="javashop_group_promotion_fullminus">满减</string>
+    <string name="javashop_group_promotion_point">积分</string>
+    <string name="javashop_group_promotion_freeship">免邮</string>
+    <string name="javashop_group_promotion_gift">赠品</string>
+    <string name="javashop_group_promotion_bonus">赠券</string>
+    <string name="javashop_group_not_full_tobuy">再逛逛</string>
+    <string name="javashop_promotion_string">促销</string>
+    <string name="javashop_singgle_promotion_edit_string">修改</string>
+    <string name="javashop_member_action_order_wait_pay">待付款</string>
+    <string name="javashop_member_action_order_wait_rog">待收货</string>
+    <string name="javashop_member_action_order_wait_comment">待评论</string>
+    <string name="javashop_member_action_aftersale">退换/售后</string>
+    <string name="javashop_member_action_order_all">我的订单</string>
+    <string name="javashop_member_action_point">积分</string>
+    <string name="javashop_member_action_bouns">优惠券</string>
+    <string name="javashop_member_action_goods">收藏商品</string>
+    <string name="javashop_member_action_shop">收藏店铺</string>
+    <string name="javashop_member_action_security">账户安全</string>
+    <string name="javashop_member_action_history">我的足迹</string>
+    <string name="javashop_member_action_address">我的地址</string>
+    <string name="javashop_member_action_user_service">客户服务</string>
+    <string name="javashop_setting_action_receipt">我的发票</string>
+    <string name="javashop_setting_action_privacy">隐私设置</string>
+    <string name="javashop_setting_action_share">应用分享</string>
+    <string name="javashop_setting_action_about">关于</string>
+    <string name="javashop_setting_action_logout">退出登录</string>
+    <string name="javashop_setting_action_cache">清除缓存</string>
+    <string name="javashop_goods_filter_all">全部</string>
+    <string name="javashop_all_brand">全部品牌</string>
+    <string name="javashop_confrim">确定</string>
+    <string name="javashop_cancel">取消</string>
+    <string name="javashop_add_cart">加入购物车</string>
+    <string name="javashop_shop">店铺</string>
+    <string name="javashop_self">自营</string>
+    <string name="javashop_collect">关注</string>
+    <string name="javashop_cart">购物车</string>
+    <string name="javashop_login">登录</string>
+    <string name="javashop_send_message">发送验证码</string>
+    <string name="javashop_use">立即使用</string>
+    <string name="javashop_get">立即领取</string>
+
+    <string name="wdkl_app_name">护士移动端</string>
+    <string name="data_empty">没有数据</string>
+    <string name="register_server_ip">服务器IP:</string>
+    <string name="register_device_identifier">识别码:</string>
+    <string name="register_done">注册完成</string>
+    <string name="register_restart">重启app</string>
+    <string name="register_config_server">配置服务器</string>
+    <string name="custom_title">顾客列表</string>
+    <string name="call_list">通话记录</string>
+    <string name="colleague">同事</string>
+    <string name="group_message">群留言</string>
+    <string name="reconnect">重连中</string>
+
+    <string name="str_empty">暂无</string>
+    <string name="str_null">未知</string>
+    <string name="device_disable">设备未启用</string>
+    <string name="str_disable">未启用</string>
+    <string name="str_enable">已启用</string>
+    <string name="setting_params_error">获取设置参数异常:</string>
+    <string name="support_sent">请求增援已发送</string>
+    <string name="net_error">网络异常</string>
+    <string name="call_init_error">网络异常或sipId异常,请稍后</string>
+    <string name="call_fail">呼叫失败</string>
+    <string name="tips_reboot">请重启设备</string>
+    <string name="str_replace">替换</string>
+    <string name="call_window_title">通话</string>
+
+    <string name="no_response">无人接听</string>
+    <string name="call_success">呼叫成功,等待接听</string>
+    <string name="call_in_calling">正在呼叫…</string>
+    <string name="call_connecting">连接中…</string>
+    <string name="call_in_call">通话中…</string>
+    <string name="call_disconnect">断开连接</string>
+    <string name="call_error">通话错误</string>
+    <string name="call_reject">对方拒绝</string>
+    <string name="call_busy">对方忙线中</string>
+    <string name="call_incoming">新来电…</string>
+    <string name="call_failed">对方离线或不存在,呼叫失败</string>
+    <string name="call_end">通话结束</string>
+    <string name="str_call_mute">静音</string>
+    <string name="str_call_handoff">挂断</string>
+    <string name="str_call_accept">接听</string>
+    <string name="str_call_speaker">免提</string>
+    <string name="voice_call_speech">%s呼叫</string>
+
+    <string name="countdown_time">%d秒</string>
+    <string name="input_password">请输入密码</string>
+    <string name="invalid_password">密码错误</string>
+    <string name="input_empty">参数不能为空</string>
+    <string name="str_confirm">确定</string>
+    <string name="str_cancel">取消</string>
+    <string name="str_delete">删除</string>
+    <string name="str_save">保存</string>
+    <string name="str_loading">正在加载</string>
+    <string name="str_yes">是</string>
+    <string name="str_no">否</string>
+
+    <string name="download_error">下载路径异常</string>
+    <string name="download_cancel">取消下载</string>
+    <string name="update_success">升级成功</string>
+    <string name="update_fail">升级失败</string>
+    <string name="downloading">正在下载中…</string>
+    <string name="updating">正在升级中,请稍后</string>
+    <string name="update_no_required">当前已是最新版本</string>
+    <string name="detect_new_version">检测到新版本,是否升级?</string>
+    <string name="new_version_tips">检测到新版本</string>
+
+    <string name="str_home">首页</string>
+    <string name="str_fees">费用</string>
+    <string name="str_more">更多</string>
+    <string name="str_support">增援</string>
+    <string name="str_call">呼叫</string>
+
+    <string name="doctor_title">责任医生</string>
+    <string name="nurse_title">责任护士</string>
+    <string name="reboot_device">重启设备</string>
+    <string name="check_update">检查升级</string>
+    <string name="server_config">服务器配置</string>
+    <string name="product_desc">产品说明:</string>
+    <string name="device_error">设备网络出现异常,请检查网络或尝试断电重启!</string>
+
+    <string name="str_voice_msg_start">开始留言</string>
+    <string name="str_voice_msg_started">留言中</string>
+    <string name="str_voice_msg_end">结束</string>
+    <string name="str_voice_msg_btn_title">松开留言,上滑取消</string>
+    <string name="str_voice_msg_btn_text">按住说话</string>
+    <string name="str_voice_msg_record_loss">说话时间太短</string>
+    <string name="str_voice_msg_record_cancel">语音留言已取消</string>
+    <string name="str_voice_msg_send_success">留言发送成功</string>
+    <string name="str_voice_msg_send_fail">留言发送失败</string>
+    <string name="str_voice_msg_play">播放留言</string>
+    <string name="str_im_no_channel">请先加入群留言频道</string>
+    <string name="str_im_no_media_button">未开启按键留言</string>
+    <string name="str_im_media_button_unuseful">请使用屏幕按钮留言</string>
+    <string name="str_im_stop">停止</string>
+
+    <string name="str_select_responsible_title">请选择处理人</string>
+    <string name="str_select_resposible_err">选择处理人错误</string>
+    <string name="str_no_resposible">没有相关处理人员</string>
+    <string name="str_set_resposible_success">分配处理人员成功</string>
+    <string name="str_set_resposible_fail">分配处理人员失败</string>
+    <string name="str_event_handle_warning">您还有事件未处理</string>
+    <string name="str_event_response">已响应: %s %s</string>
+    <string name="str_event_cancel">事件已取消</string>
+    <string name="str_event_done">事件已完成</string>
+    <string name="str_search">搜索</string>
+
+    <string name="call_phone_failed">呼叫失败,请检查手机号</string>
+    <string name="phone_type">手机-%d; 分机-%d; 主机-%d</string>
+    <string name="user_change_success">换班通知发送成功,请等待处理</string>
+    <string name="user_change_failed">换班通知发送失败,请重试</string>
+    <string name="retry_tips">请10秒后再尝试</string>
+    <string name="tts_init_success">正常</string>
+    <string name="tts_init_failed">异常</string>
+
+    <string name="event_voice_msg">语音留言</string>
+    <string name="event_voice_call">呼叫</string>
+    <string name="event_undo">未处理</string>
+    <string name="event_responded">已响应</string>
+    <string name="device_change_check">是否确认切换?</string>
+    <string name="device_change_tips">切换中,请稍后</string>
+    <string name="invalid_phone_number">非法号码: %s</string>
+
+    <string name="version_title">版本:</string>
+    <string name="device_id">设备ID:</string>
+    <string name="device_identifier">设备标识码:</string>
+    <string name="server_title">服务器:</string>
+    <string name="device_ip">设备IP:</string>
+    <string name="tts_state">TTS 状态:</string>
+    <string name="call_type">通话方式:</string>
+    <string name="str_user_change">PC 关联</string>
+    <string name="str_check_update">检查升级</string>
+    <string name="str_system_settings">系统设置</string>
+    <string name="media_button_message">开启按键留言:</string>
+
+    <string name="permission_tips">请先授权再进入APP</string>
+    <string name="device_not_register">本机未注册,请将识别码发给管理员</string>
+    <string name="device_not_register_tips">本机未注册,请将识别码发给管理员。管理员注册本机后请点击注册完成进入</string>
+    <string name="init_data_error">初始化数据不全,请联系管理员</string>
+    <string name="init_server_data_error">初始化服务器连接数据不全</string>
+    <string name="str_reload">重载</string>
+    <string name="device_user_empty">请使用PC设置使用人</string>
+    <string name="tcp_connect_success">已连接</string>
+    <string name="tcp_connect_failed">断开连接</string>
+    <string name="net_disconnect">断开连接,请检查网络</string>
+    <string name="device_user_not_register">设备未绑定</string>
+    <string name="click_twice_start_settings">再点一次进入设置</string>
+    <string name="click_twice_to_back">再按一次退出</string>
+    <string name="low_power">电量低</string>
+
+    <string name="language_set_title">语言设置:</string>
+    <string name="language_set_mode">是否同步服务器语言:</string>
+    <string name="str_language_settings">语言设置</string>
+</resources>

+ 47 - 0
resource/src/main/res/values/arrays.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<resources>
+
+    <string-array name="language_list">
+        <item value="0">Auto</item>
+        <item value="1">English</item>
+        <item value="2">Chinese</item>
+        <item value="3">Spanish</item>
+        <item value="4">Russian</item>
+    </string-array>
+
+    <string-array name="time_zones">
+        <item>GMT-11:00</item>
+        <item>GMT-10:00</item>
+        <item>GMT-09:00</item>
+        <item>GMT-08:00</item>
+        <item>GMT-07:00</item>
+        <item>GMT-06:00</item>
+        <item>GMT-05:00</item>
+        <item>GMT-04:00</item>
+        <item>GMT-03:30</item>
+        <item>GMT-02:00</item>
+        <item>GMT-01:00</item>
+        <item>GMT+00:00</item>
+        <item>GMT+01:00</item>
+        <item>GMT+02:00</item>
+        <item>GMT+03:00</item>
+        <item>GMT+03:30</item>
+        <item>GMT+04:00</item>
+        <item>GMT+04:30</item>
+        <item>GMT+05:00</item>
+        <item>GMT+05:30</item>
+        <item>GMT+05:45</item>
+        <item>GMT+06:00</item>
+        <item>GMT+06:30</item>
+        <item>GMT+07:00</item>
+        <item>GMT+08:00</item>
+        <item>GMT+09:00</item>
+        <item>GMT+09:30</item>
+        <item>GMT+10:00</item>
+        <item>GMT+10:30</item>
+        <item>GMT+11:00</item>
+        <item>GMT+12:00</item>
+        <item>GMT+13:00</item>
+        <item>GMT+14:00</item>
+    </string-array>
+</resources>

+ 153 - 1
resource/src/main/res/values/strings.xml

@@ -48,5 +48,157 @@
     <string name="javashop_use">立即使用</string>
     <string name="javashop_get">立即领取</string>
 
-    <string name="data_empty">没有数据</string>
+    <string name="wdkl_app_name">Mobile App</string>
+    <string name="data_empty">Empty</string>
+    <string name="register_server_ip">Server IP:</string>
+    <string name="register_device_identifier">Identifier:</string>
+    <string name="register_done">Register OK</string>
+    <string name="register_restart">Restart app</string>
+    <string name="register_config_server">Config server</string>
+    <string name="custom_title">Customers</string>
+    <string name="call_list">Call logs</string>
+    <string name="colleague">Colleagues</string>
+    <string name="group_message">Group message</string>
+    <string name="reconnect">Reconnect</string>
+
+    <string name="str_empty">Null</string>
+    <string name="str_null">Null</string>
+    <string name="device_disable">Device disabled</string>
+    <string name="str_disable">Device enable</string>
+    <string name="str_enable">Enabled</string>
+    <string name="setting_params_error">Setting params error:</string>
+    <string name="support_sent">Reinforcements sent</string>
+    <string name="net_error">Network error</string>
+    <string name="call_init_error">Network or sip error, please wait</string>
+    <string name="call_fail">Call failed</string>
+    <string name="tips_reboot">Please reboot device</string>
+    <string name="str_replace">Replace</string>
+    <string name="call_window_title">Call</string>
+
+    <string name="no_response">No response</string>
+    <string name="call_success">Call success</string>
+    <string name="call_in_calling">Calling…</string>
+    <string name="call_connecting">Connecting…</string>
+    <string name="call_in_call">Connected…</string>
+    <string name="call_disconnect">Disconnect</string>
+    <string name="call_error">Connect error</string>
+    <string name="call_reject">Reject</string>
+    <string name="call_busy">Busy</string>
+    <string name="call_incoming">New call…</string>
+    <string name="call_failed">Call error</string>
+    <string name="call_end">Call end</string>
+    <string name="str_call_mute">Mute</string>
+    <string name="str_call_handoff">Handoff</string>
+    <string name="str_call_accept">Accept</string>
+    <string name="str_call_speaker">Speaker</string>
+    <string name="voice_call_speech">%s calling</string>
+
+    <string name="countdown_time">%ds</string>
+    <string name="input_password">Input password</string>
+    <string name="invalid_password">Password error</string>
+    <string name="input_empty">Params error</string>
+    <string name="str_confirm">Confirm</string>
+    <string name="str_cancel">Cancel</string>
+    <string name="str_delete">Delete</string>
+    <string name="str_save">Save</string>
+    <string name="str_loading">Loading</string>
+    <string name="str_yes">Yes</string>
+    <string name="str_no">No</string>
+
+    <string name="download_error">Download error!</string>
+    <string name="download_cancel">Download cancel</string>
+    <string name="update_success">Update success</string>
+    <string name="update_fail">Update failed</string>
+    <string name="downloading">Download…</string>
+    <string name="updating">Updating, please wait</string>
+    <string name="update_no_required">It is currently the latest version</string>
+    <string name="detect_new_version">Detected new version, update now?</string>
+    <string name="new_version_tips">detected new version</string>
+
+    <string name="str_home">Home</string>
+    <string name="str_fees">Fees</string>
+    <string name="str_more">More</string>
+    <string name="str_support">Reinforce</string>
+    <string name="str_call">Call</string>
+
+    <string name="doctor_title">Doctor</string>
+    <string name="nurse_title">Nurse</string>
+    <string name="reboot_device">Reboot</string>
+    <string name="check_update">Check update</string>
+    <string name="server_config">Server config</string>
+    <string name="product_desc">Product:</string>
+    <string name="device_error">Device error, please reboot!</string>
+
+    <string name="str_voice_msg_start">Start record</string>
+    <string name="str_voice_msg_started">Voice recording</string>
+    <string name="str_voice_msg_end">End</string>
+    <string name="str_voice_msg_btn_title">Release to send message</string>
+    <string name="str_voice_msg_btn_text">Press to record message</string>
+    <string name="str_voice_msg_record_loss">time is too short</string>
+    <string name="str_voice_msg_record_cancel">Voice msg canceled</string>
+    <string name="str_voice_msg_send_success">send success</string>
+    <string name="str_voice_msg_send_fail">send failed</string>
+    <string name="str_voice_msg_play">play voice msg</string>
+    <string name="str_im_no_channel">Please enter IM channel</string>
+    <string name="str_im_no_media_button">media button for voice msg disabled</string>
+    <string name="str_im_media_button_unuseful">Please press record button</string>
+    <string name="str_im_stop">Stop</string>
+
+    <string name="str_select_responsible_title">Select responsible</string>
+    <string name="str_select_resposible_err">Responsible error</string>
+    <string name="str_no_resposible">No responsible</string>
+    <string name="str_set_resposible_success">Set responsible success</string>
+    <string name="str_set_resposible_fail">Set responsible failed</string>
+    <string name="str_event_handle_warning">Event need todo</string>
+    <string name="str_event_response">Responsed: %s %s</string>
+    <string name="str_event_cancel">Event canceled</string>
+    <string name="str_event_done">Event done</string>
+    <string name="str_search">Search</string>
+
+    <string name="call_phone_failed">Call failed, please check phone number</string>
+    <string name="phone_type">Mobile-%d; Extend-%d; Host-%d</string>
+    <string name="user_change_success">Change success, please wait.</string>
+    <string name="user_change_failed">Change failed, please retry.</string>
+    <string name="retry_tips">Please retry later</string>
+    <string name="tts_init_success">success</string>
+    <string name="tts_init_failed">fail</string>
+
+    <string name="event_voice_msg">Voice msg</string>
+    <string name="event_voice_call">Call</string>
+    <string name="event_undo">Undo</string>
+    <string name="event_responded">Responded</string>
+    <string name="device_change_check">Change confirm?</string>
+    <string name="device_change_tips">Changing, wait</string>
+    <string name="invalid_phone_number">Invalid phone: %s</string>
+
+    <string name="version_title">Version:</string>
+    <string name="device_id">ID:</string>
+    <string name="device_identifier">Identifier:</string>
+    <string name="server_title">Server:</string>
+    <string name="device_ip">IP:</string>
+    <string name="tts_state">TTS:</string>
+    <string name="call_type">Call type:</string>
+    <string name="str_user_change">User change</string>
+    <string name="str_check_update">Check update</string>
+    <string name="str_system_settings">System settings</string>
+    <string name="media_button_message">Enable media button message:</string>
+
+    <string name="permission_tips">Please grant permissions</string>
+    <string name="device_not_register">Device not registered, please contact your administrator</string>
+    <string name="device_not_register_tips">Device not registered, please contact your administrator, than click register OK button</string>
+    <string name="init_data_error">Init data error, please contact your administrator</string>
+    <string name="init_server_data_error">Init server data error</string>
+    <string name="str_reload">Reload</string>
+    <string name="device_user_empty">Please set device user</string>
+    <string name="tcp_connect_success">Connected</string>
+    <string name="tcp_connect_failed">Disconnected</string>
+    <string name="net_disconnect">Disconnected, please check net</string>
+    <string name="device_user_not_register">User not register</string>
+    <string name="click_twice_start_settings">Click twice open settings</string>
+    <string name="click_twice_to_back">Click again to back</string>
+    <string name="low_power">Low power</string>
+
+    <string name="language_set_title">Language set:</string>
+    <string name="language_set_mode">Sync language from server:</string>
+    <string name="str_language_settings">Language set</string>
 </resources>