Generate language list compile time (#1561)

* Generate language list compile time

* Add English
This commit is contained in:
LoveSy 2022-01-26 03:19:28 +08:00 committed by GitHub
parent 8ed19ae7fd
commit 2bc178ed48
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 44 deletions

View File

@ -18,8 +18,10 @@
*/
import com.android.build.gradle.internal.dsl.BuildType
import java.io.PrintStream
import java.nio.file.Paths
import java.time.Instant
import java.util.*
plugins {
id("org.gradle.idea")
@ -161,6 +163,38 @@ tasks.whenTaskAdded {
}
}
afterEvaluate {
android.applicationVariants.forEach { variant ->
val outSrcDir = file("$buildDir/generated/source/langList/${variant.name}")
val outSrc = file("$outSrcDir/org/lsposed/manager/util/LangList.java")
val genLangList =
tasks.register("generate${variant.name.capitalize(Locale.ROOT)}LangList") {
inputs.files("src/main/res")
outputs.file(outSrc)
doLast {
val langList = File(projectDir, "src/main/res").listFiles { dir ->
dir.name.startsWith("values-") && File(dir, "strings.xml").exists()
}.orEmpty().map {
it.name.substring(7).split("-", limit = 2)
}.map {
if (it.size == 1) Locale(it[0])
else Locale(it[0], it[1].substring(1))
}.map { it.toLanguageTag() }
PrintStream(outSrc).print(
"""
|package org.lsposed.manager.util;
|public final class LangList {
| public static final String[] LANG_LIST = {"SYSTEM", ${
langList.joinToString(", ") { """"$it"""" }
}};
|}""".trimMargin()
)
}
}
variant.registerJavaGeneratingTask(genLangList, outSrcDir)
}
}
dependencies {
val glideVersion = "4.12.0"
val navVersion: String by rootProject.extra

View File

@ -20,8 +20,6 @@
package org.lsposed.manager.ui.fragment;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources.NotFoundException;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
@ -49,6 +47,7 @@ import org.lsposed.manager.R;
import org.lsposed.manager.databinding.FragmentSettingsBinding;
import org.lsposed.manager.ui.activity.MainActivity;
import org.lsposed.manager.util.BackupUtils;
import org.lsposed.manager.util.LangList;
import org.lsposed.manager.util.NavUtil;
import org.lsposed.manager.util.ThemeUtil;
@ -255,18 +254,17 @@ public class SettingsFragment extends BaseFragment {
var tag = language.getValue();
var userLocale = App.getLocale();
var entries = new ArrayList<CharSequence>();
entries.add(language.getEntries()[0]);
var lstLang = getAppLanguages(requireContext(), R.string.Settings);
var lstLang = LangList.LANG_LIST;
for (var lang : lstLang) {
if (lang.equals(SYSTEM)) {
entries.add(getString(rikka.core.R.string.follow_system));
continue;
}
var locale = Locale.forLanguageTag(lang);
entries.add(HtmlCompat.fromHtml(String.format("%s - %s",
!TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(locale) : locale.getDisplayName(locale),
!TextUtils.isEmpty(locale.getScript()) ? locale.getDisplayScript(userLocale) : locale.getDisplayName(userLocale)
), HtmlCompat.FROM_HTML_MODE_LEGACY));
entries.add(HtmlCompat.fromHtml(locale.getDisplayName(locale), HtmlCompat.FROM_HTML_MODE_LEGACY));
}
language.setEntries(entries.toArray(new CharSequence[0]));
lstLang.add(0, SYSTEM);
language.setEntryValues(lstLang.toArray(new CharSequence[0]));
language.setEntryValues(lstLang);
if (TextUtils.isEmpty(tag) || SYSTEM.equals(tag)) {
language.setSummary(getString(rikka.material.R.string.follow_system));
} else {
@ -312,34 +310,5 @@ public class SettingsFragment extends BaseFragment {
}
return recyclerView;
}
private ArrayList<String> getAppLanguages(Context ctx, int id) {
Configuration conf = ctx.getResources().getConfiguration();
Locale originalLocale = conf.getLocales().get(0);
conf.setLocale(Locale.ENGLISH);
var lstLang = new ArrayList<String>();
lstLang.add(Locale.ENGLISH.getLanguage());
final String reference;
try {
reference = ctx.createConfigurationContext(conf).getString(id);
} catch (NotFoundException nfe) {
return lstLang; // return only english
}
for (String loc : ctx.getAssets().getLocales()) {
if (loc.isEmpty()) {
continue;
}
Locale locale = Locale.forLanguageTag(loc);
conf.setLocale(locale);
if (!lstLang.contains(loc) && !reference.equals(ctx.createConfigurationContext(conf).getString(id))) {
lstLang.add(loc);
}
}
conf.setLocale(originalLocale);
return lstLang;
}
}
}

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@ -32,10 +32,6 @@
<item>MODE_NIGHT_FOLLOW_SYSTEM</item>
</string-array>
<string-array name="language" translatable="false">
<item>@string/follow_system</item>
</string-array>
<string-array name="color_values" translatable="false">
<item>SAKURA</item>
<item>MATERIAL_RED</item>

View File

@ -34,7 +34,6 @@
<rikka.preference.SimpleMenuPreference
android:defaultValue="SYSTEM"
android:entries="@array/language"
android:icon="@drawable/ic_baseline_translate_24"
android:key="language"
android:summary="%s"