适配中英文切换

This commit is contained in:
2026-05-08 16:39:15 +08:00
parent 428b5e507f
commit 5ee50d3785
38 changed files with 1248 additions and 191 deletions

View File

@@ -1,10 +1,20 @@
package com.example.defenseapplication
import android.app.Application
import com.blankj.utilcode.util.Utils;
import android.content.Context
import com.blankj.utilcode.util.Utils
import com.example.defenseapplication.utils.LanguageUtil
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
Utils.init(this) // 初始化 AndroidUtilCode
}
override fun attachBaseContext(base: Context) {
// 在应用启动时应用语言设置
val context = LanguageUtil.attachBaseContext(base)
super.attachBaseContext(context)
}
}

View File

@@ -0,0 +1,38 @@
package com.example.defenseapplication.base
import android.content.Context
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.defenseapplication.utils.LanguageUtil
/**
* 支持语言切换的 Activity 基类
* 所有需要支持多语言的 Activity 都应该继承此类
*/
abstract class BaseActivity : AppCompatActivity() {
override fun attachBaseContext(newBase: Context) {
// 在 Activity 创建前应用语言设置
val context = LanguageUtil.attachBaseContext(newBase)
super.attachBaseContext(context)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 确保语言设置被应用
LanguageUtil.updateResources(this)
}
/**
* 切换语言
* 调用后会重新创建 Activity 以应用新语言
*/
protected fun switchLanguage(language: String) {
val currentLang = LanguageUtil.getCurrentLanguage(this)
if (currentLang != language) {
LanguageUtil.switchLanguage(this, language)
// 重新创建 Activity 以应用新语言
recreate()
}
}
}

View File

@@ -6,6 +6,7 @@ import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import com.example.defenseapplication.R
import com.example.defenseapplication.adapter.AddDeviceAdapter
import com.example.defenseapplication.adapter.Device
import com.example.defenseapplication.databinding.AddDeviceActivityBinding
@@ -32,8 +33,8 @@ class AddDeviceActivity : AppCompatActivity() {
private fun setupDeviceList() {
val devices = listOf(
Device("智能挂式防御机", "device1"),
Device("智能防御机", "device2")
Device(getString(R.string.smart_hanging_defense), "device1"),
Device(getString(R.string.smart_defense_device), "device2")
)
if (devices.isEmpty()) {

View File

@@ -1,6 +1,7 @@
package com.example.defenseapplication.home
import android.content.Intent
import android.content.res.Resources
import android.graphics.Color
import android.graphics.Rect
import android.graphics.drawable.GradientDrawable
@@ -13,6 +14,7 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.defenseapplication.R
import com.example.defenseapplication.adapter.DeviceAdapter
import com.example.defenseapplication.adapter.DeviceUi
import com.example.defenseapplication.adapter.FamilyAdapter
@@ -28,24 +30,32 @@ class HomeMenuFragment : Fragment() {
private val deviceAdapter by lazy { DeviceAdapter(::onDeviceClicked) }
private var isFamilyExpanded = false
private var currentFamily = "我的家庭"
private lateinit var currentFamily: String
private val familyList = listOf("我的家庭", "工作室", "父母家")
private val familyDeviceMap = mapOf(
"我的家庭" to listOf(
DeviceUi("智能挂式防御机", true),
DeviceUi("智能防御机", false),
DeviceUi("智能轨道防御机", false)
private val familyList: List<String> by lazy {
listOf(
getString(R.string.my_family_home),
getString(R.string.workshop),
getString(R.string.parents_home)
)
}
private val familyDeviceMap: Map<String, List<DeviceUi>> by lazy {
mapOf(
getString(R.string.my_family_home) to listOf(
DeviceUi(getString(R.string.smart_hanging_defense), true),
DeviceUi(getString(R.string.smart_defense_device), false),
DeviceUi(getString(R.string.smart_rail_defense), false)
),
"工作室" to listOf(
DeviceUi("走廊防御机", true),
DeviceUi("门禁防御机", true)
getString(R.string.workshop) to listOf(
DeviceUi(getString(R.string.corridor_defense), true),
DeviceUi(getString(R.string.door_defense), true)
),
"父母家" to listOf(
DeviceUi("客厅防御机", false),
DeviceUi("阳台防御机", true)
getString(R.string.parents_home) to listOf(
DeviceUi(getString(R.string.living_room_defense), false),
DeviceUi(getString(R.string.balcony_defense), true)
)
)
}
override fun onCreateView(
inflater: LayoutInflater,
@@ -81,6 +91,7 @@ class HomeMenuFragment : Fragment() {
}
private fun initView() {
currentFamily = familyList.first()
binding.rvFamilyList.layoutManager = LinearLayoutManager(requireContext())
binding.rvFamilyList.adapter = familyAdapter
familyAdapter.submitList(familyList, currentFamily)
@@ -133,7 +144,7 @@ class HomeMenuFragment : Fragment() {
private fun onDeviceClicked(device: DeviceUi) {
if (device.isOnline) return
showDefenseDialog(
config = DefenseDialogs.deviceOfflineConfig()
config = DefenseDialogs.deviceOfflineConfig(requireContext())
)
}

View File

@@ -10,6 +10,8 @@ import com.bumptech.glide.Glide
import com.example.defenseapplication.R
import com.example.defenseapplication.databinding.PersonalFragmentBinding
import com.example.defenseapplication.personal.PersonalProfileActivity
import com.example.defenseapplication.utils.LanguageUtil
import com.example.defenseapplication.view.LanguageDialog
import com.gyf.immersionbar.ImmersionBar
class PersonalFragment : Fragment() {
@@ -37,9 +39,36 @@ class PersonalFragment : Fragment() {
val intent= Intent(requireContext(), PersonalProfileActivity::class.java)
startActivity(intent)
}
// 更新当前语言显示
updateCurrentLanguageDisplay()
// 语言设置点击事件
binding.itemLanguage.setOnClickListener {
showLanguageDialog()
}
return binding.root
}
/**
* 更新当前语言显示
*/
private fun updateCurrentLanguageDisplay() {
val currentLang = LanguageUtil.getCurrentLanguage(requireContext())
binding.tvCurrentLanguage.text = LanguageUtil.getLanguageDisplayName(currentLang)
}
/**
* 显示语言选择对话框
*/
private fun showLanguageDialog() {
val dialog = LanguageDialog(requireContext()) { language ->
LanguageUtil.switchLanguage(requireContext(), language)
// 刷新当前页面以应用新语言
requireActivity().recreate()
}
dialog.show()
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null // 避免内存泄漏

View File

@@ -56,7 +56,7 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
if (isGranted) {
startRecordingMode()
} else {
Toast.makeText(this, "需要录音权限才能使用控制功能", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.recording_permission_needed, Toast.LENGTH_SHORT).show()
isRecording = false
}
}
@@ -108,29 +108,29 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
mp.isLooping = true
mp.start()
this@LiveVideoActivity.isPlaying = true
Toast.makeText(this@LiveVideoActivity, "视频准备完成", Toast.LENGTH_SHORT).show()
Toast.makeText(this@LiveVideoActivity, R.string.video_ready, Toast.LENGTH_SHORT).show()
}
setOnCompletionListener {
this@LiveVideoActivity.isPlaying = false
Toast.makeText(this@LiveVideoActivity, "播放完成", Toast.LENGTH_SHORT).show()
Toast.makeText(this@LiveVideoActivity, R.string.playback_complete, Toast.LENGTH_SHORT).show()
}
setOnErrorListener { _, what, extra ->
Toast.makeText(this@LiveVideoActivity, "播放错误: $what, $extra", Toast.LENGTH_SHORT).show()
Toast.makeText(this@LiveVideoActivity, getString(R.string.video_error_format, what, extra), Toast.LENGTH_SHORT).show()
releaseMediaPlayer()
true
}
setOnBufferingUpdateListener { _, percent ->
if (percent < 100) {
Toast.makeText(this@LiveVideoActivity, "缓冲中: $percent%", Toast.LENGTH_SHORT).show()
Toast.makeText(this@LiveVideoActivity, getString(R.string.buffering_format, percent), Toast.LENGTH_SHORT).show()
}
}
} catch (e: IOException) {
e.printStackTrace()
Toast.makeText(this@LiveVideoActivity, "无法加载视频", Toast.LENGTH_SHORT).show()
Toast.makeText(this@LiveVideoActivity, R.string.cannot_load_video, Toast.LENGTH_SHORT).show()
}
}
}
@@ -192,7 +192,7 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
}
binding.llAlarmLog.setOnClickListener {
Toast.makeText(this, "查看告警日志", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.view_alarm_log, Toast.LENGTH_SHORT).show()
}
// 点击xq箭头跳转到AlarmLogActivity
@@ -207,11 +207,11 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
if (mp.isPlaying) {
mp.pause()
isPlaying = false
Toast.makeText(this, "已暂停", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.paused, Toast.LENGTH_SHORT).show()
} else {
mp.start()
isPlaying = true
Toast.makeText(this, "继续播放", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.resume_playback, Toast.LENGTH_SHORT).show()
}
}
}
@@ -250,7 +250,7 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
binding.ivFullscreen.setImageResource(com.example.defenseapplication.R.drawable.back)
Toast.makeText(this, "已进入全屏", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.entered_fullscreen, Toast.LENGTH_SHORT).show()
}
private fun exitFullscreen() {
@@ -274,7 +274,7 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
binding.ivFullscreen.setImageResource(com.example.defenseapplication.R.drawable.full_screen)
Toast.makeText(this, "已退出全屏", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.exited_fullscreen, Toast.LENGTH_SHORT).show()
}
private fun toggleVoice() {
@@ -283,11 +283,11 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
if (isVoiceEnabled) {
mediaPlayer?.setVolume(1.0f, 1.0f)
binding.ivVoice.setImageResource(com.example.defenseapplication.R.drawable.voice_on_open)
Toast.makeText(this, "声音已开启", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.sound_on, Toast.LENGTH_SHORT).show()
} else {
mediaPlayer?.setVolume(0.0f, 0.0f)
binding.ivVoice.setImageResource(com.example.defenseapplication.R.drawable.voice)
Toast.makeText(this, "声音已关闭", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.sound_off, Toast.LENGTH_SHORT).show()
}
}
@@ -296,10 +296,10 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
if (isLightOn) {
binding.ivLight.setImageResource(com.example.defenseapplication.R.drawable.light_on_open)
Toast.makeText(this, "灯光已开启", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.light_on, Toast.LENGTH_SHORT).show()
} else {
binding.ivLight.setImageResource(com.example.defenseapplication.R.drawable.light_on)
Toast.makeText(this, "灯光已关闭", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.light_off, Toast.LENGTH_SHORT).show()
}
}
@@ -344,7 +344,7 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
// 启动麦克风脉冲动画
//startMicPulseAnimation()
Toast.makeText(this, "开始控制模式", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.start_control_mode, Toast.LENGTH_SHORT).show()
}
private fun stopRecordingMode() {
@@ -365,7 +365,7 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
// 停止麦克风脉冲动画
stopMicPulseAnimation()
Toast.makeText(this, "停止控制模式", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.stop_control_mode, Toast.LENGTH_SHORT).show()
}
// private fun startMicPulseAnimation() {
@@ -408,7 +408,7 @@ class LiveVideoActivity : AppCompatActivity(), SurfaceHolder.Callback {
start()
} catch (e: IOException) {
e.printStackTrace()
Toast.makeText(this@LiveVideoActivity, "录音启动失败", Toast.LENGTH_SHORT).show()
Toast.makeText(this@LiveVideoActivity, R.string.recording_start_failed, Toast.LENGTH_SHORT).show()
}
}
}

View File

@@ -1,13 +1,16 @@
package com.example.defenseapplication.liveVideo
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.defenseapplication.R
import com.example.defenseapplication.base.BaseActivity
import com.example.defenseapplication.databinding.SettingsActivityBinding
import com.example.defenseapplication.utils.LanguageUtil
import com.example.defenseapplication.view.CustomDialogFragmentText
import com.example.defenseapplication.view.LanguageDialog
import com.example.defenseapplication.view.RecognitionModeDialog
import com.gyf.immersionbar.ImmersionBar
class SettingsActivity : AppCompatActivity() {
class SettingsActivity : BaseActivity() {
private lateinit var binding: SettingsActivityBinding
@@ -34,8 +37,7 @@ class SettingsActivity : AppCompatActivity() {
binding.itemDeviceName.setOnClickListener {
val dialog = CustomDialogFragmentText()
.setTitle("设备名称")
.setInputHint("请输入设备名称")
.setTitle(getString(R.string.device_name))
.setInputText(binding.tvDeviceName.text.toString())
dialog.setOnConfirmListener { name ->
binding.tvDeviceName.text = name
@@ -45,15 +47,18 @@ class SettingsActivity : AppCompatActivity() {
binding.itemUnbindDevice.setOnClickListener {
val dialog = CustomDialogFragmentText()
.setTitle("提示")
.setMessage("确定解除该设备的绑定?")
.setNegativeText("取消")
.setPositiveText("确定")
.setTitle(getString(R.string.tip))
.setMessage(getString(R.string.logout_confirm))
.setNegativeText(getString(R.string.cancel))
.setPositiveText(getString(R.string.confirm))
.setShowInput(false)
dialog.setOnConfirmListener {
finish()
}
dialog.show(supportFragmentManager, "CustomDialogFragment")
}
}
}

View File

@@ -35,7 +35,7 @@ class FaceLoginActivity : AppCompatActivity() {
binding.btnStartVerification.setOnClickListener {
val intent= Intent(this, FaceVerificationActivity::class.java)
startActivity(intent)
Toast.makeText(this, "跳转到人脸识别页面", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.redirect_face_recognition_page, Toast.LENGTH_SHORT).show()
}

View File

@@ -114,24 +114,24 @@ class LoginActivity : AppCompatActivity() {
binding.loginBtn.setOnClickListener {
val phone = binding.etPhone.text.toString()
if (phone.isEmpty()) {
Toast.makeText(this, "请输入手机号", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.enter_phone_number, Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
when (currentLoginMode) {
LoginMode.SMS -> {
val code = binding.etSmsCode.text.toString()
if (code.isEmpty()) {
Toast.makeText(this, "请输入验证码", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.enter_verification_code_pls, Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "验证码登录成功\n手机号:$phone\n验证码:$code", Toast.LENGTH_SHORT).show()
Toast.makeText(this, getString(R.string.sms_login_success, phone, code), Toast.LENGTH_SHORT).show()
}
}
LoginMode.PASSWORD -> {
val pwd = binding.etPassword.text.toString()
if (pwd.isEmpty()) {
Toast.makeText(this, "请输入密码", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.password_hint, Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "密码登录成功\n手机号:$phone\n密码:$pwd", Toast.LENGTH_SHORT).show()
Toast.makeText(this, getString(R.string.password_login_success, phone, pwd), Toast.LENGTH_SHORT).show()
}
}
}
@@ -140,23 +140,23 @@ class LoginActivity : AppCompatActivity() {
binding.sendCodeBtn.setOnClickListener {
val phone = binding.etPhone.text.toString()
if (phone.isEmpty()) {
Toast.makeText(this, "请先输入手机号", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.phone_hint, Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
Toast.makeText(this, "验证码已发送至 $phone", Toast.LENGTH_SHORT).show()
Toast.makeText(this, getString(R.string.code_sent_to, phone), Toast.LENGTH_SHORT).show()
startCountDown()
}
binding.registerText.setOnClickListener {
val intent= Intent(this, RegisterActivity::class.java)
startActivity(intent)
Toast.makeText(this, "跳转到注册页面", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.redirect_register_page, Toast.LENGTH_SHORT).show()
}
binding.forgetText.setOnClickListener {
val intent= Intent(this, ForgetPasswordActivity::class.java)
startActivity(intent)
Toast.makeText(this, "找回密码", Toast.LENGTH_SHORT).show()
Toast.makeText(this, R.string.forgot_password_page, Toast.LENGTH_SHORT).show()
}
}
@@ -164,10 +164,10 @@ class LoginActivity : AppCompatActivity() {
binding.sendCodeBtn.isEnabled = false
object : CountDownTimer(60000, 1000) {
override fun onTick(millisUntilFinished: Long) {
binding.sendCodeBtn.text = "${millisUntilFinished / 1000}秒后重试"
binding.sendCodeBtn.text = getString(R.string.countdown_retry, millisUntilFinished / 1000)
}
override fun onFinish() {
binding.sendCodeBtn.text = "发送验证码"
binding.sendCodeBtn.text = getString(R.string.send_code)
binding.sendCodeBtn.isEnabled = true
}
}.start()

View File

@@ -39,7 +39,7 @@ class PersonalProfileActivity : AppCompatActivity() {
.circleCrop()
.into(binding.ivAvatar)
binding.tvNickname.text = "这里是我的昵称"
binding.tvNickname.text = getString(R.string.nickname_default)
binding.tvPhone.text = "13589898989"
// 点击行可跳转到“修改昵称/修改手机号”等页面

View File

@@ -0,0 +1,115 @@
package com.example.defenseapplication.utils
import android.content.Context
import android.content.SharedPreferences
import android.content.res.Configuration
import android.content.res.Resources
import android.os.Build
import android.os.LocaleList
import java.util.Locale
object LanguageUtil {
private const val PREF_NAME = "language_pref"
private const val KEY_LANGUAGE = "selected_language"
const val LANGUAGE_CHINESE = "zh"
const val LANGUAGE_ENGLISH = "en"
/**
* 切换语言
* @param context 上下文
* @param language 语言代码: "zh" 中文, "en" 英文
*/
fun switchLanguage(context: Context, language: String) {
saveLanguage(context, language)
}
/**
* 获取当前设置的语言
*/
fun getCurrentLanguage(context: Context): String {
val prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
return prefs.getString(KEY_LANGUAGE, LANGUAGE_CHINESE) ?: LANGUAGE_CHINESE
}
/**
* 保存语言设置
*/
private fun saveLanguage(context: Context, language: String) {
val prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
prefs.edit().putString(KEY_LANGUAGE, language).apply()
}
/**
* 判断当前是否是中文
*/
fun isChinese(context: Context): Boolean {
return getCurrentLanguage(context) == LANGUAGE_CHINESE
}
/**
* 获取本地化的 Context用于在应用内切换语言
* 在 attachBaseContext 中调用
*/
fun attachBaseContext(context: Context): Context {
val language = getCurrentLanguage(context)
return createLocalizedContext(context, language)
}
/**
* 创建本地化的 Context
*/
private fun createLocalizedContext(context: Context, language: String): Context {
val locale = Locale(language)
Locale.setDefault(locale)
val resources = context.resources
val configuration = resources.configuration
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// Android 7.0 及以上
val localeList = LocaleList(locale)
configuration.setLocales(localeList)
context.createConfigurationContext(configuration)
} else {
// Android 7.0 以下
configuration.locale = locale
resources.updateConfiguration(configuration, resources.displayMetrics)
context
}
}
/**
* 更新应用语言(用于在 Activity 中动态切换)
*/
fun updateResources(context: Context): Context {
val language = getCurrentLanguage(context)
val locale = Locale(language)
Locale.setDefault(locale)
val resources = context.resources
val configuration = resources.configuration
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val localeList = LocaleList(locale)
configuration.setLocales(localeList)
} else {
configuration.locale = locale
}
resources.updateConfiguration(configuration, resources.displayMetrics)
return context
}
/**
* 获取语言显示名称
*/
fun getLanguageDisplayName(language: String): String {
return when (language) {
LANGUAGE_CHINESE -> "中文"
LANGUAGE_ENGLISH -> "English"
else -> "中文"
}
}
}

View File

@@ -19,8 +19,8 @@ class CustomDialogFragmentText : DialogFragment() {
private var message: String = ""
private var inputHint: String = ""
private var inputText: String = ""
private var negativeText: String = "取消"
private var positiveText: String = "确定"
private var negativeText: String = ""
private var positiveText: String = ""
private var showInput: Boolean = true
private var onConfirmListener: ((String) -> Unit)? = null
@@ -87,6 +87,9 @@ class CustomDialogFragmentText : DialogFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Set defaults if not explicitly configured
if (negativeText.isEmpty()) negativeText = getString(R.string.cancel)
if (positiveText.isEmpty()) positiveText = getString(R.string.confirm)
binding.tvTitle.text = title
binding.tvMessage.text = message
binding.etInput.hint = inputHint

View File

@@ -183,41 +183,41 @@ object DefenseDialogs {
.also { it.show(fragment.parentFragmentManager, tag) }
}
fun intrusionAlertConfig(deviceName: String, timeText: String): CustomDialogFragment.Config {
fun intrusionAlertConfig(ctx: android.content.Context, deviceName: String, timeText: String): CustomDialogFragment.Config {
return CustomDialogFragment.Config(
title = "入侵告警",
message = "${timeText}有人入侵\n${deviceName}",
positiveText = "去看一下",
negativeText = "取消"
title = ctx.getString(R.string.intrusion_alarm),
message = "${timeText}${ctx.getString(R.string.someone_invaded)}\n${deviceName}",
positiveText = ctx.getString(R.string.go_check),
negativeText = ctx.getString(R.string.cancel)
)
}
fun warmPromptConfig(deviceName: String, runDays: Int): CustomDialogFragment.Config {
fun warmPromptConfig(ctx: android.content.Context, deviceName: String, runDays: Int): CustomDialogFragment.Config {
return CustomDialogFragment.Config(
title = "温馨提示",
message = "${deviceName}设备已经运行\n${runDays}天请及时维护",
positiveText = "知道了",
title = ctx.getString(R.string.notice),
message = "${deviceName}${ctx.getString(R.string.device_running_days, runDays)}",
positiveText = ctx.getString(R.string.got_it),
negativeText = null
)
}
fun deviceOfflineConfig(): CustomDialogFragment.Config {
fun deviceOfflineConfig(ctx: android.content.Context): CustomDialogFragment.Config {
return CustomDialogFragment.Config(
title = "设备离线",
message = "设备已离线请检查设备的WIF及电\n源情况",
positiveText = "知道了",
title = ctx.getString(R.string.device_offline),
message = ctx.getString(R.string.device_offline_message),
positiveText = ctx.getString(R.string.got_it),
negativeText = null
)
}
fun strikeDistanceConfig(defaultDistance: String): CustomDialogFragment.Config {
fun strikeDistanceConfig(ctx: android.content.Context, defaultDistance: String): CustomDialogFragment.Config {
return CustomDialogFragment.Config(
title = "打击距离",
title = ctx.getString(R.string.strike_distance),
message = "",
positiveText = "确定",
negativeText = "取消",
positiveText = ctx.getString(R.string.confirm),
negativeText = ctx.getString(R.string.cancel),
showInput = true,
inputHint = "请输入打击距离",
inputHint = ctx.getString(R.string.enter_strike_distance),
inputText = defaultDistance,
inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
)

View File

@@ -0,0 +1,63 @@
package com.example.defenseapplication.view
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Window
import android.widget.LinearLayout
import android.widget.TextView
import com.example.defenseapplication.R
import com.example.defenseapplication.utils.LanguageUtil
/**
* 语言选择对话框
*/
class LanguageDialog(
context: Context,
private val onLanguageSelected: (String) -> Unit
) : Dialog(context) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.dialog_language)
// 设置对话框宽度为屏幕宽度的80%
window?.setLayout(
(context.resources.displayMetrics.widthPixels * 0.8).toInt(),
LinearLayout.LayoutParams.WRAP_CONTENT
)
initViews()
}
private fun initViews() {
val tvChinese = findViewById<TextView>(R.id.tvChinese)
val tvEnglish = findViewById<TextView>(R.id.tvEnglish)
val tvCancel = findViewById<TextView>(R.id.tvCancel)
val currentLang = LanguageUtil.getCurrentLanguage(context)
// 根据当前语言高亮显示
if (currentLang == LanguageUtil.LANGUAGE_CHINESE) {
tvChinese.setTextColor(context.getColor(R.color.green))
} else {
tvEnglish.setTextColor(context.getColor(R.color.green))
}
tvChinese.setOnClickListener {
onLanguageSelected(LanguageUtil.LANGUAGE_CHINESE)
dismiss()
}
tvEnglish.setOnClickListener {
onLanguageSelected(LanguageUtil.LANGUAGE_ENGLISH)
dismiss()
}
tvCancel.setOnClickListener {
dismiss()
}
}
}

View File

@@ -39,12 +39,12 @@ class RecognitionModeDialog(context: Context) : Dialog(context) {
}
binding.itemBluetooth.setOnClickListener {
selectedMode = "蓝牙识别"
selectedMode = context.getString(R.string.bluetooth_recognition)
updateSelectedBackground(binding.itemBluetooth)
}
binding.itemBluetoothFace.setOnClickListener {
selectedMode = "蓝牙+人脸识别"
selectedMode = context.getString(R.string.bluetooth_face_recognition)
updateSelectedBackground(binding.itemBluetoothFace)
}

View File

@@ -24,7 +24,7 @@
android:id="@+id/logoText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="智能防御机"
android:text="@string/login_title"
android:textSize="26dp"
android:textStyle="bold"
android:textColor="@color/black"
@@ -53,7 +53,7 @@
android:gravity="center"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:text="验证码登录"
android:text="@string/sms_login"
android:textColor="@color/black"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
@@ -64,7 +64,7 @@
android:id="@+id/tvPwdLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码登录"
android:text="@string/password_login"
android:textSize="18sp"
android:gravity="center"
android:paddingTop="16dp"
@@ -98,7 +98,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:hint="请输入手机号"
android:hint="@string/phone_hint"
android:textColorHint="@color/gray"
android:textColor="@android:color/black"
android:background="@null"
@@ -142,7 +142,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:hint="请输入验证码"
android:hint="@string/sms_code_hint"
android:textColorHint="@color/gray"
android:textColor="@android:color/black"
android:background="@null"
@@ -158,7 +158,7 @@
android:id="@+id/sendCodeBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送验证码"
android:text="@string/send_sms_code"
android:textSize="16sp"
android:textColor="@color/white"
android:background="@drawable/rounded_blue_bg"
@@ -201,7 +201,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:hint="请输入密码"
android:hint="@string/password_hint"
android:textColorHint="@color/gray"
android:textColor="@android:color/black"
android:background="@null"
@@ -221,7 +221,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:text="登录"
android:text="@string/login"
android:textSize="18sp"
android:background="@drawable/rounded_blue_bg"
android:textColor="@color/white"
@@ -234,7 +234,7 @@
android:id="@+id/registerText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="立即注册"
android:text="@string/register"
android:textSize="14sp"
android:textColor="@color/green"
android:padding="8dp"
@@ -247,7 +247,7 @@
android:id="@+id/forgetText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="忘记密码"
android:text="@string/forgot_password"
android:textSize="14sp"
android:textColor="@color/green"
android:padding="8dp"

View File

@@ -30,7 +30,7 @@
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加设备"
android:text="@string/add_device_title"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold"
@@ -58,7 +58,7 @@
android:id="@+id/tvScanTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="扫描附近设备"
android:text="@string/scan_nearby"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />
@@ -68,7 +68,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="持续自动搜索中..."
android:text="@string/scanning"
android:textColor="@color/gray"
android:textSize="14dp" />
@@ -96,7 +96,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="请将手机尽量靠近要添加的设备"
android:text="@string/device_nearby_hint"
android:textColor="@color/gray"
android:textSize="14dp" />
</LinearLayout>
@@ -119,7 +119,7 @@
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:background="@drawable/rounded_blue_bg"
android:text="扫描添加"
android:text="@string/scan_add"
android:textColor="@color/white"
android:textSize="16dp"
android:textStyle="bold"

View File

@@ -32,7 +32,7 @@
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择Wi-Fi"
android:text="@string/select_wifi"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold"
@@ -68,7 +68,7 @@
android:layout_marginStart="12dp"
android:layout_weight="1"
android:background="@null"
android:hint="请输入WiFi名称"
android:hint="@string/enter_wifi_name"
android:textColor="@color/black"
android:textSize="16sp" />
@@ -78,7 +78,7 @@
android:layout_height="32dp"
android:layout_marginStart="12dp"
android:background="@drawable/rounded_blue_bg"
android:text="选择Wi-Fi"
android:text="@string/select_wifi"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
@@ -103,7 +103,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:background="@null"
android:hint="请输入WiFi密码"
android:hint="@string/enter_wifi_password"
android:inputType="textPassword"
android:textColor="@color/black"
android:textSize="16sp" />
@@ -132,7 +132,7 @@
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@drawable/rounded_blue_bg"
android:text="下一步"
android:text="@string/next_step"
android:textColor="@color/white"
android:textSize="16dp"
android:textStyle="bold" />

View File

@@ -27,7 +27,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="告警日志"
android:text="@string/alarm_log_title"
android:textSize="16sp"
android:textStyle="bold" />

View File

@@ -0,0 +1,70 @@
<?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="wrap_content"
android:background="@drawable/bg_white"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/language_settings"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold"
android:paddingBottom="16dp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EEEEEE" />
<TextView
android:id="@+id/tvChinese"
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center"
android:text="@string/chinese"
android:textColor="@color/black"
android:textSize="16sp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EEEEEE" />
<TextView
android:id="@+id/tvEnglish"
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center"
android:text="@string/english"
android:textColor="@color/black"
android:textSize="16sp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EEEEEE" />
<TextView
android:id="@+id/tvCancel"
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center"
android:text="@string/cancel"
android:textColor="@color/gray"
android:textSize="16sp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true" />
</LinearLayout>

View File

@@ -16,7 +16,7 @@
android:id="@+id/tv_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"
android:text="@string/cancel"
android:textColor="@color/black"
android:textSize="16sp" />
@@ -29,7 +29,7 @@
android:id="@+id/tv_confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确认"
android:text="@string/confirm"
android:textColor="@color/green"
android:textSize="16sp" />
</LinearLayout>
@@ -59,7 +59,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蓝牙识别"
android:text="@string/bluetooth_recognition"
android:textColor="@color/black"
android:textSize="16sp" />
</LinearLayout>
@@ -79,7 +79,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蓝牙+人脸识别"
android:text="@string/bluetooth_face_recognition"
android:textColor="@color/black"
android:textSize="16sp" />
</LinearLayout>

View File

@@ -10,7 +10,7 @@
android:layout_width="match_parent"
android:layout_height="56dp"
android:gravity="center"
android:text="选择Wi-Fi"
android:text="@string/select_wifi"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold" />

View File

@@ -31,7 +31,7 @@
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人脸识别"
android:text="@string/face_recognition"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
@@ -47,7 +47,7 @@
android:id="@+id/tvRegisterSubtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="人脸验证"
android:text="@string/face_verification"
android:textColor="@color/black"
android:textSize="20dp"
android:textStyle="bold"
@@ -78,7 +78,7 @@
android:id="@+id/tvSubTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="仅用于创建防御机制和防窃取,保障您的安全"
android:text="@string/face_security_notice"
android:textColor="@color/green"
android:textSize="12sp"
android:textStyle="bold"
@@ -106,7 +106,7 @@
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginTop="11dp"
android:text="请根据指示完成人脸验证"
android:text="@string/follow_instructions"
android:textColor="@color/icon_face"
android:textSize="12dp"
android:textStyle="bold"
@@ -152,7 +152,7 @@
android:layout_marginLeft="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标准拍摄"
android:text="@string/standard_capture"
android:textColor="@color/icon_face"
android:textSize="12dp"
android:textStyle="bold"/>
@@ -188,7 +188,7 @@
android:layout_marginLeft="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标准拍摄"
android:text="@string/standard_capture"
android:textColor="@color/icon_face"
android:textSize="12dp"
android:textStyle="bold"/>
@@ -224,7 +224,7 @@
android:layout_marginLeft="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拍摄不全"
android:text="@string/incomplete_capture"
android:textColor="@color/icon_face"
android:textSize="12dp"
android:textStyle="bold"/>
@@ -260,7 +260,7 @@
android:layout_marginLeft="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="光线不足"
android:text="@string/insufficient_light"
android:textColor="@color/icon_face"
android:textSize="12dp"
android:textStyle="bold"/>
@@ -279,7 +279,7 @@
android:layout_marginBottom="16dp"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:text="开始验证"
android:text="@string/start_verification"
android:textColor="@color/white"
android:textSize="14dp"
android:textStyle="bold"

View File

@@ -50,7 +50,7 @@
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人脸采集"
android:text="@string/face_collection"
android:textColor="@android:color/white"
android:textSize="22sp"
android:textStyle="bold"
@@ -84,7 +84,7 @@
android:id="@+id/tvFaceHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请将人脸放入圆形区域内"
android:text="@string/face_in_circle"
android:textColor="@android:color/white"
android:textSize="20sp"
android:textStyle="bold"
@@ -109,7 +109,7 @@
android:id="@+id/btnCaptureFace"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="采集人脸"
android:text="@string/collect_face"
android:textAllCaps="false"
android:textSize="17sp"
android:textStyle="bold"

View File

@@ -31,7 +31,7 @@
android:id="@+id/tvRegisterTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="找回密码"
android:text="@string/retrieve_password"
android:textColor="@color/black"
android:textSize="32sp"
android:textStyle="bold"
@@ -47,7 +47,7 @@
android:id="@+id/tvRegisterSubtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="找回密码"
android:text="@string/retrieve_password"
android:textColor="@color/black"
android:textSize="20dp"
android:textStyle="bold"
@@ -84,7 +84,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:background="@null"
android:hint="请输入手机号"
android:hint="@string/enter_phone_number"
android:inputType="phone"
android:maxLength="11"
android:paddingVertical="16dp"
@@ -128,7 +128,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:hint="请输入验证码"
android:hint="@string/enter_verification_code"
android:textColorHint="@color/gray"
android:textColor="@android:color/black"
android:background="@null"
@@ -144,7 +144,7 @@
android:id="@+id/sendCodeBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送验证码"
android:text="@string/send_code"
android:textSize="16sp"
android:textColor="@color/white"
android:background="@drawable/rounded_blue_bg"
@@ -185,7 +185,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:hint="请输入新密码"
android:hint="@string/enter_new_password"
android:textColorHint="@color/gray"
android:textColor="@android:color/black"
android:background="@null"
@@ -226,7 +226,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:background="@null"
android:hint="请再次输入新密码"
android:hint="@string/enter_password_again"
android:inputType="text"
android:maxLength="10"
android:paddingVertical="16dp"
@@ -246,7 +246,7 @@
android:layout_width="0dp"
android:layout_height="56dp"
android:layout_marginTop="32dp"
android:text="确定"
android:text="@string/determine"
android:textAllCaps="false"
android:textSize="16sp"
app:cornerRadius="12dp"

View File

@@ -45,7 +45,7 @@
android:id="@+id/tv_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="首页"
android:text="@string/home"
android:textSize="12sp"
android:textColor="@color/black"/>
</LinearLayout>
@@ -70,7 +70,7 @@
android:id="@+id/tv_profile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="个人"
android:text="@string/profile"
android:textSize="12sp"
android:textColor="@color/gray"/>
</LinearLayout>

View File

@@ -38,7 +38,7 @@
android:id="@+id/tvCurrentFamily"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的家庭"
android:text="@string/my_family_home"
android:textColor="@color/black"
android:textSize="20dp"
android:textStyle="bold" />
@@ -111,7 +111,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="14dp"
android:layout_marginEnd="16dp"
android:text="设备"
android:text="@string/device"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />

View File

@@ -29,7 +29,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="智能防御机A1"
android:text="@string/smart_device_a1"
android:textSize="16sp"
android:textStyle="bold" />
@@ -131,7 +131,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="语音"
android:text="@string/voice"
android:textSize="14sp"
android:textColor="@color/ic_normal"/>
@@ -155,7 +155,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="灯光"
android:text="@string/light"
android:textSize="14sp"
android:textColor="@color/ic_normal"/>
@@ -179,7 +179,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="控制"
android:text="@string/control"
android:textSize="14sp"
android:textColor="@color/ic_normal"/>
@@ -229,7 +229,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="告警日志"
android:text="@string/alarm_log_title"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />
@@ -286,7 +286,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="入侵告警"
android:text="@string/intrusion_detected"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold" />
@@ -331,7 +331,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="入侵告警"
android:text="@string/intrusion_detected"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold" />
@@ -379,7 +379,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="入侵告警"
android:text="@string/intrusion_detected"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold" />

View File

@@ -27,7 +27,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="消息列表"
android:text="@string/message_title"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold"/>

View File

@@ -42,7 +42,7 @@
android:id="@+id/tvNickname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这里是昵称"
android:text="@string/enter_nickname"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />
@@ -55,7 +55,7 @@
android:background="@drawable/rounded_blue_bg"
android:gravity="center"
android:paddingHorizontal="8dp"
android:text="管理员"
android:text="@string/admin"
android:textColor="@color/white"
android:textSize="11sp"
android:textStyle="bold" />
@@ -92,7 +92,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="切换家庭"
android:text="@string/switch_family"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -102,7 +102,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:text="我的家庭"
android:text="@string/my_family"
android:textColor="@color/green"
android:textSize="14dp" />
@@ -134,7 +134,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:text="用户管理"
android:text="@string/user_management"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -165,7 +165,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:text="密码管理"
android:text="@string/password_management"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -196,7 +196,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:text="人脸管理"
android:text="@string/face_management"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -205,6 +205,44 @@
android:layout_height="16dp"
android:src="@drawable/right_back" />
</LinearLayout>
<LinearLayout
android:id="@+id/itemLanguage"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/white"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="16dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/language_settings"
android:textColor="@color/black"
android:textSize="16dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/tvCurrentLanguage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/chinese"
android:textColor="@color/gray"
android:textSize="14sp" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="8dp"
android:src="@drawable/right_back" />
</LinearLayout>
</LinearLayout>
<Space
android:layout_width="match_parent"
@@ -219,8 +257,9 @@
android:layout_marginBottom="28dp"
android:background="@drawable/bg_logout_button"
android:gravity="center"
android:text="退出登录"
android:text="@string/logout"
android:textColor="#9B9B9B"
android:textSize="14dp" />
</LinearLayout>

View File

@@ -28,7 +28,7 @@
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="个人资料"
android:text="@string/personal_info"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold"
@@ -84,7 +84,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="昵称"
android:text="@string/nickname"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -127,7 +127,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绑定手机"
android:text="@string/bind_phone"
android:textColor="@color/black"
android:textSize="16dp" />

View File

@@ -31,7 +31,7 @@
android:id="@+id/tvRegisterTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注册"
android:text="@string/register_title"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold"
@@ -48,7 +48,7 @@
android:id="@+id/tvRegisterSubtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="注册用户"
android:text="@string/register_subtitle"
android:textColor="@color/black"
android:textSize="24dp"
android:textStyle="bold"
@@ -85,7 +85,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:background="@null"
android:hint="请输入手机号"
android:hint="@string/phone_hint"
android:inputType="phone"
android:maxLength="11"
android:paddingVertical="16dp"
@@ -127,7 +127,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:background="@null"
android:hint="请输入身份证号"
android:hint="@string/enter_id_number"
android:inputType="text"
android:maxLength="18"
android:paddingVertical="16dp"
@@ -170,7 +170,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:hint="请输入密码"
android:hint="@string/set_password"
android:textColorHint="@color/gray"
android:textColor="@android:color/black"
android:background="@null"
@@ -212,7 +212,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:background="@null"
android:hint="请输入邀请码(非必填)"
android:hint="@string/invite_code_optional"
android:inputType="text"
android:maxLength="10"
android:paddingVertical="16dp"
@@ -232,7 +232,7 @@
android:layout_width="0dp"
android:layout_height="56dp"
android:layout_marginTop="32dp"
android:text="下一步"
android:text="@string/next_step"
android:textAllCaps="false"
android:textSize="16sp"
app:cornerRadius="12dp"

View File

@@ -31,7 +31,7 @@ tools:context=".login.RegisterSuccessActivity">
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注册"
android:text="@string/register"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
@@ -47,7 +47,7 @@ tools:context=".login.RegisterSuccessActivity">
android:id="@+id/tvRegisterSubtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="注册用户"
android:text="@string/register_user"
android:textColor="@color/black"
android:textSize="20dp"
android:textStyle="bold"
@@ -76,7 +76,7 @@ tools:context=".login.RegisterSuccessActivity">
android:layout_marginBottom="16dp"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:text="进入平台3S"
android:text="@string/enter_platform"
android:textColor="@color/white"
android:textSize="14dp"
android:textStyle="bold"

View File

@@ -109,7 +109,7 @@
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="550dp"
android:text="请扫描设备或说明书上的二维码"
android:text="@string/scan_device_qr"
android:textColor="@color/white"
android:textSize="14sp" />
@@ -140,7 +140,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="相册"
android:text="@string/album"
android:textColor="@color/white"
android:textSize="12sp" />
@@ -164,7 +164,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="手电筒"
android:text="@string/flashlight"
android:textColor="@color/white"
android:textSize="12dp" />

View File

@@ -28,7 +28,7 @@
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置名字"
android:text="@string/set_name"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold"
@@ -49,7 +49,7 @@
android:id="@+id/tvLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置名字"
android:text="@string/set_name"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -59,9 +59,9 @@
android:layout_height="48dp"
android:layout_marginTop="12dp"
android:background="@drawable/textinput_white_bg"
android:hint="请输入设备名称"
android:hint="@string/enter_device_name"
android:paddingHorizontal="16dp"
android:text="智能防御机A1"
android:text="@string/smart_device_a1"
android:textColor="@color/black"
android:textSize="14dp" />
</LinearLayout>
@@ -77,7 +77,7 @@
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/rounded_blue_bg"
android:text="完成"
android:text="@string/complete"
android:textColor="@color/white"
android:textSize="16dp"
android:textStyle="bold" />

View File

@@ -25,7 +25,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="设置"
android:text="@string/settings_title"
android:textColor="@color/black"
android:textSize="16dp"
android:textStyle="bold" />
@@ -45,7 +45,7 @@
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingVertical="12dp"
android:text="功能设置"
android:text="@string/function_settings"
android:textColor="@color/gray"
android:textSize="14dp" />
@@ -62,7 +62,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="语音设置"
android:text="@string/voice_settings"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -91,7 +91,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="水枪设置"
android:text="@string/water_gun_settings"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -120,7 +120,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="识别模式"
android:text="@string/recognition_mode"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -134,7 +134,7 @@
android:id="@+id/tvRecognitionMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蓝牙+人脸"
android:text="@string/mode_standard"
android:textColor="@color/gray"
android:textSize="14sp" />
@@ -165,7 +165,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="自动模式"
android:text="@string/detection_settings"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -178,7 +178,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全自动模式"
android:text="@string/mode_standard"
android:textColor="@color/gray"
android:textSize="14sp" />
@@ -200,7 +200,7 @@
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingVertical="12dp"
android:text="基本设置"
android:text="@string/settings"
android:textColor="@color/gray"
android:textSize="14dp" />
@@ -217,7 +217,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="设备名称"
android:text="@string/device_name"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -231,7 +231,7 @@
android:id="@+id/tvDeviceName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="智能防御机A1"
android:text="@string/device_name"
android:textColor="@color/gray"
android:textSize="14sp" />
@@ -262,7 +262,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="设备信息"
android:text="@string/about"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -291,7 +291,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="关联用户"
android:text="@string/user_management"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -304,7 +304,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3"
android:text="3"
android:textColor="@color/gray"
android:textSize="14sp" />
@@ -335,7 +335,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="WiFi管理"
android:text="@string/wifi"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -348,7 +348,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AAAAAAAAAA"
android:text="@string/wifi"
android:textColor="@color/gray"
android:textSize="14sp" />
@@ -379,7 +379,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="解绑设备"
android:text="@string/unbind_device"
android:textColor="@color/black"
android:textSize="16dp" />
@@ -389,4 +389,12 @@
android:src="@drawable/right_back" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginStart="16dp"
android:background="@color/face" />
</LinearLayout>

View File

@@ -0,0 +1,335 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- App Name -->
<string name="app_name">防御器</string>
<!-- Common -->
<string name="confirm">确定</string>
<string name="cancel">取消</string>
<string name="save">保存</string>
<string name="delete">删除</string>
<string name="edit">编辑</string>
<string name="back">返回</string>
<string name="loading">加载中...</string>
<string name="network_error">网络错误,请重试</string>
<string name="send">发送</string>
<string name="submit">提交</string>
<!-- Login Activity -->
<string name="login_title">智能防御机</string>
<string name="sms_login">验证码登录</string>
<string name="password_login">密码登录</string>
<string name="phone_hint">请输入手机号</string>
<string name="sms_code_hint">请输入验证码</string>
<string name="password_hint">请输入密码</string>
<string name="send_sms_code">发送验证码</string>
<string name="login">登录</string>
<string name="forgot_password">忘记密码?</string>
<string name="register">注册</string>
<!-- Register Activity -->
<string name="register_title">注册</string>
<string name="register_subtitle">注册用户</string>
<string name="set_password">设置密码</string>
<string name="confirm_password">确认密码</string>
<string name="password_requirement">密码长度6-20位</string>
<string name="agreement_prefix">我已阅读并同意</string>
<string name="user_agreement">用户协议</string>
<string name="and"></string>
<string name="privacy_policy">隐私政策</string>
<string name="register_success">注册成功</string>
<string name="register_success_message">您的账号已成功创建</string>
<string name="go_to_login">去登录</string>
<!-- Forgot Password -->
<string name="forgot_password_title">忘记密码</string>
<string name="reset_password">重置密码</string>
<string name="new_password">新密码</string>
<string name="reset_success">密码重置成功</string>
<!-- Face Login/Verification -->
<string name="face_login">人脸登录</string>
<string name="face_verification">人脸验证</string>
<string name="face_capture_hint">请将人脸对准框内</string>
<string name="face_recognition_success">识别成功</string>
<string name="face_recognition_failed">识别失败</string>
<string name="retry">重试</string>
<!-- Home Activity -->
<string name="home">首页</string>
<string name="profile">个人</string>
<!-- Home Menu -->
<string name="my_devices">我的设备</string>
<string name="add_device">添加设备</string>
<string name="scan_qr">扫一扫</string>
<string name="voice_control">语音控制</string>
<string name="light_control">灯光控制</string>
<string name="water_gun">水枪</string>
<string name="monitor">监控</string>
<string name="alarm_log">告警记录</string>
<string name="message">消息</string>
<string name="settings">设置</string>
<!-- Device Management -->
<string name="device_name">设备名称</string>
<string name="device_status">状态</string>
<string name="device_online">在线</string>
<string name="device_offline">离线</string>
<string name="device_id">设备ID</string>
<string name="bind_device">绑定设备</string>
<string name="unbind_device">解绑设备</string>
<string name="device_not_found">暂无设备</string>
<!-- Add Device -->
<string name="add_device_title">添加设备</string>
<string name="scan_nearby">扫描附近设备</string>
<string name="scanning">持续自动搜索中...</string>
<string name="device_nearby_hint">请将手机尽量靠近要添加的设备</string>
<string name="scan_again">重新扫描</string>
<string name="add_manually">手动添加</string>
<string name="enter_device_id">请输入设备ID</string>
<string name="bind_success">绑定成功</string>
<!-- Family Management -->
<string name="family_management">家庭管理</string>
<string name="switch_family">切换家庭</string>
<string name="current_family">当前家庭</string>
<string name="my_family">我的家庭</string>
<string name="add_family">添加家庭</string>
<string name="family_name">家庭名称</string>
<string name="enter_family_name">请输入家庭名称</string>
<string name="create_family">创建家庭</string>
<string name="join_family">加入家庭</string>
<string name="family_code">家庭码</string>
<string name="enter_family_code">请输入家庭码</string>
<!-- User Management -->
<string name="user_management">用户管理</string>
<string name="user_list">用户列表</string>
<string name="add_user">添加用户</string>
<string name="admin">管理员</string>
<string name="member">成员</string>
<string name="nickname">昵称</string>
<string name="phone_number">手机号</string>
<string name="enter_nickname">请输入昵称</string>
<!-- Password Management -->
<string name="password_management">密码管理</string>
<string name="change_password">修改密码</string>
<string name="current_password">当前密码</string>
<string name="old_password">原密码</string>
<string name="verification_code">验证码</string>
<!-- Face Management -->
<string name="face_management">人脸管理</string>
<string name="add_face">添加人脸</string>
<string name="face_list">人脸列表</string>
<string name="delete_face_confirm">确定要删除这张人脸吗?</string>
<string name="standard_capture">标准采集</string>
<string name="strict_capture">严格采集</string>
<!-- Live Video -->
<string name="live_video">实时监控</string>
<string name="fullscreen">全屏</string>
<string name="screenshot">截图</string>
<string name="record">录像</string>
<string name="talk">对讲</string>
<string name="mute">静音</string>
<string name="unmute">取消静音</string>
<string name="video_loading">视频加载中...</string>
<string name="video_error">视频加载失败</string>
<!-- Alarm Log -->
<string name="alarm_log_title">告警记录</string>
<string name="alarm_detail">告警详情</string>
<string name="alarm_time">告警时间</string>
<string name="alarm_type">告警类型</string>
<string name="alarm_location">告警位置</string>
<string name="no_alarm_logs">暂无告警记录</string>
<string name="intrusion_detected">入侵检测</string>
<string name="abnormal_sound">异常声音</string>
<string name="motion_detected">移动侦测</string>
<!-- Message -->
<string name="message_title">消息</string>
<string name="system_message">系统</string>
<string name="alarm_message">告警</string>
<string name="device_message">设备</string>
<string name="no_messages">暂无消息</string>
<string name="mark_as_read">标记已读</string>
<string name="clear_all">清空全部</string>
<string name="message_detail">消息详情</string>
<!-- Settings -->
<string name="settings_title">设置</string>
<string name="function_settings">功能设置</string>
<string name="voice_settings">语音设置</string>
<string name="water_gun_settings">水枪设置</string>
<string name="detection_settings">侦测设置</string>
<string name="notification_settings">通知设置</string>
<string name="language_settings">语言</string>
<string name="chinese">中文</string>
<string name="english">English</string>
<string name="about">关于</string>
<string name="version">版本</string>
<string name="logout">退出登录</string>
<string name="logout_confirm">确定要退出登录吗?</string>
<!-- Personal Profile -->
<string name="personal_info">个人信息</string>
<string name="avatar">头像</string>
<string name="gender">性别</string>
<string name="male"></string>
<string name="female"></string>
<string name="birthday">生日</string>
<string name="address">地址</string>
<string name="enter_address">请输入地址</string>
<!-- Scan -->
<string name="scan_title">扫一扫</string>
<string name="scan_hint">将二维码/条码放入框内,即可自动扫描</string>
<string name="album">相册</string>
<string name="flashlight">手电筒</string>
<string name="scan_failed">扫描失败,请重试</string>
<!-- WiFi -->
<string name="wifi_list">WiFi列表</string>
<string name="wifi_password">WiFi密码</string>
<string name="enter_wifi_password">请输入WiFi密码</string>
<string name="connect">连接</string>
<string name="connecting">连接中...</string>
<string name="connection_failed">连接失败</string>
<string name="connection_success">连接成功</string>
<!-- Dialog -->
<string name="tip">提示</string>
<string name="please_wait">请稍候...</string>
<string name="operation_success">操作成功</string>
<string name="operation_failed">操作失败</string>
<string name="network_unavailable">网络不可用</string>
<string name="check_network">请检查网络连接</string>
<!-- Voice Recognition Mode -->
<string name="recognition_mode">识别模式</string>
<string name="mode_standard">标准模式</string>
<string name="mode_strict">严格模式</string>
<string name="mode_custom">自定义模式</string>
<!-- Time -->
<string name="today">今天</string>
<string name="yesterday">昨天</string>
<string name="this_week">本周</string>
<string name="this_month">本月</string>
<!-- Placeholder -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<!-- Additional missing strings -->
<string name="scan_device_qr">请扫描设备或说明书上的二维码</string>
<string name="workshop">工作室</string>
<string name="parents_home">父母家</string>
<string name="smart_hanging_defense">智能挂式防御机</string>
<string name="smart_defense_device">智能防御机</string>
<string name="smart_rail_defense">智能轨道防御机</string>
<string name="corridor_defense">走廊防御机</string>
<string name="door_defense">门禁防御机</string>
<string name="living_room_defense">客厅防御机</string>
<string name="balcony_defense">阳台防御机</string>
<string name="my_family_home">我的家庭</string>
<string name="device">设备</string>
<string name="smart_device_a1">智能防御机A1</string>
<string name="voice">语音</string>
<string name="light">灯光</string>
<string name="control">控制</string>
<string name="seconds">%d秒</string>
<string name="register_user">注册用户</string>
<string name="enter_platform">进入平台</string>
<string name="nickname_hint">这里是昵称</string>
<string name="bind_phone">绑定手机</string>
<string name="face_recognition">人脸识别</string>
<string name="face_security_notice">仅用于创建防御机制和防窃取,保障您的安全</string>
<string name="follow_instructions">请根据指示完成人脸验证</string>
<string name="incomplete_capture">拍摄不全</string>
<string name="insufficient_light">光线不足</string>
<string name="start_verification">开始验证</string>
<string name="select_wifi">选择Wi-Fi</string>
<string name="enter_wifi_name">请输入WiFi名称</string>
<string name="next_step">下一步</string>
<string name="set_name">设置名字</string>
<string name="enter_device_name">请输入设备名称</string>
<string name="complete">完成</string>
<string name="bluetooth_recognition">蓝牙识别</string>
<string name="bluetooth_face_recognition">蓝牙+人脸识别</string>
<string name="message_list">消息列表</string>
<string name="face_collection">人脸采集</string>
<string name="face_in_circle">请将人脸放入圆形区域内</string>
<string name="collect_face">采集人脸</string>
<string name="retrieve_password">找回密码</string>
<string name="enter_phone_number">请输入手机号</string>
<string name="enter_verification_code">请输入验证码</string>
<string name="send_code">发送验证码</string>
<string name="enter_new_password">请输入新密码</string>
<string name="enter_password_again">请再次输入新密码</string>
<string name="determine">确定</string>
<string name="id_number">身份证号</string>
<string name="enter_id_number">请输入身份证号</string>
<string name="invite_code_optional">邀请码(非必填)</string>
<string name="enter_invite_code">请输入邀请码</string>
<string name="scan_add">扫描添加</string>
<string name="wifi">WiFi</string>
<string name="recording_permission_needed">需要录音权限才能使用控制功能</string>
<string name="video_ready">视频准备完成</string>
<string name="playback_complete">播放完成</string>
<string name="cannot_load_video">无法加载视频</string>
<string name="view_alarm_log">查看告警日志</string>
<string name="paused">已暂停</string>
<string name="resume_playback">继续播放</string>
<string name="entered_fullscreen">已进入全屏</string>
<string name="exited_fullscreen">已退出全屏</string>
<string name="sound_on">声音已开启</string>
<string name="sound_off">声音已关闭</string>
<string name="light_on">灯光已开启</string>
<string name="light_off">灯光已关闭</string>
<string name="start_control_mode">开始控制模式</string>
<string name="stop_control_mode">停止控制模式</string>
<string name="recording_start_failed">录音启动失败</string>
<string name="video_error_format">播放错误: %1$d, %2$d</string>
<string name="buffering_format">缓冲中: %d%%</string>
<string name="camera_not_ready">相机未准备好</string>
<string name="cannot_open_camera">无法打开相机</string>
<string name="camera_permission_needed">需要相机权限</string>
<string name="image_selected">已选择图片</string>
<string name="please_try_later">请稍后再试</string>
<string name="phone_format_invalid">手机号格式不正确</string>
<string name="enter_verification_code_pls">请输入验证码</string>
<string name="get_code_first">请先获取验证码</string>
<string name="verification_code_error">验证码错误</string>
<string name="password_cannot_empty">密码不能为空</string>
<string name="password_letter_digit">密码需同时包含字母和数字</string>
<string name="password_mismatch">两次输入的密码不一致</string>
<string name="redirect_face_page">跳转到人脸页面</string>
<string name="redirect_register_page">跳转到注册页面</string>
<string name="forgot_password_page">找回密码</string>
<string name="redirect_face_recognition_page">跳转到人脸识别页面</string>
<string name="camera_permission_face_verify">需要相机权限才能进行人脸验证</string>
<string name="intrusion_alarm">入侵告警</string>
<string name="device_fault">设备故障</string>
<string name="renewal_reminder">到期提醒</string>
<string name="someone_invaded">有人入侵</string>
<string name="go_check">去看一下</string>
<string name="notice">温馨提示</string>
<string name="got_it">知道了</string>
<string name="strike_distance">打击距离</string>
<string name="enter_strike_distance">请输入打击距离</string>
<string name="face_detection_failed">人脸检测失败</string>
<string name="nickname_default">这里是我的昵称</string>
<string name="device_running_days">设备已经运行\n%d天请及时维护</string>
<string name="device_offline_message">设备已离线请检查设备的WIFI及电源情况</string>
<string name="countdown_retry">%d秒后重试</string>
<string name="sms_login_success">验证码登录成功\n手机号%1$s\n验证码%2$s</string>
<string name="password_login_success">密码登录成功\n手机号%1$s\n密码%2$s</string>
<string name="code_sent_to">验证码已发送至 %s</string>
<string name="sms_login_success_title">登录成功</string>
<string name="password_login_success_title">登录成功</string>
</resources>

View File

@@ -1,5 +1,335 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">防御器</string>
<!-- TODO: Remove or change this placeholder text -->
<!-- App Name -->
<string name="app_name">Defense Device</string>
<!-- Common -->
<string name="save">Save</string>
<string name="delete">Delete</string>
<string name="edit">Edit</string>
<string name="back">Back</string>
<string name="loading">Loading...</string>
<string name="network_error">Network error, please try again</string>
<string name="send">Send</string>
<string name="submit">Submit</string>
<!-- Login Activity -->
<string name="login_title">Smart Defense Device</string>
<string name="sms_login">SMS Login</string>
<string name="password_login">Password Login</string>
<string name="phone_hint">Enter phone number</string>
<string name="sms_code_hint">Enter verification code</string>
<string name="password_hint">Enter password</string>
<string name="send_sms_code">Send Code</string>
<string name="login">Login</string>
<string name="forgot_password">Forgot Password?</string>
<!-- Register Activity -->
<string name="register_title">Register</string>
<string name="register_subtitle">Register Account</string>
<string name="set_password">Set Password</string>
<string name="confirm_password">Confirm Password</string>
<string name="password_requirement">Password must be 620 characters</string>
<string name="agreement_prefix">I have read and agree to the</string>
<string name="user_agreement">User Agreement</string>
<string name="and">and</string>
<string name="privacy_policy">Privacy Policy</string>
<string name="register_success">Registration Successful</string>
<string name="register_success_message">Your account has been created successfully</string>
<string name="go_to_login">Go to Login</string>
<!-- Forgot Password -->
<string name="forgot_password_title">Forgot Password</string>
<string name="reset_password">Reset Password</string>
<string name="new_password">New Password</string>
<string name="reset_success">Password reset successful</string>
<!-- Face Login/Verification -->
<string name="face_capture_hint">Please align your face within the frame</string>
<string name="face_recognition_success">Recognition Successful</string>
<string name="face_recognition_failed">Recognition Failed</string>
<string name="retry">Retry</string>
<!-- Home Activity -->
<string name="home">Home</string>
<string name="profile">Profile</string>
<!-- Home Menu -->
<string name="my_devices">My Devices</string>
<string name="add_device">Add Device</string>
<string name="scan_qr">Scan QR Code</string>
<string name="voice_control">Voice Control</string>
<string name="light_control">Light Control</string>
<string name="water_gun">Water Gun</string>
<string name="monitor">Monitor</string>
<string name="message">Message</string>
<string name="settings">Settings</string>
<!-- Device Management -->
<string name="device_name">Device Name</string>
<string name="device_status">Status</string>
<string name="device_online">Online</string>
<string name="device_id">Device ID</string>
<string name="bind_device">Bind Device</string>
<string name="unbind_device">Unbind Device</string>
<string name="device_not_found">No devices found</string>
<!-- Add Device -->
<string name="add_device_title">Add Device</string>
<string name="scan_nearby">Scan Nearby Devices</string>
<string name="scanning">Scanning continuously...</string>
<string name="device_nearby_hint">Please keep your phone close to the device</string>
<string name="scan_again">Scan Again</string>
<string name="add_manually">Add Manually</string>
<string name="enter_device_id">Enter Device ID</string>
<string name="bind_success">Binding Successful</string>
<!-- Family Management -->
<string name="family_management">Family Management</string>
<string name="switch_family">Switch Family</string>
<string name="current_family">Current Family</string>
<string name="my_family">My Family</string>
<string name="add_family">Add Family</string>
<string name="family_name">Family Name</string>
<string name="enter_family_name">Enter family name</string>
<string name="create_family">Create Family</string>
<string name="join_family">Join Family</string>
<string name="family_code">Family Code</string>
<string name="enter_family_code">Enter family code</string>
<!-- User Management -->
<string name="user_management">User Management</string>
<string name="user_list">User List</string>
<string name="add_user">Add User</string>
<string name="admin">Admin</string>
<string name="member">Member</string>
<string name="phone_number">Phone Number</string>
<string name="enter_nickname">Enter nickname</string>
<!-- Password Management -->
<string name="password_management">Password Management</string>
<string name="change_password">Change Password</string>
<string name="current_password">Current Password</string>
<string name="old_password">Old Password</string>
<string name="verification_code">Verification Code</string>
<!-- Face Management -->
<string name="face_management">Face Management</string>
<string name="add_face">Add Face</string>
<string name="face_list">Face List</string>
<string name="delete_face_confirm">Are you sure you want to delete this face?</string>
<string name="strict_capture">Strict Capture</string>
<!-- Live Video -->
<string name="live_video">Live Video</string>
<string name="fullscreen">Fullscreen</string>
<string name="screenshot">Screenshot</string>
<string name="record">Record</string>
<string name="talk">Talk</string>
<string name="mute">Mute</string>
<string name="unmute">Unmute</string>
<string name="video_loading">Loading video...</string>
<string name="video_error">Video loading failed</string>
<!-- Alarm Log -->
<string name="alarm_log_title">Alarm Log</string>
<string name="alarm_detail">Alarm Detail</string>
<string name="alarm_time">Alarm Time</string>
<string name="alarm_type">Alarm Type</string>
<string name="alarm_location">Location</string>
<string name="no_alarm_logs">No alarm records</string>
<string name="intrusion_detected">Intrusion Detected</string>
<string name="abnormal_sound">Abnormal Sound</string>
<string name="motion_detected">Motion Detected</string>
<!-- Message -->
<string name="message_title">Messages</string>
<string name="system_message">System</string>
<string name="alarm_message">Alarm</string>
<string name="device_message">Device</string>
<string name="no_messages">No messages</string>
<string name="mark_as_read">Mark as Read</string>
<string name="clear_all">Clear All</string>
<string name="message_detail">Message Detail</string>
<!-- Settings -->
<string name="settings_title">Settings</string>
<string name="function_settings">Function Settings</string>
<string name="voice_settings">Voice Settings</string>
<string name="water_gun_settings">Water Gun Settings</string>
<string name="detection_settings">Detection Settings</string>
<string name="notification_settings">Notification Settings</string>
<string name="language_settings">Language</string>
<string name="chinese">Chinese</string>
<string name="english">English</string>
<string name="about">About</string>
<string name="version">Version</string>
<string name="logout">Logout</string>
<string name="logout_confirm">Are you sure you want to logout?</string>
<!-- Personal Profile -->
<string name="avatar">Avatar</string>
<string name="gender">Gender</string>
<string name="male">Male</string>
<string name="female">Female</string>
<string name="birthday">Birthday</string>
<string name="address">Address</string>
<string name="enter_address">Enter address</string>
<!-- Scan -->
<string name="scan_title">Scan QR Code</string>
<string name="scan_hint">Align QR code within frame to scan</string>
<string name="scan_failed">Scan failed, please try again</string>
<!-- WiFi -->
<string name="wifi_list">WiFi List</string>
<string name="wifi_password">WiFi Password</string>
<string name="enter_wifi_password">Enter WiFi password</string>
<string name="connect">Connect</string>
<string name="connecting">Connecting...</string>
<string name="connection_failed">Connection failed</string>
<string name="connection_success">Connected successfully</string>
<!-- Dialog -->
<string name="tip">Tip</string>
<string name="please_wait">Please wait...</string>
<string name="operation_success">Operation successful</string>
<string name="operation_failed">Operation failed</string>
<string name="network_unavailable">Network unavailable</string>
<string name="check_network">Please check your network connection</string>
<!-- Voice Recognition Mode -->
<string name="recognition_mode">Recognition Mode</string>
<string name="mode_standard">Standard Mode</string>
<string name="mode_strict">Strict Mode</string>
<string name="mode_custom">Custom Mode</string>
<!-- Time -->
<string name="today">Today</string>
<string name="yesterday">Yesterday</string>
<string name="this_week">This Week</string>
<string name="this_month">This Month</string>
<!-- Placeholder -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<!-- Additional missing strings -->
<string name="scan_device_qr">Please scan the QR code on the device or manual</string>
<string name="workshop">Workshop</string>
<string name="parents_home">Parents Home</string>
<string name="smart_hanging_defense">Smart Hanging Defense</string>
<string name="smart_defense_device">Smart Defense Device</string>
<string name="smart_rail_defense">Smart Rail Defense</string>
<string name="corridor_defense">Corridor Defense</string>
<string name="door_defense">Door Defense</string>
<string name="living_room_defense">Living Room Defense</string>
<string name="balcony_defense">Balcony Defense</string>
<string name="album">Album</string>
<string name="flashlight">Flashlight</string>
<string name="my_family_home">My Family</string>
<string name="device">Device</string>
<string name="smart_device_a1">Smart Defense Device A1</string>
<string name="voice">Voice</string>
<string name="light">Light</string>
<string name="control">Control</string>
<string name="seconds">%ds</string>
<string name="register">Register</string>
<string name="register_user">Register User</string>
<string name="enter_platform">Enter Platform</string>
<string name="personal_info">Personal Info</string>
<string name="nickname">Nickname</string>
<string name="nickname_hint">Enter nickname</string>
<string name="bind_phone">Bind Phone</string>
<string name="face_recognition">Face Recognition</string>
<string name="face_verification">Face Verification</string>
<string name="face_security_notice">Only used to create defense mechanisms and prevent theft, ensuring your security</string>
<string name="follow_instructions">Please follow the instructions to complete face verification</string>
<string name="standard_capture">Standard Capture</string>
<string name="incomplete_capture">Incomplete Capture</string>
<string name="insufficient_light">Insufficient Light</string>
<string name="start_verification">Start Verification</string>
<string name="select_wifi">Select Wi-Fi</string>
<string name="enter_wifi_name">Enter Wi-Fi name</string>
<string name="next_step">Next</string>
<string name="set_name">Set Name</string>
<string name="enter_device_name">Enter device name</string>
<string name="complete">Complete</string>
<string name="alarm_log">Alarm Log</string>
<string name="cancel">Cancel</string>
<string name="confirm">Confirm</string>
<string name="bluetooth_recognition">Bluetooth Recognition</string>
<string name="bluetooth_face_recognition">Bluetooth + Face Recognition</string>
<string name="message_list">Messages</string>
<string name="face_collection">Face Collection</string>
<string name="face_in_circle">Please align your face within the circular area</string>
<string name="collect_face">Collect Face</string>
<string name="retrieve_password">Retrieve Password</string>
<string name="enter_phone_number">Enter phone number</string>
<string name="enter_verification_code">Enter verification code</string>
<string name="send_code">Send Code</string>
<string name="enter_new_password">Enter new password</string>
<string name="enter_password_again">Enter password again</string>
<string name="determine">Confirm</string>
<string name="id_number">ID Number</string>
<string name="enter_id_number">Enter ID number</string>
<string name="invite_code_optional">Invite Code (Optional)</string>
<string name="enter_invite_code">Enter invite code</string>
<string name="scan_add">Scan to Add</string>
<string name="wifi">WiFi</string>
<string name="face_login">Face Login</string>
<string name="recording_permission_needed">Recording permission is required for control features</string>
<string name="video_ready">Video ready</string>
<string name="playback_complete">Playback complete</string>
<string name="cannot_load_video">Cannot load video</string>
<string name="view_alarm_log">View alarm log</string>
<string name="paused">Paused</string>
<string name="resume_playback">Resume playback</string>
<string name="entered_fullscreen">Entered fullscreen</string>
<string name="exited_fullscreen">Exited fullscreen</string>
<string name="sound_on">Sound on</string>
<string name="sound_off">Sound off</string>
<string name="light_on">Light on</string>
<string name="light_off">Light off</string>
<string name="start_control_mode">Start control mode</string>
<string name="stop_control_mode">Stop control mode</string>
<string name="recording_start_failed">Recording start failed</string>
<string name="video_error_format">Playback error: %1$d, %2$d</string>
<string name="buffering_format">Buffering: %d%%</string>
<string name="camera_not_ready">Camera not ready</string>
<string name="cannot_open_camera">Cannot open camera</string>
<string name="camera_permission_needed">Camera permission is required</string>
<string name="image_selected">Image selected</string>
<string name="please_try_later">Please try again later</string>
<string name="phone_format_invalid">Invalid phone number format</string>
<string name="enter_verification_code_pls">Please enter verification code</string>
<string name="get_code_first">Please get verification code first</string>
<string name="verification_code_error">Verification code error</string>
<string name="password_cannot_empty">Password cannot be empty</string>
<string name="password_letter_digit">Password must contain both letters and digits</string>
<string name="password_mismatch">Passwords do not match</string>
<string name="redirect_face_page">Redirecting to face page</string>
<string name="redirect_register_page">Redirecting to register page</string>
<string name="forgot_password_page">Forgot password page</string>
<string name="redirect_face_recognition_page">Redirecting to face recognition page</string>
<string name="camera_permission_face_verify">Camera permission is required for face verification</string>
<string name="intrusion_alarm">Intrusion alarm</string>
<string name="device_fault">Device fault</string>
<string name="device_offline">Device offline</string>
<string name="renewal_reminder">Renewal reminder</string>
<string name="someone_invaded">Someone invaded</string>
<string name="go_check">Go check</string>
<string name="notice">Notice</string>
<string name="got_it">Got it</string>
<string name="strike_distance">Strike distance</string>
<string name="enter_strike_distance">Enter strike distance</string>
<string name="face_detection_failed">Face detection failed</string>
<string name="nickname_default">My nickname</string>
<string name="device_running_days">Device has been running for %d days, please maintain in time</string>
<string name="device_offline_message">Device is offline, please check the WiFi and power connection</string>
<string name="countdown_retry">%ds retry</string>
<string name="sms_login_success">SMS login successful\nPhone: %1$s\nCode: %2$s</string>
<string name="password_login_success">Password login successful\nPhone: %1$s\nPassword: %2$s</string>
<string name="code_sent_to">Verification code sent to %s</string>
<string name="sms_login_success_title">Login successful</string>
<string name="password_login_success_title">Login successful</string>
</resources>