mirror of
https://github.com/2dust/v2rayNG.git
synced 2026-10-29 06:31:54 +00:00
1 parent
9fcb1a30f8
commit
63f557242b
17 files changed
+308
-2
No files matched your search
@@ -21,6 +21,9 @@ V2rayNG/app/build
|
|||||||
V2rayNG/build
|
V2rayNG/build
|
||||||
V2rayNG/local.properties
|
V2rayNG/local.properties
|
||||||
|
|
||||||
|
# Ignore prebuilt native libraries (built from submodules by compile-hevtun.sh / AndroidLibXrayLite)
|
||||||
|
V2rayNG/app/libs
|
||||||
|
|
||||||
# Ignore APK and AAR files
|
# Ignore APK and AAR files
|
||||||
*.apk
|
*.apk
|
||||||
*.aar
|
*.aar
|
||||||
|
|||||||
@@ -209,6 +209,9 @@
|
|||||||
<activity
|
<activity
|
||||||
android:name=".ui.AboutActivity"
|
android:name=".ui.AboutActivity"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
<activity
|
||||||
|
android:name=".ui.TranslatorsActivity"
|
||||||
|
android:exported="false" />
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name=".service.CoreVpnService"
|
android:name=".service.CoreVpnService"
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"language": "العربية (Arabic)",
|
||||||
|
"contributors": [
|
||||||
|
{ "name": "@mribrahem", "displayName": "ibrahem Qasim", "url": "https://github.com/mribrahem" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language": "বাংলা (Bengali)",
|
||||||
|
"contributors": [
|
||||||
|
{ "name": "@codewithtamim", "displayName": "Tamim Hossain", "url": "https://github.com/codewithtamim" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language": "لۊری بختیاری (Luri Bakhtiari)",
|
||||||
|
"contributors": [
|
||||||
|
{ "name": "@hosseinabaspanah", "displayName": "Hossein Abaspanah", "url": "https://github.com/hosseinabaspanah" },
|
||||||
|
{ "name": "@codewithtamim", "displayName": "Tamim Hossain", "url": "https://github.com/codewithtamim" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language": "فارسی (Persian)",
|
||||||
|
"contributors": [
|
||||||
|
{ "name": "@themrvx", "displayName": "MRVX", "url": "https://github.com/themrvx" },
|
||||||
|
{ "name": "@skh-web6982", "url": "https://github.com/skh-web6982" },
|
||||||
|
{ "name": "@ptechgithub", "displayName": "Peyman", "url": "https://github.com/ptechgithub" },
|
||||||
|
{ "name": "@pk-web6936" },
|
||||||
|
{ "name": "@alphax-hue3682" },
|
||||||
|
{ "name": "@phoenix6936" },
|
||||||
|
{ "name": "@decorativefamily" },
|
||||||
|
{ "name": "@decorativeman" },
|
||||||
|
{ "name": "@mh292929", "displayName": "MH", "url": "https://github.com/mh292929" },
|
||||||
|
{ "name": "@amir-yazdanmanesh", "displayName": "AmirMohammad Yazdanmanesh", "url": "https://github.com/amir-yazdanmanesh" },
|
||||||
|
{ "name": "@cumoon", "displayName": "C_U_Moon", "url": "https://github.com/cumoon" },
|
||||||
|
{ "name": "@hadi-norouzi", "displayName": "Hadi Norouzi", "url": "https://github.com/hadi-norouzi" },
|
||||||
|
{ "name": "Vahid Farid" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language": "Русский (Russian)",
|
||||||
|
"contributors": [
|
||||||
|
{ "name": "@solokot", "url": "https://github.com/solokot" },
|
||||||
|
{ "name": "@liniya", "url": "https://github.com/liniya" },
|
||||||
|
{ "name": "@eliotcougar", "url": "https://github.com/eliotcougar" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language": "Tiếng Việt (Vietnamese)",
|
||||||
|
"contributors": [
|
||||||
|
{ "name": "@admarty", "url": "https://github.com/admarty" },
|
||||||
|
{ "name": "@user09283", "url": "https://github.com/user09283" },
|
||||||
|
{ "name": "@yuhan6665", "url": "https://github.com/yuhan6665" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language": "简体中文 (Simplified Chinese)",
|
||||||
|
"contributors": [
|
||||||
|
{ "name": "@yau08", "displayName": "David", "url": "https://github.com/yau08" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language": "繁體中文 (Traditional Chinese)",
|
||||||
|
"contributors": [
|
||||||
|
{ "name": "@yau08", "displayName": "David", "url": "https://github.com/yau08" },
|
||||||
|
{ "name": "@fubuki0x10de", "url": "https://github.com/fubuki0x10de" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package com.v2ray.ang.dto
|
||||||
|
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import com.google.gson.reflect.TypeToken
|
||||||
|
import com.v2ray.ang.AppConfig
|
||||||
|
import com.v2ray.ang.util.LogUtil
|
||||||
|
|
||||||
|
data class Contributor(
|
||||||
|
val name: String,
|
||||||
|
val displayName: String? = null,
|
||||||
|
val url: String? = null
|
||||||
|
)
|
||||||
|
|
||||||
|
data class TranslatorsCredit(
|
||||||
|
val language: String,
|
||||||
|
val contributors: List<Contributor>
|
||||||
|
)
|
||||||
|
|
||||||
|
object TranslatorsParser {
|
||||||
|
|
||||||
|
private val gson = Gson()
|
||||||
|
|
||||||
|
fun parse(json: String): List<TranslatorsCredit> {
|
||||||
|
if (json.isBlank()) return emptyList()
|
||||||
|
|
||||||
|
return try {
|
||||||
|
val type = object : TypeToken<List<TranslatorsCredit>>() {}.type
|
||||||
|
gson.fromJson<List<TranslatorsCredit>>(json, type).orEmpty()
|
||||||
|
.filter { it.language.isNotBlank() && it.contributors.isNotEmpty() }
|
||||||
|
.distinctBy { it.language }
|
||||||
|
} catch (e: Exception) {
|
||||||
|
LogUtil.e(AppConfig.TAG, "Failed to parse translators.json", e)
|
||||||
|
emptyList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.v2ray.ang.ui
|
package com.v2ray.ang.ui
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.webkit.WebView
|
import android.webkit.WebView
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
@@ -46,12 +47,20 @@ class AboutActivity : BaseComponentActivity() {
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun ScreenContent() {
|
override fun ScreenContent() {
|
||||||
AboutScreen(onBackClick = { finish() })
|
AboutScreen(
|
||||||
|
onBackClick = { finish() },
|
||||||
|
onTranslatorsClick = {
|
||||||
|
startActivity(Intent(this, TranslatorsActivity::class.java))
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun AboutScreen(onBackClick: () -> Unit) {
|
fun AboutScreen(
|
||||||
|
onBackClick: () -> Unit,
|
||||||
|
onTranslatorsClick: () -> Unit
|
||||||
|
) {
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
var showOssDialog by remember { mutableStateOf(false) }
|
var showOssDialog by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
@@ -84,6 +93,11 @@ fun AboutScreen(onBackClick: () -> Unit) {
|
|||||||
title = stringResource(R.string.title_oss_license),
|
title = stringResource(R.string.title_oss_license),
|
||||||
onClick = { showOssDialog = true }
|
onClick = { showOssDialog = true }
|
||||||
)
|
)
|
||||||
|
SettingsMenuItem(
|
||||||
|
icon = painterResource(R.drawable.ic_translate_24dp),
|
||||||
|
title = stringResource(R.string.title_translators),
|
||||||
|
onClick = onTranslatorsClick
|
||||||
|
)
|
||||||
SettingsMenuItem(
|
SettingsMenuItem(
|
||||||
icon = painterResource(R.drawable.ic_feedback_24dp),
|
icon = painterResource(R.drawable.ic_feedback_24dp),
|
||||||
title = stringResource(R.string.title_pref_feedback),
|
title = stringResource(R.string.title_pref_feedback),
|
||||||
|
|||||||
@@ -0,0 +1,155 @@
|
|||||||
|
package com.v2ray.ang.ui
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.WindowInsets
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.layout.size
|
||||||
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
|
import androidx.compose.foundation.lazy.items
|
||||||
|
import androidx.compose.material3.Card
|
||||||
|
import androidx.compose.material3.CardDefaults
|
||||||
|
import androidx.compose.material3.HorizontalDivider
|
||||||
|
import androidx.compose.material3.Icon
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Scaffold
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.res.painterResource
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.semantics.Role
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.dto.TranslatorsCredit
|
||||||
|
import com.v2ray.ang.dto.TranslatorsParser
|
||||||
|
import com.v2ray.ang.ui.base.BaseComponentActivity
|
||||||
|
import com.v2ray.ang.ui.compose.AppTopBar
|
||||||
|
import com.v2ray.ang.ui.compose.NavigationBarsSpacer
|
||||||
|
import com.v2ray.ang.util.Utils
|
||||||
|
|
||||||
|
class TranslatorsActivity : BaseComponentActivity() {
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
override fun ScreenContent() {
|
||||||
|
TranslatorsScreen(onBackClick = { finish() })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun TranslatorsScreen(onBackClick: () -> Unit) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val credits = remember {
|
||||||
|
TranslatorsParser.parse(Utils.readTextFromAssets(context, "translators.json"))
|
||||||
|
}
|
||||||
|
|
||||||
|
Scaffold(
|
||||||
|
contentWindowInsets = WindowInsets(0),
|
||||||
|
topBar = {
|
||||||
|
AppTopBar(
|
||||||
|
title = stringResource(R.string.title_translators),
|
||||||
|
onBackClick = onBackClick
|
||||||
|
)
|
||||||
|
}
|
||||||
|
) { innerPadding ->
|
||||||
|
LazyColumn(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.padding(innerPadding),
|
||||||
|
contentPadding = PaddingValues(16.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
items(credits, key = { it.language }) { credit ->
|
||||||
|
TranslationCreditCard(credit)
|
||||||
|
}
|
||||||
|
item {
|
||||||
|
NavigationBarsSpacer()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun TranslationCreditCard(credit: TranslatorsCredit) {
|
||||||
|
Card(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
colors = CardDefaults.cardColors(
|
||||||
|
containerColor = MaterialTheme.colorScheme.surfaceContainerLow
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
Column {
|
||||||
|
Text(
|
||||||
|
text = credit.language,
|
||||||
|
style = MaterialTheme.typography.titleMedium,
|
||||||
|
modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp)
|
||||||
|
)
|
||||||
|
credit.contributors.forEachIndexed { index, contributor ->
|
||||||
|
if (index > 0) {
|
||||||
|
HorizontalDivider(
|
||||||
|
modifier = Modifier.padding(horizontal = 16.dp),
|
||||||
|
color = MaterialTheme.colorScheme.outlineVariant,
|
||||||
|
thickness = 0.5.dp
|
||||||
|
)
|
||||||
|
}
|
||||||
|
ContributorRow(
|
||||||
|
displayName = contributor.displayName ?: contributor.name,
|
||||||
|
linkUrl = contributor.url
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun ContributorRow(displayName: String, linkUrl: String?) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val isLink = linkUrl != null
|
||||||
|
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.then(
|
||||||
|
if (isLink) {
|
||||||
|
Modifier.clickable(role = Role.Button) {
|
||||||
|
Utils.openUri(context, linkUrl)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Modifier
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.padding(horizontal = 16.dp, vertical = 12.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
if (isLink) {
|
||||||
|
Icon(
|
||||||
|
painter = painterResource(R.drawable.ic_github_24dp),
|
||||||
|
contentDescription = null,
|
||||||
|
tint = MaterialTheme.colorScheme.primary,
|
||||||
|
modifier = Modifier.size(20.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Text(
|
||||||
|
text = displayName,
|
||||||
|
style = MaterialTheme.typography.bodyLarge,
|
||||||
|
color = if (isLink) {
|
||||||
|
MaterialTheme.colorScheme.primary
|
||||||
|
} else {
|
||||||
|
MaterialTheme.colorScheme.onSurface
|
||||||
|
},
|
||||||
|
modifier = Modifier.padding(start = if (isLink) 12.dp else 0.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M12,2C6.48,2 2,6.58 2,12.25c0,4.75 3.07,8.78 7.33,10.2c0.54,0.1 0.73,-0.23 0.73,-0.52v-1.82c-2.98,0.65 -3.61,-1.44 -3.61,-1.44c-0.49,-1.27 -1.19,-1.61 -1.19,-1.61c-0.98,-0.67 0.07,-0.66 0.07,-0.66c1.08,0.08 1.65,1.13 1.65,1.13c0.96,1.68 2.52,1.2 3.13,0.92c0.1,-0.71 0.37,-1.2 0.68,-1.47c-2.39,-0.27 -4.9,-1.22 -4.9,-5.42c0,-1.2 0.42,-2.18 1.1,-2.94c-0.11,-0.28 -0.48,-1.39 0.1,-2.91c0,0 0.9,-0.29 2.95,1.12c0.86,-0.24 1.78,-0.37 2.7,-0.37c0.92,0 1.84,0.13 2.7,0.37c2.05,-1.41 2.95,-1.12 2.95,-1.12c0.58,1.52 0.21,2.63 0.1,2.91c0.68,0.76 1.1,1.74 1.1,2.94c0,4.21 -2.51,5.15 -4.91,5.42c0.39,0.34 0.73,1.02 0.73,2.06v3.06c0,0.29 0.19,0.63 0.74,0.52c4.25,-1.42 7.32,-5.45 7.32,-10.2C22,6.58 17.52,2 12,2z" />
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:pathData="M12.87,15.07L10.33,12.56L10.36,12.53C12.1,10.59 13.34,8.36 14.07,6H17V4H10V2H8V4H1V6H12.17C11.5,7.92 10.45,9.75 9,11.35C8.06,10.32 7.28,9.19 6.69,8H4.69C5.42,9.63 6.42,11.17 7.7,12.56L2.61,17.58L4,19L9,14L12.11,17.11L12.87,15.07ZM18.5,10H16.5L12,22H14L15.12,19H19.87L21,22H23L18.5,10ZM15.88,17L17.5,12.67L19.12,17H15.88Z" />
|
||||||
|
</vector>
|
||||||
@@ -283,6 +283,7 @@
|
|||||||
<string name="title_about">حول التطبيق</string>
|
<string name="title_about">حول التطبيق</string>
|
||||||
<string name="title_source_code">الكود المصدري</string>
|
<string name="title_source_code">الكود المصدري</string>
|
||||||
<string name="title_oss_license">تراخيص المصادر المفتوحة</string>
|
<string name="title_oss_license">تراخيص المصادر المفتوحة</string>
|
||||||
|
<string name="title_translators">المترجمون</string>
|
||||||
<string name="title_tg_channel">قناة Telegram</string>
|
<string name="title_tg_channel">قناة Telegram</string>
|
||||||
|
|
||||||
<string name="title_pref_promotion">ترويج</string>
|
<string name="title_pref_promotion">ترويج</string>
|
||||||
|
|||||||
@@ -283,6 +283,7 @@
|
|||||||
<string name="title_about">সম্পর্কিত</string>
|
<string name="title_about">সম্পর্কিত</string>
|
||||||
<string name="title_source_code">সোর্স কোড</string>
|
<string name="title_source_code">সোর্স কোড</string>
|
||||||
<string name="title_oss_license">ওপেন সোর্স লাইসেন্স</string>
|
<string name="title_oss_license">ওপেন সোর্স লাইসেন্স</string>
|
||||||
|
<string name="title_translators">অনুবাদকগণ</string>
|
||||||
<string name="title_tg_channel">টেলিগ্রাম চ্যানেল</string>
|
<string name="title_tg_channel">টেলিগ্রাম চ্যানেল</string>
|
||||||
|
|
||||||
<string name="title_pref_promotion">প্রচার</string>
|
<string name="title_pref_promotion">প্রচার</string>
|
||||||
|
|||||||
@@ -283,6 +283,7 @@
|
|||||||
<string name="title_about">زبار</string>
|
<string name="title_about">زبار</string>
|
||||||
<string name="title_source_code">کود بونچک</string>
|
<string name="title_source_code">کود بونچک</string>
|
||||||
<string name="title_oss_license">موجوزا کود بونچک</string>
|
<string name="title_oss_license">موجوزا کود بونچک</string>
|
||||||
|
<string name="title_translators">ترجومهگرا</string>
|
||||||
<string name="title_tg_channel">تورگه تلگرام</string>
|
<string name="title_tg_channel">تورگه تلگرام</string>
|
||||||
|
|
||||||
<string name="title_pref_promotion">تبلیغات</string>
|
<string name="title_pref_promotion">تبلیغات</string>
|
||||||
|
|||||||
@@ -283,6 +283,7 @@
|
|||||||
<string name="title_about">درباره</string>
|
<string name="title_about">درباره</string>
|
||||||
<string name="title_source_code">کد منبع</string>
|
<string name="title_source_code">کد منبع</string>
|
||||||
<string name="title_oss_license">مجوز های منبع باز</string>
|
<string name="title_oss_license">مجوز های منبع باز</string>
|
||||||
|
<string name="title_translators">مترجمان</string>
|
||||||
<string name="title_tg_channel">کانال تلگرام</string>
|
<string name="title_tg_channel">کانال تلگرام</string>
|
||||||
|
|
||||||
<string name="title_pref_promotion">تبلیغات</string>
|
<string name="title_pref_promotion">تبلیغات</string>
|
||||||
|
|||||||
@@ -283,6 +283,7 @@
|
|||||||
<string name="title_about">О приложении</string>
|
<string name="title_about">О приложении</string>
|
||||||
<string name="title_source_code">Исходный код</string>
|
<string name="title_source_code">Исходный код</string>
|
||||||
<string name="title_oss_license">Лицензии открытого исходного кода</string>
|
<string name="title_oss_license">Лицензии открытого исходного кода</string>
|
||||||
|
<string name="title_translators">Переводчики</string>
|
||||||
<string name="title_tg_channel">Telegram-канал</string>
|
<string name="title_tg_channel">Telegram-канал</string>
|
||||||
|
|
||||||
<string name="title_pref_promotion">Предложения</string>
|
<string name="title_pref_promotion">Предложения</string>
|
||||||
|
|||||||
@@ -283,6 +283,7 @@
|
|||||||
<string name="title_about">Giới thiệu</string>
|
<string name="title_about">Giới thiệu</string>
|
||||||
<string name="title_source_code">Mã nguồn</string>
|
<string name="title_source_code">Mã nguồn</string>
|
||||||
<string name="title_oss_license">Giấy phép mã nguồn mở</string>
|
<string name="title_oss_license">Giấy phép mã nguồn mở</string>
|
||||||
|
<string name="title_translators">Người dịch</string>
|
||||||
<string name="title_tg_channel">Kênh Telegram</string>
|
<string name="title_tg_channel">Kênh Telegram</string>
|
||||||
|
|
||||||
<string name="title_pref_promotion">Ưu đãi</string>
|
<string name="title_pref_promotion">Ưu đãi</string>
|
||||||
|
|||||||
@@ -283,6 +283,7 @@
|
|||||||
<string name="title_about">关于</string>
|
<string name="title_about">关于</string>
|
||||||
<string name="title_source_code">源代码</string>
|
<string name="title_source_code">源代码</string>
|
||||||
<string name="title_oss_license">开源许可证</string>
|
<string name="title_oss_license">开源许可证</string>
|
||||||
|
<string name="title_translators">翻译贡献者</string>
|
||||||
<string name="title_tg_channel">Telegram 频道</string>
|
<string name="title_tg_channel">Telegram 频道</string>
|
||||||
|
|
||||||
<string name="title_pref_promotion">推广</string>
|
<string name="title_pref_promotion">推广</string>
|
||||||
|
|||||||
@@ -283,6 +283,7 @@
|
|||||||
<string name="title_about">關於</string>
|
<string name="title_about">關於</string>
|
||||||
<string name="title_source_code">原始碼</string>
|
<string name="title_source_code">原始碼</string>
|
||||||
<string name="title_oss_license">開放原始碼授權</string>
|
<string name="title_oss_license">開放原始碼授權</string>
|
||||||
|
<string name="title_translators">翻譯貢獻者</string>
|
||||||
<string name="title_tg_channel">Telegram 頻道</string>
|
<string name="title_tg_channel">Telegram 頻道</string>
|
||||||
|
|
||||||
<string name="title_pref_promotion">推廣</string>
|
<string name="title_pref_promotion">推廣</string>
|
||||||
|
|||||||
@@ -283,6 +283,7 @@
|
|||||||
<string name="title_about">About</string>
|
<string name="title_about">About</string>
|
||||||
<string name="title_source_code">Source code</string>
|
<string name="title_source_code">Source code</string>
|
||||||
<string name="title_oss_license">Open-source licenses</string>
|
<string name="title_oss_license">Open-source licenses</string>
|
||||||
|
<string name="title_translators">Translators</string>
|
||||||
<string name="title_tg_channel">Telegram channel</string>
|
<string name="title_tg_channel">Telegram channel</string>
|
||||||
|
|
||||||
<string name="title_pref_promotion">Promotion</string>
|
<string name="title_pref_promotion">Promotion</string>
|
||||||
|
|||||||
Reference in new issue
Block a user