From eeec0520d017f571c3bfc3338791581223c29cfa Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Thu, 18 Dec 2025 14:12:52 +0800 Subject: [PATCH] =?UTF-8?q?[8.3.0]=20=E5=8F=B8=E4=B9=98=E5=B1=8F=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E8=87=AA=E5=8A=A8=E4=BF=AE=E6=94=B9=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E6=9A=82=E6=97=B6=E6=9C=AA=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=8C=E5=9B=A0=E4=B8=BA=E4=B9=98=E5=AE=A2=E5=B1=8F=E4=B8=8E?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E5=9B=BD=E5=AE=B6=E5=8C=96=E5=8A=9F=E8=83=BD?= =?UTF-8?q?dpi=E5=AD=98=E5=9C=A8=E5=86=B2=E7=AA=81=EF=BC=8C=E4=BC=9A?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E4=B9=98=E5=AE=A2=E5=B1=8FUI=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=E9=94=99=E4=B9=B1=EF=BC=8C=E6=9A=82=E6=97=B6=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/setting/DebugSettingView.kt | 52 ++++++++++++++ .../eagle/core/function/main/MainActivity.kt | 7 ++ .../main/res/layout/view_debug_setting.xml | 61 +++++++++++++++++ .../com/mogo/commons/AbsMogoApplication.java | 5 ++ .../com/mogo/commons/utils/LocaleHelper.java | 68 +++++++++++++++++++ 5 files changed, 193 insertions(+) create mode 100644 foudations/mogo-commons/src/main/java/com/mogo/commons/utils/LocaleHelper.java diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 861a1e1f31..739d5c1257 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -18,6 +18,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter +import android.widget.RadioGroup import android.widget.TextView import androidx.annotation.RequiresApi import androidx.appcompat.widget.ListPopupWindow @@ -36,6 +37,7 @@ import com.mogo.commons.constants.SharedPrefsConstants import com.mogo.commons.debug.DebugConfig import com.mogo.commons.module.status.MogoStatusManager import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.commons.utils.LocaleHelper import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig @@ -161,6 +163,9 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.btnEnsureMap import kotlinx.android.synthetic.main.view_debug_setting.view.btnFmd import kotlinx.android.synthetic.main.view_debug_setting.view.btnHdVisualAdjust import kotlinx.android.synthetic.main.view_debug_setting.view.btnIpcReboot +import kotlinx.android.synthetic.main.view_debug_setting.view.btnLanguageChinese +import kotlinx.android.synthetic.main.view_debug_setting.view.btnLanguageEnglish +import kotlinx.android.synthetic.main.view_debug_setting.view.btnLanguageFollowSystem import kotlinx.android.synthetic.main.view_debug_setting.view.btnPassengerReboot import kotlinx.android.synthetic.main.view_debug_setting.view.btnPointCloudColor import kotlinx.android.synthetic.main.view_debug_setting.view.btnPointCloudSize @@ -217,6 +222,7 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.etThreshold import kotlinx.android.synthetic.main.view_debug_setting.view.exportAllLogs import kotlinx.android.synthetic.main.view_debug_setting.view.hdMapControllerLayout import kotlinx.android.synthetic.main.view_debug_setting.view.hmiControllerLayout +import kotlinx.android.synthetic.main.view_debug_setting.view.layoutLanguage import kotlinx.android.synthetic.main.view_debug_setting.view.logLoadingView import kotlinx.android.synthetic.main.view_debug_setting.view.logcatCenterLayout import kotlinx.android.synthetic.main.view_debug_setting.view.obuConnectStatusTv @@ -224,6 +230,7 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.obuControllerLayou import kotlinx.android.synthetic.main.view_debug_setting.view.reportMsgLayout import kotlinx.android.synthetic.main.view_debug_setting.view.reset_changesight import kotlinx.android.synthetic.main.view_debug_setting.view.rgGpsProvider +import kotlinx.android.synthetic.main.view_debug_setting.view.rgLanguage import kotlinx.android.synthetic.main.view_debug_setting.view.statusCenterLayout import kotlinx.android.synthetic.main.view_debug_setting.view.swDevelopMode import kotlinx.android.synthetic.main.view_debug_setting.view.tbADASLog @@ -252,6 +259,7 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.tbIsDrawPath import kotlinx.android.synthetic.main.view_debug_setting.view.tbIsDrawUnknownIdentifyData import kotlinx.android.synthetic.main.view_debug_setting.view.tbIsRainMode import kotlinx.android.synthetic.main.view_debug_setting.view.tbIsStrictMode +import kotlinx.android.synthetic.main.view_debug_setting.view.tbLanguage import kotlinx.android.synthetic.main.view_debug_setting.view.tbLogCatch import kotlinx.android.synthetic.main.view_debug_setting.view.tbLogcatCenter import kotlinx.android.synthetic.main.view_debug_setting.view.tbNetLog @@ -859,6 +867,50 @@ internal class DebugSettingView @JvmOverloads constructor( ActivityUtils.startActivity(AutopilotCheckAct::class.java) } + when (LocaleHelper.getLanguage(AbsMogoApplication.getApp())) { + LocaleHelper.LANGUAGE_FOLLOW_SYSTEM -> { + rgLanguage.check(R.id.btnLanguageFollowSystem) + } + + LocaleHelper.LANGUAGE_CHINESE -> { + rgLanguage.check(R.id.btnLanguageChinese) + } + + LocaleHelper.LANGUAGE_ENGLISH -> { + rgLanguage.check(R.id.btnLanguageEnglish) + } + + else -> {} + } + /** + * 语言 + */ + tbLanguage.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + buttonView.setCompoundDrawables(null, null, iconDown, null) + //展示调试中心 + layoutLanguage.visibility = View.VISIBLE + } else { + buttonView.setCompoundDrawables(null, null, iconRight, null) + //隐藏日志中心 + layoutLanguage.visibility = View.GONE + } + } + rgLanguage.setOnCheckedChangeListener(RadioGroup.OnCheckedChangeListener { group, checkedId -> + when (checkedId) { + R.id.btnLanguageFollowSystem -> { + LocaleHelper.setLocale(AbsMogoApplication.getApp(), LocaleHelper.LANGUAGE_FOLLOW_SYSTEM) + } + + R.id.btnLanguageChinese -> { + LocaleHelper.setLocale(AbsMogoApplication.getApp(), LocaleHelper.LANGUAGE_CHINESE) + } + + R.id.btnLanguageEnglish -> { + LocaleHelper.setLocale(AbsMogoApplication.getApp(), LocaleHelper.LANGUAGE_ENGLISH) + } + } + }) /** * 日志中心 */ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt index 7143b0f3fe..035bc94787 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.main import android.Manifest +import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri @@ -23,6 +24,7 @@ import com.mogo.commons.context.ContextHolderUtil import com.mogo.commons.debug.DebugConfig import com.mogo.commons.module.status.MogoStatusManager import com.mogo.commons.mvp.MvpActivity +import com.mogo.commons.utils.LocaleHelper import com.mogo.commons.utils.MogoAnalyticUtils import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.deva.chain.ChainConstant @@ -95,6 +97,11 @@ open class MainActivity : MvpActivity(), MainView, PermissionsDialogUtils.openAppDetails(this, StringUtils.getString(R.string.module_core_show_pop_window), REQUEST_CODE_DIALOG) } +// override fun attachBaseContext(newBase: Context) { +// super.attachBaseContext(LocaleHelper.onAttach(newBase)) +// } + + // todo 优化 车聊聊 private fun injectFloatView() { val decorView = this.window.decorView as? FrameLayout ?: return diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 1957d74eb6..da39c97ca9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -233,6 +233,67 @@ android:layout_height="1dp" android:background="#F0F0F0" /> + + + + + + + + + + + + + + { CallerLogger.e("RxJava", "" + throwable); diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/utils/LocaleHelper.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/utils/LocaleHelper.java new file mode 100644 index 0000000000..5011609b43 --- /dev/null +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/utils/LocaleHelper.java @@ -0,0 +1,68 @@ +package com.mogo.commons.utils; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Build; +import android.preference.PreferenceManager; + +import java.util.Locale; + +public class LocaleHelper { + public static final String KEY_APP_LANGUAGE = "app_language"; + + // 语言代码常量 + public static final String LANGUAGE_FOLLOW_SYSTEM = "auto"; + public static final String LANGUAGE_CHINESE = "zh"; + public static final String LANGUAGE_ENGLISH = "en"; + + // 在 Application 和 BaseActivity 的 attachBaseContext 中调用 + public static Context onAttach(Context context) { + String lang = getPersistedData(context, LANGUAGE_FOLLOW_SYSTEM); + return setLocale(context, lang); + } + + public static String getLanguage(Context context) { + return getPersistedData(context, LANGUAGE_FOLLOW_SYSTEM); + } + + // 保存并设置语言 + public static Context setLocale(Context context, String language) { + persist(context, language); + + if (LANGUAGE_FOLLOW_SYSTEM.equals(language)) { + // 如果是跟随系统,获取系统当前的 Locale + Locale systemLocale; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + systemLocale = Resources.getSystem().getConfiguration().getLocales().get(0); + } else { + systemLocale = Resources.getSystem().getConfiguration().locale; + } + return updateResources(context, systemLocale); + } + + return updateResources(context, new Locale(language)); + } + + private static String getPersistedData(Context context, String defaultLanguage) { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + return preferences.getString(KEY_APP_LANGUAGE, defaultLanguage); + } + + private static void persist(Context context, String language) { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + preferences.edit().putString(KEY_APP_LANGUAGE, language).apply(); + } + + // 核心适配逻辑:兼容 Android N (7.0) 及以上 + @TargetApi(Build.VERSION_CODES.N) + private static Context updateResources(Context context, Locale locale) { + Configuration configuration = context.getResources().getConfiguration(); + configuration.setLocale(locale); + configuration.setLayoutDirection(locale); // 适配从右到左的语言(如阿拉伯语),虽然这里只是中英文 + // 创建包含新配置的 Context + return context.createConfigurationContext(configuration); + } +} \ No newline at end of file