From 5712c32ff351c00ef6b433fc2d46a954cd63e03a Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Tue, 7 Jun 2022 20:51:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=EF=BC=9A=E4=B8=AD=E8=8B=B1?= =?UTF-8?q?=E6=96=87=E8=AF=AD=E8=A8=80=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sms/forwarder/activity/MainActivity.kt | 2 +- .../core/http/callback/NoTipCallBack.kt | 2 +- .../core/http/callback/TipCallBack.kt | 2 +- .../callback/TipProgressLoadingCallBack.kt | 2 +- .../http/loader/MiniLoadingDialogLoader.kt | 2 +- .../http/subscriber/NoTipRequestSubscriber.kt | 2 +- .../TipProgressLoadingSubscriber.kt | 2 +- .../http/subscriber/TipRequestSubscriber.kt | 2 +- .../core/webview/WebViewInterceptDialog.kt | 2 +- .../sms/forwarder/entity/ContactInfo.kt | 4 +- .../sms/forwarder/fragment/AppListFragment.kt | 3 +- .../sms/forwarder/fragment/ClientFragment.kt | 8 +-- .../sms/forwarder/fragment/FrpcFragment.kt | 4 +- .../forwarder/fragment/RulesEditFragment.kt | 6 +-- .../sms/forwarder/fragment/ServerFragment.kt | 2 +- .../fragment/client/CallQueryFragment.kt | 10 ++-- .../fragment/client/CloneFragment.kt | 22 ++++----- .../fragment/client/ContactQueryFragment.kt | 10 ++-- .../fragment/client/SmsQueryFragment.kt | 6 +-- .../server/component/LoggerInterceptor.kt | 4 +- .../server/controller/CloneController.kt | 4 +- .../sms/forwarder/service/BatteryService.kt | 13 ++--- .../idormy/sms/forwarder/utils/CommonUtils.kt | 9 +++- .../sms/forwarder/utils/HttpServerUtils.kt | 14 +++--- .../sms/forwarder/utils/RuleLineUtils.kt | 4 +- .../utils/sender/WeworkAgentUtils.kt | 3 +- .../res/layout/adapter_item_simple_list.xml | 4 +- app/src/main/res/layout/dialog_guide_tips.xml | 2 +- app/src/main/res/layout/fragment_client.xml | 14 +++--- .../res/layout/fragment_client_call_query.xml | 2 +- .../layout/fragment_client_contact_query.xml | 2 +- .../res/layout/fragment_client_sms_query.xml | 2 +- .../res/layout/fragment_client_sms_send.xml | 2 +- app/src/main/res/values-en/strings.xml | 49 +++++++++++++++++++ app/src/main/res/values/strings.xml | 49 +++++++++++++++++++ 35 files changed, 193 insertions(+), 77 deletions(-) diff --git a/app/src/main/java/com/idormy/sms/forwarder/activity/MainActivity.kt b/app/src/main/java/com/idormy/sms/forwarder/activity/MainActivity.kt index 52fe1c49..14f4f74c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/activity/MainActivity.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/activity/MainActivity.kt @@ -158,7 +158,7 @@ class MainActivity : BaseActivity(), R.id.nav_logcat -> openNewPage(LogcatFragment::class.java) R.id.nav_help -> AgentWebActivity.goWeb(this, getString(R.string.url_help)) R.id.nav_about -> openNewPage(AboutFragment::class.java) - else -> XToastUtils.toast("点击了:" + menuItem.title) + else -> XToastUtils.toast("Click:" + menuItem.title) } } true diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/NoTipCallBack.kt b/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/NoTipCallBack.kt index 02b8422f..3009cc29 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/NoTipCallBack.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/NoTipCallBack.kt @@ -27,7 +27,7 @@ abstract class NoTipCallBack : SimpleCallBack { override fun onError(e: ApiException) { if (!StringUtils.isEmpty(mUrl)) { - Logger.e("网络请求的url:$mUrl", e) + Logger.e("Request Url: $mUrl", e) } else { Logger.e(e) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/TipCallBack.kt b/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/TipCallBack.kt index 59de6b0a..f7e80ed7 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/TipCallBack.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/TipCallBack.kt @@ -29,7 +29,7 @@ abstract class TipCallBack : SimpleCallBack { override fun onError(e: ApiException) { XToastUtils.error(e) if (!StringUtils.isEmpty(mUrl)) { - Logger.e("网络请求的url:$mUrl", e) + Logger.e("Request Url: $mUrl", e) } else { Logger.e(e) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/TipProgressLoadingCallBack.kt b/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/TipProgressLoadingCallBack.kt index 1e1b8b54..79a9411f 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/TipProgressLoadingCallBack.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/core/http/callback/TipProgressLoadingCallBack.kt @@ -37,7 +37,7 @@ abstract class TipProgressLoadingCallBack : ProgressLoadingCallBack { super.onError(e) XToastUtils.error(e) if (!StringUtils.isEmpty(mUrl)) { - Logger.e("网络请求的url:$mUrl", e) + Logger.e("Request Url: $mUrl", e) } else { Logger.e(e) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/http/loader/MiniLoadingDialogLoader.kt b/app/src/main/java/com/idormy/sms/forwarder/core/http/loader/MiniLoadingDialogLoader.kt index 842ba897..03c3b3c6 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/core/http/loader/MiniLoadingDialogLoader.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/core/http/loader/MiniLoadingDialogLoader.kt @@ -13,7 +13,7 @@ import com.xuexiang.xui.widget.dialog.MiniLoadingDialog */ class MiniLoadingDialogLoader @JvmOverloads constructor( context: Context?, - msg: String? = "请求中...", + msg: String? = "Loading...", ) : IProgressLoader { /** * 进度loading弹窗 diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/NoTipRequestSubscriber.kt b/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/NoTipRequestSubscriber.kt index df52f486..bbf536ea 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/NoTipRequestSubscriber.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/NoTipRequestSubscriber.kt @@ -27,7 +27,7 @@ abstract class NoTipRequestSubscriber : BaseSubscriber { public override fun onError(e: ApiException) { if (!StringUtils.isEmpty(mUrl)) { - Logger.e("网络请求的url:$mUrl", e) + Logger.e("Request Url: $mUrl", e) } else { Logger.e(e) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/TipProgressLoadingSubscriber.kt b/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/TipProgressLoadingSubscriber.kt index 42570440..559e7816 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/TipProgressLoadingSubscriber.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/TipProgressLoadingSubscriber.kt @@ -34,7 +34,7 @@ abstract class TipProgressLoadingSubscriber : ProgressLoadingSubscriber { super.onError(e) XToastUtils.error(e) if (!StringUtils.isEmpty(mUrl)) { - Logger.e("网络请求的url:$mUrl", e) + Logger.e("Request Url: $mUrl", e) } else { Logger.e(e) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/TipRequestSubscriber.kt b/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/TipRequestSubscriber.kt index e7b7d071..6546c4a2 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/TipRequestSubscriber.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/core/http/subscriber/TipRequestSubscriber.kt @@ -29,7 +29,7 @@ abstract class TipRequestSubscriber : BaseSubscriber { public override fun onError(e: ApiException) { XToastUtils.error(e) if (!StringUtils.isEmpty(mUrl)) { - Logger.e("网络请求的url:$mUrl", e) + Logger.e("Request Url: $mUrl", e) } else { Logger.e(e) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/webview/WebViewInterceptDialog.kt b/app/src/main/java/com/idormy/sms/forwarder/core/webview/WebViewInterceptDialog.kt index 8fc4c10f..51cbf980 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/core/webview/WebViewInterceptDialog.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/core/webview/WebViewInterceptDialog.kt @@ -43,7 +43,7 @@ class WebViewInterceptDialog : AppCompatActivity(), DialogInterface.OnDismissLis private fun getOpenTitle(url: String): String { val scheme = getScheme(url) return if ("mqqopensdkapi" == scheme) { - "是否允许页面打开\"QQ\"?" + ResUtils.getString(R.string.lab_open_qq_app) } else { ResUtils.getString(R.string.lab_open_third_app) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/ContactInfo.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/ContactInfo.kt index 0a05fc40..64e4d38c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/ContactInfo.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/ContactInfo.kt @@ -2,6 +2,8 @@ package com.idormy.sms.forwarder.entity import android.util.Patterns import com.google.gson.annotations.SerializedName +import com.idormy.sms.forwarder.R +import com.xuexiang.xui.utils.ResUtils.getString import java.io.Serializable import java.util.* @@ -17,6 +19,6 @@ data class ContactInfo( } override fun toString(): String { - return String.format("姓名:%s\n号码:%s", name, phoneNumber) + return String.format(getString(R.string.contact_info), name, phoneNumber) } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/AppListFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/AppListFragment.kt index 13c95d5b..90528941 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/AppListFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/AppListFragment.kt @@ -17,6 +17,7 @@ import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener import com.xuexiang.xaop.annotation.SingleClick import com.xuexiang.xpage.annotation.Page import com.xuexiang.xui.utils.DensityUtils +import com.xuexiang.xui.utils.ResUtils import com.xuexiang.xui.utils.ThemeUtils import com.xuexiang.xui.utils.WidgetUtils import com.xuexiang.xui.widget.actionbar.TitleBar @@ -73,7 +74,7 @@ class AppListFragment : BaseFragment() { val cm = requireContext().getSystemService(AppCompatActivity.CLIPBOARD_SERVICE) as ClipboardManager val mClipData = ClipData.newPlainText("pkgName", item?.packageName) cm.setPrimaryClip(mClipData) - XToastUtils.toast("已复制包名:" + item?.packageName, 2000) + XToastUtils.toast(ResUtils.getString(R.string.package_name_copied) + item?.packageName, 2000) } //设置刷新加载时禁止所有列表操作 diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/ClientFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/ClientFragment.kt index 15db8380..450db704 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/ClientFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/ClientFragment.kt @@ -107,7 +107,7 @@ class ClientFragment : BaseFragment(), when (v.id) { R.id.btn_server_test -> { if (!CommonUtils.checkUrl(HttpServerUtils.serverAddress)) { - XToastUtils.error("请输入有效的服务地址") + XToastUtils.error(getString(R.string.invalid_service_address)) return } queryConfig(true) @@ -119,12 +119,12 @@ class ClientFragment : BaseFragment(), override fun onItemClick(itemView: View, item: PageInfo, position: Int) { try { if (!CommonUtils.checkUrl(HttpServerUtils.serverAddress)) { - XToastUtils.error("请输入有效的服务地址") + XToastUtils.error(getString(R.string.invalid_service_address)) serverConfig = null return } if (serverConfig == null && item.name != ResUtils.getString(R.string.api_clone)) { - XToastUtils.error("请先点击【测试接口】按钮") + XToastUtils.error(getString(R.string.click_test_button_first)) return } if (serverConfig != null && ( @@ -135,7 +135,7 @@ class ClientFragment : BaseFragment(), || (item.name == ResUtils.getString(R.string.api_battery_query) && !serverConfig!!.enableApiBatteryQuery) ) ) { - XToastUtils.error("服务端未开启此功能") + XToastUtils.error(getString(R.string.disabled_on_the_server)) return } @Suppress("UNCHECKED_CAST") diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/FrpcFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/FrpcFragment.kt index 919e0c98..bd0f9b67 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/FrpcFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/FrpcFragment.kt @@ -117,7 +117,7 @@ class FrpcFragment : BaseFragment(), FrpcPagingAdapter.On //运行出错时间 LiveEventBus.get(EVENT_FRPC_RUNNING_ERROR, String::class.java).observe(this) { - XToastUtils.error("Frpc运行失败") + XToastUtils.error(getString(R.string.frpc_failed_to_run)) //FrpcUtils.checkAndStopService(requireContext()) adapter.refresh() } @@ -190,7 +190,7 @@ class FrpcFragment : BaseFragment(), FrpcPagingAdapter.On try { viewModel.delete(item) LiveEventBus.get(EVENT_FRPC_DELETE_CONFIG).post(item) - XToastUtils.success("删除成功") + XToastUtils.success(getString(R.string.successfully_deleted)) } catch (e: Exception) { e.message?.let { XToastUtils.error(it) } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/RulesEditFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/RulesEditFragment.kt index 0e6e471c..6ba0e3b3 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/RulesEditFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/RulesEditFragment.kt @@ -339,7 +339,7 @@ class RulesEditFragment : BaseFragment(), View.OnClic ) binding!!.tvSenderName.text = sender.title if (STATUS_OFF == sender.status) { - XToastUtils.warning("【注意】该发送通道已经禁用,其关联的规则即便匹配上也不会发送!") + XToastUtils.warning(getString(R.string.sender_disabled_tips)) } } catch (e: Exception) { XToastUtils.error(e.message.toString()) @@ -557,7 +557,7 @@ class RulesEditFragment : BaseFragment(), View.OnClic val testSim = "SIM" + (simSlot + 1) val ruleSim: String = rule.simSlot if (ruleSim != "ALL" && ruleSim != testSim) { - throw java.lang.Exception("卡槽未匹配中规则") + throw java.lang.Exception(getString(R.string.card_slot_does_not_match)) } //获取卡槽信息 @@ -569,7 +569,7 @@ class RulesEditFragment : BaseFragment(), View.OnClic val msgInfo = MsgInfo(ruleType, etFrom.text.toString(), etContent.text.toString(), Date(), simInfo, simSlot) if (!rule.checkMsg(msgInfo)) { - throw java.lang.Exception("未匹配中规则") + throw java.lang.Exception(getString(R.string.unmatched_rule)) } AppDatabase.getInstance(requireContext()) diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/ServerFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/ServerFragment.kt index 993f421d..2ff11bc6 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/ServerFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/ServerFragment.kt @@ -144,7 +144,7 @@ class ServerFragment : BaseFragment(), View.OnClickListe if (inetAddress != null) { val url = "http://${inetAddress!!.hostAddress}:5000" ClipboardUtils.copyText(url) - XToastUtils.info("已复制到剪贴板:$url") + XToastUtils.info(String.format(getString(R.string.copied_to_clipboard), url)) } } else -> {} diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CallQueryFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CallQueryFragment.kt index fa44d0a6..a4c46a87 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CallQueryFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CallQueryFragment.kt @@ -99,15 +99,15 @@ class CallQueryFragment : BaseFragment() { holder.image(R.id.iv_call, R.drawable.ic_phone_out) holder.image(R.id.iv_reply, R.drawable.ic_reply) holder.click(R.id.iv_copy) { - XToastUtils.info("已经复制到剪贴板!\n$from") + XToastUtils.info(String.format(getString(R.string.copied_to_clipboard), from)) ClipboardUtils.copyText(from) } holder.click(R.id.iv_call) { - XToastUtils.info("本地呼叫:" + model.number) + XToastUtils.info(getString(R.string.local_call) + model.number) PhoneUtils.dial(model.number) } holder.click(R.id.iv_reply) { - XToastUtils.info("远程发短信:" + model.number) + XToastUtils.info(getString(R.string.remote_sms) + model.number) LiveEventBus.get(EVENT_KEY_SIM_SLOT).post(model.simId) LiveEventBus.get(EVENT_KEY_PHONE_NUMBERS).post(model.number) PageOption.to(SmsSendFragment::class.java).setNewActivity(true).open((context as XPageActivity?)!!) @@ -146,9 +146,9 @@ class CallQueryFragment : BaseFragment() { binding!!.searchView.setSuggestions(resources.getStringArray(R.array.query_suggestions)) binding!!.searchView.setOnQueryTextListener(object : MaterialSearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String): Boolean { - SnackbarUtils.Indefinite(view, "搜索关键字: $query").info() + SnackbarUtils.Indefinite(view, String.format(getString(R.string.search_keyword), query)).info() .actionColor(ResUtils.getColor(R.color.xui_config_color_white)) - .setAction("清除") { + .setAction(getString(R.string.clear)) { keyword = "" loadRemoteData(true) }.show() diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CloneFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CloneFragment.kt index 53a2f1a4..fe791642 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CloneFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CloneFragment.kt @@ -86,7 +86,7 @@ class CloneFragment : BaseFragment(), View.OnClickL } else { XToastUtils.error(R.string.toast_denied) } - binding!!.tvBackupPath.text = "未授权储存权限,该功能无法使用!" + binding!!.tvBackupPath.text = getString(R.string.storage_permission_tips) } }) @@ -169,13 +169,13 @@ class CloneFragment : BaseFragment(), View.OnClickL val cloneInfo = HttpServerUtils.exportSettings() val jsonStr = Gson().toJson(cloneInfo) if (FileIOUtils.writeFileFromString(file, jsonStr)) { - XToastUtils.success("导出配置成功!") + XToastUtils.success(getString(R.string.export_succeeded)) } else { - binding!!.tvExport.text = "导出失败,请检查写入权限!" - XToastUtils.error("导出失败,请检查写入权限!") + binding!!.tvExport.text = getString(R.string.export_failed) + XToastUtils.error(getString(R.string.export_failed)) } } catch (e: Exception) { - XToastUtils.error("导出失败:" + e.message) + XToastUtils.error(String.format(getString(R.string.export_failed_tips), e.message)) } } //导入配置 @@ -185,14 +185,14 @@ class CloneFragment : BaseFragment(), View.OnClickL val file = File(backupPath + File.separator + backupFile) //判断文件是否存在 if (!FileUtils.isFileExists(file)) { - XToastUtils.error("导入失败:本地备份文件不存在!") + XToastUtils.error(getString(R.string.import_failed_file_not_exist)) return } val jsonStr = FileIOUtils.readFile2String(file) Log.d(TAG, "jsonStr = $jsonStr") if (TextUtils.isEmpty(jsonStr)) { - XToastUtils.error("导入失败:请检查是否有外部存储访问权限!") + XToastUtils.error(getString(R.string.import_failed)) return } @@ -207,12 +207,12 @@ class CloneFragment : BaseFragment(), View.OnClickL HttpServerUtils.compareVersion(cloneInfo) if (HttpServerUtils.restoreSettings(cloneInfo)) { - XToastUtils.success("导入配置成功!") + XToastUtils.success(getString(R.string.import_succeeded)) } else { - XToastUtils.error("导入失败") + XToastUtils.error(getString(R.string.import_failed)) } } catch (e: Exception) { - XToastUtils.error("导入失败:" + e.message) + XToastUtils.error(String.format(getString(R.string.import_failed_tips), e.message)) } } } @@ -329,7 +329,7 @@ class CloneFragment : BaseFragment(), View.OnClickL HttpServerUtils.compareVersion(cloneInfo) if (HttpServerUtils.restoreSettings(cloneInfo)) { - XToastUtils.success("导入配置成功!") + XToastUtils.success(getString(R.string.import_succeeded)) } } else { XToastUtils.error(ResUtils.getString(R.string.request_failed) + resp.msg) diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/ContactQueryFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/ContactQueryFragment.kt index 0236befa..ec5a8828 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/ContactQueryFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/ContactQueryFragment.kt @@ -95,15 +95,15 @@ class ContactQueryFragment : BaseFragment() holder.image(R.id.iv_reply, R.drawable.ic_reply) holder.click(R.id.iv_copy) { val str = model.toString() - XToastUtils.info("已经复制到剪贴板!\n$str") + XToastUtils.info(String.format(getString(R.string.copied_to_clipboard), str)) ClipboardUtils.copyText(str) } holder.click(R.id.iv_call) { - XToastUtils.info("本地呼叫:" + model.phoneNumber) + XToastUtils.info(getString(R.string.local_call) + model.phoneNumber) PhoneUtils.dial(model.phoneNumber) } holder.click(R.id.iv_reply) { - XToastUtils.info("远程发短信:" + model.phoneNumber) + XToastUtils.info(getString(R.string.remote_sms) + model.phoneNumber) /*val params = Bundle() params.putString(KEY_PHONE_NUMBERS, model.phoneNumber) openPage(SmsSendFragment::class.java, params)*/ @@ -133,9 +133,9 @@ class ContactQueryFragment : BaseFragment() binding!!.searchView.setSuggestions(resources.getStringArray(R.array.query_suggestions)) binding!!.searchView.setOnQueryTextListener(object : MaterialSearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String): Boolean { - SnackbarUtils.Indefinite(view, "搜索关键字: $query").info() + SnackbarUtils.Indefinite(view, String.format(getString(R.string.search_keyword), query)).info() .actionColor(ResUtils.getColor(R.color.xui_config_color_white)) - .setAction("清除") { + .setAction(getString(R.string.clear)) { keyword = "" loadRemoteData() }.show() diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/SmsQueryFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/SmsQueryFragment.kt index 1281d275..979310aa 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/SmsQueryFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/SmsQueryFragment.kt @@ -98,7 +98,7 @@ class SmsQueryFragment : BaseFragment() { holder.text(R.id.tv_content, model.content) holder.image(R.id.iv_reply, R.drawable.ic_reply) holder.click(R.id.iv_reply) { - XToastUtils.info("远程回短信:" + model.number) + XToastUtils.info(getString(R.string.remote_sms) + model.number) LiveEventBus.get(EVENT_KEY_SIM_SLOT).post(model.simId) LiveEventBus.get(EVENT_KEY_PHONE_NUMBERS).post(model.number) PageOption.to(SmsSendFragment::class.java).setNewActivity(true).open((context as XPageActivity?)!!) @@ -136,9 +136,9 @@ class SmsQueryFragment : BaseFragment() { binding!!.searchView.setSuggestions(resources.getStringArray(R.array.query_suggestions)) binding!!.searchView.setOnQueryTextListener(object : MaterialSearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String): Boolean { - SnackbarUtils.Indefinite(view, "搜索关键字: $query").info() + SnackbarUtils.Indefinite(view, String.format(getString(R.string.search_keyword), query)).info() .actionColor(ResUtils.getColor(R.color.xui_config_color_white)) - .setAction("清除") { + .setAction(getString(R.string.clear)) { keyword = "" loadRemoteData(true) }.show() diff --git a/app/src/main/java/com/idormy/sms/forwarder/server/component/LoggerInterceptor.kt b/app/src/main/java/com/idormy/sms/forwarder/server/component/LoggerInterceptor.kt index 5d562c71..9018adc1 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/server/component/LoggerInterceptor.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/server/component/LoggerInterceptor.kt @@ -1,7 +1,9 @@ package com.idormy.sms.forwarder.server.component import android.util.Log +import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.utils.HttpServerUtils +import com.xuexiang.xui.utils.ResUtils.getString import com.yanzhenjie.andserver.annotation.Interceptor import com.yanzhenjie.andserver.error.HttpException import com.yanzhenjie.andserver.framework.HandlerInterceptor @@ -39,7 +41,7 @@ class LoggerInterceptor : HandlerInterceptor { || (httpPath.startsWith("/contact/query") && !HttpServerUtils.enableApiContactQuery) || (httpPath.startsWith("/battery/query") && !HttpServerUtils.enableApiBatteryQuery) ) { - throw HttpException(500, "服务端未开启此功能") + throw HttpException(500, getString(R.string.disabled_on_the_server)) } /* diff --git a/app/src/main/java/com/idormy/sms/forwarder/server/controller/CloneController.kt b/app/src/main/java/com/idormy/sms/forwarder/server/controller/CloneController.kt index ae4f12e8..3a60a2f8 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/server/controller/CloneController.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/server/controller/CloneController.kt @@ -1,9 +1,11 @@ package com.idormy.sms.forwarder.server.controller import android.util.Log +import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.entity.CloneInfo import com.idormy.sms.forwarder.server.model.BaseRequest import com.idormy.sms.forwarder.utils.HttpServerUtils +import com.xuexiang.xui.utils.ResUtils.getString import com.yanzhenjie.andserver.annotation.* @Suppress("PrivatePropertyName") @@ -36,7 +38,7 @@ class CloneController { HttpServerUtils.compareVersion(cloneInfo) - return if (HttpServerUtils.restoreSettings(cloneInfo)) "success" else "还原失败" + return if (HttpServerUtils.restoreSettings(cloneInfo)) "success" else getString(R.string.restore_failed) } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.kt b/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.kt index 451aa8fd..180adee3 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/service/BatteryService.kt @@ -12,6 +12,7 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import androidx.work.workDataOf import com.google.gson.Gson +import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.utils.BatteryUtils import com.idormy.sms.forwarder.utils.SettingUtils @@ -66,19 +67,19 @@ class BatteryService : Service() { val levelMin: Int = SettingUtils.batteryLevelMin val levelMax: Int = SettingUtils.batteryLevelMax if (SettingUtils.batteryLevelOnce && levelMin > 0 && levelPre > levelCur && levelCur <= levelMin) { //电量下降到下限 - msg = "【电量预警】已低于电量预警下限,请及时充电!$msg" + msg = String.format(getString(R.string.below_level_min), msg) sendMessage(context, msg) return } else if (SettingUtils.batteryLevelOnce && levelMax > 0 && levelPre < levelCur && levelCur >= levelMax) { //电量上升到上限 - msg = "【电量预警】已高于电量预警上限,请拔掉充电器!$msg" + msg = String.format(getString(R.string.over_level_max), msg) sendMessage(context, msg) return } else if (!SettingUtils.batteryLevelOnce && levelMin > 0 && levelPre > levelCur && levelCur == levelMin) { //电量下降到下限 - msg = "【电量预警】已到达电量预警下限,请及时充电!$msg" + msg = String.format(getString(R.string.reach_level_min), msg) sendMessage(context, msg) return } else if (!SettingUtils.batteryLevelOnce && levelMax > 0 && levelPre < levelCur && levelCur == levelMax) { //电量上升到上限 - msg = "【电量预警】已到达电量预警上限,请拔掉充电器!$msg" + msg = String.format(getString(R.string.reach_level_max), msg) sendMessage(context, msg) return } @@ -91,7 +92,7 @@ class BatteryService : Service() { if (status != oldStatus) { var msg: String = BatteryUtils.getBatteryInfo(intent).toString() SettingUtils.batteryStatus = status - msg = "【充电状态】发生变化:" + BatteryUtils.getStatus(oldStatus) + " → " + BatteryUtils.getStatus(status) + msg + msg = getString(R.string.battery_status_changed) + BatteryUtils.getStatus(oldStatus) + " → " + BatteryUtils.getStatus(status) + msg sendMessage(context, msg) } } @@ -102,7 +103,7 @@ class BatteryService : Service() { private fun sendMessage(context: Context, msg: String) { Log.i(TAG, msg) try { - val msgInfo = MsgInfo("app", "88888888", msg, Date(), "电池状态监听", -1) + val msgInfo = MsgInfo("app", "88888888", msg, Date(), getString(R.string.battery_status_monitor), -1) val request = OneTimeWorkRequestBuilder() .setInputData( workDataOf( diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtils.kt index bd29fe42..c70ddd35 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtils.kt @@ -236,11 +236,16 @@ class CommonUtils private constructor() { } //是否合法的url - fun checkUrl(urls: String, emptyResult: Boolean): Boolean { + fun checkUrl(urls: String?): Boolean { + return checkUrl(urls, false) + } + + //是否合法的url + fun checkUrl(urls: String?, emptyResult: Boolean): Boolean { if (TextUtils.isEmpty(urls)) return emptyResult val regex = "(ht|f)tp(s?)\\:\\/\\/[\\da-zA-Z]([-.\\w]*[\\da-zA-Z])*(:(0-9)*)*(\\/?)([a-zA-Z\\d\\-\\.\\?\\,\\'\\/\\\\&%\\+\\$#_=]*)?" val pat = Pattern.compile(regex) - val mat = pat.matcher(urls.trim()) + val mat = pat.matcher(urls?.trim() ?: "") return mat.matches() } diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt index d6019e77..6afedd4e 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt @@ -4,9 +4,11 @@ package com.idormy.sms.forwarder.utils import android.text.TextUtils import android.util.Base64 import com.google.gson.Gson +import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.entity.CloneInfo import com.idormy.sms.forwarder.server.model.BaseRequest +import com.xuexiang.xui.utils.ResUtils.getString import com.xuexiang.xutil.app.AppUtils import com.yanzhenjie.andserver.error.HttpException import java.net.URLEncoder @@ -116,26 +118,26 @@ class HttpServerUtils private constructor() { val signSecret = serverSignKey if (TextUtils.isEmpty(signSecret)) return - if (TextUtils.isEmpty(req.sign)) throw HttpException(500, "服务端启用签名密钥,sign节点必传") - if (req.timestamp == 0L) throw HttpException(500, "服务端启用签名密钥,timestamp节点必传") + if (TextUtils.isEmpty(req.sign)) throw HttpException(500, getString(R.string.sign_required)) + if (req.timestamp == 0L) throw HttpException(500, getString(R.string.timestamp_required)) val timestamp = System.currentTimeMillis() val diffTime = kotlin.math.abs(timestamp - req.timestamp) if (diffTime > 3600000L) { - throw HttpException(500, "timestamp校验失败,与服务器时间($timestamp)误差不能超过1小时(diffTime=$diffTime)") + throw HttpException(500, String.format(getString(R.string.timestamp_verify_failed), timestamp, diffTime)) } val sign = calcSign(req.timestamp.toString(), signSecret.toString()) - if (sign != req.sign) throw HttpException(500, "签名校验失败") + if (sign != req.sign) throw HttpException(500, getString(R.string.sign_verify_failed)) } //判断版本是否一致 @Throws(HttpException::class) fun compareVersion(cloneInfo: CloneInfo) { val versionCodeRequest = cloneInfo.versionCode - if (versionCodeRequest == 0) throw HttpException(500, "version_code节点必传") + if (versionCodeRequest == 0) throw HttpException(500, getString(R.string.version_code_required)) val versionCodeLocal = AppUtils.getAppVersionCode().toString().substring(1) - if (!versionCodeRequest.toString().endsWith(versionCodeLocal)) throw HttpException(500, "客户端与服务端的App版本不一致") + if (!versionCodeRequest.toString().endsWith(versionCodeLocal)) throw HttpException(500, getString(R.string.inconsistent_version)) } //导出设置 diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLineUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLineUtils.kt index fa2b0692..2414c509 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLineUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/RuleLineUtils.kt @@ -1,7 +1,9 @@ package com.idormy.sms.forwarder.utils import android.util.Log +import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.entity.MsgInfo +import com.xuexiang.xui.utils.ResUtils.getString import java.util.* @Suppress("unused") @@ -45,7 +47,7 @@ object RuleLineUtils { if (lineNum == 0) { //第一行不允许缩进 if (line.startsWith(" ")) { - throw Exception("第一行不允许缩进") + throw Exception(getString(R.string.no_indentation_allowed_on_the_first_line)) } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/sender/WeworkAgentUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/sender/WeworkAgentUtils.kt index a89f5ced..c8ddb332 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/sender/WeworkAgentUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/sender/WeworkAgentUtils.kt @@ -18,6 +18,7 @@ import com.xuexiang.xhttp2.cache.model.CacheMode import com.xuexiang.xhttp2.callback.SimpleCallBack import com.xuexiang.xhttp2.exception.ApiException import com.xuexiang.xui.utils.ResUtils +import com.xuexiang.xui.utils.ResUtils.getString @Suppress("PrivatePropertyName", "UNUSED_PARAMETER") class WeworkAgentUtils private constructor() { @@ -65,7 +66,7 @@ class WeworkAgentUtils private constructor() { MMKVUtils.put("expires_in_" + setting.agentID, System.currentTimeMillis() + ((resp.expires_in ?: 7200) - 120) * 1000L) //提前2分钟过期 sendTextMsg(setting, msgInfo, rule, logId) } else { - XToastUtils.error("请求失败:$response") + XToastUtils.error(String.format(getString(R.string.request_failed_tips), response)) } } diff --git a/app/src/main/res/layout/adapter_item_simple_list.xml b/app/src/main/res/layout/adapter_item_simple_list.xml index 2c1fc4e1..b0865bcb 100644 --- a/app/src/main/res/layout/adapter_item_simple_list.xml +++ b/app/src/main/res/layout/adapter_item_simple_list.xml @@ -12,12 +12,12 @@ + tools:text="@string/main_title" /> + tools:text="@string/subtitle" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_guide_tips.xml b/app/src/main/res/layout/dialog_guide_tips.xml index 53576fc8..547103a0 100644 --- a/app/src/main/res/layout/dialog_guide_tips.xml +++ b/app/src/main/res/layout/dialog_guide_tips.xml @@ -67,7 +67,7 @@ android:paddingBottom="@dimen/config_margin_10dp" android:singleLine="false" android:textColor="@color/xui_config_color_primary_text" - tools:text="获取更多资讯,欢迎关注我的微信公众号:【我的Android开源之旅】" /> + tools:text="" /> @@ -49,7 +49,7 @@ + android:hint="@string/service_address_hint" /> @@ -72,7 +72,7 @@ diff --git a/app/src/main/res/layout/fragment_client_call_query.xml b/app/src/main/res/layout/fragment_client_call_query.xml index 5f1ac1b6..02c5091b 100644 --- a/app/src/main/res/layout/fragment_client_call_query.xml +++ b/app/src/main/res/layout/fragment_client_call_query.xml @@ -12,7 +12,7 @@ android:id="@+id/search_view" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="输入关键字模糊匹配手机号码" /> + android:hint="@string/call_keyword_hint" /> + android:hint="@string/contact_keyword_hint" /> + android:hint="@string/sms_keyword_hint" /> + app:mlet_hintText="@string/msg_content_hint" /> diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 3798ad8f..9c4d4f5e 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -55,6 +55,7 @@ Yes No + Allow pages to open QQ apps? Allow pages to open third-party apps? @@ -703,6 +704,7 @@ Other login methods Request succeeded Request failed: + Request failed: %s No SMS sending permission Missing FrpcLib v%s Downloading, please wait… @@ -802,5 +804,52 @@ Status: %s Health: %s Plugged: %s + Server Test + Invalid service address + Click the test button first, to get the list of features enabled by the server + Disable this feature on the server + Frpc failed to run + Successfully deleted + [Note] The sending channel has been disabled, and its associated rules will not be sent even if they match! + Local Call: + Remote SMS: + Clear + Unauthorized storage permission, this function cannot be used! + Name:%s\nPhone:%s + Card slot does not match the rule + Unmatched rule + Copied to clipboard:\n%s + Search Keyword: %s + Export configuration succeeded! + Export failed, please check write permission! + Export failed: %s + Import failed: Please check for external storage access! + Import failed: local backup file does not exist + Import configuration successful! + Import failed: %s + Restore failed + Battery Status Monitor + [Battery Warning] The battery has been lower than the lower limit of the battery warning, please charge it in time!%s + [Battery Warning] The battery warning limit has been exceeded, please unplug the charger!%s + [Battery Warning] The lower limit of the battery warning has been reached, please charge it in time!%s + [Battery Warning] The upper limit of battery warning has been reached, please unplug the charger!%s + 【充电状态】发生变化: + 第一行不允许缩进 + The server enables the signing key, and the sign node required + The server enables the signing key, and the timestamp node required + Sign verify failed + version_code required + The app versions of the client and server are inconsistent + The timestamp verification failed, and the difference with the server time (%s) cannot exceed 1 hour (diffTime=%s) + + Main title + Subtitle + Input keywords to fuzzy match SMS content + Pure numbers match numbers / non-numbers match names + Input keyword to fuzzy match mobile phone number + Fill two items according to the config of server, the signature key is optional + Service Address + E.g: http://127.0.0.1:5000 + Features List diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ce46cd8d..6b44ea8f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,6 +55,7 @@ + 是否允许页面打开"QQ"? 是否允许页面打开第三方应用? @@ -704,6 +705,7 @@ 其他登录方式 请求成功 请求失败: + 请求失败:%s 没有短信发送权限 缺少 FrpcLib v%s 动态库 正在下载中,请稍后…… @@ -803,5 +805,52 @@ 电池状态:%s 健康度:%s 充电器:%s + 测试接口 + 无效的服务地址 + 请先点击【测试接口】按钮,获取服务端已启用的功能列表 + 服务端禁用此功能 + Frpc运行失败 + 删除成功 + 【注意】该发送通道已经禁用,其关联的规则即便匹配上也不会发送! + 本地呼叫: + 远程发短信: + 清除 + 未授权储存权限,该功能无法使用! + 姓名:%s\n号码:%s + 卡槽未匹配中规则 + 未匹配中规则 + 已复制到剪贴板:\n%s + 搜索关键字: %s + 导出配置成功! + 导出失败,请检查写入权限! + 导出失败: %s + 导入失败:请检查是否有外部存储访问权限! + 导入失败:本地备份文件不存在! + 导入配置成功! + 导入失败: %s + 还原失败 + 电池状态监听 + 【电量预警】已低于电量预警下限,请及时充电!%s + 【电量预警】已高于电量预警上限,请拔掉充电器!%s + 【电量预警】已低于电量预警下限,请及时充电!%s + 【电量预警】已高于电量预警上限,请拔掉充电器!%s + 【充电状态】发生变化: + 第一行不允许缩进 + 服务端启用签名密钥,sign节点必传 + 服务端启用签名密钥,timestamp节点必传 + 签名校验失败 + version_code节点必传 + 客户端与服务端的App版本不一致 + timestamp校验失败,与服务器时间(%s)误差不能超过1小时(diffTime=%s) + + 主标题 + 副标题 + 输入关键字模糊匹配短信内容 + 纯数字匹配号码/非数字匹配姓名 + 输入关键字模糊匹配手机号码 + 按照主动控制·服务端的配置填写以下两项,签名密钥可选 + 服务地址 + 例如:http://127.0.0.1:5000 + 功能列表