Skip to content

Commit dbc5042

Browse files
committed
软件支持语言切换
1 parent 0018756 commit dbc5042

6 files changed

Lines changed: 153 additions & 10 deletions

File tree

app/src/main/java/com/sevtinge/hyperceiler/ui/fragment/settings/ModuleSettingsFragment.java

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.sevtinge.hyperceiler.ui.fragment.base.SettingsPreferenceFragment;
4343
import com.sevtinge.hyperceiler.utils.BackupUtils;
4444
import com.sevtinge.hyperceiler.utils.DialogHelper;
45+
import com.sevtinge.hyperceiler.utils.LanguageHelper;
4546
import com.sevtinge.hyperceiler.utils.prefs.PrefsUtils;
4647
import com.sevtinge.hyperceiler.utils.shell.ShellInit;
4748

@@ -51,12 +52,13 @@
5152
import moralnorm.preference.SwitchPreference;
5253

5354
public class ModuleSettingsFragment extends SettingsPreferenceFragment
54-
implements Preference.OnPreferenceChangeListener {
55+
implements Preference.OnPreferenceChangeListener {
5556
DropDownPreference mIconModePreference;
5657
DropDownPreference mIconModeValue;
5758
SwitchPreference mHideAppIcon;
5859

5960
DropDownPreference mLogLevel;
61+
DropDownPreference mLanguage;
6062

6163
@Override
6264
public int getContentResId() {
@@ -68,21 +70,56 @@ public void initPrefs() {
6870
int mIconMode = Integer.parseInt(PrefsUtils.getSharedStringPrefs(getContext(), "prefs_key_settings_icon", "0"));
6971
mIconModePreference = findPreference("prefs_key_settings_icon");
7072
mIconModeValue = findPreference("prefs_key_settings_icon_mode");
73+
mLanguage = findPreference("prefs_key_settings_app_language");
7174
mHideAppIcon = findPreference("prefs_key_settings_hide_app_icon");
7275
mLogLevel = findPreference("prefs_key_log_level");
7376

7477
setIconMode(mIconMode);
7578
mIconModePreference.setOnPreferenceChangeListener(this);
79+
String language = LanguageHelper.getLanguage(getContext());
80+
int value = LanguageHelper.resultIndex(LanguageHelper.appLanguages, language);
81+
mLanguage.setValueIndex(value);
82+
mLanguage.setOnPreferenceChangeListener(
83+
new Preference.OnPreferenceChangeListener() {
84+
@Override
85+
public boolean onPreferenceChange(@NonNull Preference preference, Object o) {
86+
String v = LanguageHelper.appLanguages[Integer.parseInt((String) o)];
87+
switch (v) {
88+
case "CN" -> {
89+
LanguageHelper.setLanguage(getContext(), "zh", "CN");
90+
getActivity().recreate();
91+
}
92+
case "TW" -> {
93+
LanguageHelper.setLanguage(getContext(), "zh", "TW");
94+
getActivity().recreate();
95+
}
96+
case "HK" -> {
97+
LanguageHelper.setLanguage(getContext(), "zh", "HK");
98+
getActivity().recreate();
99+
}
100+
case "en" -> {
101+
LanguageHelper.setLanguage(getContext(), "en");
102+
getActivity().recreate();
103+
}
104+
case "JP" -> {
105+
LanguageHelper.setLanguage(getContext(), "ja", "JP");
106+
getActivity().recreate();
107+
}
108+
}
109+
return true;
110+
}
111+
}
112+
);
76113

77114
switch (BuildConfig.BUILD_TYPE) {
78115
case "canary" -> {
79116
mLogLevel.setValueIndex(0);
80117
mLogLevel.setEntries(new CharSequence[]{"Info", "Debug"});
81118
mLogLevel.setOnPreferenceChangeListener(
82-
(preference, o) -> {
83-
setLogLevel(Integer.parseInt((String) o) + 3);
84-
return true;
85-
}
119+
(preference, o) -> {
120+
setLogLevel(Integer.parseInt((String) o) + 3);
121+
return true;
122+
}
86123
);
87124
}
88125
/*case "debug" -> {
@@ -92,10 +129,10 @@ public void initPrefs() {
92129
}*/
93130
default -> {
94131
mLogLevel.setOnPreferenceChangeListener(
95-
(preference, o) -> {
96-
setLogLevel(Integer.parseInt((String) o));
97-
return true;
98-
}
132+
(preference, o) -> {
133+
setLogLevel(Integer.parseInt((String) o));
134+
return true;
135+
}
99136
);
100137
}
101138
}
@@ -173,7 +210,7 @@ public WindowInsetsCompat onApplyWindowInsets(@NonNull View v, @NonNull WindowIn
173210
Insets inset = Insets.max(insets.getInsets(WindowInsetsCompat.Type.systemBars()),
174211
insets.getInsets(WindowInsetsCompat.Type.displayCutout()));
175212
// 22dp + 2dp + 12sp + 10dp + 18dp + 0.5dp + inset.bottom + 4dp(?)
176-
v.setPadding(inset.left, 0, inset.right, inset.bottom + dip2px(requireContext(), 56.5F) + sp2px(requireContext(),12));
213+
v.setPadding(inset.left, 0, inset.right, inset.bottom + dip2px(requireContext(), 56.5F) + sp2px(requireContext(), 12));
177214
return insets;
178215
}
179216
});
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.sevtinge.hyperceiler.utils;
2+
3+
import android.content.Context;
4+
import android.content.res.Configuration;
5+
import android.content.res.Resources;
6+
7+
import java.util.Locale;
8+
9+
public class LanguageHelper {
10+
public static final String[] appLanguages = {
11+
"CN", "TW", "HK", "en", "JP"
12+
};
13+
14+
public static void setLanguage(Context context, String language) {
15+
Resources resources = context.getResources();
16+
Configuration configuration = resources.getConfiguration();
17+
Locale locale = new Locale(language);
18+
Locale.setDefault(locale);
19+
configuration.setLocale(locale);
20+
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
21+
}
22+
23+
public static void setLanguage(Context context, String language, String country) {
24+
Resources resources = context.getResources();
25+
Configuration configuration = resources.getConfiguration();
26+
Locale locale = new Locale(language, country);
27+
Locale.setDefault(locale);
28+
configuration.setLocale(locale);
29+
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
30+
}
31+
32+
public static void setLanguage(Context context, Locale locale) {
33+
Resources resources = context.getResources();
34+
Configuration configuration = resources.getConfiguration();
35+
Locale.setDefault(locale);
36+
configuration.setLocale(locale);
37+
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
38+
}
39+
40+
public static String getLanguage(Context context) {
41+
Resources resources = context.getResources();
42+
String country = resources.getConfiguration().getLocales().get(0).getCountry();
43+
if (country.isEmpty()) {
44+
return resources.getConfiguration().getLocales().get(0).getLanguage();
45+
}
46+
return country;
47+
}
48+
49+
public static String newLanguage(String language, String country) {
50+
if (country.isEmpty()) {
51+
return new Locale(language, country).getLanguage();
52+
}
53+
return new Locale(language, country).getCountry();
54+
}
55+
56+
public static int resultIndex(String[] languages, String value) {
57+
int index = -1;
58+
for (String l : languages) {
59+
index = index + 1;
60+
if (l.equals(value)) {
61+
return index;
62+
}
63+
}
64+
return index;
65+
}
66+
67+
public static boolean isUpperCase(String string) {
68+
String result = string.toUpperCase();
69+
return result.equals(string);
70+
}
71+
}

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@
6969
<string name="settings_icon_medium">中部</string>
7070
<string name="settings_icon_down">底部</string>
7171
<string name="settings_icon_mode">图标样式</string>
72+
<string name="settings_app_language">软件语言</string>
73+
<string name="settings_app_zh">简体中文</string>
74+
<string name="settings_app_zh_hk">繁体中文(香港)</string>
75+
<string name="settings_app_zh_tw">繁体中文(台湾)</string>
76+
<string name="settings_app_en">英文</string>
77+
<string name="settings_app_jp">日语</string>
7278
<string name="settings_icon_miui_14">圆角矩形样式</string>
7379
<string name="settings_icon_miui_13">背景镂空样式</string>
7480
<string name="settings_reboot">重启作用域</string>

app/src/main/res/values/arrays.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,27 @@
155155
<item>@string/settings_icon_miui_13</item>
156156
</string-array>
157157

158+
<string-array name="settings_app_language">
159+
<item>@string/settings_app_zh</item>
160+
<item>@string/settings_app_zh_tw</item>
161+
<item>@string/settings_app_zh_hk</item>
162+
<item>@string/settings_app_en</item>
163+
<item>@string/settings_app_jp</item>
164+
</string-array>
165+
158166
<string-array name="settings_icon_mode_value">
159167
<item>0</item>
160168
<item>1</item>
161169
</string-array>
162170

171+
<string-array name="settings_app_language_value">
172+
<item>0</item>
173+
<item>1</item>
174+
<item>2</item>
175+
<item>3</item>
176+
<item>4</item>
177+
</string-array>
178+
163179
<array name="miui_volume_timer_segments">
164180
<item>@null</item>
165181
<item>1800</item>

app/src/main/res/values/strings.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@
9494
<string name="settings_icon_medium">Middle</string>
9595
<string name="settings_icon_down">Bottom</string>
9696
<string name="settings_icon_mode">Icon style</string>
97+
<string name="settings_app_zh">Chinese Simplified</string>
98+
<string name="settings_app_zh_tw">Chinese Traditional (Tai Wan)</string>
99+
<string name="settings_app_zh_hk">Chinese Traditional (Hong Kong)</string>
100+
<string name="settings_app_en">English</string>
101+
<string name="settings_app_jp">Japanese</string>
102+
<string name="settings_app_language">Software language</string>
97103
<string name="settings_icon_miui_14">Rounded rectangle style</string>
98104
<string name="settings_icon_miui_13">Background cutout style</string>
99105
<string name="settings_reboot">Restart the target app</string>

app/src/main/res/xml/prefs_settings.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323
app:entries="@array/settings_icon_mode"
2424
app:entryValues="@array/settings_icon_mode_value" />
2525

26+
<DropDownPreference
27+
android:defaultValue="0"
28+
android:key="prefs_key_settings_app_language"
29+
android:title="@string/settings_app_language"
30+
app:entries="@array/settings_app_language"
31+
app:entryValues="@array/settings_app_language_value" />
32+
2633
</PreferenceCategory>
2734

2835
<PreferenceCategory android:title="@string/settings_data_title">

0 commit comments

Comments
 (0)