Android 实现多语言功能

news/2025/1/18 10:42:42/

这几天看到了小红书上有大量TikTok用户涌入,app端上外国用户描述的英文信息,因此想着研究一下Android端如何实现多语言功能,以下用一个最简单的demo演示一下:

1. 创建不同语言的资源文件

  • 英语资源文件 (res/values/strings.xml):

<resources><string name="app_name">My App</string><string name="greeting">Hello!</string><string name="change_language">Change Language</string>
</resources>

选中res目录,右键选中New -> Android Resource Directory

然后选中Chinese 选择中文

然后再在values-zh-rCN目录下,新建strings.xml文件

中文资源文件 (res/values-zh-rCN/strings.xml):

<?xml version="1.0" encoding="utf-8"?>
<resources><string name="app_name">我的应用</string><string name="greeting">你好!</string><string name="change_language">更改语言</string>
</resources>

这里需要删掉values目录下的strings.xml,不然这里面的会和strings_us.xml的资源冲突。

2. 创建一个语言设置工具类

此类负责更改应用的语言并更新界面。

import android.content.Context
import android.content.res.Configuration
import android.os.Build
import java.util.*object LocaleHelper {fun setLocale(context: Context, languageCode: String?) {if (languageCode == null) {return}val locale = Locale(languageCode)Locale.setDefault(locale)val config = Configuration()if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {config.setLocale(locale)} else {config.locale = locale}context.resources.updateConfiguration(config,context.resources.displayMetrics)// 保存语言设置val preferences = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE)val editor = preferences.edit()editor.putString("language", languageCode)editor.apply()}fun getLanguage(context: Context): String? {val preferences = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE)return preferences.getString("language", "en") // 默认语言为英语}
}

3. 在MainActivity实现语言切换

主活动中添加按钮来切换语言,并显示当前的语言。

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private TextView greetingText;private Button changeLanguageButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 获取保存的语言设置并设置语言String language = LocaleHelper.getLanguage(this);LocaleHelper.setLocale(this, language);setContentView(R.layout.activity_main);greetingText = findViewById(R.id.greetingText);changeLanguageButton = findViewById(R.id.changeLanguageButton);// 设置问候语greetingText.setText(getString(R.string.greeting));// 切换语言changeLanguageButton.setText(getString(R.string.change_language));changeLanguageButton.setOnClickListener(v -> {if ("en".equals(language)) {LocaleHelper.setLocale(MainActivity.this, "zh");} else {LocaleHelper.setLocale(MainActivity.this, "en");}// 重新启动活动以应用语言更改restartActivity();});}private void restartActivity() {Intent intent = getIntent();finish();startActivity(intent);}
}

4. 布局文件 activity_main.xml

该布局包含一个文本视图来显示问候语,一个按钮来切换语言。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/greetingText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/greeting"android:textSize="24sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/changeLanguageButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/change_language"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/greetingText"android:layout_marginTop="16dp" /></androidx.constraintlayout.widget.ConstraintLayout>

5. 启动应用时设置语言

onCreate 方法中检查用户的语言设置并应用。

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 获取用户的语言设置String language = LocaleHelper.getLanguage(this);LocaleHelper.setLocale(this, language);setContentView(R.layout.activity_main);
}

6. 语言切换效果

  • 用户点击按钮时,当前语言会切换,问候语和按钮文本会根据当前选择的语言更新。

  • 语言设置会被保存在 SharedPreferences 中,确保用户下次启动应用时,语言设置不会丢失。

7. 运行效果

  1. 应用启动时会加载系统或用户保存的语言设置。

  2. 显示对应的问候语和按钮文本。

  3. 用户点击“Change Language”按钮后,应用语言会切换为中文或英文,并刷新界面。

点击按钮之后,可以看到已经切换了语言


http://www.ppmy.cn/news/1564124.html

相关文章

43.Textbox的数据绑定 C#例子 WPF例子

固定最简步骤&#xff0c;包括 XAML&#xff1a; 题头里引入命名空间 标题下面引入类 box和block绑定属性 C#&#xff1a; 通知的类&#xff0c;及对应固定的任务 引入字段 引入属性 属性双触发&#xff0c;其中一个更新block的属性 block>指向box的属性 从Textbo…

NVIDIA 下 基于Ubuntun20.04下 使用脚本安装 ros2-foxy 和 使用docker安装 ros2-foxy

一、前提介绍&#xff1a; 本文主要采用两种方式在NVIDIA 下基于 Ubuntun20.04安装 ros2-foxy。 使用环境&#xff1a; NVIDIA 为 Jetson 系列下 Jetson Xavier NX&#xff1b; Ubuntun版本&#xff1a;20.04 二、安装方法&#xff1a; 1、使用脚本编译方式&#xff1a; 使…

AttributeError: ‘super‘ object has no attribute ‘__sklearn_tags__‘

最近用sklearn跑Stacking&#xff0c;基学习器是XGBoost、LightGBM、CatBoost。运行的时候报了标题的这个错误。 应该是sklearn的版本高了&#xff0c;需要降级处理。报错时的版本号是1.6.0 &#xff0c;可以降级到1.5.2。直接运行下面的代码就行。 !pip uninstall -y scikit…

【Redis】Redis大key的危害及解决方案分享

文章目录 一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危害六、大key检查与发现6.1 使用 --bigkeys参数6.2 使用scan命令6.3 使用 memory 命令查看 key 的大小6.4 使用 Rdbtools 工具包6.5 代码埋点6.6 公有云的Redis分析服务 七、大ke…

[云讷科技] 用于软件验证的仿真环境

我们使用Pursuit自动驾驶仪为各种场景设计仿真环境&#xff0c;以便用户可以在模拟环境中直接验证他们的软件&#xff0c;无需现场测试。该环境基于Gazebo引擎。 1. 工作区目录 模拟环境的工作区位于提供的U盘中的~/pursuit_space/sitl_space_pursuit中。用户可以按照用户手册…

css3过渡总结

一、过渡的定义与作用 CSS3 过渡&#xff08;Transitions&#xff09;允许 CSS 属性在一定的时间区间内平滑地过渡&#xff0c;从一个值转变为另一个值。它能够让网页元素的状态变化更加自然、流畅&#xff0c;给用户带来更好的视觉体验。例如&#xff0c;当一个元素从隐藏状态…

如何在没有root权限的情况下使用R语言

01、写在前面 大部分共享服务器没有root权限(当然也有例外&#xff1a;有root权限的共享服务器)&#xff0c;装不了Rstudio-server。而R终端虽然可以完成一些基本任务&#xff0c;但对于数据分析、画图等高级操作则显得不够便利。因此&#xff0c;我们需要一种能够轻松应对这些…

Matlab 具有周期性分布的死角孔的饱和空气多孔材料的声学特性

本文对直主孔含侧空腔&#xff08;死角&#xff09;的饱和空气多孔介质中的声传播进行了理论和数值研究。侧腔位于沿每个主孔周期性间隔的“节点”上。研究了侧向空腔分布中周期性的影响&#xff0c;并单独考虑了紧间隔死角的低频极限。结果表明&#xff0c;吸附系数和透射损失…