feat(battlenet): import, list and delete World of Warcraft addons (#2111)

World of Warcraft, Classic and Forever get an Addons tab in the Library. It imports addon zips into the right Interface/AddOns folder, lists the installed addons, and deletes one after a confirmation.
This commit is contained in:
MaxsTechReview authored and GitHub committed 2026-11-05 02:04:03 -05:00
1 parent b9dbd006be
commit a309428a2a
39 files changed
+1142 -1

No files matched your search

+1
View File
@@ -93,6 +93,7 @@ DroidDeck is [GPL-3.0](LICENSE). Steam and Proton belong to Valve Corporation. V
- Epic's official Linux launcher preview runs through FEX. That setup is outside Epic's listed Linux support.
- Battle.net is by [@kayakyakr](https://github.com/kayakyakr). It runs Blizzard's own client in Proton (downloaded from Blizzard, not included) and shows key art from the [Battle.net Shop](https://shop.battle.net). Without Steam, its games see the pad as an Xbox 360 controller via `PROTON_SPOOF_STEAMINPUT_VIDPID` in [Proton](https://github.com/ValveSoftware/wine)'s `dlls/winebus.sys`.
- Battle.net installs drive Blizzard's Agent the way [@barncastle](https://github.com/barncastle)'s [Battle.Net-Installer](https://github.com/barncastle/Battle.Net-Installer) does, with requests from [wowdev.wiki](https://wowdev.wiki/Agent). Read without taking code: [@mubaraknumann](https://github.com/mubaraknumann)'s [unifideck](https://github.com/mubaraknumann/unifideck), [@djmittens](https://github.com/djmittens)'s [neo-mittens](https://github.com/djmittens/neo-mittens) `bnetswitch`, [@BCD1210](https://github.com/BCD1210)'s [soju](https://github.com/BCD1210/soju) and [Lutris](https://github.com/lutris/lutris)'s `product.db` reader.
- World of Warcraft addon imports replace an addon's folder from a temporary copy, as [WowUp](https://github.com/WowUp/WowUp) does, and read flavour folders the way [WoWDeck](https://github.com/sigboe/wowdeck) does. No code from either is used.
- Xbox games load [@domsvoboda](https://github.com/domsvoboda)'s [xodus-nexus](https://github.com/domsvoboda/xodus-nexus) modules (LGPL-2.1-or-later), including `wintypes.dll`. Minecraft's GameInput setup was checked against [@Wyze3306](https://github.com/Wyze3306)'s [BedrockOnLinux](https://github.com/Wyze3306/BedrockOnLinux) (MIT).
- The Xbox Cloud Gaming player uses the WebRTC client of [@unknownskl](https://github.com/unknownskl)'s [Greenlight](https://github.com/unknownskl/greenlight) (MIT), and its offer tweaks and sharpening follow [@redphx](https://github.com/redphx)'s [Better xCloud](https://github.com/redphx/better-xcloud) (MIT). See `tools/xcloud-player/NOTICE.md`.
- The itch.io butler pack ships butler's `7z.so`, itch.io's build of [7-Zip](https://www.7-zip.org) by Igor Pavlov (LGPL-2.1, unRAR restriction on RAR code), unmodified. Other archives use Apache Commons Compress and the runtime's bsdtar (libarchive).
@@ -433,6 +433,27 @@ class FrontEndActivity : ComponentActivity() {
pickSaveZip.launch(InAppFilePicker.buildIntent(this, listOf("zip"), getString(R.string.main_saves_pick_zip, name), GameSaves.savesDir().parentFile?.parentFile?.path))
}
private fun importAddons(name: String, target: com.droiddeck.launcher.runtime.WowAddons.Target) {
if (SessionState.running) {
android.widget.Toast.makeText(this, R.string.main_addons_close_session, android.widget.Toast.LENGTH_LONG).show()
return
}
onSavePicked = { zip ->
saveAction(getString(R.string.main_addons_importing, name)) {
if (SessionState.running) return@saveAction getString(R.string.main_addons_close_session)
val imported = try {
com.droiddeck.launcher.runtime.WowAddons.import(zip, target)
} catch (_: com.droiddeck.launcher.runtime.WowAddons.TooLarge) {
return@saveAction getString(R.string.main_addons_too_large, zip.name)
}
if (imported.isEmpty()) getString(R.string.main_addons_none, zip.name)
else resources.getQuantityString(R.plurals.main_addons_imported, imported.size, imported.size, target.flavor)
}
}
val downloads = android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS).path
pickSaveZip.launch(InAppFilePicker.buildIntent(this, listOf("zip"), getString(R.string.main_addons_pick_zip, name), downloads))
}
private fun exportSaves(name: String, layout: GameSaves.Layout, game: () -> GameSaves.Game) {
onSavePicked = { dir ->
saveAction(getString(R.string.main_saves_exporting, name)) {
@@ -1282,6 +1303,13 @@ class FrontEndActivity : ComponentActivity() {
onGameComponents = { game -> openComponents(gameKey = game.profileKey) },
onComponentsTab = { tab -> openComponents(focusContent = true, tab = tab) },
onSaveImport = { sg -> importSaves(sg.name) { GameSaves.game(sg) } },
onAddonImport = { sg, target -> importAddons(sg.name, target) },
onAddonDelete = { target, name ->
saveAction(getString(R.string.main_addons_deleting, name)) {
com.droiddeck.launcher.runtime.WowAddons.delete(target, name)
getString(R.string.main_addons_deleted, name)
}
},
onSaveExport = { sg, layout -> exportSaves(sg.name, layout) { GameSaves.game(sg) } },
onPerformance = { refreshCores(); showComponents = false; showMapping = false; showPerformance = true },
onRoms = { showRoms = true },
@@ -0,0 +1,164 @@
package com.droiddeck.launcher.runtime
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.setValue
import com.droiddeck.launcher.frontend.Library
import com.droiddeck.launcher.stores.Store
import com.droiddeck.launcher.stores.StoreInstalls
import org.apache.commons.compress.archivers.zip.ZipFile
import java.io.File
import java.io.IOException
import java.nio.file.Files
import java.nio.file.LinkOption
object WowAddons {
var imports by mutableIntStateOf(0)
private set
class TooLarge : IOException()
class Target(val flavor: String, val addOns: File)
class Addon(val name: String, val root: String)
internal const val MAX_EXPANDED_BYTES = 4L * 1024 * 1024 * 1024
private val SUFFIX = Regex("[-_](standard|mainline|classic|vanilla|tbc|bcc|wrath|wotlkc|cata|mists|forever)$", RegexOption.IGNORE_CASE)
fun targets(game: Library.SteamGame): List<Target> {
if (game.source != Store.BATTLENET.id) return emptyList()
val title = game.storeId?.let(BattleNet::title) ?: return emptyList()
if (title.flavor == null) return emptyList()
val folder = game.gameFiles ?: return emptyList()
return targets(title, folder)
}
internal fun targets(title: BattleNet.Title, folder: File): List<Target> {
val flavors = BattleNet.TITLES.filter { it.code == title.code }.mapNotNull { it.flavor }
.flatMap { listOf(it, it.dropLast(1) + "_beta_") }.distinct()
val root = if (folder.name in flavors) folder.parentFile ?: return emptyList() else folder
return flavors.map { File(root, it) }.filter { it.isDirectory }.map { Target(it.name, addOnsFolder(it)) }
}
fun installed(target: Target): List<String> =
target.addOns.listFiles().orEmpty().filter { it.isDirectory && !it.name.startsWith(".") }
.map { it.name }.sortedBy { it.lowercase() }
fun delete(target: Target, name: String) {
val folder = target.addOns.listFiles()?.firstOrNull { it.name == name && !it.name.startsWith(".") }
?: throw IOException("Cannot find $name")
StoreInstalls.deleteTree(folder)
if (Files.exists(folder.toPath(), LinkOption.NOFOLLOW_LINKS)) throw IOException("Cannot delete $name")
imports++
}
fun import(zipFile: File, target: Target): List<String> {
ZipFile.builder().setFile(zipFile).get().use { zip ->
val all = zip.entries.toList()
if (all.any { it.isUnixSymlink }) return emptyList()
val entries = all.filter { clean(it.name) != null }
val addons = addons(entries.filter { !it.isDirectory }.mapNotNull { clean(it.name) })
if (addons.isEmpty()) return emptyList()
val addOns = target.addOns
if (!addOns.isDirectory && !addOns.mkdirs()) throw IOException("Cannot create ${addOns.path}")
val stage = File(addOns.parentFile, ".addon-import-${System.nanoTime()}")
try {
val fresh = File(stage, "new")
val buffer = ByteArray(64 * 1024)
var written = 0L
for (entry in entries) {
if (entry.isDirectory) continue
val path = clean(entry.name) ?: continue
val addon = addons.firstOrNull { path.startsWith(it.root) } ?: continue
val out = inside(fresh, addon.name + "/" + path.removePrefix(addon.root)) ?: continue
out.parentFile?.mkdirs()
zip.getInputStream(entry).use { input ->
out.outputStream().use { output ->
while (true) {
val read = input.read(buffer)
if (read < 0) break
written += read
if (written > MAX_EXPANDED_BYTES) throw TooLarge()
output.write(buffer, 0, read)
}
}
}
}
swap(addons.map { File(fresh, it.name) to it.name }, addOns, File(stage, "old").apply { mkdirs() })
} finally {
StoreInstalls.deleteTree(stage)
}
imports++
return addons.map { it.name }
}
}
internal fun addons(files: List<String>): List<Addon> {
val tocs = files.filter { it.endsWith(".toc", ignoreCase = true) }
val folders = tocs.map { it.substringBeforeLast('/', "") }.distinct().sortedBy { it.length }
val roots = ArrayList<String>()
for (folder in folders) {
if (roots.none { it.isEmpty() || folder.startsWith("$it/") }) roots.add(folder)
}
return roots.mapNotNull { root ->
val inFolder = tocs.filter { it.substringBeforeLast('/', "") == root }
.map { it.substringAfterLast('/').dropLast(4) }
val name = addonName(root.substringAfterLast('/'), inFolder)
name.takeIf { it.isNotEmpty() && !it.startsWith(".") }?.let { Addon(it, if (root.isEmpty()) "" else "$root/") }
}.distinctBy { it.name.lowercase() }
}
private fun addonName(folder: String, tocs: List<String>): String {
val match = tocs.firstOrNull { it.equals(folder, ignoreCase = true) }
?: tocs.firstOrNull { it.replace(SUFFIX, "").equals(folder, ignoreCase = true) }
if (match != null) return folder
return tocs.map { it.replace(SUFFIX, "") }.minByOrNull { it.length }.orEmpty()
}
private fun clean(name: String): String? {
val parts = name.replace('\\', '/').trim('/').split('/')
if (name.startsWith("/") || name.startsWith("\\") || parts.any { it.isEmpty() || it == "." || it == ".." || it.endsWith(":") }) return null
if (parts.first() == "__MACOSX" || parts.last().startsWith("._")) return null
return parts.joinToString("/")
}
private fun inside(root: File, path: String): File? {
val out = File(root, path)
return out.takeIf { it.canonicalPath.startsWith(root.canonicalPath + File.separator) }
}
private fun addOnsFolder(flavor: File): File = child(child(flavor, "Interface"), "AddOns")
private fun child(parent: File, name: String): File =
parent.listFiles()?.firstOrNull { it.name.equals(name, ignoreCase = true) } ?: File(parent, name)
internal fun swap(fresh: List<Pair<File, String>>, addOns: File, old: File) {
val done = ArrayList<Replaced>()
try {
for ((folder, name) in fresh) done.add(replace(folder, addOns, name, old))
} catch (e: IOException) {
done.asReversed().forEach { undo(it) }
throw e
}
}
private class Replaced(val installed: File, val previous: File?, val kept: File?)
private fun undo(replaced: Replaced) {
StoreInstalls.deleteTree(replaced.installed)
if (replaced.previous != null) replaced.kept?.renameTo(replaced.previous)
}
private fun replace(fresh: File, addOns: File, name: String, old: File): Replaced {
val current = addOns.listFiles()?.firstOrNull { it.name.equals(name, ignoreCase = true) }
val kept = current?.let { File(old, it.name) }
if (current != null && !current.renameTo(kept!!)) throw IOException("Cannot replace ${current.path}")
val installed = File(addOns, name)
if (!fresh.renameTo(installed)) {
kept?.renameTo(current)
throw IOException("Cannot install $name")
}
return Replaced(installed, current, kept)
}
}
@@ -219,6 +219,8 @@ class FrontEndActions(
val onGameComponents: (Library.SteamGame) -> Unit = { onComponents(true) },
val onComponentsTab: (String) -> Unit = {},
val onSaveImport: (Library.SteamGame) -> Unit = {},
val onAddonImport: (Library.SteamGame, com.droiddeck.launcher.runtime.WowAddons.Target) -> Unit = { _, _ -> },
val onAddonDelete: (com.droiddeck.launcher.runtime.WowAddons.Target, String) -> Unit = { _, _ -> },
val onSaveExport: (Library.SteamGame, com.droiddeck.launcher.session.GameSaves.Layout) -> Unit = { _, _ -> },
val onPerformance: () -> Unit,
val onRoms: () -> Unit,
@@ -73,6 +73,7 @@ import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
@@ -86,7 +87,9 @@ import coil.compose.AsyncImage
import com.droiddeck.launcher.R
import com.droiddeck.launcher.frontend.GameRemoval
import com.droiddeck.launcher.frontend.Library
import com.droiddeck.launcher.runtime.WowAddons
import com.droiddeck.launcher.session.GameSaves
import com.droiddeck.launcher.session.SessionState
import com.droiddeck.launcher.stores.CatalogItem
import com.droiddeck.launcher.stores.CloudSaves
import com.droiddeck.launcher.stores.InstalledStoreGame
@@ -136,7 +139,7 @@ internal class GameRef(val appId: Int?, val store: Store?, val storeId: String?)
}
}
internal enum class GameTab { ABOUT, ACHIEVEMENTS, LAUNCH, SAVES, INSTALL }
internal enum class GameTab { ABOUT, ACHIEVEMENTS, LAUNCH, SAVES, ADDONS, INSTALL }
@Composable
internal fun GameDetail(
@@ -180,12 +183,14 @@ internal fun GameDetail(
.takeUnless { it.trim().equals(title.trim(), ignoreCase = true) }.orEmpty()
val scored = scores != null && (scores.metacritic != Lookup.None || scores.hltb != Lookup.None)
val prefix = game?.protonPrefix?.takeIf { it.isDirectory }
val addonTargets = remember(game?.gameId, game?.gameFiles) { game?.let(WowAddons::targets).orEmpty() }
val tabs = buildList {
if (description.isNotBlank() || developer.isNotBlank() || publisher.isNotBlank() || releaseDate.isNotBlank() || scored || (!s.shortcutPicker && title.isNotBlank() && title != id)) add(GameTab.ABOUT)
if (achievementState != null) add(GameTab.ACHIEVEMENTS)
val cloud = game?.library == Library.XBOX_CLOUD
if (game != null && !cloud) add(GameTab.LAUNCH)
if (game != null && game.library == Library.ADDED && prefix != null) add(GameTab.SAVES)
if (addonTargets.isNotEmpty()) add(GameTab.ADDONS)
if ((game != null && !cloud) || installed != null) add(GameTab.INSTALL)
}
var picked by remember(key) { mutableStateOf<GameTab?>(null) }
@@ -248,6 +253,7 @@ internal fun GameDetail(
} ?: stringResource(R.string.achievements_title)
GameTab.LAUNCH -> stringResource(R.string.game_tab_launch)
GameTab.SAVES -> stringResource(if (Store.byId(source).let { it == Store.GOG || it == Store.EPIC }) R.string.game_tab_saves_cloud else R.string.games_saves)
GameTab.ADDONS -> stringResource(R.string.game_tab_addons)
GameTab.INSTALL -> stringResource(R.string.game_tab_install)
}
}
@@ -263,6 +269,7 @@ internal fun GameDetail(
GameTab.ACHIEVEMENTS -> achievementState?.let { st -> AchievementsTab(StoreAchievements.forSource(store?.id)?.label.orEmpty(), st) }
GameTab.LAUNCH -> if (game != null) LaunchTab(game, s, a, hopRail)
GameTab.SAVES -> if (game != null && prefix != null) SavesTab(game, prefix, a)
GameTab.ADDONS -> if (game != null) AddonsTab(game, addonTargets, a)
GameTab.INSTALL -> InstallTab(game, installed, item, store)
}
}
@@ -857,6 +864,44 @@ private fun SavesTab(g: Library.SteamGame, prefix: File, a: FrontEndActions) {
}
}
@Composable
private fun AddonsTab(g: Library.SteamGame, targets: List<WowAddons.Target>, a: FrontEndActions) {
Column(Modifier.fillMaxWidth().tabPanel(), verticalArrangement = Arrangement.spacedBy(2.dp)) {
targets.forEach { target ->
val names by produceState(emptyList<String>(), target.addOns, WowAddons.imports) {
value = withContext(Dispatchers.IO) { WowAddons.installed(target) }
}
if (targets.size > 1) SectionLabel(target.flavor)
MenuItem(
stringResource(R.string.games_import_addons), checked = false,
detail = pluralStringResource(R.plurals.games_addons_count, names.size, names.size),
) { a.onAddonImport(g, target) }
MenuItem(stringResource(R.string.games_open_addons_folder), checked = false) {
target.addOns.mkdirs()
a.onBrowseFiles(target.addOns)
}
names.forEach { name -> AddonRow(name, target, a) }
}
}
}
@Composable
private fun AddonRow(name: String, target: WowAddons.Target, a: FrontEndActions) {
var asking by remember(target.addOns, name) { mutableStateOf(false) }
val delete = stringResource(R.string.common_delete)
Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth().padding(start = 16.dp, top = 2.dp, bottom = 2.dp)) {
Text(name, fontSize = 14.sp, color = MaterialTheme.colorScheme.onBackground, maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier.weight(1f))
if (!SessionState.running) IconAction(Icons.Outlined.Delete, delete, "addon:delete:${target.flavor}:$name", danger = true) { asking = true }
}
if (asking) ConfirmDialog(
title = stringResource(R.string.games_delete_addon_title, name),
text = stringResource(R.string.games_delete_addon_body),
confirm = delete,
onConfirm = { a.onAddonDelete(target, name) },
onDismiss = { asking = false },
)
}
@Composable
private fun CloudRows(g: Library.SteamGame) {
val store = Store.byId(g.source)?.takeIf { it != Store.AMAZON } ?: return
+28
View File
@@ -1207,6 +1207,18 @@
<string name="games_export_gamehub">تصدير بصيغة GameHub المضغوطة…</string>
<string name="games_export_winlator">تصدير بصيغة Winlator المضغوطة…</string>
<string name="games_open_save_folder">فتح مجلد الحفظ</string>
<string name="games_import_addons">استيراد الإضافات من zip…</string>
<string name="games_open_addons_folder">فتح مجلد الإضافات</string>
<string name="games_delete_addon_title">حذف %1$s؟</string>
<string name="games_delete_addon_body">يؤدي هذا إلى حذف مجلد الإضافة. تبقى إعداداتها.</string>
<plurals name="games_addons_count">
<item quantity="zero">%1$d إضافة</item>
<item quantity="one">%1$d إضافة</item>
<item quantity="two">%1$d إضافتان</item>
<item quantity="few">%1$d إضافات</item>
<item quantity="many">%1$d إضافة</item>
<item quantity="other">%1$d إضافة</item>
</plurals>
<string name="games_never_played">لم يتم تشغيلها أبدًا</string>
<string name="games_runtime_busy_percent">بيئة التشغيل مشغولة · %1$d%%</string>
<string name="games_runtime_busy">بيئة التشغيل مشغولة</string>
@@ -1393,6 +1405,21 @@
<item quantity="many">تم استيراد %1$d ملفًا من %2$s إلى %3$s. تم نسخ ملفات الحفظ القديمة احتياطيًا إلى Download/DroidDeck/Saves/backups</item>
<item quantity="other">تم استيراد %1$d ملف من %2$s إلى %3$s. تم نسخ ملفات الحفظ القديمة احتياطيًا إلى Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">أغلِق الجلسة أولاً حتى لا تستخدم اللعبة إضافاتها أثناء الاستيراد</string>
<string name="main_addons_importing">استيراد الإضافات إلى %1$s</string>
<string name="main_addons_pick_zip">اختر ملف zip للإضافات الخاصة بـ %1$s</string>
<string name="main_addons_too_large">%1$s كبير جدًا بحيث لا يمكن استيراده</string>
<string name="main_addons_deleting">جارٍ حذف %1$s</string>
<string name="main_addons_deleted">تم حذف %1$s</string>
<string name="main_addons_none">لم يتم العثور على إضافات في %1$s</string>
<plurals name="main_addons_imported">
<item quantity="zero">تم استيراد %1$d إضافة إلى %2$s</item>
<item quantity="one">تم استيراد %1$d إضافة إلى %2$s</item>
<item quantity="two">تم استيراد %1$d إضافتين إلى %2$s</item>
<item quantity="few">تم استيراد %1$d إضافات إلى %2$s</item>
<item quantity="many">تم استيراد %1$d إضافة إلى %2$s</item>
<item quantity="other">تم استيراد %1$d إضافة إلى %2$s</item>
</plurals>
<string name="main_saves_pick_zip">اختر ملف zip لملفات حفظ %1$s</string>
<string name="main_saves_exporting">تصدير %1$s</string>
<plurals name="main_saves_exported">
@@ -3616,6 +3643,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">للألعاب التي تُحفظ بياناتها في حساب Steam الخاص بك</string>
<string name="game_resource_search">البحث في الويب</string>
<string name="game_tab_addons">الإضافات</string>
<string name="game_tab_install">تثبيت</string>
<string name="game_install_location">الموقع</string>
<string name="game_install_folder">مجلد</string>
@@ -1259,6 +1259,15 @@
<string name="games_export_gamehub">Exportar como zip de GameHub…</string>
<string name="games_export_winlator">Exportar como zip de Winlator…</string>
<string name="games_open_save_folder">Abrir carpeta de guardado</string>
<string name="games_import_addons">Importar addons desde zip…</string>
<string name="games_open_addons_folder">Abrir carpeta de addons</string>
<string name="games_delete_addon_title">¿Eliminar %1$s?</string>
<string name="games_delete_addon_body">Esto elimina la carpeta del addon. Sus ajustes se conservan.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d addon</item>
<item quantity="other">%1$d addons</item>
<item quantity="many">%1$d de addons</item>
</plurals>
<string name="games_never_played">Nunca jugado</string>
<string name="games_runtime_busy_percent">Runtime ocupado · %1$d%%</string>
<string name="games_runtime_busy">Runtime ocupado</string>
@@ -1438,6 +1447,18 @@
<item quantity="other">Se importaron %1$d archivos del %2$s en %3$s. Copia de las partidas anteriores en Download/DroidDeck/Saves/backups</item>
<item quantity="many">Se importaron %1$d archivos del %2$s en %3$s. Copia de las partidas anteriores en Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Cierra primero la sesión para que el juego no use sus addons durante la importación</string>
<string name="main_addons_importing">Importando addons en %1$s</string>
<string name="main_addons_pick_zip">Elige un zip de addons para %1$s</string>
<string name="main_addons_too_large">%1$s es demasiado grande para importarlo</string>
<string name="main_addons_deleting">Eliminando %1$s</string>
<string name="main_addons_deleted">Se eliminó %1$s</string>
<string name="main_addons_none">No se encontraron addons en %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Se importó %1$d addon en %2$s</item>
<item quantity="other">Se importaron %1$d addons en %2$s</item>
<item quantity="many">Se importaron %1$d de addons en %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Elige un zip de partidas guardadas para %1$s</string>
<string name="main_saves_exporting">Exportando %1$s</string>
<plurals name="main_saves_exported">
@@ -3481,6 +3502,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Para juegos con partidas guardadas en tu cuenta de Steam</string>
<string name="game_resource_search">Búsqueda web</string>
<string name="game_tab_addons">Addons</string>
<string name="game_tab_install">Instalar</string>
<string name="game_install_location">Ubicación</string>
<string name="game_install_folder">Carpeta</string>
+20
View File
@@ -1183,6 +1183,14 @@
<string name="games_export_gamehub">Експортиране като GameHub zip…</string>
<string name="games_export_winlator">Експортиране като Winlator zip…</string>
<string name="games_open_save_folder">Отваряне на папката за записи</string>
<string name="games_import_addons">Импортиране на добавки от ZIP…</string>
<string name="games_open_addons_folder">Отваряне на папката с добавки</string>
<string name="games_delete_addon_title">Да се изтрие ли %1$s?</string>
<string name="games_delete_addon_body">Това изтрива папката на добавката. Настройките ѝ се запазват.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d добавка</item>
<item quantity="other">%1$d добавки</item>
</plurals>
<string name="games_never_played">Никога не е играна</string>
<string name="games_runtime_busy_percent">Средата за изпълнение е заета · %1$d%%</string>
<string name="games_runtime_busy">Средата за изпълнение е заета</string>
@@ -1361,6 +1369,17 @@
<item quantity="one">Импортиран %1$d файл от %2$s в %3$s. Старите запазвания са архивирани в Download/DroidDeck/Saves/backups</item>
<item quantity="other">Импортирани %1$d файла от %2$s в %3$s. Старите запазвания са архивирани в Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Затвори сесията първо, за да не използва играта добавките си по време на импортирането</string>
<string name="main_addons_importing">Импортиране на добавки в %1$s</string>
<string name="main_addons_pick_zip">Избор на ZIP файл с добавки за %1$s</string>
<string name="main_addons_too_large">%1$s е твърде голям за импортиране</string>
<string name="main_addons_deleting">Изтриване на %1$s</string>
<string name="main_addons_deleted">Изтрито: %1$s</string>
<string name="main_addons_none">Не са намерени добавки в %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Импортирана %1$d добавка в %2$s</item>
<item quantity="other">Импортирани %1$d добавки в %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Избор на ZIP файл със запазвания за %1$s</string>
<string name="main_saves_exporting">Експортиране на %1$s</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">За игри със записи в акаунта ви в Steam</string>
<string name="game_resource_search">Търсене в мрежата</string>
<string name="game_tab_addons">Добавки</string>
<string name="game_tab_install">Инсталиране</string>
<string name="game_install_location">Местоположение</string>
<string name="game_install_folder">Папка</string>
+24
View File
@@ -1195,6 +1195,16 @@
<string name="games_export_gamehub">Exportovat jako GameHub zip…</string>
<string name="games_export_winlator">Exportovat jako Winlator zip…</string>
<string name="games_open_save_folder">Otevřít složku s uloženými pozicemi</string>
<string name="games_import_addons">Importovat doplňky ze ZIP…</string>
<string name="games_open_addons_folder">Otevřít složku s doplňky</string>
<string name="games_delete_addon_title">Smazat %1$s?</string>
<string name="games_delete_addon_body">Tím se smaže složka doplňku. Jeho nastavení zůstane zachováno.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d doplněk</item>
<item quantity="few">%1$d doplňky</item>
<item quantity="many">%1$d doplňku</item>
<item quantity="other">%1$d doplňků</item>
</plurals>
<string name="games_never_played">Nikdy nehráno</string>
<string name="games_runtime_busy_percent">Runtime zaneprázdněn · %1$d%%</string>
<string name="games_runtime_busy">Runtime zaneprázdněn</string>
@@ -1377,6 +1387,19 @@
<item quantity="many">Importováno %1$d souborů z %2$s do %3$s. Staré uložené pozice byly zálohovány do Download/DroidDeck/Saves/backups</item>
<item quantity="other">Importováno %1$d souborů z %2$s do %3$s. Staré uložené pozice byly zálohovány do Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Nejprve zavřete relaci, aby hra během importu nepoužívala své doplňky.</string>
<string name="main_addons_importing">Importování doplňků do %1$s</string>
<string name="main_addons_pick_zip">Vyberte ZIP s doplňky pro %1$s</string>
<string name="main_addons_too_large">%1$s je pro import příliš velký</string>
<string name="main_addons_deleting">Mazání: %1$s</string>
<string name="main_addons_deleted">Smazáno: %1$s</string>
<string name="main_addons_none">V %1$s nebyly nalezeny žádné doplňky</string>
<plurals name="main_addons_imported">
<item quantity="one">Importován %1$d doplněk do %2$s</item>
<item quantity="few">Importovány %1$d doplňky do %2$s</item>
<item quantity="many">Importováno %1$d doplňku do %2$s</item>
<item quantity="other">Importováno %1$d doplňků do %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Vyberte ZIP s uloženou pozicí pro %1$s</string>
<string name="main_saves_exporting">Exportování %1$s</string>
<plurals name="main_saves_exported">
@@ -3544,6 +3567,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Pro hry s uloženými pozicemi ve vašem účtu Steam</string>
<string name="game_resource_search">Hledat na webu</string>
<string name="game_tab_addons">Doplňky</string>
<string name="game_tab_install">Instalovat</string>
<string name="game_install_location">Umístění</string>
<string name="game_install_folder">Složka</string>
+20
View File
@@ -1183,6 +1183,14 @@
<string name="games_export_gamehub">Eksporter som GameHub-zip…</string>
<string name="games_export_winlator">Eksporter som Winlator-zip…</string>
<string name="games_open_save_folder">Åbn savemappe</string>
<string name="games_import_addons">Importer addons fra zip…</string>
<string name="games_open_addons_folder">Åbn addon-mappe</string>
<string name="games_delete_addon_title">Slet %1$s?</string>
<string name="games_delete_addon_body">Dette fjerner addonens mappe. Dens indstillinger bevares.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d addon</item>
<item quantity="other">%1$d addons</item>
</plurals>
<string name="games_never_played">Aldrig spillet</string>
<string name="games_runtime_busy_percent">Runtime optaget · %1$d%%</string>
<string name="games_runtime_busy">Runtime optaget</string>
@@ -1361,6 +1369,17 @@
<item quantity="one">Importerede %1$d fil fra %2$s til %3$s. Gamle gemte spil sikkerhedskopieret til Download/DroidDeck/Saves/backups</item>
<item quantity="other">Importerede %1$d filer fra %2$s til %3$s. Gamle gemte spil sikkerhedskopieret til Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Luk sessionen først, så spillet ikke bruger sine addons under importen</string>
<string name="main_addons_importing">Importerer addons til %1$s</string>
<string name="main_addons_pick_zip">Vælg en zip med addons til %1$s</string>
<string name="main_addons_too_large">%1$s er for stor til at blive importeret</string>
<string name="main_addons_deleting">Sletter %1$s</string>
<string name="main_addons_deleted">%1$s slettet</string>
<string name="main_addons_none">Ingen addons fundet i %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Importerede %1$d addon til %2$s</item>
<item quantity="other">Importerede %1$d addons til %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Vælg en zip med gemte spil til %1$s</string>
<string name="main_saves_exporting">Eksporterer %1$s</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Til spil med gemte data på din Steam-konto</string>
<string name="game_resource_search">Websøgning</string>
<string name="game_tab_addons">Addons</string>
<string name="game_tab_install">Installer</string>
<string name="game_install_location">Placering</string>
<string name="game_install_folder">Mappe</string>
+20
View File
@@ -1175,6 +1175,14 @@
<string name="games_export_gamehub">Als GameHub-ZIP exportieren…</string>
<string name="games_export_winlator">Als Winlator-ZIP exportieren…</string>
<string name="games_open_save_folder">Spielstandordner öffnen</string>
<string name="games_import_addons">Addons aus ZIP importieren…</string>
<string name="games_open_addons_folder">Addon-Ordner öffnen</string>
<string name="games_delete_addon_title">%1$s löschen?</string>
<string name="games_delete_addon_body">Dadurch wird der Ordner des Addons entfernt. Die Einstellungen bleiben erhalten.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d Addon</item>
<item quantity="other">%1$d Addons</item>
</plurals>
<string name="games_never_played">Nie gespielt</string>
<string name="games_runtime_busy_percent">Laufzeit beschäftigt · %1$d %%</string>
<string name="games_runtime_busy">Laufzeit beschäftigt</string>
@@ -1353,6 +1361,17 @@
<item quantity="one">%1$d Datei aus %2$s in %3$s importiert. Alte Spielstände gesichert unter Download/DroidDeck/Saves/backups</item>
<item quantity="other">%1$d Dateien aus %2$s in %3$s importiert. Alte Spielstände gesichert unter Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Schließe zuerst die Sitzung, damit das Spiel seine Addons während des Imports nicht verwendet</string>
<string name="main_addons_importing">Addons werden in %1$s importiert</string>
<string name="main_addons_pick_zip">Addon-ZIP für %1$s auswählen</string>
<string name="main_addons_too_large">%1$s ist zu groß zum Importieren</string>
<string name="main_addons_deleting">%1$s wird gelöscht</string>
<string name="main_addons_deleted">%1$s gelöscht</string>
<string name="main_addons_none">Keine Addons in %1$s gefunden</string>
<plurals name="main_addons_imported">
<item quantity="one">%1$d Addon in %2$s importiert</item>
<item quantity="other">%1$d Addons in %2$s importiert</item>
</plurals>
<string name="main_saves_pick_zip">Spielstand-ZIP für %1$s auswählen</string>
<string name="main_saves_exporting">Export von %1$s</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Für Spiele mit Speicherständen in deinem Steam-Konto</string>
<string name="game_resource_search">Websuche</string>
<string name="game_tab_addons">Addons</string>
<string name="game_tab_install">Installieren</string>
<string name="game_install_location">Speicherort</string>
<string name="game_install_folder">Ordner</string>
+20
View File
@@ -1183,6 +1183,14 @@
<string name="games_export_gamehub">Εξαγωγή ως zip GameHub…</string>
<string name="games_export_winlator">Εξαγωγή ως zip Winlator…</string>
<string name="games_open_save_folder">Άνοιγμα φακέλου αποθήκευσης</string>
<string name="games_import_addons">Εισαγωγή προσθέτων από zip…</string>
<string name="games_open_addons_folder">Άνοιγμα φακέλου προσθέτων</string>
<string name="games_delete_addon_title">Διαγραφή του %1$s;</string>
<string name="games_delete_addon_body">Ο φάκελος του πρόσθετου θα διαγραφεί. Οι ρυθμίσεις του παραμένουν.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d πρόσθετο</item>
<item quantity="other">%1$d πρόσθετα</item>
</plurals>
<string name="games_never_played">Δεν έχει παιχτεί ποτέ</string>
<string name="games_runtime_busy_percent">Το runtime είναι απασχολημένο · %1$d%%</string>
<string name="games_runtime_busy">Το runtime είναι απασχολημένο</string>
@@ -1361,6 +1369,17 @@
<item quantity="one">Έγινε εισαγωγή %1$d αρχείου από το %2$s στο %3$s. Τα παλιά αρχεία αποθήκευσης κρατήθηκαν ως αντίγραφο ασφαλείας στο Download/DroidDeck/Saves/backups</item>
<item quantity="other">Έγινε εισαγωγή %1$d αρχείων από το %2$s στο %3$s. Τα παλιά αρχεία αποθήκευσης κρατήθηκαν ως αντίγραφο ασφαλείας στο Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Κλείστε πρώτα τη συνεδρία, ώστε το παιχνίδι να μη χρησιμοποιεί τα πρόσθετά του κατά την εισαγωγή</string>
<string name="main_addons_importing">Εισαγωγή προσθέτων στο %1$s</string>
<string name="main_addons_pick_zip">Επιλέξτε ένα zip προσθέτων για το %1$s</string>
<string name="main_addons_too_large">Το %1$s είναι πολύ μεγάλο για εισαγωγή</string>
<string name="main_addons_deleting">Γίνεται διαγραφή του %1$s</string>
<string name="main_addons_deleted">Το %1$s διαγράφηκε</string>
<string name="main_addons_none">Δεν βρέθηκαν πρόσθετα στο %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Έγινε εισαγωγή %1$d προσθέτου στο %2$s</item>
<item quantity="other">Έγινε εισαγωγή %1$d προσθέτων στο %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Επιλέξτε ένα zip αποθηκευμένων αρχείων για το %1$s</string>
<string name="main_saves_exporting">Εξαγωγή %1$s</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Για παιχνίδια με αποθηκεύσεις στον λογαριασμό σας Steam</string>
<string name="game_resource_search">Αναζήτηση στον ιστό</string>
<string name="game_tab_addons">Πρόσθετα</string>
<string name="game_tab_install">Εγκατάσταση</string>
<string name="game_install_location">Τοποθεσία</string>
<string name="game_install_folder">Φάκελος</string>
+22
View File
@@ -1189,6 +1189,15 @@
<string name="games_export_gamehub">Exportar como zip de GameHub…</string>
<string name="games_export_winlator">Exportar como zip de Winlator…</string>
<string name="games_open_save_folder">Abrir carpeta de guardado</string>
<string name="games_import_addons">Importar addons desde zip…</string>
<string name="games_open_addons_folder">Abrir carpeta de addons</string>
<string name="games_delete_addon_title">¿Eliminar %1$s?</string>
<string name="games_delete_addon_body">Esto elimina la carpeta del addon. Sus ajustes se conservan.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d addon</item>
<item quantity="many">%1$d de addons</item>
<item quantity="other">%1$d addons</item>
</plurals>
<string name="games_never_played">Nunca jugado</string>
<string name="games_runtime_busy_percent">Runtime ocupado · %1$d%%</string>
<string name="games_runtime_busy">Runtime ocupado</string>
@@ -1369,6 +1378,18 @@
<item quantity="many">Se importaron %1$d archivos del %2$s en %3$s. Copia de las partidas anteriores en Download/DroidDeck/Saves/backups</item>
<item quantity="other">Se importaron %1$d archivos del %2$s en %3$s. Copia de las partidas anteriores en Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Cierra primero la sesión para que el juego no use sus addons durante la importación</string>
<string name="main_addons_importing">Importando addons en %1$s</string>
<string name="main_addons_pick_zip">Elige un zip de addons para %1$s</string>
<string name="main_addons_too_large">%1$s es demasiado grande para importarlo</string>
<string name="main_addons_deleting">Eliminando %1$s</string>
<string name="main_addons_deleted">Se eliminó %1$s</string>
<string name="main_addons_none">No se encontraron addons en %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Se importó %1$d addon en %2$s</item>
<item quantity="many">Se importaron %1$d de addons en %2$s</item>
<item quantity="other">Se importaron %1$d addons en %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Elige un zip de partidas guardadas para %1$s</string>
<string name="main_saves_exporting">Exportando %1$s</string>
<plurals name="main_saves_exported">
@@ -3508,6 +3529,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Para juegos con partidas guardadas en tu cuenta de Steam</string>
<string name="game_resource_search">Búsqueda web</string>
<string name="game_tab_addons">Addons</string>
<string name="game_tab_install">Instalar</string>
<string name="game_install_location">Ubicación</string>
<string name="game_install_folder">Carpeta</string>
+20
View File
@@ -1183,6 +1183,14 @@
<string name="games_export_gamehub">Vie GameHub-zipinä…</string>
<string name="games_export_winlator">Vie Winlator-zipinä…</string>
<string name="games_open_save_folder">Avaa tallennuskansio</string>
<string name="games_import_addons">Tuo lisäosat zip-tiedostosta…</string>
<string name="games_open_addons_folder">Avaa lisäosakansio</string>
<string name="games_delete_addon_title">Poistetaanko %1$s?</string>
<string name="games_delete_addon_body">Tämä poistaa lisäosan kansion. Sen asetukset säilyvät.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d lisäosa</item>
<item quantity="other">%1$d lisäosaa</item>
</plurals>
<string name="games_never_played">Ei pelattu koskaan</string>
<string name="games_runtime_busy_percent">Ajoympäristö varattu · %1$d %%</string>
<string name="games_runtime_busy">Ajoympäristö varattu</string>
@@ -1361,6 +1369,17 @@
<item quantity="one">Tuotiin %1$d tiedosto %2$s-muodosta kohteeseen %3$s. Vanhat tallennukset varmuuskopioitu kansioon Download/DroidDeck/Saves/backups</item>
<item quantity="other">Tuotiin %1$d tiedostoa %2$s-muodosta kohteeseen %3$s. Vanhat tallennukset varmuuskopioitu kansioon Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Sulje istunto ensin, jotta peli ei käytä lisäosiaan tuonnin aikana</string>
<string name="main_addons_importing">Tuodaan lisäosia kohteeseen %1$s</string>
<string name="main_addons_pick_zip">Valitse lisäosien zip-tiedosto kohteelle %1$s</string>
<string name="main_addons_too_large">%1$s on liian suuri tuotavaksi</string>
<string name="main_addons_deleting">Poistetaan %1$s</string>
<string name="main_addons_deleted">%1$s poistettu</string>
<string name="main_addons_none">Lisäosia ei löytynyt kohteesta %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Tuotiin %1$d lisäosa kohteeseen %2$s</item>
<item quantity="other">Tuotiin %1$d lisäosaa kohteeseen %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Valitse tallennusten zip-tiedosto kohteelle %1$s</string>
<string name="main_saves_exporting">Viedään %1$s</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Peleille, joiden tallennukset ovat Steam-tililläsi</string>
<string name="game_resource_search">Verkkohaku</string>
<string name="game_tab_addons">Lisäosat</string>
<string name="game_tab_install">Asenna</string>
<string name="game_install_location">Sijainti</string>
<string name="game_install_folder">Kansio</string>
+22
View File
@@ -1189,6 +1189,15 @@
<string name="games_export_gamehub">Exporter en tant qu\'archive GameHub…</string>
<string name="games_export_winlator">Exporter en tant qu\'archive Winlator…</string>
<string name="games_open_save_folder">Ouvrir le dossier de sauvegarde</string>
<string name="games_import_addons">Importer des addons depuis un zip…</string>
<string name="games_open_addons_folder">Ouvrir le dossier des addons</string>
<string name="games_delete_addon_title">Supprimer %1$s ?</string>
<string name="games_delete_addon_body">Cela supprime le dossier de l\'addon. Ses paramètres sont conservés.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d addon</item>
<item quantity="many">%1$d d\'addons</item>
<item quantity="other">%1$d addons</item>
</plurals>
<string name="games_never_played">Jamais lancé</string>
<string name="games_runtime_busy_percent">Environnement d\'exécution occupé · %1$d%%</string>
<string name="games_runtime_busy">Environnement d\'exécution occupé</string>
@@ -1369,6 +1378,18 @@
<item quantity="many">%1$d fichiers importés (%2$s) dans %3$s. Anciennes sauvegardes copiées dans Download/DroidDeck/Saves/backups</item>
<item quantity="other">%1$d fichiers importés (%2$s) dans %3$s. Anciennes sauvegardes copiées dans Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Fermez d\'abord la session, pour que le jeu n\'utilise pas ses addons pendant l\'importation</string>
<string name="main_addons_importing">Importation des addons dans %1$s</string>
<string name="main_addons_pick_zip">Choisir un zip d\'addons pour %1$s</string>
<string name="main_addons_too_large">%1$s est trop volumineux pour être importé</string>
<string name="main_addons_deleting">Suppression de %1$s</string>
<string name="main_addons_deleted">%1$s supprimé</string>
<string name="main_addons_none">Aucun addon trouvé dans %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">%1$d addon importé dans %2$s</item>
<item quantity="many">%1$d d\'addons importés dans %2$s</item>
<item quantity="other">%1$d addons importés dans %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Choisir un zip de sauvegarde pour %1$s</string>
<string name="main_saves_exporting">Exportation de %1$s</string>
<plurals name="main_saves_exported">
@@ -3508,6 +3529,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Pour les jeux dont les sauvegardes sont sur votre compte Steam</string>
<string name="game_resource_search">Recherche web</string>
<string name="game_tab_addons">Addons</string>
<string name="game_tab_install">Installer</string>
<string name="game_install_location">Emplacement</string>
<string name="game_install_folder">Dossier</string>
+20
View File
@@ -1183,6 +1183,14 @@
<string name="games_export_gamehub">GameHub zip के रूप में एक्सपोर्ट करें…</string>
<string name="games_export_winlator">Winlator zip के रूप में एक्सपोर्ट करें…</string>
<string name="games_open_save_folder">सेव फ़ोल्डर खोलें</string>
<string name="games_import_addons">zip से ऐडऑन इंपोर्ट करें…</string>
<string name="games_open_addons_folder">ऐडऑन फ़ोल्डर खोलें</string>
<string name="games_delete_addon_title">%1$s हटाएं?</string>
<string name="games_delete_addon_body">यह ऐडऑन का फ़ोल्डर हटा देता है। इसकी सेटिंग्स बनी रहती हैं।</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d ऐडऑन</item>
<item quantity="other">%1$d ऐडऑन</item>
</plurals>
<string name="games_never_played">कभी नहीं खेला</string>
<string name="games_runtime_busy_percent">रनटाइम व्यस्त · %1$d%%</string>
<string name="games_runtime_busy">रनटाइम व्यस्त</string>
@@ -1361,6 +1369,17 @@
<item quantity="one">%2$s से %1$d फ़ाइल %3$s में इंपोर्ट हुई। पुराने सेव Download/DroidDeck/Saves/backups में बैकअप हो गए</item>
<item quantity="other">%2$s से %1$d फ़ाइलें %3$s में इंपोर्ट हुईं। पुराने सेव Download/DroidDeck/Saves/backups में बैकअप हो गए</item>
</plurals>
<string name="main_addons_close_session">पहले सेशन बंद करें, ताकि इंपोर्ट के दौरान गेम अपने ऐडऑन का उपयोग न करे</string>
<string name="main_addons_importing">%1$s में ऐडऑन इंपोर्ट हो रहे हैं</string>
<string name="main_addons_pick_zip">%1$s के लिए ऐडऑन zip चुनें</string>
<string name="main_addons_too_large">%1$s इंपोर्ट करने के लिए बहुत बड़ा है</string>
<string name="main_addons_deleting">%1$s हटाया जा रहा है</string>
<string name="main_addons_deleted">%1$s हटाया गया</string>
<string name="main_addons_none">%1$s में कोई ऐडऑन नहीं मिला</string>
<plurals name="main_addons_imported">
<item quantity="one">%1$d ऐडऑन %2$s में इंपोर्ट हुआ</item>
<item quantity="other">%1$d ऐडऑन %2$s में इंपोर्ट हुए</item>
</plurals>
<string name="main_saves_pick_zip">%1$s के लिए एक सेव zip चुनें</string>
<string name="main_saves_exporting">%1$s एक्सपोर्ट हो रहा है</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">उन गेम के लिए जिनके सेव आपके Steam अकाउंट पर हैं</string>
<string name="game_resource_search">वेब सर्च</string>
<string name="game_tab_addons">ऐडऑन</string>
<string name="game_tab_install">इंस्टॉल करें</string>
<string name="game_install_location">जगह</string>
<string name="game_install_folder">फ़ोल्डर</string>
+20
View File
@@ -1183,6 +1183,14 @@
<string name="games_export_gamehub">Exportálás GameHub zipként…</string>
<string name="games_export_winlator">Exportálás Winlator zipként…</string>
<string name="games_open_save_folder">Mentésmappa megnyitása</string>
<string name="games_import_addons">Kiegészítők importálása zipből…</string>
<string name="games_open_addons_folder">Kiegészítők mappájának megnyitása</string>
<string name="games_delete_addon_title">Törlöd ezt: %1$s?</string>
<string name="games_delete_addon_body">Ez törli a kiegészítő mappáját. A beállításai megmaradnak.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d kiegészítő</item>
<item quantity="other">%1$d kiegészítő</item>
</plurals>
<string name="games_never_played">Még nem játszott</string>
<string name="games_runtime_busy_percent">Futtatókörnyezet dolgozik · %1$d%%</string>
<string name="games_runtime_busy">Futtatókörnyezet dolgozik</string>
@@ -1361,6 +1369,17 @@
<item quantity="one">%1$d fájl importálva innen: %2$s, ide: %3$s. A régi mentések mentve itt: Download/DroidDeck/Saves/backups</item>
<item quantity="other">%1$d fájl importálva innen: %2$s, ide: %3$s. A régi mentések mentve itt: Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Előbb zárja be a munkamenetet, hogy a játék ne használja a kiegészítőit az importálás alatt</string>
<string name="main_addons_importing">Kiegészítők importálása ide: %1$s</string>
<string name="main_addons_pick_zip">Válasszon kiegészítő zip fájlt ehhez: %1$s</string>
<string name="main_addons_too_large">A(z) %1$s túl nagy az importáláshoz</string>
<string name="main_addons_deleting">%1$s törlése folyamatban</string>
<string name="main_addons_deleted">%1$s törölve</string>
<string name="main_addons_none">Nem található kiegészítő itt: %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">%1$d kiegészítő importálva ide: %2$s</item>
<item quantity="other">%1$d kiegészítő importálva ide: %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Válasszon mentés zip fájlt ehhez: %1$s</string>
<string name="main_saves_exporting">%1$s exportálása</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">A Steam-fiókjában mentéseket tároló játékokhoz</string>
<string name="game_resource_search">Webes keresés</string>
<string name="game_tab_addons">Kiegészítők</string>
<string name="game_tab_install">Telepítés</string>
<string name="game_install_location">Hely</string>
<string name="game_install_folder">Mappa</string>
+18
View File
@@ -1177,6 +1177,13 @@
<string name="games_export_gamehub">Ekspor sebagai zip GameHub…</string>
<string name="games_export_winlator">Ekspor sebagai zip Winlator…</string>
<string name="games_open_save_folder">Buka folder simpanan</string>
<string name="games_import_addons">Impor addon dari zip…</string>
<string name="games_open_addons_folder">Buka folder addon</string>
<string name="games_delete_addon_title">Hapus %1$s?</string>
<string name="games_delete_addon_body">Ini menghapus folder addon. Pengaturannya tetap ada.</string>
<plurals name="games_addons_count">
<item quantity="other">%1$d addon</item>
</plurals>
<string name="games_never_played">Belum pernah dimainkan</string>
<string name="games_runtime_busy_percent">Runtime sibuk · %1$d%%</string>
<string name="games_runtime_busy">Runtime sibuk</string>
@@ -1353,6 +1360,16 @@
<plurals name="main_saves_imported_backup">
<item quantity="other">%1$d file diimpor dari %2$s ke %3$s. Save lama dicadangkan ke Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Tutup sesi dulu, agar game tidak memakai addon-nya saat impor</string>
<string name="main_addons_importing">Mengimpor addon ke %1$s</string>
<string name="main_addons_pick_zip">Pilih zip addon untuk %1$s</string>
<string name="main_addons_too_large">%1$s terlalu besar untuk diimpor</string>
<string name="main_addons_deleting">Menghapus %1$s</string>
<string name="main_addons_deleted">%1$s dihapus</string>
<string name="main_addons_none">Tidak ada addon di %1$s</string>
<plurals name="main_addons_imported">
<item quantity="other">%1$d addon diimpor ke %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Pilih zip save untuk %1$s</string>
<string name="main_saves_exporting">Mengekspor %1$s</string>
<plurals name="main_saves_exported">
@@ -3445,6 +3462,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Untuk gim dengan save di akun Steam Anda</string>
<string name="game_resource_search">Penelusuran web</string>
<string name="game_tab_addons">Addon</string>
<string name="game_tab_install">Pasang</string>
<string name="game_install_location">Lokasi</string>
<string name="game_install_folder">Folder</string>
+22
View File
@@ -1181,6 +1181,15 @@
<string name="games_export_gamehub">Esporta come zip GameHub…</string>
<string name="games_export_winlator">Esporta come zip Winlator…</string>
<string name="games_open_save_folder">Apri cartella di salvataggio</string>
<string name="games_import_addons">Importa addon da zip…</string>
<string name="games_open_addons_folder">Apri cartella degli addon</string>
<string name="games_delete_addon_title">Eliminare %1$s?</string>
<string name="games_delete_addon_body">Questo rimuove la cartella dell\'addon. Le sue impostazioni restano.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d addon</item>
<item quantity="many">%1$d di addon</item>
<item quantity="other">%1$d addon</item>
</plurals>
<string name="games_never_played">Mai giocato</string>
<string name="games_runtime_busy_percent">Runtime occupato · %1$d%%</string>
<string name="games_runtime_busy">Runtime occupato</string>
@@ -1361,6 +1370,18 @@
<item quantity="many">%1$d file importati (%2$s) in %3$s. Backup dei vecchi salvataggi in Download/DroidDeck/Saves/backups</item>
<item quantity="other">%1$d file importati (%2$s) in %3$s. Backup dei vecchi salvataggi in Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Chiudi prima la sessione, così il gioco non usa i suoi addon durante l\'importazione</string>
<string name="main_addons_importing">Importazione degli addon in %1$s</string>
<string name="main_addons_pick_zip">Scegli uno zip di addon per %1$s</string>
<string name="main_addons_too_large">%1$s è troppo grande per essere importato</string>
<string name="main_addons_deleting">Eliminazione di %1$s</string>
<string name="main_addons_deleted">%1$s eliminato</string>
<string name="main_addons_none">Nessun addon trovato in %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">%1$d addon importato in %2$s</item>
<item quantity="many">%1$d di addon importati in %2$s</item>
<item quantity="other">%1$d addon importati in %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Scegli uno zip di salvataggi per %1$s</string>
<string name="main_saves_exporting">Esportazione di %1$s</string>
<plurals name="main_saves_exported">
@@ -3508,6 +3529,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Per i giochi con salvataggi nel tuo account Steam</string>
<string name="game_resource_search">Ricerca web</string>
<string name="game_tab_addons">Addon</string>
<string name="game_tab_install">Installa</string>
<string name="game_install_location">Posizione</string>
<string name="game_install_folder">Cartella</string>
+18
View File
@@ -1177,6 +1177,13 @@
<string name="games_export_gamehub">GameHubアーカイブとしてエクスポート…</string>
<string name="games_export_winlator">Winlatorアーカイブとしてエクスポート…</string>
<string name="games_open_save_folder">セーブフォルダを開く</string>
<string name="games_import_addons">zipからアドオンをインポート…</string>
<string name="games_open_addons_folder">アドオンフォルダを開く</string>
<string name="games_delete_addon_title">%1$sを削除しますか?</string>
<string name="games_delete_addon_body">アドオンのフォルダが削除されます。設定は残ります。</string>
<plurals name="games_addons_count">
<item quantity="other">%1$d個のアドオン</item>
</plurals>
<string name="games_never_played">未プレイ</string>
<string name="games_runtime_busy_percent">実行環境は使用中 · %1$d%%</string>
<string name="games_runtime_busy">実行環境は使用中</string>
@@ -1353,6 +1360,16 @@
<plurals name="main_saves_imported_backup">
<item quantity="other">%2$sから%1$d個のファイルを%3$sにインポートしました。以前のセーブデータはDownload/DroidDeck/Saves/backupsにバックアップされました</item>
</plurals>
<string name="main_addons_close_session">インポート中にゲームがアドオンを使用しないよう、先にセッションを終了してください</string>
<string name="main_addons_importing">%1$sにアドオンをインポート中</string>
<string name="main_addons_pick_zip">%1$sのアドオンzipを選択</string>
<string name="main_addons_too_large">%1$s は大きすぎるためインポートできません</string>
<string name="main_addons_deleting">%1$sを削除中</string>
<string name="main_addons_deleted">%1$sを削除しました</string>
<string name="main_addons_none">%1$sにアドオンが見つかりません</string>
<plurals name="main_addons_imported">
<item quantity="other">%1$d個のアドオンを%2$sにインポートしました</item>
</plurals>
<string name="main_saves_pick_zip">%1$sのセーブデータzipを選択</string>
<string name="main_saves_exporting">%1$sをエクスポート中</string>
<plurals name="main_saves_exported">
@@ -3445,6 +3462,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Steamアカウントにセーブデータがあるゲーム向け</string>
<string name="game_resource_search">ウェブ検索</string>
<string name="game_tab_addons">アドオン</string>
<string name="game_tab_install">インストール</string>
<string name="game_install_location">場所</string>
<string name="game_install_folder">フォルダ</string>
+18
View File
@@ -1177,6 +1177,13 @@
<string name="games_export_gamehub">GameHub 아카이브로 내보내기…</string>
<string name="games_export_winlator">Winlator 아카이브로 내보내기…</string>
<string name="games_open_save_folder">저장 폴더 열기</string>
<string name="games_import_addons">zip에서 애드온 가져오기…</string>
<string name="games_open_addons_folder">애드온 폴더 열기</string>
<string name="games_delete_addon_title">%1$s을(를) 삭제할까요?</string>
<string name="games_delete_addon_body">애드온 폴더가 삭제됩니다. 설정은 유지됩니다.</string>
<plurals name="games_addons_count">
<item quantity="other">애드온 %1$d개</item>
</plurals>
<string name="games_never_played">플레이한 적 없음</string>
<string name="games_runtime_busy_percent">런타임 사용 중 · %1$d%%</string>
<string name="games_runtime_busy">런타임 사용 중</string>
@@ -1353,6 +1360,16 @@
<plurals name="main_saves_imported_backup">
<item quantity="other">%2$s에서 %3$s(으)로 파일 %1$d개를 가져왔습니다. 이전 저장 데이터는 Download/DroidDeck/Saves/backups에 백업되었습니다</item>
</plurals>
<string name="main_addons_close_session">가져오는 동안 게임이 애드온을 사용하지 않도록 먼저 세션을 종료하세요</string>
<string name="main_addons_importing">%1$s(으)로 애드온 가져오는 중</string>
<string name="main_addons_pick_zip">%1$s의 애드온 zip 선택</string>
<string name="main_addons_too_large">%1$s은(는) 너무 커서 가져올 수 없습니다</string>
<string name="main_addons_deleting">%1$s 삭제 중</string>
<string name="main_addons_deleted">%1$s 삭제됨</string>
<string name="main_addons_none">%1$s에서 애드온을 찾을 수 없습니다</string>
<plurals name="main_addons_imported">
<item quantity="other">애드온 %1$d개를 %2$s(으)로 가져왔습니다</item>
</plurals>
<string name="main_saves_pick_zip">%1$s의 저장 데이터 zip 선택</string>
<string name="main_saves_exporting">%1$s 내보내는 중</string>
<plurals name="main_saves_exported">
@@ -3445,6 +3462,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Steam 계정에 저장 파일이 있는 게임용</string>
<string name="game_resource_search">웹 검색</string>
<string name="game_tab_addons">애드온</string>
<string name="game_tab_install">설치</string>
<string name="game_install_location">위치</string>
<string name="game_install_folder">폴더</string>
+18
View File
@@ -1177,6 +1177,13 @@
<string name="games_export_gamehub">Eksport sebagai zip GameHub…</string>
<string name="games_export_winlator">Eksport sebagai zip Winlator…</string>
<string name="games_open_save_folder">Buka folder simpanan</string>
<string name="games_import_addons">Import addon daripada zip…</string>
<string name="games_open_addons_folder">Buka folder addon</string>
<string name="games_delete_addon_title">Padam %1$s?</string>
<string name="games_delete_addon_body">Ini memadam folder addon. Tetapannya kekal.</string>
<plurals name="games_addons_count">
<item quantity="other">%1$d addon</item>
</plurals>
<string name="games_never_played">Belum pernah dimainkan</string>
<string name="games_runtime_busy_percent">Masa jalan sibuk · %1$d%%</string>
<string name="games_runtime_busy">Masa jalan sibuk</string>
@@ -1353,6 +1360,16 @@
<plurals name="main_saves_imported_backup">
<item quantity="other">Mengimport %1$d fail daripada %2$s ke %3$s. Simpanan lama disandarkan ke Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Tutup sesi dahulu, supaya permainan tidak menggunakan addonnya semasa import</string>
<string name="main_addons_importing">Mengimport addon ke %1$s</string>
<string name="main_addons_pick_zip">Pilih zip addon untuk %1$s</string>
<string name="main_addons_too_large">%1$s terlalu besar untuk diimport</string>
<string name="main_addons_deleting">Memadam %1$s</string>
<string name="main_addons_deleted">%1$s dipadam</string>
<string name="main_addons_none">Tiada addon ditemui dalam %1$s</string>
<plurals name="main_addons_imported">
<item quantity="other">Berjaya mengimport %1$d addon ke %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Pilih zip simpanan untuk %1$s</string>
<string name="main_saves_exporting">Mengeksport %1$s</string>
<plurals name="main_saves_exported">
@@ -3445,6 +3462,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Untuk permainan dengan simpanan pada akaun Steam anda</string>
<string name="game_resource_search">Carian web</string>
<string name="game_tab_addons">Addon</string>
<string name="game_tab_install">Pasang</string>
<string name="game_install_location">Lokasi</string>
<string name="game_install_folder">Folder</string>
+20
View File
@@ -1183,6 +1183,14 @@
<string name="games_export_gamehub">Eksporter som GameHub-zip…</string>
<string name="games_export_winlator">Eksporter som Winlator-zip…</string>
<string name="games_open_save_folder">Åpne lagringsmappe</string>
<string name="games_import_addons">Importer tillegg fra zip…</string>
<string name="games_open_addons_folder">Åpne tilleggsmappe</string>
<string name="games_delete_addon_title">Slett %1$s?</string>
<string name="games_delete_addon_body">Dette fjerner tilleggets mappe. Innstillingene beholdes.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d tillegg</item>
<item quantity="other">%1$d tillegg</item>
</plurals>
<string name="games_never_played">Aldri spilt</string>
<string name="games_runtime_busy_percent">Kjøretid opptatt · %1$d%%</string>
<string name="games_runtime_busy">Kjøretid opptatt</string>
@@ -1361,6 +1369,17 @@
<item quantity="one">Importerte %1$d fil fra %2$s til %3$s. Gamle lagringer sikkerhetskopiert til Download/DroidDeck/Saves/backups</item>
<item quantity="other">Importerte %1$d filer fra %2$s til %3$s. Gamle lagringer sikkerhetskopiert til Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Lukk sesjonen først, så spillet ikke bruker tilleggene under importen</string>
<string name="main_addons_importing">Importerer tillegg til %1$s</string>
<string name="main_addons_pick_zip">Velg en zip med tillegg for %1$s</string>
<string name="main_addons_too_large">%1$s er for stor til å importeres</string>
<string name="main_addons_deleting">Sletter %1$s</string>
<string name="main_addons_deleted">Slettet %1$s</string>
<string name="main_addons_none">Fant ingen tillegg i %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Importerte %1$d tillegg til %2$s</item>
<item quantity="other">Importerte %1$d tillegg til %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Velg en lagrings-zip for %1$s</string>
<string name="main_saves_exporting">Eksporterer %1$s</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">For spill med lagringer på Steam-kontoen din</string>
<string name="game_resource_search">Nettsøk</string>
<string name="game_tab_addons">Tillegg</string>
<string name="game_tab_install">Installer</string>
<string name="game_install_location">Plassering</string>
<string name="game_install_folder">Mappe</string>
+20
View File
@@ -1183,6 +1183,14 @@
<string name="games_export_gamehub">Exporteren als GameHub-zip…</string>
<string name="games_export_winlator">Exporteren als Winlator-zip…</string>
<string name="games_open_save_folder">Opslagmap openen</string>
<string name="games_import_addons">Addons importeren uit zip…</string>
<string name="games_open_addons_folder">Addonmap openen</string>
<string name="games_delete_addon_title">%1$s verwijderen?</string>
<string name="games_delete_addon_body">Hiermee wordt de map van de addon verwijderd. De instellingen blijven behouden.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d addon</item>
<item quantity="other">%1$d addons</item>
</plurals>
<string name="games_never_played">Nooit gespeeld</string>
<string name="games_runtime_busy_percent">Runtime bezig · %1$d%%</string>
<string name="games_runtime_busy">Runtime bezig</string>
@@ -1361,6 +1369,17 @@
<item quantity="one">%1$d bestand uit de %2$s geïmporteerd in %3$s. Oude savegames als back-up bewaard in Download/DroidDeck/Saves/backups</item>
<item quantity="other">%1$d bestanden uit de %2$s geïmporteerd in %3$s. Oude savegames als back-up bewaard in Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Sluit eerst de sessie, zodat de game tijdens de import geen addons gebruikt</string>
<string name="main_addons_importing">Addons importeren in %1$s</string>
<string name="main_addons_pick_zip">Kies een addon-zip voor %1$s</string>
<string name="main_addons_too_large">%1$s is te groot om te importeren</string>
<string name="main_addons_deleting">%1$s wordt verwijderd</string>
<string name="main_addons_deleted">%1$s verwijderd</string>
<string name="main_addons_none">Geen addons gevonden in %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">%1$d addon geïmporteerd in %2$s</item>
<item quantity="other">%1$d addons geïmporteerd in %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Kies een savegame-zip voor %1$s</string>
<string name="main_saves_exporting">%1$s exporteren</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Voor games met opslagbestanden in je Steam-account</string>
<string name="game_resource_search">Zoeken op het web</string>
<string name="game_tab_addons">Addons</string>
<string name="game_tab_install">Installeren</string>
<string name="game_install_location">Locatie</string>
<string name="game_install_folder">Map</string>
+24
View File
@@ -1195,6 +1195,16 @@
<string name="games_export_gamehub">Eksportuj jako zip GameHub…</string>
<string name="games_export_winlator">Eksportuj jako zip Winlator…</string>
<string name="games_open_save_folder">Otwórz folder zapisów</string>
<string name="games_import_addons">Importuj dodatki z zip…</string>
<string name="games_open_addons_folder">Otwórz folder dodatków</string>
<string name="games_delete_addon_title">Usunąć %1$s?</string>
<string name="games_delete_addon_body">Spowoduje to usunięcie folderu dodatku. Jego ustawienia zostaną zachowane.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d dodatek</item>
<item quantity="few">%1$d dodatki</item>
<item quantity="many">%1$d dodatków</item>
<item quantity="other">%1$d dodatku</item>
</plurals>
<string name="games_never_played">Nigdy nie grano</string>
<string name="games_runtime_busy_percent">Środowisko zajęte · %1$d%%</string>
<string name="games_runtime_busy">Środowisko zajęte</string>
@@ -1377,6 +1387,19 @@
<item quantity="many">Zaimportowano %1$d plików z %2$s do %3$s. Kopię starych zapisów umieszczono w Download/DroidDeck/Saves/backups</item>
<item quantity="other">Zaimportowano %1$d pliku z %2$s do %3$s. Kopię starych zapisów umieszczono w Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Najpierw zamknij sesję, aby gra nie używała dodatków podczas importu</string>
<string name="main_addons_importing">Importowanie dodatków do %1$s</string>
<string name="main_addons_pick_zip">Wybierz plik zip z dodatkami dla %1$s</string>
<string name="main_addons_too_large">Plik %1$s jest za duży, aby go zaimportować</string>
<string name="main_addons_deleting">Usuwanie: %1$s</string>
<string name="main_addons_deleted">Usunięto: %1$s</string>
<string name="main_addons_none">Nie znaleziono dodatków w %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Zaimportowano %1$d dodatek do %2$s</item>
<item quantity="few">Zaimportowano %1$d dodatki do %2$s</item>
<item quantity="many">Zaimportowano %1$d dodatków do %2$s</item>
<item quantity="other">Zaimportowano %1$d dodatku do %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Wybierz plik zip z zapisami dla %1$s</string>
<string name="main_saves_exporting">Eksportowanie %1$s</string>
<plurals name="main_saves_exported">
@@ -3544,6 +3567,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Dla gier z zapisami na Twoim koncie Steam</string>
<string name="game_resource_search">Wyszukiwanie w sieci</string>
<string name="game_tab_addons">Dodatki</string>
<string name="game_tab_install">Zainstaluj</string>
<string name="game_install_location">Lokalizacja</string>
<string name="game_install_folder">Folder</string>
@@ -1181,6 +1181,15 @@
<string name="games_export_gamehub">Exportar como zip do GameHub…</string>
<string name="games_export_winlator">Exportar como zip do Winlator…</string>
<string name="games_open_save_folder">Abrir pasta de gravações</string>
<string name="games_import_addons">Importar addons de zip…</string>
<string name="games_open_addons_folder">Abrir pasta de addons</string>
<string name="games_delete_addon_title">Eliminar %1$s?</string>
<string name="games_delete_addon_body">Isto elimina a pasta do addon. As definições dele mantêm-se.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d addon</item>
<item quantity="many">%1$d de addons</item>
<item quantity="other">%1$d addons</item>
</plurals>
<string name="games_never_played">Nunca jogado</string>
<string name="games_runtime_busy_percent">Ambiente de execução ocupado · %1$d%%</string>
<string name="games_runtime_busy">Ambiente de execução ocupado</string>
@@ -1361,6 +1370,18 @@
<item quantity="many">%1$d ficheiros importados do %2$s para %3$s. Cópia de segurança dos dados guardados antigos em Download/DroidDeck/Saves/backups</item>
<item quantity="other">%1$d ficheiros importados do %2$s para %3$s. Cópia de segurança dos dados guardados antigos em Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Feche primeiro a sessão, para que o jogo não use os addons durante a importação</string>
<string name="main_addons_importing">A importar addons para %1$s</string>
<string name="main_addons_pick_zip">Escolha um zip de addons para %1$s</string>
<string name="main_addons_too_large">%1$s é demasiado grande para importar</string>
<string name="main_addons_deleting">A eliminar %1$s</string>
<string name="main_addons_deleted">%1$s eliminado</string>
<string name="main_addons_none">Nenhum addon encontrado em %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">%1$d addon importado para %2$s</item>
<item quantity="many">%1$d de addons importados para %2$s</item>
<item quantity="other">%1$d addons importados para %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Escolha um zip de dados guardados para %1$s</string>
<string name="main_saves_exporting">A exportar %1$s</string>
<plurals name="main_saves_exported">
@@ -3508,6 +3529,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Para jogos com guardados na sua conta Steam</string>
<string name="game_resource_search">Pesquisa na Web</string>
<string name="game_tab_addons">Addons</string>
<string name="game_tab_install">Instalar</string>
<string name="game_install_location">Localização</string>
<string name="game_install_folder">Pasta</string>
+22
View File
@@ -1181,6 +1181,15 @@
<string name="games_export_gamehub">Exportar como zip do GameHub…</string>
<string name="games_export_winlator">Exportar como zip do Winlator…</string>
<string name="games_open_save_folder">Abrir pasta de jogos salvos</string>
<string name="games_import_addons">Importar addons de zip…</string>
<string name="games_open_addons_folder">Abrir pasta de addons</string>
<string name="games_delete_addon_title">Excluir %1$s?</string>
<string name="games_delete_addon_body">Isso remove a pasta do addon. As configurações dele permanecem.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d addon</item>
<item quantity="many">%1$d de addons</item>
<item quantity="other">%1$d addons</item>
</plurals>
<string name="games_never_played">Nunca jogado</string>
<string name="games_runtime_busy_percent">Runtime ocupado · %1$d%%</string>
<string name="games_runtime_busy">Runtime ocupado</string>
@@ -1361,6 +1370,18 @@
<item quantity="many">%1$d arquivos importados de %2$s para %3$s. Backup dos saves antigos em Download/DroidDeck/Saves/backups</item>
<item quantity="other">%1$d arquivos importados de %2$s para %3$s. Backup dos saves antigos em Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Feche a sessão primeiro, para que o jogo não use os addons durante a importação</string>
<string name="main_addons_importing">Importando addons para %1$s</string>
<string name="main_addons_pick_zip">Escolha um zip de addons para %1$s</string>
<string name="main_addons_too_large">%1$s é grande demais para importar</string>
<string name="main_addons_deleting">Excluindo %1$s</string>
<string name="main_addons_deleted">%1$s excluído</string>
<string name="main_addons_none">Nenhum addon encontrado em %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">%1$d addon importado para %2$s</item>
<item quantity="many">%1$d de addons importados para %2$s</item>
<item quantity="other">%1$d addons importados para %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Escolha um zip de saves para %1$s</string>
<string name="main_saves_exporting">Exportando %1$s</string>
<plurals name="main_saves_exported">
@@ -3508,6 +3529,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Para jogos com salvamentos na sua conta Steam</string>
<string name="game_resource_search">Pesquisa na web</string>
<string name="game_tab_addons">Addons</string>
<string name="game_tab_install">Instalar</string>
<string name="game_install_location">Local</string>
<string name="game_install_folder">Pasta</string>
+22
View File
@@ -1189,6 +1189,15 @@
<string name="games_export_gamehub">Exportă ca arhivă GameHub…</string>
<string name="games_export_winlator">Exportă ca arhivă Winlator…</string>
<string name="games_open_save_folder">Deschide folderul de salvare</string>
<string name="games_import_addons">Importă suplimente din zip…</string>
<string name="games_open_addons_folder">Deschide folderul de suplimente</string>
<string name="games_delete_addon_title">Ștergi %1$s?</string>
<string name="games_delete_addon_body">Aceasta șterge folderul suplimentului. Setările sale rămân.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d supliment</item>
<item quantity="few">%1$d suplimente</item>
<item quantity="other">%1$d de suplimente</item>
</plurals>
<string name="games_never_played">Niciodată jucat</string>
<string name="games_runtime_busy_percent">Mediu de execuție ocupat · %1$d%%</string>
<string name="games_runtime_busy">Mediu de execuție ocupat</string>
@@ -1369,6 +1378,18 @@
<item quantity="few">S-au importat %1$d fișiere din %2$s în %3$s. Salvările vechi au fost copiate de rezervă în Download/DroidDeck/Saves/backups</item>
<item quantity="other">S-au importat %1$d de fișiere din %2$s în %3$s. Salvările vechi au fost copiate de rezervă în Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Închide mai întâi sesiunea, ca jocul să nu folosească suplimentele în timpul importului</string>
<string name="main_addons_importing">Se importă suplimente în %1$s</string>
<string name="main_addons_pick_zip">Alege o arhivă zip de suplimente pentru %1$s</string>
<string name="main_addons_too_large">%1$s este prea mare pentru a fi importat</string>
<string name="main_addons_deleting">Se șterge %1$s</string>
<string name="main_addons_deleted">S-a șters %1$s</string>
<string name="main_addons_none">Nu s-au găsit suplimente în %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">S-a importat %1$d supliment în %2$s</item>
<item quantity="few">S-au importat %1$d suplimente în %2$s</item>
<item quantity="other">S-au importat %1$d de suplimente în %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Alege o arhivă de salvare pentru %1$s</string>
<string name="main_saves_exporting">Se exportă %1$s</string>
<plurals name="main_saves_exported">
@@ -3508,6 +3529,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Pentru jocurile cu salvări în contul tău Steam</string>
<string name="game_resource_search">Căutare pe web</string>
<string name="game_tab_addons">Suplimente</string>
<string name="game_tab_install">Instalează</string>
<string name="game_install_location">Locație</string>
<string name="game_install_folder">Folder</string>
+24
View File
@@ -1195,6 +1195,16 @@
<string name="games_export_gamehub">Экспорт как архив GameHub…</string>
<string name="games_export_winlator">Экспорт как архив Winlator…</string>
<string name="games_open_save_folder">Открыть папку сохранений</string>
<string name="games_import_addons">Импорт аддонов из zip…</string>
<string name="games_open_addons_folder">Открыть папку аддонов</string>
<string name="games_delete_addon_title">Удалить %1$s?</string>
<string name="games_delete_addon_body">Папка аддона будет удалена. Его настройки сохранятся.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d аддон</item>
<item quantity="few">%1$d аддона</item>
<item quantity="many">%1$d аддонов</item>
<item quantity="other">%1$d аддона</item>
</plurals>
<string name="games_never_played">Никогда не запускалась</string>
<string name="games_runtime_busy_percent">Среда выполнения занята · %1$d%%</string>
<string name="games_runtime_busy">Среда выполнения занята</string>
@@ -1377,6 +1387,19 @@
<item quantity="many">Импортировано %1$d файлов (%2$s) в %3$s. Старые сохранения скопированы в Download/DroidDeck/Saves/backups</item>
<item quantity="other">Импортировано %1$d файла (%2$s) в %3$s. Старые сохранения скопированы в Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Сначала закройте сессию, чтобы игра не использовала аддоны во время импорта</string>
<string name="main_addons_importing">Импорт аддонов в %1$s</string>
<string name="main_addons_pick_zip">Выберите zip-архив аддонов для %1$s</string>
<string name="main_addons_too_large">%1$s слишком большой для импорта</string>
<string name="main_addons_deleting">Удаление: %1$s</string>
<string name="main_addons_deleted">Удалено: %1$s</string>
<string name="main_addons_none">Аддоны не найдены в %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Импортирован %1$d аддон в %2$s</item>
<item quantity="few">Импортировано %1$d аддона в %2$s</item>
<item quantity="many">Импортировано %1$d аддонов в %2$s</item>
<item quantity="other">Импортировано %1$d аддона в %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Выберите zip-архив сохранений для %1$s</string>
<string name="main_saves_exporting">Экспорт %1$s</string>
<plurals name="main_saves_exported">
@@ -3544,6 +3567,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Для игр с сохранениями в аккаунте Steam</string>
<string name="game_resource_search">Поиск в интернете</string>
<string name="game_tab_addons">Аддоны</string>
<string name="game_tab_install">Установить</string>
<string name="game_install_location">Расположение</string>
<string name="game_install_folder">Папка</string>
+20
View File
@@ -1183,6 +1183,14 @@
<string name="games_export_gamehub">Exportera som GameHub-zip…</string>
<string name="games_export_winlator">Exportera som Winlator-zip…</string>
<string name="games_open_save_folder">Öppna sparmappen</string>
<string name="games_import_addons">Importera tillägg från zip…</string>
<string name="games_open_addons_folder">Öppna tilläggsmappen</string>
<string name="games_delete_addon_title">Ta bort %1$s?</string>
<string name="games_delete_addon_body">Detta tar bort tilläggets mapp. Inställningarna behålls.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d tillägg</item>
<item quantity="other">%1$d tillägg</item>
</plurals>
<string name="games_never_played">Aldrig spelat</string>
<string name="games_runtime_busy_percent">Körmiljö upptagen · %1$d %%</string>
<string name="games_runtime_busy">Körmiljö upptagen</string>
@@ -1361,6 +1369,17 @@
<item quantity="one">Importerade %1$d fil från %2$s till %3$s. Gamla sparfiler säkerhetskopierades till Download/DroidDeck/Saves/backups</item>
<item quantity="other">Importerade %1$d filer från %2$s till %3$s. Gamla sparfiler säkerhetskopierades till Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Stäng sessionen först, så att spelet inte använder sina tillägg under importen</string>
<string name="main_addons_importing">Importerar tillägg till %1$s</string>
<string name="main_addons_pick_zip">Välj en zip-fil med tillägg för %1$s</string>
<string name="main_addons_too_large">%1$s är för stor för att importeras</string>
<string name="main_addons_deleting">Tar bort %1$s</string>
<string name="main_addons_deleted">Tog bort %1$s</string>
<string name="main_addons_none">Inga tillägg hittades i %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Importerade %1$d tillägg till %2$s</item>
<item quantity="other">Importerade %1$d tillägg till %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Välj en zip-fil med sparfiler för %1$s</string>
<string name="main_saves_exporting">Exporterar %1$s</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">För spel med sparningar på ditt Steam-konto</string>
<string name="game_resource_search">Webbsökning</string>
<string name="game_tab_addons">Tillägg</string>
<string name="game_tab_install">Installera</string>
<string name="game_install_location">Plats</string>
<string name="game_install_folder">Mapp</string>
+18
View File
@@ -1177,6 +1177,13 @@
<string name="games_export_gamehub">ส่งออกเป็น GameHub zip…</string>
<string name="games_export_winlator">ส่งออกเป็น Winlator zip…</string>
<string name="games_open_save_folder">เปิดโฟลเดอร์เซฟ</string>
<string name="games_import_addons">นำเข้าแอดออนจาก zip…</string>
<string name="games_open_addons_folder">เปิดโฟลเดอร์แอดออน</string>
<string name="games_delete_addon_title">ลบ %1$s ไหม</string>
<string name="games_delete_addon_body">การดำเนินการนี้จะลบโฟลเดอร์ของแอดออน ส่วนการตั้งค่ายังคงอยู่</string>
<plurals name="games_addons_count">
<item quantity="other">%1$d แอดออน</item>
</plurals>
<string name="games_never_played">ยังไม่เคยเล่น</string>
<string name="games_runtime_busy_percent">รันไทม์กำลังทำงาน · %1$d%%</string>
<string name="games_runtime_busy">รันไทม์กำลังทำงาน</string>
@@ -1353,6 +1360,16 @@
<plurals name="main_saves_imported_backup">
<item quantity="other">นำเข้า %1$d ไฟล์จาก %2$s สู่ %3$s แล้ว เซฟเก่าสำรองไว้ที่ Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">ปิดเซสชันก่อน เพื่อไม่ให้เกมใช้แอดออนระหว่างการนำเข้า</string>
<string name="main_addons_importing">กำลังนำเข้าแอดออนสู่ %1$s</string>
<string name="main_addons_pick_zip">เลือกไฟล์ zip แอดออนสำหรับ %1$s</string>
<string name="main_addons_too_large">%1$s มีขนาดใหญ่เกินกว่าจะนำเข้าได้</string>
<string name="main_addons_deleting">กำลังลบ %1$s</string>
<string name="main_addons_deleted">ลบ %1$s แล้ว</string>
<string name="main_addons_none">ไม่พบแอดออนใน %1$s</string>
<plurals name="main_addons_imported">
<item quantity="other">นำเข้า %1$d แอดออนสู่ %2$s แล้ว</item>
</plurals>
<string name="main_saves_pick_zip">เลือกไฟล์ zip เซฟสำหรับ %1$s</string>
<string name="main_saves_exporting">กำลังส่งออก %1$s</string>
<plurals name="main_saves_exported">
@@ -3445,6 +3462,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">สำหรับเกมที่มีเซฟอยู่ในบัญชี Steam ของคุณ</string>
<string name="game_resource_search">ค้นหาเว็บ</string>
<string name="game_tab_addons">แอดออน</string>
<string name="game_tab_install">ติดตั้ง</string>
<string name="game_install_location">ตำแหน่ง</string>
<string name="game_install_folder">โฟลเดอร์</string>
+20
View File
@@ -1175,6 +1175,14 @@
<string name="games_export_gamehub">GameHub zip\'i olarak dışa aktar…</string>
<string name="games_export_winlator">Winlator zip\'i olarak dışa aktar…</string>
<string name="games_open_save_folder">Kayıt klasörünü aç</string>
<string name="games_import_addons">Eklentileri zip\'ten içe aktar…</string>
<string name="games_open_addons_folder">Eklentiler klasörünü aç</string>
<string name="games_delete_addon_title">%1$s silinsin mi?</string>
<string name="games_delete_addon_body">Bu işlem eklentinin klasörünü kaldırır. Ayarları korunur.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d eklenti</item>
<item quantity="other">%1$d eklenti</item>
</plurals>
<string name="games_never_played">Hiç oynanmadı</string>
<string name="games_runtime_busy_percent">Çalışma ortamı meşgul · %1$d%%</string>
<string name="games_runtime_busy">Çalışma ortamı meşgul</string>
@@ -1353,6 +1361,17 @@
<item quantity="one">%2$s içinden %1$d dosya %3$s oyununa aktarıldı. Eski kayıtlar Download/DroidDeck/Saves/backups klasörüne yedeklendi</item>
<item quantity="other">%2$s içinden %1$d dosya %3$s oyununa aktarıldı. Eski kayıtlar Download/DroidDeck/Saves/backups klasörüne yedeklendi</item>
</plurals>
<string name="main_addons_close_session">Önce oturumu kapatın; böylece oyun içe aktarma sırasında eklentilerini kullanmaz</string>
<string name="main_addons_importing">Eklentiler içe aktarılıyor: %1$s</string>
<string name="main_addons_pick_zip">%1$s için bir eklenti zip dosyası seçin</string>
<string name="main_addons_too_large">%1$s içe aktarılamayacak kadar büyük</string>
<string name="main_addons_deleting">%1$s siliniyor</string>
<string name="main_addons_deleted">%1$s silindi</string>
<string name="main_addons_none">%1$s içinde eklenti bulunamadı</string>
<plurals name="main_addons_imported">
<item quantity="one">%1$d eklenti %2$s oyununa aktarıldı</item>
<item quantity="other">%1$d eklenti %2$s oyununa aktarıldı</item>
</plurals>
<string name="main_saves_pick_zip">%1$s için bir kayıt zip dosyası seçin</string>
<string name="main_saves_exporting">Dışa aktarılıyor: %1$s</string>
<plurals name="main_saves_exported">
@@ -3472,6 +3491,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Kayıtları Steam hesabınızda olan oyunlar için</string>
<string name="game_resource_search">Web\'de ara</string>
<string name="game_tab_addons">Eklentiler</string>
<string name="game_tab_install">Yükle</string>
<string name="game_install_location">Konum</string>
<string name="game_install_folder">Klasör</string>
+24
View File
@@ -1195,6 +1195,16 @@
<string name="games_export_gamehub">Експортувати як zip GameHub…</string>
<string name="games_export_winlator">Експортувати як zip Winlator…</string>
<string name="games_open_save_folder">Відкрити папку збережень</string>
<string name="games_import_addons">Імпортувати аддони з zip…</string>
<string name="games_open_addons_folder">Відкрити папку аддонів</string>
<string name="games_delete_addon_title">Видалити %1$s?</string>
<string name="games_delete_addon_body">Папку аддона буде видалено. Його налаштування збережуться.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d аддон</item>
<item quantity="few">%1$d аддони</item>
<item quantity="many">%1$d аддонів</item>
<item quantity="other">%1$d аддона</item>
</plurals>
<string name="games_never_played">Ще не грали</string>
<string name="games_runtime_busy_percent">Середовище зайняте · %1$d%%</string>
<string name="games_runtime_busy">Середовище зайняте</string>
@@ -1377,6 +1387,19 @@
<item quantity="many">Імпортовано %1$d файлів з %2$s у %3$s. Резервну копію старих збережень записано в Download/DroidDeck/Saves/backups</item>
<item quantity="other">Імпортовано %1$d файлу з %2$s у %3$s. Резервну копію старих збережень записано в Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Спершу закрийте сеанс, щоб гра не використовувала аддони під час імпорту</string>
<string name="main_addons_importing">Імпорт аддонів у %1$s</string>
<string name="main_addons_pick_zip">Виберіть zip-архів аддонів для %1$s</string>
<string name="main_addons_too_large">%1$s завеликий для імпорту</string>
<string name="main_addons_deleting">Видалення: %1$s</string>
<string name="main_addons_deleted">Видалено: %1$s</string>
<string name="main_addons_none">Аддони не знайдено в %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Імпортовано %1$d аддон у %2$s</item>
<item quantity="few">Імпортовано %1$d аддони в %2$s</item>
<item quantity="many">Імпортовано %1$d аддонів у %2$s</item>
<item quantity="other">Імпортовано %1$d аддона в %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Виберіть zip-архів збережень для %1$s</string>
<string name="main_saves_exporting">Експорт %1$s</string>
<plurals name="main_saves_exported">
@@ -3544,6 +3567,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Для ігор зі збереженнями в обліковому записі Steam</string>
<string name="game_resource_search">Пошук в інтернеті</string>
<string name="game_tab_addons">Аддони</string>
<string name="game_tab_install">Установити</string>
<string name="game_install_location">Розташування</string>
<string name="game_install_folder">Папка</string>
+18
View File
@@ -1177,6 +1177,13 @@
<string name="games_export_gamehub">Xuất dưới dạng zip GameHub…</string>
<string name="games_export_winlator">Xuất dưới dạng zip Winlator…</string>
<string name="games_open_save_folder">Mở thư mục lưu</string>
<string name="games_import_addons">Nhập addon từ zip…</string>
<string name="games_open_addons_folder">Mở thư mục addon</string>
<string name="games_delete_addon_title">Xóa %1$s?</string>
<string name="games_delete_addon_body">Thao tác này xóa thư mục của addon. Cài đặt của addon vẫn được giữ lại.</string>
<plurals name="games_addons_count">
<item quantity="other">%1$d addon</item>
</plurals>
<string name="games_never_played">Chưa chơi bao giờ</string>
<string name="games_runtime_busy_percent">Runtime đang bận · %1$d%%</string>
<string name="games_runtime_busy">Runtime đang bận</string>
@@ -1353,6 +1360,16 @@
<plurals name="main_saves_imported_backup">
<item quantity="other">Đã nhập %1$d tệp từ %2$s vào %3$s. Tệp lưu cũ đã được sao lưu vào Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Hãy đóng phiên trước, để game không dùng addon trong lúc nhập</string>
<string name="main_addons_importing">Đang nhập addon vào %1$s</string>
<string name="main_addons_pick_zip">Chọn một tệp zip addon cho %1$s</string>
<string name="main_addons_too_large">%1$s quá lớn để nhập</string>
<string name="main_addons_deleting">Đang xóa %1$s</string>
<string name="main_addons_deleted">Đã xóa %1$s</string>
<string name="main_addons_none">Không tìm thấy addon nào trong %1$s</string>
<plurals name="main_addons_imported">
<item quantity="other">Đã nhập %1$d addon vào %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Chọn một tệp zip lưu cho %1$s</string>
<string name="main_saves_exporting">Đang xuất %1$s</string>
<plurals name="main_saves_exported">
@@ -3445,6 +3462,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">Cho game có bản lưu trong tài khoản Steam của bạn</string>
<string name="game_resource_search">Tìm kiếm trên web</string>
<string name="game_tab_addons">Addon</string>
<string name="game_tab_install">Cài đặt</string>
<string name="game_install_location">Vị trí</string>
<string name="game_install_folder">Thư mục</string>
@@ -1261,6 +1261,13 @@
<string name="games_export_gamehub">导出为 GameHub zip 包…</string>
<string name="games_export_winlator">导出为 Winlator zip 包…</string>
<string name="games_open_save_folder">打开存档文件夹</string>
<string name="games_import_addons">从 zip 导入插件…</string>
<string name="games_open_addons_folder">打开插件文件夹</string>
<string name="games_delete_addon_title">删除 %1$s?</string>
<string name="games_delete_addon_body">这会移除插件的文件夹,其设置会保留。</string>
<plurals name="games_addons_count">
<item quantity="other">%1$d 个插件</item>
</plurals>
<string name="games_never_played">从未游玩</string>
<string name="games_runtime_busy_percent">运行时繁忙 · %1$d%%</string>
<string name="games_runtime_busy">运行时繁忙</string>
@@ -1437,6 +1444,16 @@
<plurals name="main_saves_imported_backup">
<item quantity="other">已从 %2$s 导入 %1$d 个文件到 %3$s。旧存档已备份到 Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">请先关闭会话,以免游戏在导入期间使用其插件</string>
<string name="main_addons_importing">正在导入插件到 %1$s</string>
<string name="main_addons_pick_zip">为 %1$s 选择插件 zip 包</string>
<string name="main_addons_too_large">%1$s 太大,无法导入</string>
<string name="main_addons_deleting">正在删除 %1$s</string>
<string name="main_addons_deleted">已删除 %1$s</string>
<string name="main_addons_none">在 %1$s 中未找到插件</string>
<plurals name="main_addons_imported">
<item quantity="other">已导入 %1$d 个插件到 %2$s</item>
</plurals>
<string name="main_saves_pick_zip">为 %1$s 选择存档 zip 包</string>
<string name="main_saves_exporting">正在导出 %1$s</string>
<plurals name="main_saves_exported">
@@ -3448,6 +3465,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">适用于存档保存在 Steam 账户中的游戏</string>
<string name="game_resource_search">网页搜索</string>
<string name="game_tab_addons">插件</string>
<string name="game_tab_install">安装</string>
<string name="game_install_location">位置</string>
<string name="game_install_folder">文件夹</string>
@@ -1177,6 +1177,13 @@
<string name="games_export_gamehub">匯出為 GameHub zip…</string>
<string name="games_export_winlator">匯出為 Winlator zip…</string>
<string name="games_open_save_folder">開啟存檔資料夾</string>
<string name="games_import_addons">從 zip 匯入外掛…</string>
<string name="games_open_addons_folder">開啟外掛資料夾</string>
<string name="games_delete_addon_title">刪除 %1$s?</string>
<string name="games_delete_addon_body">這會移除外掛的資料夾,其設定會保留。</string>
<plurals name="games_addons_count">
<item quantity="other">%1$d 個外掛</item>
</plurals>
<string name="games_never_played">從未玩過</string>
<string name="games_runtime_busy_percent">運行環境繁忙 · %1$d%%</string>
<string name="games_runtime_busy">運行環境繁忙</string>
@@ -1353,6 +1360,16 @@
<plurals name="main_saves_imported_backup">
<item quantity="other">已從 %2$s 匯入 %1$d 個檔案至 %3$s。舊存檔已備份至 Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">請先關閉會話,以免遊戲在匯入期間使用外掛</string>
<string name="main_addons_importing">正在匯入外掛至 %1$s</string>
<string name="main_addons_pick_zip">選擇 %1$s 的外掛 zip</string>
<string name="main_addons_too_large">%1$s 太大,無法匯入</string>
<string name="main_addons_deleting">正在刪除 %1$s</string>
<string name="main_addons_deleted">已刪除 %1$s</string>
<string name="main_addons_none">在 %1$s 中找不到外掛</string>
<plurals name="main_addons_imported">
<item quantity="other">已匯入 %1$d 個外掛至 %2$s</item>
</plurals>
<string name="main_saves_pick_zip">為 %1$s 選擇存檔 zip</string>
<string name="main_saves_exporting">正在匯出 %1$s</string>
<plurals name="main_saves_exported">
@@ -3445,6 +3462,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">適用於存檔儲存在 Steam 帳戶中的遊戲</string>
<string name="game_resource_search">網上搜尋</string>
<string name="game_tab_addons">外掛</string>
<string name="game_tab_install">安裝</string>
<string name="game_install_location">位置</string>
<string name="game_install_folder">資料夾</string>
@@ -1177,6 +1177,13 @@
<string name="games_export_gamehub">匯出為 GameHub 壓縮檔…</string>
<string name="games_export_winlator">匯出為 Winlator 壓縮檔…</string>
<string name="games_open_save_folder">開啟存檔資料夾</string>
<string name="games_import_addons">從 zip 匯入外掛…</string>
<string name="games_open_addons_folder">開啟外掛資料夾</string>
<string name="games_delete_addon_title">刪除 %1$s?</string>
<string name="games_delete_addon_body">這會移除外掛的資料夾,其設定會保留。</string>
<plurals name="games_addons_count">
<item quantity="other">%1$d 個外掛</item>
</plurals>
<string name="games_never_played">從未執行</string>
<string name="games_runtime_busy_percent">執行環境繁忙 · %1$d%%</string>
<string name="games_runtime_busy">執行環境繁忙</string>
@@ -1353,6 +1360,16 @@
<plurals name="main_saves_imported_backup">
<item quantity="other">已從 %2$s 匯入 %1$d 個檔案到 %3$s。舊存檔已備份到 Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">請先關閉工作階段,以免遊戲在匯入期間使用外掛</string>
<string name="main_addons_importing">正在匯入外掛到 %1$s</string>
<string name="main_addons_pick_zip">選擇 %1$s 的外掛 zip</string>
<string name="main_addons_too_large">%1$s 太大,無法匯入</string>
<string name="main_addons_deleting">正在刪除 %1$s</string>
<string name="main_addons_deleted">已刪除 %1$s</string>
<string name="main_addons_none">在 %1$s 中找不到外掛</string>
<plurals name="main_addons_imported">
<item quantity="other">已匯入 %1$d 個外掛到 %2$s</item>
</plurals>
<string name="main_saves_pick_zip">選擇 %1$s 的存檔壓縮檔</string>
<string name="main_saves_exporting">正在匯出 %1$s</string>
<plurals name="main_saves_exported">
@@ -3445,6 +3462,7 @@
<string name="game_resource_steam_cloud">Steam Cloud</string>
<string name="game_resource_steam_cloud_detail">適用於存檔儲存在 Steam 帳戶中的遊戲</string>
<string name="game_resource_search">網路搜尋</string>
<string name="game_tab_addons">外掛</string>
<string name="game_tab_install">安裝</string>
<string name="game_install_location">位置</string>
<string name="game_install_folder">資料夾</string>
+20
View File
@@ -1317,6 +1317,14 @@
<string name="games_export_gamehub">Export as GameHub zip…</string>
<string name="games_export_winlator">Export as Winlator zip…</string>
<string name="games_open_save_folder">Open save folder</string>
<string name="games_import_addons">Import addons from zip…</string>
<string name="games_open_addons_folder">Open addons folder</string>
<string name="games_delete_addon_title">Delete %1$s?</string>
<string name="games_delete_addon_body">This removes the addon\'s folder. Its settings stay.</string>
<plurals name="games_addons_count">
<item quantity="one">%1$d addon</item>
<item quantity="other">%1$d addons</item>
</plurals>
<string name="games_never_played">Never played</string>
<string name="games_runtime_busy_percent">Runtime busy · %1$d%%</string>
<string name="games_runtime_busy">Runtime busy</string>
@@ -1504,6 +1512,17 @@
<item quantity="one">Imported %1$d file from the %2$s into %3$s. Old saves backed up to Download/DroidDeck/Saves/backups</item>
<item quantity="other">Imported %1$d files from the %2$s into %3$s. Old saves backed up to Download/DroidDeck/Saves/backups</item>
</plurals>
<string name="main_addons_close_session">Close the session first, so the game isn\'t using its addons during the import</string>
<string name="main_addons_importing">Importing addons into %1$s</string>
<string name="main_addons_pick_zip">Choose an addon zip for %1$s</string>
<string name="main_addons_too_large">%1$s is too large to import</string>
<string name="main_addons_deleting">Deleting %1$s</string>
<string name="main_addons_deleted">Deleted %1$s</string>
<string name="main_addons_none">No addons found in %1$s</string>
<plurals name="main_addons_imported">
<item quantity="one">Imported %1$d addon into %2$s</item>
<item quantity="other">Imported %1$d addons into %2$s</item>
</plurals>
<string name="main_saves_pick_zip">Choose a save zip for %1$s</string>
<string name="main_saves_exporting">Exporting %1$s</string>
<plurals name="main_saves_exported">
@@ -3669,6 +3688,7 @@
<string name="game_resource_search">Web search</string>
<string name="game_tab_achievements_count" translatable="false">%1$s %2$d/%3$d</string>
<string name="game_tab_launch">Launch</string>
<string name="game_tab_addons">Addons</string>
<string name="game_tab_saves_cloud">Saves &amp; cloud</string>
<string name="game_tab_install">Install</string>
<string name="game_launch_shortcut">Steam shortcut</string>
@@ -0,0 +1,221 @@
package com.droiddeck.launcher.runtime
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertThrows
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
import java.io.File
import java.io.IOException
import java.nio.file.Files
import java.nio.file.LinkOption
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
class WowAddonsTest {
@get:Rule val temp = TemporaryFolder()
private fun zip(vararg files: Pair<String, String>): File {
val file = temp.newFile("addon-${System.nanoTime()}.zip")
ZipOutputStream(file.outputStream()).use { out ->
for ((name, text) in files) {
out.putNextEntry(ZipEntry(name))
out.write(text.toByteArray())
out.closeEntry()
}
}
return file
}
private fun target(): WowAddons.Target {
val root = temp.newFolder("World of Warcraft")
File(root, "_retail_").mkdirs()
return WowAddons.targets(BattleNet.title("wow")!!, root).single()
}
private fun names(vararg files: String) = WowAddons.addons(files.toList()).map { it.name to it.root }
@Test fun plainFoldersKeepTheirNames() {
assertEquals(listOf("Foo" to "Foo/", "Bar" to "Bar/"), names("Foo/Foo.toc", "Foo/a.lua", "Bar/Bar.toc"))
}
@Test fun flavourTocsKeepTheFolderName() {
assertEquals(listOf("Foo" to "Foo/"), names("Foo/Foo_Mainline.toc", "Foo/Foo_Vanilla.toc", "Foo/Foo-Classic.toc"))
}
@Test fun anAddonNamedLikeAFlavourStaysWhole() {
assertEquals(listOf("Foo_Classic" to "Foo_Classic/"), names("Foo_Classic/Foo_Classic.toc"))
}
@Test fun sourceWrappersTakeTheTocName() {
assertEquals(listOf("Foo" to "Foo-main/"), names("Foo-main/Foo.toc", "Foo-main/README.md"))
assertEquals(listOf("Foo" to "Repo-1.2.3/"), names("Repo-1.2.3/Foo_Mainline.toc", "Repo-1.2.3/Foo_TBC.toc"))
}
@Test fun packsAndGameFolderWrappersFindEveryAddon() {
assertEquals(
listOf("Foo" to "Interface/AddOns/Foo/", "Bar" to "Interface/AddOns/Bar/"),
names("Interface/AddOns/Foo/Foo.toc", "Interface/AddOns/Bar/Bar.toc"),
)
}
@Test fun bareFilesGetAFolder() {
assertEquals(listOf("Foo" to ""), names("Foo.toc", "core.lua"))
}
@Test fun nestedTocsBelongToTheirAddon() {
assertEquals(listOf("Foo" to "Foo/"), names("Foo/Foo.toc", "Foo/Libs/Lib/Lib.toc"))
}
@Test fun anAddonInTheFolderOfASimilarNameIsNotNested() {
assertEquals(listOf("Foo" to "Foo/", "FooOptions" to "FooOptions/"), names("Foo/Foo.toc", "FooOptions/FooOptions.toc"))
}
@Test fun importsIntoInterfaceAddOns() {
val target = target()
val zip = zip("Foo-main/Foo.toc" to "toc", "Foo-main/sub/a.lua" to "lua", "__MACOSX/Foo-main/._Foo.toc" to "x")
assertEquals(listOf("Foo"), WowAddons.import(zip, target))
assertEquals(File(target.addOns.parentFile, "AddOns"), target.addOns)
assertEquals("lua", File(target.addOns, "Foo/sub/a.lua").readText())
assertEquals(listOf("Foo"), WowAddons.installed(target))
assertEquals(listOf("AddOns"), target.addOns.parentFile!!.list()!!.toList())
}
@Test fun reimportReplacesTheFolderIgnoringCase() {
val target = target()
File(target.addOns, "foo").mkdirs()
File(target.addOns, "foo/stale.lua").writeText("old")
File(target.addOns, "Keep").mkdirs()
WowAddons.import(zip("Foo/Foo.toc" to "new"), target)
assertTrue(File(target.addOns, "Foo/Foo.toc").isFile)
assertFalse(File(target.addOns, "foo").exists())
assertTrue(File(target.addOns, "Keep").isDirectory)
}
@Test fun replacingALinkLeavesItsTargetAlone() {
val target = target()
val outside = temp.newFolder("outside")
File(outside, "keep.lua").writeText("keep")
target.addOns.mkdirs()
Files.createSymbolicLink(File(target.addOns, "Foo").toPath(), outside.toPath())
WowAddons.import(zip("Foo/Foo.toc" to "new"), target)
assertEquals("keep", File(outside, "keep.lua").readText())
assertFalse(Files.isSymbolicLink(File(target.addOns, "Foo").toPath()))
}
@Test fun deletesOnlyTheChosenAddon() {
val target = target()
WowAddons.import(zip("Foo/Foo.toc" to "a", "Bar/Bar.toc" to "b"), target)
assertEquals(listOf("Bar", "Foo"), WowAddons.installed(target))
WowAddons.delete(target, "Foo")
assertEquals(listOf("Bar"), WowAddons.installed(target))
assertTrue(File(target.addOns, "Bar/Bar.toc").isFile)
}
@Test fun deletingALinkLeavesItsTargetAlone() {
val target = target()
val outside = temp.newFolder("linked")
File(outside, "keep.lua").writeText("keep")
target.addOns.mkdirs()
Files.createSymbolicLink(File(target.addOns, "Foo").toPath(), outside.toPath())
WowAddons.delete(target, "Foo")
assertFalse(Files.exists(File(target.addOns, "Foo").toPath(), LinkOption.NOFOLLOW_LINKS))
assertEquals("keep", File(outside, "keep.lua").readText())
}
@Test fun onlyAFolderDirectlyInAddOnsCanBeDeleted() {
val target = target()
val outside = File(target.addOns.parentFile!!.parentFile, "Outside").apply { mkdirs() }
target.addOns.mkdirs()
assertThrows(IOException::class.java) { WowAddons.delete(target, "../../Outside") }
assertTrue(outside.isDirectory)
}
@Test fun aFailedReplacementRestoresEarlierAddons() {
val base = temp.newFolder("swap")
val addOns = File(base, "AddOns").apply { mkdirs() }
File(addOns, "Foo").mkdirs()
File(addOns, "Foo/old.lua").writeText("old")
File(addOns, "Bar").mkdirs()
File(addOns, "Bar/old.lua").writeText("old")
val fresh = File(base, "fresh/Foo").apply { mkdirs() }
File(fresh, "new.lua").writeText("new")
val old = File(base, "old").apply { mkdirs() }
assertThrows(IOException::class.java) {
WowAddons.swap(listOf(fresh to "Foo", File(base, "fresh/Missing") to "Bar"), addOns, old)
}
assertEquals("old", File(addOns, "Foo/old.lua").readText())
assertEquals("old", File(addOns, "Bar/old.lua").readText())
assertFalse(File(addOns, "Foo/new.lua").exists())
}
@Test fun zipsWithoutAnAddonChangeNothing() {
val target = target()
assertEquals(emptyList<String>(), WowAddons.import(zip("readme.txt" to "x"), target))
assertFalse(target.addOns.exists())
}
@Test fun linkEntriesDoNotCountAsAddons() {
val target = target()
val file = temp.newFile("links.zip")
ZipArchiveOutputStream(file).use { out ->
val link = ZipArchiveEntry("Foo/Foo.toc").apply { unixMode = 0xA1FF }
out.putArchiveEntry(link)
out.write("/etc/passwd".toByteArray())
out.closeArchiveEntry()
}
assertEquals(emptyList<String>(), WowAddons.import(file, target))
assertFalse(target.addOns.exists())
}
@Test fun aZipWithAnyLinkIsRefusedWhole() {
val target = target()
File(target.addOns, "Ace3").mkdirs()
File(target.addOns, "Ace3/keep.lua").writeText("keep")
val file = temp.newFile("nested.zip")
ZipArchiveOutputStream(file).use { out ->
out.putArchiveEntry(ZipArchiveEntry("Foo/Foo.toc").apply { unixMode = 0xA1FF })
out.write("/etc/passwd".toByteArray())
out.closeArchiveEntry()
out.putArchiveEntry(ZipArchiveEntry("Foo/Libs/Ace3/Ace3.toc"))
out.write("toc".toByteArray())
out.closeArchiveEntry()
}
assertEquals(emptyList<String>(), WowAddons.import(file, target))
assertEquals("keep", File(target.addOns, "Ace3/keep.lua").readText())
}
@Test fun escapingEntriesAreNeverWritten() {
val target = target()
WowAddons.import(zip("Foo/Foo.toc" to "a", "../../evil.lua" to "x", "Foo/../../evil2.lua" to "x"), target)
val written = target.addOns.parentFile!!.parentFile!!.walkTopDown().map { it.name }.toList()
assertFalse("evil.lua" in written)
assertFalse("evil2.lua" in written)
assertTrue("Foo.toc" in written)
}
@Test fun usesTheInstalledFlavourFolders() {
val root = temp.newFolder("wow")
listOf("_classic_", "_classic_era_", "_anniversary_", "_retail_").forEach { File(root, it).mkdirs() }
val classic = BattleNet.title("wow_classic")!!
assertEquals(setOf("_classic_", "_classic_era_", "_anniversary_"), WowAddons.targets(classic, root).map { it.flavor }.toSet())
assertEquals(listOf("_retail_"), WowAddons.targets(BattleNet.title("wow")!!, File(root, "_retail_")).map { it.flavor })
}
@Test fun reusesAnExistingFolderSpelling() {
val root = temp.newFolder("wow2")
File(root, "_forever_/interface/addons").mkdirs()
val target = WowAddons.targets(BattleNet.title("wow_forever")!!, root).single()
assertEquals(File(root, "_forever_/interface/addons"), target.addOns)
}
@Test fun otherGamesHaveNoTargets() {
val root = temp.newFolder("d4")
File(root, "_retail_").mkdirs()
assertEquals(emptyList<String>(), WowAddons.targets(BattleNet.title("fenris")!!, root).map { it.flavor })
}
}