Compare commits

...

1358 Commits

Author SHA1 Message Date
0fd496e660 Merge pull request #2139 from ImranR98/dev
Allow users to override author name (#1792)
2025-02-22 19:03:39 -06:00
b3af899ba1 Allow users to override author name (#1792) 2025-02-22 20:01:59 -05:00
9a58643088 Merge pull request #2138 from ImranR98/dev
- Fix GitLab bug that broke all repos with hyphens in their names (#2125)
- Provide "current" link in HTML source errors to help w/ troubleshooting
2025-02-22 18:47:23 -06:00
b223522801 Update packages, increment version 2025-02-22 19:46:09 -05:00
375caa4511 Merge pull request #2137 from summoner001/main
Update hu.json
2025-02-22 18:45:18 -06:00
92ebbd9138 Fix GitLab bug that broke all repos with hyphens in their names (#2125) 2025-02-22 19:44:28 -05:00
a3c2761aba Provide "current" link in HTML source errors to help w/ troubleshooting 2025-02-22 19:24:00 -05:00
68e38259bd Update hu.json
Fixing typos and misspellings

Fixing name of Tencent App Store - use the official name of Tencent Appstore instead of Tencent App Store whtat's wrong.
2025-02-22 13:33:58 +01:00
4aed749b44 Merge pull request #2135 from ImranR98/dev
Increment version
2025-02-21 16:53:40 -06:00
e135476d86 Increment version 2025-02-21 17:53:11 -05:00
7490942fad Merge pull request #2134 from ImranR98/dev
Better file naming on selective export + updated screenshots
2025-02-21 16:39:46 -06:00
794be438b0 Updated screenshots (#2131) 2025-02-21 17:38:00 -05:00
f2f055ad83 Better file naming on selective export 2025-02-21 17:31:14 -05:00
4c94f278e2 Merge pull request #2133 from ImranR98/dev
Fix minor translation error (#2121)
2025-02-21 16:22:09 -06:00
22acb6a2dd Fix minor translation error (#2121) 2025-02-21 17:16:44 -05:00
d32befb832 Merge pull request #2130 from ImranR98/dev
Bugfix - app crashes when language set to zh_Hant_TW
2025-02-21 11:52:02 -06:00
94d8295992 Bugfix - app crashes when language set to zh_Hant_TW 2025-02-21 12:51:44 -05:00
dcf9f5732a Merge pull request #2129 from ImranR98/dev
- Correct spelling of Wi-Fi - not "WiFi" (#2121)
- Change font to Montserrat (#2122)
- Extract GitLab Asset Filenames (#2127)
- Fix "Bad State: No element" Error on Some Direct APK Links (#2128)
2025-02-21 10:05:46 -06:00
c89790d58f Increment version, update packages 2025-02-21 11:04:25 -05:00
3633c58bea Change font to Montserrat (#2122) 2025-02-21 11:01:38 -05:00
9770501aec Correct spelling of Wi-Fi - not "WiFi" (#2121) 2025-02-21 10:44:49 -05:00
167d0ccced Extract GitLab Asset Filenames (#2127) 2025-02-21 10:39:45 -05:00
430d1f2690 Fix "Bad State: No element" Error on Some Direct APK Links (#2128) 2025-02-21 10:22:49 -05:00
eb21ba3f6e Merge pull request #2113 from ImranR98/dev
Fix RuStore characterset issue + support RuStore app  changelogs
2025-02-13 17:07:19 -05:00
3ab14e2311 Fix RuStore characterset issue + support RuStore app changelogs 2025-02-13 17:06:48 -05:00
fff3b22e74 Merge remote-tracking branch 'origin/dev' 2025-02-13 13:18:27 -05:00
46354e648a Merge pull request #2081 from PadowYT2/rustore
RuStore support
2025-02-13 13:09:35 -05:00
4f67ba3f3b Merge pull request #1 from ImranR98/rustore
Fix RuStore PR bug + reorder items in README
2025-02-13 20:46:02 +03:00
e5db702a67 Merge pull request #2112 from ImranR98/dev
- GitLab URL parsing bugfix (#2106)
- Tencent store bugfix (#2108)
- Allow for MarkDown inside "about" app field (#2109)
2025-02-13 11:07:16 -05:00
53451fd883 Upgrade Flutter + packages, increment version 2025-02-13 11:06:03 -05:00
491d3cb723 Merge remote-tracking branch 'origin/main' into dev 2025-02-13 11:05:55 -05:00
6c7644c9b3 Allow for MarkDown inside "about" app field (#2109) 2025-02-13 10:33:46 -05:00
8539581fe9 Tencent store bugfix (#2108) 2025-02-13 10:14:46 -05:00
f301f6cedb Fix RuStore PR bug + reorder items in README 2025-02-13 10:05:09 -05:00
93c8bca038 GitLab URL parsing bugfix (#2106) 2025-02-13 09:55:25 -05:00
0961e044a7 Merge branch 'ImranR98:main' into rustore 2025-02-02 01:14:05 +03:00
7da631e429 Merge pull request #2094 from ImranR98/dev
- Attempt to fix "double download" bug (#2073)
- Avoid JSON corruption when storage full (#2089)
- Fix error when GitLab repo is in a subgroup (#2079)
- Update screenshots in README
2025-01-27 21:13:54 -05:00
66c08f0bfd Updated screenshots 2025-01-27 21:12:35 -05:00
79a2484d68 Don't show debug banner in development 2025-01-27 20:29:34 -05:00
c3c7c844dc Update Flutter submodule 2025-01-27 20:21:44 -05:00
075d0a0854 Enable Korean, update Flutter + packages, increment version 2025-01-27 20:20:37 -05:00
cc0416e344 Merge remote-tracking branch 'origin/main' into dev 2025-01-27 20:16:04 -05:00
af7088b754 Merge pull request #2090 from ColorfulRhino/patch-2
Fix and improve German translation
2025-01-27 20:14:53 -05:00
ba21137da7 Fix error when GitLab repo is in a subgroup (#2079) 2025-01-27 20:14:11 -05:00
a7a5749d4f Avoid JSON corruption when storage full (#2089) 2025-01-27 19:55:12 -05:00
fcf3c8b635 Attempt to fix "double download" bug (#2073) 2025-01-27 19:51:02 -05:00
69f578652c Merge pull request #2080 from tkgo11/main
Added Korean translation.
2025-01-26 23:46:47 -05:00
7593af25b9 Improve German translation
- Increase consistency for certain terms
- Address concerns for the translation of _author_ containing a colon by using a different wording
- Minor improvements
2025-01-26 13:32:35 +00:00
1e8fd33469 Restore two lines in de.json accidentally removed during merge conflict
Two lines were accidentally reverted in #2057 due to a merge conflict.
2025-01-26 13:13:41 +00:00
03f50e501e This was removed by accident 2025-01-20 22:04:41 +03:00
21dacb6171 Revert "Debug the response"
This reverts commit 16ecc88fcd.
2025-01-20 22:03:06 +03:00
16ecc88fcd Debug the response 2025-01-20 21:47:43 +03:00
1f829289ed Fix the API URL having www 2025-01-20 21:36:02 +03:00
be739b7639 Call the function properly 2025-01-20 21:06:08 +03:00
4b66aefb33 Initial progress of RuStore
almost ran out of storage space while trying to build
2025-01-20 21:04:51 +03:00
3f948ae73c Create ko.json 2025-01-20 13:53:32 +09:00
de2e881e82 Merge pull request #2075 from ImranR98/dev
- Fix categories UI bug (#2064)
- Fix how changelog quotes look in dark theme (#2065)
2025-01-14 17:38:54 +03:00
9af3aaa82a Increment version 2025-01-14 17:37:46 +03:00
3a5157ced0 Fix how changelog quotes look in dark theme (#2065) 2025-01-14 17:36:14 +03:00
e16320f995 Fix categories UI bug (#2064) 2025-01-14 17:23:49 +03:00
aac01885f1 Update Flutter version 2025-01-14 16:54:35 +03:00
7d330cd074 Merge pull request #2062 from ImranR98/dev
Update Flutter submodule
2025-01-11 22:19:15 +02:00
8b0e2aaef1 Update Flutter submodule 2025-01-11 23:18:27 +03:00
5db53d9c71 Merge pull request #2044 from ArcticFoxPro/main
feat(i18n): Add Tencent App Store zh-Hans translations and add zh-Hans version of Obtainium badge
2025-01-11 22:03:44 +02:00
ff5bba933b Merge branch 'main' into main 2025-01-11 22:03:36 +02:00
2b48ee81b7 Merge pull request #2048 from mxhdee/main
Update fa.json
2025-01-11 22:02:10 +02:00
fe6d0040c4 Merge pull request #2050 from Kevinr99089/main
Update fr.json
2025-01-11 22:01:59 +02:00
17d32cd1c6 Merge pull request #2057 from DwainZwerg/patch-2
Update de.json
2025-01-11 22:01:50 +02:00
c6a62fe15a Merge branch 'main' into patch-2 2025-01-11 22:01:41 +02:00
2b22de585e Merge pull request #2059 from ColorfulRhino/patch-1
Improve German translation
2025-01-11 22:00:53 +02:00
346c670488 Merge pull request #2061 from ImranR98/dev
- Upgrade to latest Flutter version (fix errors that were preventing this)
- Fix button highlight visibility on black theme (#2039)
2025-01-11 22:00:30 +02:00
2137335e56 Increment version 2025-01-11 22:59:29 +03:00
cea96275b7 Fix button highlight visibility on black theme (#2039) 2025-01-11 22:54:47 +03:00
9954b68332 Upgrade to latest Flutter version (fix Gradle and other errors) 2025-01-11 22:35:40 +03:00
974a822b29 Improve German translation 2025-01-10 12:32:56 +00:00
48b89335fa Update de.json
Hopefully more understandable
2025-01-09 10:31:06 +01:00
e834630688 Update fr.json
- Correction of some translations (French)
- Line: 94, 97
2025-01-01 03:42:04 +01:00
3dd1ef076f Update fr.json
- Correction of some translations (French)
- Line: 28, 32, 63, 81, 102, 316
2025-01-01 03:29:31 +01:00
e70edae831 Update fa.json 2024-12-29 02:31:39 +01:00
d9b2d18d85 feat: Add Simplified Chinese version of Obtainium badge
- Add an image of the Obtainium badge in Simplified Chinese
- File path: assets/graphics/badge_obtainium_i18n/badge_obtainium_zh-Hans.png
- Font used from Noto Sans CJK
2024-12-22 16:03:52 +08:00
96b260e431 feat(i18n): Add Tencent App Store zh-Hans translations
- Add zh-Hans translations for Tencent App Store(腾讯应用宝) in the multilingual files
- Update the display name for Tencent App Store to use localized translations
2024-12-21 17:46:46 +08:00
18ccd01186 Merge pull request #2043 from ImranR98/dev
APKPure bugfix, Restore "Telegram App" source (#2025)
2024-12-20 19:13:02 +03:00
c84f51b6ce Update packages, increment version 2024-12-20 19:11:34 +03:00
48958748f6 Minor bugfix 2024-12-20 19:08:41 +03:00
966b1ee6e3 Revert "Removed Telegram App"
This reverts commit 29bb5cc8cd.
2024-12-20 19:00:26 +03:00
7432ee867f APKPure bugfix 2024-12-20 18:58:31 +03:00
3ebbd2a4a5 Merge pull request #2033 from ImranR98/dev
Bugfix: GitHub fallback option was broken (#2032)
2024-12-12 11:05:30 -05:00
82207a1b3b Increment version 2024-12-12 11:04:46 -05:00
2ec5c7db11 Bugfix: GitHub fallback option was broken (#2032) 2024-12-12 11:04:31 -05:00
ab949af700 Merge pull request #2031 from ImranR98/dev
Hardcode Flutter version in GitHub action for now (until new Flutter works)
2024-12-12 04:02:41 -05:00
5c9a35c4f0 Hardcode Flutter version in GitHub action for now (until new Flutter works) 2024-12-12 04:01:59 -05:00
8651f58744 Merge pull request #2030 from ImranR98/dev
- Avoid OS version reconciliation for pseudo-versioned apps (#2023)
- When importing configs via link, don't show dialog twice
- GitHub - do not use filtered asset release dates (#2012)
2024-12-12 03:53:27 -05:00
d93798a8df Increment version 2024-12-12 03:52:10 -05:00
0822f991ff Remove unused function 2024-12-12 03:34:47 -05:00
fde63a0f05 GitHub - do not use filtered asset release dates (#2012) 2024-12-12 03:27:17 -05:00
523e1151b2 When importing configs via link, don't show dialog twice 2024-12-12 02:58:01 -05:00
d5d6825ed9 Avoid OS version reconciliation for pseudo-versioned apps (#2023) 2024-12-12 02:40:04 -05:00
79c4d3b9fe Merge pull request #2026 from summoner001/main
Update hu.json
2024-12-12 02:21:19 -05:00
d6b99b903f Prevent pseudo-versioning method from changing on load (#2022) 2024-12-12 02:20:56 -05:00
335752ee7c Update hu.json
Correcting hungarian translation
2024-12-10 15:55:12 +01:00
e5afe75213 Merge pull request #2021 from ImranR98/dev
Catch errors when running JSON compat mods - app breaking bug (#2015, #2019)
2024-12-09 17:21:40 -05:00
0df1c1c512 Increment version 2024-12-09 17:21:00 -05:00
bd2ac73b9f Catch errors when running JSON compat mods (#2015, #2019) 2024-12-09 17:18:25 -05:00
26b5a2d976 Catch errors when running JSON compat mods (#2015, #2019) 2024-12-09 17:04:49 -05:00
c0968e8991 Merge pull request #2008 from ImranR98/dev
- Fix broken "Download Asset" function for HTML source (#1998)
- Add "refresh before download" (#1943)
- Remove WhatsApp, VLC, and Telegram App sources - no longer needed as HTML source sufficient (#1943)
2024-12-08 16:41:24 -05:00
243b1eb2ac Update packages, increment version 2024-12-08 16:39:26 -05:00
c6c61d1c83 Merge remote-tracking branch 'origin/main' into dev 2024-12-08 16:37:08 -05:00
f207967411 Merge pull request #1995 from ygxbnet/patch-2
Update zh.json
2024-12-08 16:36:56 -05:00
29bb5cc8cd Removed Telegram App 2024-12-08 16:36:46 -05:00
dbbc2ff19c Removed VLC (#1943) 2024-12-08 16:21:36 -05:00
c012b016f9 Add "refresh before download" + remove WhatsApp (#1943) 2024-12-08 15:58:44 -05:00
22815b8209 Minor bug 2024-12-08 14:53:31 -05:00
619d4f1a51 Fix broken "Download Asset" function for HTML source (#1998) 2024-12-08 13:47:32 -05:00
50e8929763 Update zh.json 2024-11-30 21:49:58 +08:00
0e2a0b65ec Merge pull request #1990 from ImranR98/dev
- Improved XAPK Support (#682)
- Custom user-agent for APKMirror (as per feedback in #1973)
- Minor change to German translation (#1986)
2024-11-23 16:31:46 -05:00
5b79f399d1 Minor change to German translation (#1986) 2024-11-23 16:29:10 -05:00
2961d5ac17 Merge remote-tracking branch 'origin/main' into dev 2024-11-23 16:27:21 -05:00
4af4160aaa Increment version 2024-11-23 16:27:11 -05:00
327f73cc9e More changes for XAPK support (#682) 2024-11-23 16:26:11 -05:00
e82170fec6 Improved XAPK Support (#682) 2024-11-23 16:05:02 -05:00
8922b1c048 Custom user-agent for APKMirror (as per feedback in #1973) 2024-11-23 15:26:58 -05:00
e9550c6ff0 Merge pull request #1980 from Hamster45105/wiki-links
Update wiki links
2024-11-23 01:53:07 -05:00
890c3682c4 Update wiki links 2024-11-23 17:17:04 +11:00
a2c38968e1 Merge pull request #1977 from summoner001/main
Update hu.json
2024-11-15 13:14:29 -05:00
a9c3ee4c54 Update hu.json
Correcting translation.
2024-11-15 14:34:01 +01:00
36db226024 README updates
Signed-off-by: Imran Remtulla <contact@imranr.dev>
2024-11-14 21:42:25 -05:00
6fbdf62afa Merge pull request #1975 from ImranR98/dev
Bugfixes for the "download release assets" button (#1968)
2024-11-14 21:34:36 -05:00
9344ebbb06 Upgrade Flutter + packages, increment version 2024-11-14 21:31:47 -05:00
51b66ab983 Merge remote-tracking branch 'origin/main' into dev 2024-11-14 21:31:17 -05:00
7f2a9b6fa5 Bugfix for "download release assets" (#1968) 2024-11-14 21:21:32 -05:00
ac6bc4d786 Bugfix in "download release assets" button (#1968) 2024-11-14 20:50:06 -05:00
acd30b516c Merge pull request #1972 from DwainZwerg/patch-1
Update README.md
2024-11-14 20:23:41 -05:00
5bc9234101 Merge pull request #1965 from bluefly000/japanese-translation
Update ja.json
2024-11-14 20:23:28 -05:00
80d15f5232 Merge pull request #1964 from summoner001/main
update hu.json
2024-11-14 20:23:15 -05:00
eb7c2a9fc4 Update README.md 2024-11-14 15:04:14 +01:00
40175468b2 Update README.md
Add list of all repositories
2024-11-14 15:01:48 +01:00
814b5a71bd Update ja.json 2024-11-11 14:47:17 +09:00
38a1e43116 Update ja.json 2024-11-11 14:27:20 +09:00
5064b78c79 update hu.json 2024-11-10 18:42:08 +01:00
767350e4e3 update hu.json 2024-11-10 18:39:41 +01:00
4caae51904 Merge pull request #1962 from ImranR98/dev
- Uptodown - fix broken web scraping logic (#1956)
- Add signature info to README (#1957)
2024-11-10 02:49:22 -05:00
83616b7a79 Upgrade packages, increment version 2024-11-10 02:46:25 -05:00
52b2d0868c Add signature info to README (#1957) 2024-11-10 02:42:26 -05:00
94f629859e Merge remote-tracking branch 'origin/main' into dev 2024-11-10 02:27:37 -05:00
773d3455ae Uptodown - fix broken web scraping logic (#1956) 2024-11-10 02:27:00 -05:00
919ab16528 Merge pull request #1948 from CertainBot/main
Update es.json
2024-11-09 14:55:53 -05:00
268b89eaf6 Merge pull request #1945 from Kevinr99089/main
Correction of long translations (French)
2024-11-09 14:55:43 -05:00
9c9a264e39 Update es.json
- Minor changes

- Cambios menores
2024-11-03 13:06:48 +00:00
e1e612455a Correction of long translations (French)
- The previous correction was still too long, so I corrected it again.
- Line 317: "Configuration d'applis communautaire" changed by "Appli communautaires"
- translation suggested by @peternmuller
2024-11-02 23:26:29 +01:00
e191d75300 Merge pull request #1942 from ImranR98/dev
Correct issue w/ Signal migration
2024-11-01 14:34:41 -04:00
fce2a2f15c Correct issue w/ Signal migration 2024-11-01 14:34:19 -04:00
dd8acd9451 Merge pull request #1941 from ImranR98/dev
Fix PathAccessException on secondary profiles (#1754), Log installs (#1924), APKPure URL parsing bugfix (#1926), Remove Signal source (HTML is enough) (#1928), F-Droid URL parsing bugfix (#1933), HTML link extraction bugfix (#1937)
2024-11-01 14:24:33 -04:00
2d5676f13d Increment version 2024-11-01 14:24:18 -04:00
dfbf9e925c Log installs (#1924) 2024-11-01 14:19:55 -04:00
e44f77a68a Remove unused classes and translations (related to Steam Mobile and Signal) 2024-11-01 14:12:55 -04:00
cc373c8d7f Remove Signal source (HTML is enough) (#1928) 2024-11-01 14:09:38 -04:00
2ad88bf3ca Fix PathAccessException on secondary profiles (#1754) 2024-11-01 13:28:10 -04:00
b1f9375bb1 APKPure URL parsing bugfix (#1926) 2024-11-01 13:17:19 -04:00
0e14e17236 F-Droid URL parsing bugfix (#1933) 2024-11-01 13:07:45 -04:00
fc541837ef HTML link extraction bugfix (#1937) 2024-11-01 12:52:32 -04:00
da0b1d0684 Merge pull request #1938 from catsnote/main
Updated a few strings - assets/translations/da.json
2024-11-01 11:27:11 -04:00
3fd89e8567 Merge pull request #1940 from ImranR98/dev
Translation fix, Flutter/package updates, GitHub action security improvement
2024-11-01 11:26:53 -04:00
8cab348eed Build online but do not sign 2024-11-01 11:24:51 -04:00
6bd821985f Merge remote-tracking branch 'origin/main' into dev 2024-11-01 11:18:47 -04:00
1f2efe435f Testing GitHub action changes 2024-11-01 10:41:11 -04:00
8276a809a5 Update packages, Flutter 2024-10-31 19:50:04 -04:00
cat
5fe1a8a370 update assets/translations/da.json 2024-10-31 02:27:27 +01:00
58710093ba Add an exception to the translations/standardize.js 2024-10-25 18:02:53 -04:00
ac6f8c456d Sort pl.json entries 2024-10-25 17:59:26 -04:00
905461c242 Update a field label 2024-10-25 17:54:34 -04:00
e3fcf6e0b5 Merge pull request #1915 from InfiniteCoder06/main
Add Custom app ID
2024-10-25 17:52:10 -04:00
903fad5158 Merge pull request #1929 from Daviteusz/translate
Update Polish translation
2024-10-25 17:44:48 -04:00
1de93e827a Merge pull request #1918 from Kevinr99089/main
Correction of last French modifications (too long)
2024-10-25 17:36:04 -04:00
a5040aa0c1 Update Polish translation 2024-10-24 12:33:10 +02:00
9f7c4e23d5 Change behaviour of Custom App ID 2024-10-21 21:52:40 +05:30
876f67aacb Correction of last French modifications (too long) 2024-10-20 23:32:39 +02:00
2ed2c2c5f9 Merge pull request #1917 from summoner001/main
Update hungarian translation - hu.json
2024-10-20 14:22:10 -04:00
7f35589d49 Fix auto translated strings. 2024-10-20 19:28:13 +02:00
9d5ce75e27 Fixed a Bug, Added Validation 2024-10-20 22:47:13 +05:30
09f1f27fa8 Merge pull request #1916 from ImranR98/dev
- APKPure: Fix issue with characters in URLs (#1912)
- APKPure: Fix bug with versionCode not found
- Optional "when charging only" toggle for BG updates (#1914)
2024-10-20 12:53:52 -04:00
ea239ffa3a Optional "when charging only" toggle for BG updates (#1914) 2024-10-20 12:51:07 -04:00
07ef86ae75 Update packages, increment version 2024-10-20 12:35:29 -04:00
c670fce652 Merge remote-tracking branch 'origin/main' into dev 2024-10-20 12:29:48 -04:00
ba8ef7e5b0 Merge pull request #1906 from mintsoft/debug-build
Allow installation of the debug build
2024-10-20 12:29:37 -04:00
0ec3fb0064 Merge pull request #1907 from Kevinr99089/main
Correction of French translations
2024-10-20 12:29:20 -04:00
c1c06b3f9c Make appId Assignable only once 2024-10-20 21:46:13 +05:30
d121463bad APKPure: Fix bug with versionCode not found 2024-10-20 12:10:11 -04:00
862e85f882 APKPure: Fix issue with characters in URLs (#1912) 2024-10-20 12:02:44 -04:00
5e0333c4c8 Add Custom app ID 2024-10-20 19:56:19 +05:30
efb75afb9b French Translation correction for "Community App Sources".
- Corrected to "Configurations d'applications par la communauté (à utiliser à vos risques et périls)" line 317, and "Configurations d'applications par la communauté" line 318
2024-10-16 22:46:33 +02:00
b4510e10a7 Merge branch 'ImranR98:main' into main 2024-10-16 22:32:15 +02:00
25233f3259 App is now called debug so its easier to spot 2024-10-16 01:30:18 +01:00
cff6b86997 App debug builds can now be installed side-by-side with non-debug 2024-10-16 01:22:57 +01:00
344a6efbf6 Merge pull request #1905 from ImranR98/dev
Add some logs to troubleshoot #1550
2024-10-15 16:02:01 -04:00
59a4b88a88 Update packages, increment version 2024-10-15 16:01:53 -04:00
cf7c41bf4c Merge remote-tracking branch 'origin/main' into dev 2024-10-15 16:00:34 -04:00
d32543b5d0 Merge pull request #1902 from summoner001/main
Update hu.json
2024-10-15 16:00:10 -04:00
892a3b3c30 Add some logs to troubleshoot #1550 2024-10-15 15:56:19 -04:00
56c791d3e5 Update hu.json
Fixing coherence
2024-10-14 15:45:41 +02:00
e4103c8352 Merge branch 'ImranR98:main' into main 2024-10-13 03:14:07 +02:00
672bc159cc Merge pull request #1894 from summoner001/main
Update hu.json
2024-10-12 13:36:07 -04:00
ee5d121bf0 Merge pull request #1889 from strugee/patch-1
Fix typo
2024-10-12 13:35:54 -04:00
e5d1fafc13 Merge pull request #1882 from Erengun/develop
Add "Community App Sources" translation and button to Add App Screen
2024-10-12 13:35:38 -04:00
8bb4f46209 Update hu.json
More fixes
2024-10-09 15:21:10 +02:00
504e1d551b Update hu.json
Fix translation
2024-10-09 15:07:03 +02:00
5e7e143bba Fix typo 2024-10-06 18:52:16 -04:00
91a82af418 Refactor translations to use shorter label for crowdsourced app configurations 2024-10-03 12:13:24 +03:00
7af2145e9a Refactor translations to use shorter label for crowdsourced app configurations 2024-10-03 11:00:00 +03:00
74b9de3516 Replace the "Community App Sources" button with a text link in the AddAppPage for a cleaner UI.
improving interface consistency.
2024-10-03 10:59:44 +03:00
f5b540dd8b Add "Community App Sources" button to AddAppPage 2024-10-02 19:19:23 +03:00
01d701d8cd Add "Community App Sources" translation 2024-10-02 19:16:42 +03:00
4017253470 Merge pull request #1878 from ImranR98/dev
Add "title as version" option for GitHub (#1875)
2024-10-01 20:05:16 -04:00
b0b6ddb8fd Merge remote-tracking branch 'origin/main' into dev 2024-10-01 20:04:30 -04:00
192b7fc6ce Add "title as version" option for GitHub (#1875) 2024-10-01 20:04:10 -04:00
b74dbb973c Merge pull request #1870 from robifr/main
Fix indonesian translation
2024-10-01 19:23:26 -04:00
46ccf8478b Merge pull request #1874 from ImranR98/dev
- App-wide "pretend to be GPlay" option (#1859)
- UI bugfixes on add app page (#1866)
- UI tweaks (#1871, #1872)
- Added "skip latest" option to APKPure (also fallback toggle)
2024-10-01 16:20:55 -05:00
9a354ecf0e Increment version, upgrade package 2024-10-01 17:12:10 -04:00
738dd5649f App-wide "pretend to be GPlay" option (#1859) 2024-10-01 17:07:11 -04:00
9f50d8db2d UI bugfixes on add app page (#1866) 2024-10-01 16:59:28 -04:00
eeb57dbe35 UI tweaks (#1871, #1872) 2024-10-01 15:57:18 -04:00
cbcc8c4eaf Added "skip latest" option to APKPure (also fallback toggle) 2024-10-01 15:49:00 -04:00
f4d27c8494 Fix indonesian translation
Co-authored-by: Kuching Neko <kuchingneko28@gmail.com>
2024-10-02 01:10:31 +07:00
7507e7bf5c Merge pull request #1867 from ImranR98/dev
Fix broken SourceHut source (#1864)
2024-09-30 15:48:45 -05:00
783e8029b6 Increment version 2024-09-30 16:47:58 -04:00
3554257918 Fix broken SourceHut source (#1864) 2024-09-30 16:43:19 -04:00
ef98ceaaa2 Merge pull request #1863 from ImranR98/dev
Add Indonesian to language menu
2024-09-29 12:38:09 -05:00
86540e703d Increment version 2024-09-29 13:36:20 -04:00
1b7c340e2c Add Indonesian to language menu 2024-09-29 13:35:40 -04:00
ba6148dfef Merge pull request #1862 from summoner001/main
Update hu.json
2024-09-29 12:29:53 -05:00
6b47048e43 Merge pull request #1861 from robifr/translation
Add id.json file to support Indonesian language
2024-09-29 12:29:38 -05:00
b698947ecf Update en.json 2024-09-29 13:29:25 -04:00
e677d3179c Revert changes to en.json 2024-09-29 13:28:56 -04:00
25ef35c13c Update hu.json
Minor fix
2024-09-29 16:30:13 +02:00
ba167fed33 Update hu.json
Minor fix
2024-09-29 16:28:37 +02:00
d03c4dec4e Update hu.json
Minor fix
2024-09-29 16:19:04 +02:00
e2525eef74 Update hu.json
Fix the coherence of the translation after viewing the text in the app.
2024-09-29 16:09:48 +02:00
35caec61c5 Add id.json file to support Indonesian language 2024-09-29 15:00:34 +07:00
33a7af216c Corrected versionCode string to version code 2024-09-29 13:44:52 +07:00
b7c477fd40 Merge pull request #1857 from ImranR98/dev
Increment version for bugfix release
2024-09-28 12:43:58 -05:00
045d8cfbe8 Merge pull request #1855 from summoner001/main
Update hu.json
2024-09-28 12:43:36 -05:00
ea6e0b37a3 Increment version for bugfix release 2024-09-28 13:43:11 -04:00
d58eba984e Merge pull request #1854 from mxhdee/main
Update Farsi (Persian)
2024-09-28 12:37:54 -05:00
3d46237d17 Update hu.json
Use „” commas without \ backslash in hungarian translation.
2024-09-28 09:56:13 +02:00
ed3cff87ca Update hu.json
Fix unrecognized string escape in line 311
2024-09-28 08:09:37 +02:00
2002581106 Update fa.json (Persian) 2024-09-28 07:26:47 +02:00
e968d50aac Update fa.json (Persian) 2024-09-28 07:09:18 +02:00
1e03194765 Merge pull request #1853 from ImranR98/dev
- Add Tencent App Store (#1848)
- Enable icon caching (#1837)
2024-09-27 18:05:56 -05:00
10c558faaf Increment version 2024-09-27 19:03:17 -04:00
dcf6957842 Remove unused code 2024-09-27 19:02:54 -04:00
77bebc48bc Enable icon caching (#1837) 2024-09-27 19:01:57 -04:00
cad14dd6a4 Update Flutter, upgrade packages 2024-09-27 18:34:52 -04:00
5d72af5b20 Add Tencent App Store (#1848) 2024-09-27 18:28:37 -04:00
1fcb923469 Merge pull request #1832 from summoner001/main
Update hu.json
2024-09-27 15:17:14 -05:00
f89bc41ac1 Merge pull request #1850 from lagodimos/format-json
Format exported json
2024-09-27 15:17:01 -05:00
70988a91fd Update hu.json
fixing translation of URL
2024-09-25 10:21:03 +02:00
f3481f94dd format exported json
Make the exported applications' file more readable in case it is needed to be opened with a text editor.
2024-09-22 22:50:17 +03:00
204eadd809 Update hu.json
Minor sentence fixes
2024-09-21 17:23:00 +02:00
69f2ec1777 Update hu.json
Fixing the hungarian translation
2024-09-15 17:11:06 +02:00
b98c23e369 Update hu.json
fixing a typo
2024-09-10 10:53:27 +02:00
64779fb55a Update hu.json
fixing access token and api key translation
2024-09-10 10:51:52 +02:00
845cf0a035 Update hu.json
Fixing sentence
2024-09-09 19:31:34 +02:00
9dba240202 Update hu.json
Fixing sentences
2024-09-09 19:25:39 +02:00
8aa682028f Update hu.json
Translating the "regex" word
2024-09-09 19:17:00 +02:00
cb80b80efb Update hu.json
fixing a typo
2024-09-09 17:47:46 +02:00
eb1d997413 Update hu.json
fixing a translation word
2024-09-09 17:46:10 +02:00
986badc653 Update hu.json
fixing a typo
2024-09-09 17:45:04 +02:00
2432db0b31 Update hu.json
Rewieving the hungarian translation. Fixing typos, sentences and the coherence.
2024-09-09 17:29:01 +02:00
87c66b4d09 Modification of 2 translations (fr.json)
- Suggested by [peternmuller](https://github.com/peternmuller)
2024-09-08 22:20:52 +02:00
5be2c9b51d Merge pull request #1826 from ImranR98/dev
- Improved APKPure compatibility by prioritizing APK when available (over XAPK)
- Auto-select direct APK source for URLs ending in '.apk' (#1820)
- Handle install failures more gracefully on apps page (#1782)
- Enabled ZH-TW and EO languages
- Added "allow insecure request" option (#1825)
2024-09-08 04:00:49 -04:00
d801994fed Added "allow insecure request" option (#1825) 2024-09-08 03:58:51 -04:00
19bb9a0331 Update packages + Flutter, increment version 2024-09-08 03:27:20 -04:00
b8dc6f9a53 Dart fix 2024-09-08 03:25:52 -04:00
3a7ba00486 Merge remote-tracking branch 'origin/main' into dev 2024-09-08 03:24:26 -04:00
86416df7dd Enabled ZH-TW and EO languages 2024-09-08 03:23:29 -04:00
704f209e4d Merge pull request #1824 from DwainZwerg/patch-1
Update de.json
2024-09-08 03:14:40 -04:00
e1bed6f0cf Handle install failures more gracefully on apps page (#1782) 2024-09-08 03:11:49 -04:00
61c88596f0 Bugfix 2024-09-08 02:54:43 -04:00
a07c51a04a Merge remote-tracking branch 'origin/main' into dev 2024-09-08 02:51:22 -04:00
0e46a83843 Auto-select direct APK source for URLs ending in '.apk' (#1820) 2024-09-08 02:51:11 -04:00
1a4b9658c3 Update de.json
see https://github.com/ImranR98/Obtainium/pull/1783#issuecomment-2310350237
2024-09-08 08:48:54 +02:00
9b922abe48 Merge pull request #1815 from pgmtx/add-esperanto
Add Esperanto translation
2024-09-08 02:40:57 -04:00
6f0f883d88 Merge pull request #1807 from Kevinr99089/main
Fr: Rollback import export change
2024-09-08 02:40:48 -04:00
aafcc4d96e Merge pull request #1803 from gidano/Updated_hu
Updated hu.json
2024-09-08 02:40:39 -04:00
e019c8027b Improved APKPure compatibility by prioritizing APK when available (over XAPK) 2024-09-05 13:10:02 -04:00
b6acb43055 Finished proofreading 2024-08-28 23:06:33 +02:00
d9f6e3328e Created eo.json file and added first translations 2024-08-27 19:43:07 +02:00
0e50132e13 Rollback import export change
- The changes made to "Import and Export", translated as "Sauvegarder et Restaurer" have been cancelled because some of the text goes beyond the box.
- Back to "Importer et Exporter" by correcting past errors.
2024-08-22 16:26:10 +02:00
c74e8456d2 Updated hu.json 2024-08-20 08:35:30 +02:00
33c60c9d4f Merge pull request #1801 from ImranR98/dev
Switch back to old Shizuku plugin version (new one broke build)
2024-08-19 23:03:40 -04:00
151e085655 Switch back to old Shizuku plugin version (new one broke build) 2024-08-19 23:03:20 -04:00
b1d641ae24 Merge pull request #1783 from Mr-Update/patch-1
Update de.json
2024-08-19 22:56:51 -04:00
7ddb35f933 Update de.json 2024-08-19 22:56:38 -04:00
b05a2ed14f Merge pull request #1800 from ImranR98/dev
- GitLab bugfix for some APK URLs (#1790)
- Fix Uptodown - was completely broken (#1796)
- Slight XAPK support improvement + BG install bugfix
2024-08-19 22:55:37 -04:00
b22a82d11b Upgrade packages, increment version 2024-08-19 22:54:24 -04:00
ee051153ca Merge remote-tracking branch 'origin/main' into dev 2024-08-19 22:53:44 -04:00
46871191c4 Merge pull request #1787 from Kevinr99089/main
French corrections
2024-08-19 22:48:45 -04:00
0cb518d434 Merge pull request #1785 from PeterDaveHelloKitchen/Improve-zh-TW-translation
Improve zh-TW traditional Chinese translation
2024-08-19 22:48:36 -04:00
03778fd743 Fix Uptodown - was completely broken (#1796) 2024-08-19 22:37:57 -04:00
514ca3e28b Slight XAPK support improvement + BG install bugfix 2024-08-19 21:29:19 -04:00
37e90dabe7 GitLab bugfix for some APK URLs (#1790) 2024-08-19 20:55:37 -04:00
ee99f2b71f Update de.json 2024-08-17 21:39:56 +02:00
ca9289f104 Some words corrected #5
- Correction of some words suggested by [AntoninDelFabbro](https://github.com/AntoninDelFabbro).
2024-08-14 16:10:30 +02:00
aefe7eaa5f Improve zh-TW traditional Chinese translation 2024-08-11 04:19:53 +08:00
e979f7c6f3 Update de.json 2024-08-09 00:13:02 +02:00
e2118a3b53 Some words corrected #4
- Correction of some words suggested by [AntoninDelFabbro](https://github.com/AntoninDelFabbro).
- Additional modification to be made later (awaiting reply)
2024-08-08 02:07:15 +02:00
d3a5d3b0fa Some words corrected #3
- Correction of some words suggested by [AntoninDelFabbro](https://github.com/AntoninDelFabbro).
- Additional modification to be made later (awaiting reply)
2024-08-07 13:49:07 +02:00
bc7c70aca6 Correcting some words #2
- I made half of the modifications previously
- Correction of some words suggested by [AntoninDelFabbro](https://github.com/AntoninDelFabbro).
- Additional modification to be made later (awaiting reply)
2024-08-07 13:39:57 +02:00
6cde454bd9 Some words corrected #01
- Correction of some words suggested by [AntoninDelFabbro](https://github.com/AntoninDelFabbro).
- Additional modification to be made later (awaiting reply)
2024-08-07 12:42:06 +02:00
78e20984ed Merge pull request #1778 from ImranR98/dev
Yet another APKPure bugfix (last one)
2024-08-06 16:48:37 -04:00
f963996a19 Version increment 2024-08-06 16:48:02 -04:00
1ddf2869a6 Yet another APKPure bugfix (last one) 2024-08-06 16:47:38 -04:00
f9b97b4469 Merge pull request #1777 from ImranR98/dev
APKPure bugfix: Correctly extract APKs that are multi-arch but not universal
2024-08-06 15:52:31 -04:00
6f706ab493 Update Flutter version + update packages, increment version 2024-08-06 15:51:54 -04:00
ed2e6e2e9e APKPure bugfix: Correctly extract APKs that are multi-arch but not universal 2024-08-06 15:49:44 -04:00
f00758cd83 Merge pull request #1774 from ImranR98/dev
- Fix bug introduced in v1.1.16: APKPure fails to find universal APKs
- Fix bugs found in APKPure URL matching
2024-08-06 11:47:56 -04:00
25bd61f289 Merge pull request #1773 from Kevinr99089/main
Updating certain words (French File)
2024-08-06 11:46:46 -04:00
25d19d22cf Increment version 2024-08-06 11:46:25 -04:00
9ffb91266f Re-order some sources 2024-08-06 11:45:49 -04:00
8d921cfbf1 Fix bugs in APKPure URL matching 2024-08-06 11:45:01 -04:00
3ed6b168e1 Fix bug from previous version: APKPure fails to find universal APKs 2024-08-06 11:36:39 -04:00
4a45c900c3 Some minor corrections
- A job well done is the key (of I don't know what, but it's the key...)
2024-08-06 01:50:03 +02:00
7e9e6958a3 Merge pull request #1771 from Kevinr99089/main
French translation completely revised
2024-08-05 18:01:02 -04:00
9de082f684 Last modification before PR 2024-08-05 23:38:41 +02:00
b40afc7329 Add files via upload 2024-08-05 23:32:32 +02:00
4fb3da45e9 Merge pull request #1770 from ImranR98/dev
- APKPure: Filter releases by available architecture (#598)
- Use a more obvious icon (magnifying glass) for the "filter apps" button (#1762)
2024-08-05 16:33:29 -04:00
1f8e051ed6 Merge remote-tracking branch 'origin/main' into dev 2024-08-05 16:31:15 -04:00
adc4e7c2b4 Fix error after fgbg package update in previous commit 2024-08-05 16:30:12 -04:00
325d2f48dc More consistent tagline 2024-08-05 16:25:02 -04:00
aa00f42a23 Update packages, increment version 2024-08-05 16:24:30 -04:00
62dbffab52 Use a more obvious icon (magnifying glass) for the "filter apps" button (#1762) 2024-08-05 16:21:42 -04:00
fd38444836 Improvement on previous commit 2024-08-05 16:08:12 -04:00
71cc49a30f APKPure: Filter releases by available architecture (#598) 2024-08-05 15:53:44 -04:00
e4187c8e17 Merge pull request #1755 from ImranR98/dev
Update GitLab for new uploads URL scheme (#1742), Ability to share selective exports (#1752)
2024-07-28 17:28:53 -04:00
15ae98d426 Update Flutter + packages, increment version 2024-07-28 17:27:18 -04:00
7b4fa2269e Merge remote-tracking branch 'origin/main' into dev 2024-07-28 17:25:02 -04:00
656e14793d Merge pull request #1748 from asandikci/main
translate: update turkish
2024-07-28 17:24:41 -04:00
d23381147b Merge pull request #1746 from bluefly000/japanese-translation
Update ja.json
2024-07-28 17:24:33 -04:00
cfe184c6d5 Merge pull request #1749 from VladWinner/main
Change the font (support for more languages)
2024-07-28 17:20:21 -04:00
9c16f24a08 Ability to share selective exports (#1752) 2024-07-28 17:18:36 -04:00
ce200403e0 Update GitLab for new uploads URL scheme (#1742) 2024-07-28 16:41:01 -04:00
caca84f84d Change the font (support for more languages) 2024-07-26 01:18:14 +03:00
ac2d7b9639 translate: update turkish 2024-07-24 20:02:57 +03:00
78069a9b26 Update ja.json 2024-07-24 14:35:05 +09:00
3e23fffaea Merge pull request #1725 from ImranR98/dev
- Attempt bugfix for error when on VPN (#1120)
- Translation fixes (#1699)
- GitHub search bugfix (#1705)
- Fix missing trailing slash for path-less URLs (#1715)
- Rename Codeberg to Forgejo (#1722)
- Rename "Version String Extraction" to "Trim Version String" for non-HTML Sources (#1723)
2024-07-14 20:56:22 -04:00
624b9fb6dc Update packages, increment version 2024-07-14 20:50:48 -04:00
fbd6189721 GitHub search bugfix (#1705) 2024-07-14 20:42:20 -04:00
6a44fe227c Fix missing trailing slash for path-less URLs (#1715) 2024-07-14 20:27:42 -04:00
d1cb2688c6 Rename "Version String Extraction" to "Trim Version String" for non-HTML Sources (#1723)
Rename Codeberg to Forgejo (#1722)
2024-07-14 20:20:41 -04:00
b43b2f9740 Merge pull request #1720 from Erudaro/main
Update bs.json
2024-07-14 02:08:43 -04:00
6288a9cb8d Merge pull request #1710 from DwainZwerg/for-eXense-auth-Update-ru.json-see-#1703](https/github.com/ImranR98/Obtainium/issues/1703)
for eXense-auth: Update ru.json (issue#1703)
2024-07-14 02:08:31 -04:00
18c6f75054 Update bs.json 2024-07-13 23:56:33 +00:00
1f8d187b84 Update ru.json
see [#1703](https://github.com/ImranR98/Obtainium/issues/1703)
2024-07-07 12:13:07 +02:00
77618ad1ff Merge remote-tracking branch 'origin/main' into dev 2024-06-30 13:02:43 -04:00
75efd335e9 Update release.yml 2024-06-30 12:56:28 -04:00
c4438de200 Update release.yml 2024-06-30 12:55:38 -04:00
e3c9a227d3 Translation fixes 2024-06-29 17:04:34 -04:00
548f859349 Merge remote-tracking branch 'origin/main' into dev 2024-06-29 16:49:16 -04:00
db413badec Attempt bugfix for error when on VPN (#1120) 2024-06-29 16:48:59 -04:00
dfac3af3f5 Merge pull request #1698 from ImranR98/dev
Bugfix for files with vague 'content-disposition' header (#1697)
2024-06-29 03:03:36 -04:00
5eceaeecde Increment version, run dart fix 2024-06-29 03:02:56 -04:00
62c23004f7 Bugfix for files with vague 'content-disposition' header (#1697) 2024-06-29 03:01:48 -04:00
cd153e7d11 Merge pull request #1696 from ImranR98/dev
- Bugfix: Pull to refresh not working with few apps (#1680)
- Add third-party F-Droid repo search to main search menu (#1681)
- Added autocomplete for F-Droid repos (#1681)
- Bugfix: Missing request headers for direct APK link apps (#1688)
- Release asset download confirmation even for single choice (#1694)
- Add a less obvious touch target to highlights (#1694)
2024-06-28 23:03:14 -04:00
3b494511d7 Merge remote-tracking branch 'origin/main' into dev 2024-06-28 22:54:15 -04:00
6c806a44d4 Merge pull request #1676 from abc0922001/patch-1
add Traditional Chinese translation
2024-06-28 22:54:01 -04:00
c5bac43bfd Merge pull request #1673 from AntoninDelFabbro/patch-1
(following d8c805a + #1670) Undone a mistake
2024-06-28 22:53:52 -04:00
1636281d6d Merge pull request #1674 from catsnote/main
Improved Danish Translation
2024-06-28 22:53:46 -04:00
0f4feb2da6 Merge pull request #1682 from CertainBot/patch-4
Update es.json
2024-06-28 22:53:23 -04:00
c32f34c116 Update packages, increment version 2024-06-28 22:52:24 -04:00
d391c5cfc2 Bugfix: Missing request headers for direct APK link apps (#1688) 2024-06-28 22:50:43 -04:00
bb45a157b3 Add a less obvious touch target to highlights (#1694) 2024-06-28 22:29:34 -04:00
c90a571f89 Release asset download confirmation even for single choice (#1694) 2024-06-28 22:12:45 -04:00
1278407c90 Slight spacing change 2024-06-28 22:04:21 -04:00
dff1b4cf39 Bugfixes for F-Droid repo search (#1681) 2024-06-28 21:55:13 -04:00
105e70a814 F-Droid repo search bugfix (#1681) 2024-06-28 21:28:02 -04:00
2938cea419 Added autocomplete for F-Droid repos (#1681) 2024-06-28 21:03:53 -04:00
9b6b7780d8 Fix F-Droid repo search bugs (#1681) 2024-06-28 20:11:43 -04:00
f53a4f3827 Add third-party F-Droid repo search to main search menu (#1681) 2024-06-28 19:10:45 -04:00
9b0d672553 Bugfix: Pull to refresh not working with few apps (#1680) 2024-06-28 18:51:02 -04:00
9d14145ac2 Update es.json
- English: corrected a few typos and wrong translations
- Español: corregidas faltas y errores de traducción
2024-06-19 19:31:58 +00:00
9948797b25 Create zh-TW.json
add Traditional Chinese translation
2024-06-17 13:08:26 +08:00
cat
a80d9e3623 Improved assets/translations/da.json 2024-06-16 20:22:03 +02:00
37ecb057f9 Undone a mistake 2024-06-15 22:19:42 +02:00
06cbe74c6c Merge pull request #1672 from ImranR98/dev
- Add release date extraction for track-only GitLab and Codeberg apps (#1664)
- Add a scrollbar to the apps page
2024-06-15 02:00:30 -04:00
f5769b85fe Add release date extraction for track-only GitLab and Codeberg apps (#1664) 2024-06-15 01:58:07 -04:00
875868af47 Added DA to the language menu 2024-06-15 01:21:31 -04:00
24ea15d600 Merge remote-tracking branch 'origin/main' into dev 2024-06-15 01:20:23 -04:00
87cdc3dcef Merge pull request #1657 from Grooty12/main
Add da.json
2024-06-15 01:20:01 -04:00
c2f976d7f4 Merge pull request #1670 from AntoninDelFabbro/patch-1
Reworked french translation
2024-06-15 01:19:50 -04:00
ebc46bfd3f Update Flutter submodule 2024-06-15 01:19:33 -04:00
e674f7e89d Merge remote-tracking branch 'origin/main' into dev 2024-06-15 01:19:13 -04:00
86d29b163c Update packages, increment version 2024-06-15 01:19:06 -04:00
a849919799 Add a scrollbar to the apps page 2024-06-15 01:18:50 -04:00
d8c805a6b3 Reworked french translation 2024-06-12 23:07:57 +02:00
8acbd3ef78 "Material You" shouldn't be translated 2024-06-12 20:43:50 +02:00
b81088d767 Add danish translation 2024-06-05 14:33:22 +02:00
7071e34a74 Merge pull request #1643 from ImranR98/dev
- Bugfix: Include GitLab token in APK request (#1622)
- Bugfix: Don't trim trailing slashes when parsing links (#1625)
- Improve contrast of placeholder icon in dark mode (#1637) 
- Improve app loading times
- Revert a previous change to background downloads
- Add a "clear logs" button
2024-05-24 16:27:18 -04:00
6a73ade359 Add a "clear logs" button 2024-05-23 21:18:13 -04:00
6c5e5043a4 Improve icon loading after last commit 2024-05-23 21:02:50 -04:00
5edaf1306d Update packages + Flutter, increment version 2024-05-23 20:17:44 -04:00
5bf7fdb94e Revert a previous change related to BG downloads (did not work as intended) 2024-05-23 20:15:25 -04:00
7808bc5ccb Improve loading time/stability (at the cost of icon flickering) 2024-05-23 20:02:43 -04:00
06a079e452 Attempt to improve load times again + link parsing bugfix (#1625) 2024-05-23 19:35:52 -04:00
de509737e6 Include GitLab token in APK request (#1622) 2024-05-22 19:51:35 -04:00
08a3ba8d13 Merge remote-tracking branch 'origin/main' into dev 2024-05-22 19:37:30 -04:00
2b27902d5f Merge pull request #1633 from teaminh/main
Update vi.json
2024-05-22 19:37:16 -04:00
62185127c2 Merge remote-tracking branch 'origin/main' into dev 2024-05-22 19:36:53 -04:00
9c46e3f88c Attempt to improve app load time
Slight icon opacity tweak (#1637)
2024-05-22 19:35:51 -04:00
daa4de921d Update vi.json 2024-05-19 12:20:28 +07:00
bc977e2a5a Update vi.json 2024-05-19 12:09:36 +07:00
1e3815ca20 Merge pull request #1631 from ImranR98/dev
- Don't use partial downloads for BG tasks (more reliable)
- More accurate error reports for Huawei AppGallery fails
- Various bugfixes
- Update Flutter
2024-05-17 22:35:12 -04:00
0e2fa96b9f More accurate error reports for Huawei AppGallery fails 2024-05-17 16:17:51 -04:00
389aebe54e Various bugfixes 2024-05-17 15:56:41 -04:00
fbfeaf2a91 Update Flutter, packages, increment version 2024-05-16 22:31:21 -04:00
485812d076 Merge remote-tracking branch 'origin/main' into dev 2024-05-16 22:21:58 -04:00
68e98ec719 Don't use partial downloads for BG tasks (more reliable) 2024-05-16 22:21:52 -04:00
cbe41de734 Merge pull request #1620 from mxhdee/main
Update fa.json
2024-05-16 22:11:23 -04:00
abb8641105 Update fa.json 2024-05-13 18:46:01 -04:00
dbcb4b3c09 Merge pull request #1619 from ImranR98/dev
- Bugfix: Get initial data on config import
- Bugfix: Include overrideSource in exported config
2024-05-12 20:47:51 -04:00
b231c756e6 Increment version, update packages 2024-05-12 20:47:06 -04:00
3cb3f7fdd4 Merge remote-tracking branch 'origin/main' into dev 2024-05-12 20:45:34 -04:00
9837e8e325 Merge pull request #1608 from ArcticFoxPro/main
Update zh.json
2024-05-12 20:45:21 -04:00
73d4814f18 Merge pull request #1616 from KoolTechTricks/patch-1
Update ru.json
2024-05-12 20:45:04 -04:00
0a9219c314 Merge pull request #1618 from GitGitro/main
Enable per-app language, closes #1430
2024-05-12 20:44:55 -04:00
56c5a73d9a Bugfix: Get initial data on config import 2024-05-12 20:41:53 -04:00
a30e063246 Bugfix: Include overrideSource in exported config 2024-05-12 20:12:02 -04:00
bd26b6514a Enable per-app language, closes #1430 2024-05-12 18:07:35 +02:00
3ea8c7e888 Update ru.json
Fix incorrect machine translated strings
2024-05-11 21:26:42 +05:00
5f2ec5ce6f Update zh.json 2024-05-07 08:12:17 +08:00
783ce9d555 Update zh.json
`trackOnlyInBrackets`、`searchableInBrackets`:更正半角标点为全角
`enableBackgroundUpdates`:改为“启用全局后台更新”突出全局性
`exemptFromBackgroundUpdates`:“仅此应用生效,即使已启用全局后台更新”更明确了选项条件
`shizukuPretendToBeGooglePlay`:Google Play 不是确定的字符串,在这里指代了 Play Store 实体,无需双引号。
`useLatestAssetDateAsReleaseDate`:英文 Latest 通常在简体中文对应“最新”而非“最近”。
2024-05-06 19:12:38 +08:00
a719b2475b Update zh.json 2024-05-06 13:21:08 +08:00
84df499ea6 Merge pull request #1606 from ImranR98/dev
- Add more links to the settings page (#1554)
- Support for more Huawei AppGallery URL schemes (#1570)
- Fix HTML release asset download (#1578)
- Fix non-APK GitHub release asset downloads (#1581)
- Fix asset date UI (#1590)
2024-05-05 22:07:51 -04:00
0d25b74050 Increment version 2024-05-05 22:05:59 -04:00
0effbc3841 Merge remote-tracking branch 'origin/main' into dev 2024-05-05 22:05:07 -04:00
7478a7af22 Add more links to the settings page (#1554) 2024-05-05 22:03:04 -04:00
0838a6d30b Support for more Huawei AppGallery URL schemes (#1570) 2024-05-05 21:51:05 -04:00
8cee268d13 Fix HTML release asset download (#1578) 2024-05-05 21:43:05 -04:00
a3fddc5400 Fix non-APK GitHub release asset downloads (#1581) 2024-05-05 21:35:16 -04:00
c0a2e372e5 Fix asset date UI (#1590) + update packages 2024-05-05 21:11:59 -04:00
c633963203 Merge pull request #1598 from LilligantMatsuri/main
Update Chinese translation
2024-05-02 09:11:40 -04:00
299f457938 Update zh.json
- Add a missing string and its translation (#L116)
- Correct inaccurate translations
- Minor improvements

Signed-off-by: Matsuri <matsuri@vmoe.info>
2024-05-02 16:00:00 +08:00
37e62c922b Merge pull request #1591 from Hamster45105/main
Fix README link
2024-05-01 09:05:15 -04:00
95722ce47b Fix README link 2024-05-01 16:42:56 +10:00
8b806b3ef1 Merge pull request #1585 from Hamster45105/patch-1
Update README
2024-04-30 16:35:41 -04:00
09221b3526 Update README 2024-04-29 11:56:28 +10:00
31b6250082 Merge pull request #1568 from DwainZwerg/patch-16
Update de.json
2024-04-28 13:32:12 -04:00
07372da91b Merge pull request #1569 from bluefly000/japanese-translation
Update ja.json
2024-04-28 13:32:01 -04:00
5c36bcfb4b Merge pull request #1575 from Stephan-P/patch-1
Update nl.json
2024-04-28 13:31:52 -04:00
e5012b1fcb Merge pull request #1582 from CertainBot/patch-3
Spanish Update
2024-04-28 13:31:43 -04:00
6f951175a4 Spanish Update
English:
- texts homogenized, few corrections
Español:
- homogeneizar textos, algunas correcciones
2024-04-27 17:31:38 +02:00
be52ec372f Update nl.json
Significant overhaul of the Dutch translation including addition of a line that was missing compared to en.json
2024-04-24 20:02:50 +02:00
eb7126afc3 Update ja.json 2024-04-24 13:14:41 +09:00
26fc63a02a Update de.json 2024-04-23 22:15:22 +02:00
d33ca0948f Merge pull request #1567 from ImranR98/dev
- Share apps.obtainium.imranr.dev config links instead of HTML raw (#1553)
- Remove foreground requirement for Shizuku (#1561)
- Fix "illegal encoding" error (#1563)
2024-04-23 14:48:53 -04:00
f76637a2e1 Update packages, increment version 2024-04-23 14:47:13 -04:00
b7de627c7b Share apps.obtainium.imranr.dev config links instead of HTML raw (#1553) 2024-04-23 14:43:37 -04:00
27fc60d437 Fix "illegal encoding" error (#1563), Remove foreground requirement for Shizuku (#1561) 2024-04-23 14:35:28 -04:00
ec240f946e Merge pull request #1555 from DwainZwerg/patch-15
Update de.json
2024-04-23 14:15:56 -04:00
ecd80fc371 Merge pull request #1556 from re7gog/re7gog
Fixes
2024-04-23 14:15:47 -04:00
68fa660e6d Merge pull request #1559 from CertainBot/patch-2
Spanish update
2024-04-23 14:15:37 -04:00
70f9e33d17 Merge pull request #1560 from jmoerschbach/conflicting_provider
Use applicationId for provider authorities
2024-04-23 14:15:09 -04:00
2e2dffd8e2 Merge pull request #1562 from ArcticFoxPro/main
Fix some questions of 简体中文(Simplified Chinese) and English.
2024-04-23 14:15:00 -04:00
0b1d5bf514 Fix some questions of 简体中文(zh-CN) and English.
Google's "Material You" is a specific noun in China, and it can be used directly in English, because Google China is also directly used in English, and translated into Chinese "您的材料" will look strange to Chinese users.
2024-04-22 16:01:21 +08:00
2570c8e289 Use applicationId for provider authorities
Fixes #1378

Instead of hardcoding the authority string, use the ${applicationId} to
always make the provider unique.
2024-04-21 21:49:33 +02:00
43a8ba4de1 Spanish update
- English:
Minor changes.

- Spanish:
Modificaciones menores.
2024-04-21 21:20:55 +02:00
3f2fb1c1ed Update de.json 2024-04-21 15:45:26 +02:00
40d303fb57 Partially rollback system theme (#1552) 2024-04-21 16:31:55 +03:00
2c1687c33d Hide some settings if they are not available 2024-04-21 12:53:57 +03:00
b688e7f160 Fix #968 2024-04-21 12:21:52 +03:00
0c80d88583 Merge pull request #1551 from ImranR98/dev
Minor Adjustments
2024-04-20 19:45:46 -04:00
b293b1e9ff Update Flutter, packages, increment version 2024-04-20 19:44:32 -04:00
61038a8969 Updated translations 2024-04-20 19:38:59 -04:00
b92d1541bf Restore Flutter branch 2024-04-20 19:36:02 -04:00
13f0ccb10d Merge pull request #1548 from re7gog/re7gog
Native and UI improvements
2024-04-20 19:35:37 -04:00
ed732cfad2 Look at all these colors!🌈 2024-04-20 18:24:08 +03:00
fb206aee84 Add system theme api level check 2024-04-20 11:57:12 +03:00
285530784d little 2024-04-20 11:30:34 +03:00
0ddb5b5e81 Merge branch 'main' into re7gog
# Conflicts:
#	pubspec.lock
2024-04-19 18:07:51 +03:00
c16cda1962 Make pretending to be a Google Play setting per app based⚙️ 2024-04-19 17:57:22 +03:00
49022726d3 Shizuku logic 3: Prettify 2024-04-19 16:41:34 +03:00
a311894b9f Shizuku logic 2: Determination of installation 2024-04-18 20:01:40 +03:00
29e13efd66 Change background shizuku logic 2024-04-17 17:05:08 +03:00
8c2a97e092 Merge pull request #1544 from ImranR98/dev
- Don't trust content-length header from sites w/o accept-ranges support (#1542) + bugfixes
- Allow for spaces in HTML link and version filters (#1537)
2024-04-15 19:16:10 -04:00
34d571f586 Merge remote-tracking branch 'origin/main' into dev 2024-04-15 19:14:47 -04:00
a20b87889b Update packages, increment version 2024-04-15 19:14:39 -04:00
c7319cd958 Merge pull request #1540 from o101010/main
Corrects french translations
2024-04-15 19:09:50 -04:00
d61fd800ef Merge pull request #1543 from yurtpage/main
fastlane: i18n ru for app description
2024-04-15 19:09:26 -04:00
12dda8bfa9 Allow for spaces in HTML link and version filters (#1537) 2024-04-15 19:06:24 -04:00
0657f832e1 Don't trust content-length header from sites w/o accept-ranges support (#1542) + bugfixes 2024-04-15 18:39:21 -04:00
6431357b15 ru.json: translate apk.other 2024-04-16 01:16:08 +03:00
dcc42bdfe5 fastlane: i18n ru for app description 2024-04-16 01:09:18 +03:00
85718dc3a3 Update README.md 2024-04-15 17:53:55 -04:00
9dff352796 Update README.md 2024-04-15 17:52:35 -04:00
c5477767a0 Update README.md 2024-04-15 17:52:08 -04:00
3131ef8c4e Neat slider 2024-04-15 12:55:34 +03:00
4d9f05aa87 Corrects french translations
Corrects french translations in fr.json.
2024-04-14 20:52:51 +02:00
7b882d9bd8 Move to plugins🐱🎉 2024-04-14 18:40:32 +03:00
d1a2831922 Merge pull request #1535 from ImranR98/dev
Update packages, increment version
2024-04-13 03:09:10 -04:00
b042050ea3 Update packages, increment version 2024-04-13 03:05:44 -04:00
2d43dfe0a7 Merge pull request #1525 from gidano/main
Update hu.json
2024-04-13 03:04:13 -04:00
b1a740223c Merge pull request #1529 from DwainZwerg/patch-14
Update de.json
2024-04-13 03:04:02 -04:00
41c98d97b1 Merge pull request #1532 from gepbird/fix-generated-form-update
Fix out of bounds array access in GeneratedForm update
2024-04-13 03:03:47 -04:00
fb06babb96 Merge branch 'main' into re7gog 2024-04-12 13:21:52 +03:00
ccc0e7696b Fix out of bounds array access in GeneratedForm update 2024-04-08 21:45:19 +02:00
6d41ed8011 Update de.json
Corrected translation
2024-04-08 08:44:28 +02:00
c1476a7d58 Update hu.json 2024-04-07 09:37:28 +02:00
b1ee39be3b Merge pull request #1524 from ImranR98/dev
Add release asset download button (#1493) + Minor UI change
2024-04-07 02:25:27 -04:00
c2ccdd3d05 Merge remote-tracking branch 'origin/main' into dev 2024-04-07 02:21:45 -04:00
a621f1dfb4 Update packages, increment version 2024-04-07 02:21:38 -04:00
8527ad0007 Bugfix in release asset download 2024-04-07 02:19:40 -04:00
377ecef1b4 More resilient release asset import (if Downloads inaccessible, use export dir) 2024-04-07 02:18:26 -04:00
1f9921e6ff UI improvements 2024-04-07 02:13:36 -04:00
00988ed04d Improve release asset download UI 2024-04-07 01:41:35 -04:00
3d1113c057 Add release asset download button (#1493) 2024-04-07 01:28:45 -04:00
1c81f0c1e1 Merge pull request #1516 from ImranR98/dev
* Add support for GitLab CI artifact links in releases (#1506)
* Improve load speed on return to foreground
2024-04-03 18:15:44 -04:00
b26043ef5e Merge remote-tracking branch 'origin/main' into dev 2024-04-03 18:14:04 -04:00
e3ad144c06 Merge pull request #1503 from ngocanhtve/main
Update vi.json
2024-04-03 18:13:53 -04:00
fdb45c48ce Upgrade packages, increment version 2024-04-03 18:12:42 -04:00
8619cfa819 Add support for GitLab CI artifact links in releases (#1506) 2024-04-02 14:07:32 -04:00
1fe4cdd648 Improve load speed on return to foreground 2024-04-02 13:45:32 -04:00
2289e58dda Move to fonts plugin 2024-03-31 14:18:21 +03:00
049bcfbaf5 Ooops 2024-03-30 16:11:55 +03:00
5b5f922b54 Synced 2024-03-30 15:58:28 +03:00
6545498c21 Return random request code 2024-03-30 15:39:48 +03:00
ce22197ec9 Update vi.json
Complete.
2024-03-29 12:07:13 +07:00
f3d2dfe386 Update release.yml 2024-03-29 00:23:06 -04:00
677790af9c Update release.yml 2024-03-29 00:22:43 -04:00
85941349d8 Update release.yml 2024-03-29 00:17:35 -04:00
db755e0f90 Update release.yml 2024-03-29 00:14:26 -04:00
1019a01249 Update release.yml 2024-03-29 00:02:11 -04:00
35da44bc64 Update release.yml 2024-03-29 00:00:53 -04:00
b7ce07f965 Merge pull request #1502 from ImranR98/dev
- Added 'Share new Apps with AppVerifier' (#255)
- **Removed SourceForge (#1487)**
- Delete downloaded APK on install fail (#1495)
- Fix GitLab's broken track-only mode (#1496)
- Auto-delete download if likely invalid (#1498)
2024-03-28 23:43:25 -04:00
f2c15c5c8e Update packages and Flutter, increment version 2024-03-28 23:40:36 -04:00
8f0a6b7635 Merge remote-tracking branch 'origin/main' into dev 2024-03-28 23:40:11 -04:00
491c42d68b Removed SourceForge (#1487) 2024-03-28 23:27:22 -04:00
a883857230 Auto-delete download if likely invalid (#1498) 2024-03-28 23:13:45 -04:00
6468d0edcc Fix GitLab's broken track-only mode (#1496) 2024-03-28 23:05:16 -04:00
48eeeb4f00 Merge remote-tracking branch 'origin/main' into dev 2024-03-28 22:29:52 -04:00
0b25f25669 Merge pull request #1486 from fitojb/patch-1
Fixes to Spanish translation
2024-03-28 22:29:45 -04:00
d76b7375cb Added 'Share new Apps with AppVerifier' (#255) 2024-03-28 22:28:55 -04:00
f76aa51b54 Delete downloaded APK on install fail (#1495) 2024-03-23 19:26:39 -04:00
9e19a293d4 Fixes to Spanish translation
Includes assorted typography and treatment fixes.
2024-03-18 17:52:08 -06:00
381758550c Merge pull request #1478 from ImranR98/dev
Resume failed downloads when possible instead of starting again (#634), Typo: 'Installed' not 'Updated' (#1469) + Bugfix: Don't incorrectly show message when user cancel, Add changelog button to app page (#1474)
2024-03-17 05:15:46 -04:00
da496f7c53 GitHub actions: Don't add '-beta' to beta tags (pre-release mark is enough) 2024-03-17 05:14:08 -04:00
f905aa7dfd Made required changes according to https://docs.flutter.dev/release/breaking-changes/flutter-gradle-plugin-apply 2024-03-17 05:12:31 -04:00
0db27c773b Upgrade packages, increment version 2024-03-17 04:52:17 -04:00
4e968826ba Add changelog button to app page (#1474) 2024-03-17 04:15:43 -04:00
e95f575530 Typo: 'Installed' not 'Updated' (#1469) + Bugfix: Don't incorrectly show message when user cancels 2024-03-17 04:01:09 -04:00
3943caeedb Resume failed downloads when possible (#634) 2024-03-17 03:04:05 -04:00
4495051813 Merge pull request #1464 from dik08razz/main
Update uk.json
2024-03-10 14:40:28 -04:00
558d23b8c0 Update uk.json 2024-03-09 23:28:12 +02:00
2e90d1fb18 Update uk.json 2024-03-09 22:37:27 +02:00
9dae24ace6 Merge pull request #1462 from ImranR98/dev
Removed outdated translations related to #1459
2024-03-09 14:25:50 -05:00
b6e6568500 Increment version, upgrade Flutter + packages 2024-03-09 14:24:13 -05:00
a8eae7f04b Merge remote-tracking branch 'origin/main' into dev 2024-03-09 14:18:36 -05:00
4902e0ef06 Removed outdated translations related to #1459 2024-03-09 14:17:18 -05:00
e6926a714f Merge pull request #1442 from gidano/main
Update hu.json
2024-03-09 14:08:15 -05:00
c9eee4331d Merge pull request #1444 from rollsicecream/main
Fix 'F-Droid' translation' in fr.json
2024-03-09 14:08:09 -05:00
9a8cc2e5c3 Merge pull request #1445 from LilligantMatsuri/main
Update Chinese translation
2024-03-09 14:07:54 -05:00
a7c9cd0f27 Merge pull request #1448 from dik08razz/dev
add ukrainian
2024-03-09 14:07:49 -05:00
efc6846c1c Merge pull request #1459 from akramer-zibra/improve-gitlab-apk-retrieval
Improve gitlab .apk retrieval (#1450, #1381, #1380)
2024-03-09 14:07:36 -05:00
89edddd38c Merge pull request #1461 from ImranR98/dev
Fix bug in GitHub's 'verify latest' option (#1449)
2024-03-09 14:06:24 -05:00
e7c2112f41 Bugfix from prev. commit 2024-03-09 13:50:22 -05:00
d8cd3b6c92 Remove unused package import 2024-03-09 10:17:27 +01:00
bb1dd4ecfd Inject Private Access Token as optional request param
It turned out: If the parameter `private_token` is given but empty, the Gitlab REST API does expect a valid access token otherwise responds with an authorization error
2024-03-09 10:16:54 +01:00
3824b386d7 Regroup functions by their intention
This may prepare for later refactorings and code simplification
2024-03-09 10:11:54 +01:00
a9159fc8a0 Remove .apk retrieval from tags-feed
So this code does focus on the official Gitlab REST API. With this the retrieval logic changes.
2024-03-09 09:23:48 +01:00
7f4cf6e681 Fix bug in GitHub's 'verify latest' option (#1449) 2024-03-05 10:37:36 -05:00
215f05fbc2 add ukrainian 2024-03-04 18:14:37 +02:00
6d6afe9e69 Fix 'F-Droid' translation' in fr.json 2024-03-03 18:30:48 +01:00
66122f1608 Update zh.json
- Translate new strings
- Correct inaccurate translations

Signed-off-by: Matsuri <matsuri@vmoe.info>
2024-03-03 23:58:18 +08:00
0ad9bbdd8e Update hu.json 2024-03-03 09:32:21 +01:00
59cc08f28a Merge pull request #1439 from ImranR98/dev
- Allow any source to be overridden (#1420)
- Bugfix for installing apps with ID change step (#1424)
- Bugfix: 'null' changelog for some track-only apps (#1425)
- Show latest APK name/count on app page (#1426)
- More BG update interval options (#1431)
2024-03-01 20:37:02 -05:00
afc0c3a2fa Upgrade packages, increment version 2024-03-01 20:34:15 -05:00
a827046acc More BG update interval options (#1431) 2024-03-01 20:21:46 -05:00
fd8f967036 Show latest APK name/count on app page (#1426) 2024-03-01 20:18:07 -05:00
26be524c6d Bugfix: 'null' changelog for some track-only apps (#1425) 2024-03-01 19:50:04 -05:00
8ec3360575 Merge remote-tracking branch 'origin/main' into dev 2024-03-01 19:46:38 -05:00
f66753498b Bugfix for installing apps with ID change step (#1424) 2024-03-01 19:46:30 -05:00
90e6e5a3a3 Update README.md 2024-02-29 19:17:53 -05:00
2c4713ff25 Merge pull request #1411 from akramer-zibra/fix-gitlab-request-headers
Solve issues with gitlab .apk files and cloudflare protection
2024-02-26 10:56:11 -05:00
ef3b01ac56 Use gitlab host defined in class member variable 2024-02-26 13:42:56 +01:00
1cfb258dcc Allow any source to be overridden (#1420) 2024-02-25 15:41:12 -05:00
d13464a392 Merge pull request #1415 from ngocanhtve/main
Update vi.json
2024-02-25 14:20:38 -05:00
f1dd50faee Merge pull request #1413 from DwainZwerg/patch-13
Update README.md
2024-02-25 14:20:27 -05:00
6f5315db27 Update vi.json 2024-02-20 21:00:39 +07:00
02922c3c8e Merge remote-tracking branch 'upstream/main' 2024-02-20 20:35:07 +07:00
03ef649c0f Update README.md
Add IzzyOnDroid-Badge, since it isn't out of day
2024-02-20 09:38:57 +00:00
9083e28637 Merge branch 'main' into fix-gitlab-request-headers 2024-02-19 16:16:42 +01:00
cfa4c680cf Set referer header for gitlab app source context
There occur issues if a gitlab project refers in its release data to external hosted .apk file. In some cases (e.g. Aurora Store) download is not possible because cloudflare protection gives "forbidden" error. The referer header seems to pacify this cloudflare protection. Tested with Android 14 in an AVD emulator.

Related to: #1397, #1389, #1384, #1382, #1381, #1380, #1359, #854, #785, #697
2024-02-19 16:02:49 +01:00
a5b3b9d1d0 Merge pull request #1408 from ImranR98/dev
- Improved URL handling for F-Droid third party repos (#1399)
- Fixed F-Droid repo search (#1400) + general search bugfixes
- Improved APK filter for F-Droid (#1386)
- Don't remove storage permission (#1391)
- Jump in versionCode to fix updates in x86 versions (#1370)
2024-02-18 18:20:54 -05:00
13cd7e76c1 Update Flutter + packages, increment version 2024-02-18 18:19:29 -05:00
6e7ccfba37 Merge remote-tracking branch 'origin/main' into dev 2024-02-18 18:18:40 -05:00
34fd673e25 Jump in versionCode to fix updates in x86 versions (#1370) 2024-02-18 18:16:33 -05:00
db484f7b28 Don't remove storage permission (#1391) 2024-02-18 18:13:17 -05:00
b4cf0f5d29 Improved APK filter for F-Droid (#1386) 2024-02-18 18:00:03 -05:00
4db205dd9a Fixed F-Droid repo search (#1400) + general search bugfixes 2024-02-18 17:43:24 -05:00
64f8e2a57b Improved URL handling for F-Droid third party repos (#1399) 2024-02-18 17:00:56 -05:00
eddc245ff4 Update issue templates 2024-02-15 17:13:02 -05:00
9717db0ca4 Probably fixed 2024-02-05 18:26:17 +03:00
ed2f0f2c0c Merge pull request #1368 from gidano/main
Update hu.json
2024-02-03 15:47:45 -05:00
7d5a422855 Merge pull request #1371 from inson1/patch-1
Add F-droid badge to README.md
2024-02-03 15:47:28 -05:00
e420862546 Add F-droid badge to README.md 2024-02-03 17:45:32 +01:00
2cc59948a7 Update hu.json 2024-02-03 10:59:10 +01:00
188d33199e Merge pull request #1365 from heuwerk/patch-1
Update de.json
2024-02-03 04:29:36 -05:00
24928261bb Merge pull request #1367 from ImranR98/dev
Updated a package
2024-02-03 04:29:26 -05:00
4c7bda8343 Updated a package 2024-02-03 04:24:59 -05:00
d88709c999 Update de.json
Added forgotten translation
2024-02-02 11:30:20 +01:00
29e1481a3b Update de.json
Changed "Update" in translated text to "Aktualisierung", since it is used everywhere else.
2024-02-02 11:24:47 +01:00
9d76359543 Merge pull request #1364 from ImranR98/dev
Add DeepL translations as placeholders
2024-02-01 20:34:46 -05:00
f50e791221 Add DeepL translations as placeholders 2024-02-01 20:34:32 -05:00
7d08e5225c Merge pull request #1363 from ImranR98/dev
Correctly report and auto-delete bad APKs (#1251)
2024-02-01 19:32:15 -05:00
3842c1e2df Update packages, increment version 2024-02-01 19:31:32 -05:00
21b1990991 Merge remote-tracking branch 'origin/main' into dev 2024-02-01 19:31:19 -05:00
e278c9fb5a Correctly report and auto-delete bad APKs (#1251) 2024-02-01 19:26:36 -05:00
bfa29bb7c2 Merge pull request #1361 from DwainZwerg/patch-12
Translation of the Note of the sources window
2024-02-01 19:00:41 -05:00
efa55a9696 Update de.json
Okay → OK because it’s shorter and more common
2024-01-31 14:55:23 +00:00
8888cd6264 Update de.json
Translation of the note of the Sources Menu
2024-01-31 14:51:08 +00:00
34e2c014e3 Merge pull request #1357 from jont4/main
Update pt translation
2024-01-29 18:44:36 -05:00
5d92a6d013 Update pt translation 2024-01-28 22:58:17 -03:00
fb03b2e95c Merge pull request #1356 from ImranR98/dev
Better support for SourceForge (#1352), Remove READ_EXTERNAL_STORAGE again (#1309) + fix typo
2024-01-28 17:00:10 -05:00
5a1e09564c Merge pull request #1350 from gidano/main
Update hu.json
2024-01-28 16:58:53 -05:00
3783eba401 Merge pull request #1351 from unbranched/patch-5
Update it.json
2024-01-28 16:58:39 -05:00
a3530ce6bb Remove READ_EXTERNAL_STORAGE again (#1309) + fix typo 2024-01-28 16:58:09 -05:00
27d8655d58 Better support for SourceForge (#1352) 2024-01-28 16:32:58 -05:00
fb845ce601 Update it.json 2024-01-28 10:59:15 +00:00
dbd433df9d Update hu.json 2024-01-28 09:15:28 +01:00
badf32ff11 Merge pull request #1349 from ImranR98/dev
- Allow existing '/refs' in SourceHut URLs (#1347)
- Revert to showing App URL separately again (#1336)
- F-Droid: Don't pull changelog text if it isn't a raw file from GitHub/GitLab (#1340)
- Add a note on self-hosted instances of sources (#1342)
- versionCode changes
2024-01-27 22:00:54 -05:00
5e40f3264e Merge pull request #1337 from jont4/main
Translation: pt update
2024-01-27 21:58:41 -05:00
71bb6d9410 Merge pull request #1338 from teaminh/main
Update vi.json
2024-01-27 21:58:14 -05:00
731b682fc9 Merge pull request #1339 from DwainZwerg/patch-11
Update de.json
2024-01-27 21:57:03 -05:00
c9751227a5 Flutter upgrade + versionCode changes + increment version 2024-01-27 21:56:26 -05:00
6ef2a26e94 Add a note on self-hosted instances of sources (#1342) 2024-01-27 21:26:32 -05:00
5a8efa2388 F-Droid: Don't pull changelog text if it isn't a raw file from GitHub/GitLab (#1340) 2024-01-27 21:01:44 -05:00
d25895fa28 Revert to showing App URL separately again (#1336) 2024-01-27 20:13:01 -05:00
de09f3ece2 Allow existing '/refs' in SourceHut URLs (#1347) 2024-01-27 20:08:05 -05:00
1135ffb30f Update de.json
Better Translation of "latest"
2024-01-25 13:49:57 +00:00
5379cb31e8 Update vi.json 2024-01-25 18:31:46 +07:00
7d41ab44b7 Minor update 2024-01-24 23:21:42 -03:00
b239f9bd05 Merge pull request #1335 from ImranR98/dev
Don't include prereleases in default app entry
2024-01-24 20:15:35 -05:00
1acc923ec2 Don't include prereleases in default app entry 2024-01-24 20:15:13 -05:00
8d6edfb91f Update release.yml 2024-01-24 20:12:56 -05:00
491b62bb0d Update release.yml 2024-01-24 20:10:02 -05:00
d1413fc478 Update release.yml 2024-01-24 20:05:47 -05:00
761f7039e9 Merge pull request #1334 from ImranR98/dev
- De-emphasize 'reset install status' button to avoid confusion
- Minor bugfix (#1331)
2024-01-24 19:54:16 -05:00
59783a341d Upgrade packages, increment version (1.0.0) 2024-01-24 19:53:31 -05:00
0100fa4236 Merge remote-tracking branch 'origin/main' into dev 2024-01-24 19:52:42 -05:00
f6f9ed68dc Merge pull request #1332 from palopezv/patch-1
Update es.json
2024-01-24 19:50:46 -05:00
8adb5e84d1 Reordered a button for consistency 2024-01-24 19:50:11 -05:00
3940b65156 De-emphasize 'reset install status' button to avoid confusion 2024-01-24 19:49:07 -05:00
98e7f27eab Merge remote-tracking branch 'origin/main' into dev 2024-01-24 19:33:45 -05:00
7cf5cafd75 Minor bugfix (#1331) 2024-01-24 19:28:40 -05:00
d750e35273 Update release.yml 2024-01-24 19:22:56 -05:00
1f12e12130 Update es.json
I'm submitting a revision (call it heartless copy editing :😉:) of the Spanish translation file. This revision corrects several grammatical errors, most are syntactical and semantic, some stylistic in order to correct literal (and intellegible) translations and typos.
2024-01-24 16:11:54 -05:00
4a4fb4716e Merge pull request #1328 from ImranR98/dev
Updated modules
2024-01-23 11:37:29 -05:00
efe6ec0d43 Updated modules 2024-01-23 11:37:08 -05:00
00d605e195 Merge pull request #1325 from ImranR98/dev
Update Flutter submodule and make GitHub actions error out if it doesn't match latest/stable
2024-01-22 12:22:15 -05:00
f06de8d19f Update Flutter submodule and make GitHub actions error out if it doesn't match latest/stable 2024-01-22 12:21:38 -05:00
fac335c849 Merge pull request #1324 from p1gp1g/reproducible-build
Add flutter as a submodule (again)
2024-01-22 12:07:43 -05:00
5bef546ae4 Merge pull request #1323 from DwainZwerg/patch-10
Update de.json
2024-01-21 14:13:07 -05:00
b690cd6a67 Update de.json
Edit german translation
2024-01-21 18:59:22 +00:00
dbee4a2657 Merge pull request #1316 from bluefly000/japanese-translation
Update ja.json
2024-01-21 12:35:30 -05:00
67420f293b Merge pull request #1319 from teaminh/main
Update vi.json
2024-01-21 12:35:23 -05:00
d1d6b0792b Merge pull request #1322 from ygxbnet/patch-1
Update zh.json
2024-01-21 12:35:17 -05:00
2ec039ba0f Update zh.json 2024-01-21 23:38:20 +08:00
4b9b9a10ad Update vi.json 2024-01-21 10:00:00 +07:00
4193d8ada1 Update ja.json 2024-01-21 10:19:35 +09:00
4701b090b0 Update ja.json 2024-01-21 10:18:45 +09:00
8b0c85827c Merge pull request #1315 from ClockGen/fastlane
Added fastlane structure for F-Droid
2024-01-20 19:26:31 -05:00
57e02d1c80 Added initial fastlane structure 2024-01-21 01:51:57 +03:00
4446929b10 Merge pull request #1314 from ImranR98/dev
Remove unnecessary padding from badge graphic
2024-01-20 16:42:25 -05:00
c31f65b0e4 Remove unnecessary padding from badge graphic 2024-01-20 16:42:01 -05:00
f6c3b8dceb Merge pull request #1313 from ImranR98/dev
Increment version
2024-01-20 16:31:49 -05:00
10bd825972 Increment version 2024-01-20 16:31:30 -05:00
303bee7c57 Merge pull request #1312 from ImranR98/dev
Bugfix: don't show 'Apps Updated' toast when nothing was updated (#1307), Disable app page buttons while app info is being updated
2024-01-20 16:29:47 -05:00
369ae43062 Disable app page buttons while app info is being updated 2024-01-20 16:28:54 -05:00
62dc7fd88b Bugfix: don't show 'Apps Updated' toast when nothing was updated (#1307) 2024-01-20 16:18:19 -05:00
4aace63cd7 Merge pull request #1311 from ImranR98/dev
Removed unnecessary READ_EXTERNAL_STORAGE permission (#1309)
2024-01-20 16:05:33 -05:00
5d588a05a7 Removed unnecessary READ_EXTERNAL_STORAGE permission (#1309) 2024-01-20 16:04:17 -05:00
cab6f9d026 Merge pull request #1310 from ImranR98/dev
"Standardize" translation files + use machine-translations as placeholders for missing translations
2024-01-20 15:42:24 -05:00
fc94d553eb Merge remote-tracking branch 'origin/main' into dev 2024-01-20 15:41:44 -05:00
2952345585 Use machine-translations as placeholders for missing translations 2024-01-20 15:39:10 -05:00
becc3828b7 Remove some unused translations 2024-01-20 14:58:37 -05:00
2a62248991 "Standardize" translation files 2024-01-20 14:45:28 -05:00
eb2b31219c Merge pull request #1306 from gidano/main
Update hu.json
2024-01-20 14:31:51 -05:00
55053f9627 Merge pull request #1304 from bluefly000/japanese-translation
Update ja.json
2024-01-20 14:31:19 -05:00
5ff6c64938 Update hu.json 2024-01-20 10:35:18 +01:00
c1c517cf38 Update ja.json 2024-01-20 18:21:00 +09:00
b3de2e5d6b Merge pull request #1303 from ImranR98/dev
- Better partial APK hash as pseudo-version (related to #1101)
- Support Direct APK Links (#1292)
- Easier to understand version detection settings
- Bugfix in automatic source selection for URL input
- Various UI improvements and wording changes
- Add invert option to apk filter regex 
- Filter out fdroid APKs from default Obtainium entry (for later)
2024-01-19 23:41:27 -05:00
0183070b2b Merge remote-tracking branch 'origin/main' into dev 2024-01-19 23:38:23 -05:00
089bbc3ee9 Merge pull request #1291 from Bardesss/patch-1
Update nl.json
2024-01-19 23:29:49 -05:00
b085801c2c Merge pull request #1298 from jont4/main
Translation: Some fixes and updates in pt.json
2024-01-19 23:29:40 -05:00
ad4cae4288 Add F-Droid build to GitHub action 2024-01-19 23:29:22 -05:00
95c285e1f7 Filter out fdroid APKs from default Obtainium entry 2024-01-19 23:25:00 -05:00
c31a1912a5 Add invert option to apk filter regex 2024-01-19 23:22:00 -05:00
99da1f8481 Upgrade packages, increment version 2024-01-19 20:41:07 -05:00
bf6b3a7da0 UI bug 2024-01-19 20:36:40 -05:00
4ab4f58f65 Cleaner 'add app' page 2024-01-19 20:35:44 -05:00
29a76ac8e6 Removed unused divider and commented code on settings page 2024-01-19 19:59:30 -05:00
e2761ce284 UI improvements on app page 2024-01-19 19:57:28 -05:00
dc45334cb9 Support Direct APK Links (#1292) 2024-01-19 18:54:01 -05:00
56052bfd79 Bugfix in version detection toggles 2024-01-19 00:43:02 -05:00
f5067d636a More UI tweaks 2024-01-19 00:21:57 -05:00
b173b1300a Clearer wording 2024-01-19 00:12:43 -05:00
15a34e53bf Bugfix in automatic source selection for URL input 2024-01-19 00:00:47 -05:00
183fb26988 Clearer version detection settings 2024-01-18 23:46:23 -05:00
2da9a8cd59 Remove unnecessary print() 2024-01-18 20:45:34 -05:00
bb07000280 Better partial APK hash as pseudo-version (related to #1101) 2024-01-18 20:45:06 -05:00
3a46ad2957 Some fixes and updates 2024-01-16 15:48:59 -03:00
6b631d119c Merge branch 'ImranR98:main' into main 2024-01-16 15:24:02 -03:00
051762fcc1 Update nl.json
Added new strings.
2024-01-15 11:38:00 +00:00
595d5dc283 Merge pull request #1289 from ImranR98/dev
Added badge graphic (#1287)
2024-01-14 15:14:41 -05:00
1d328f07e2 Merge remote-tracking branch 'origin/main' into dev 2024-01-14 15:14:01 -05:00
b1c8ac6f2a Added badge graphic (#1287) 2024-01-14 15:09:16 -05:00
da619d37f7 Merge pull request #1288 from iDazai/main
Update de.json
2024-01-14 14:56:54 -05:00
236c4722e5 Update de.json
added 2 missing strings, translated new strings
2024-01-14 15:36:08 +01:00
92f59116a0 Merge remote-tracking branch 'origin/main' into dev 2024-01-14 01:37:17 -05:00
c28040f0cb Merge remote-tracking branch 'origin/main' into dev 2024-01-14 01:36:43 -05:00
e8b9654320 Update release.yml 2024-01-14 01:36:35 -05:00
be1a793a37 Update release.yml 2024-01-14 01:34:32 -05:00
440720afb6 Update release.yml 2024-01-14 01:31:42 -05:00
900d3e734e Update release.yml 2024-01-14 01:27:13 -05:00
0bf096abb5 Temporary GitHub action change 2024-01-14 01:26:17 -05:00
632efb9e22 Merge remote-tracking branch 'origin/main' into dev 2024-01-14 01:24:50 -05:00
bfc506e450 Merge pull request #1285 from ImranR98/dev
- Improve loading time (parallelize version detection)
- Newest asset upload date as release date for GitHub (#1284)
- Enable 'start on boot' for BG task (#1234)
- Remove the need to hardcode Obtainium's version number
2024-01-14 01:24:25 -05:00
ffe612708c Remove the need to hardcode Obtainium's version number 2024-01-14 01:22:35 -05:00
5d161160aa Increment version 2024-01-14 00:56:25 -05:00
eadf3e5a29 Enable 'start on boot' for BG task (#1234) 2024-01-14 00:22:25 -05:00
6b6b4084a0 Newest asset upload date as release date for GitHub (#1284) 2024-01-14 00:14:44 -05:00
30a4633f72 Improve loading time (parallelize version detection) 2024-01-13 23:26:57 -05:00
d44139dd72 Merge pull request #1281 from ImranR98/dev
Allow entire app config to be shared as link (see https://github.com/ImranR98/apps.obtainium.imranr.dev/issues/5)
2024-01-12 23:47:31 -05:00
60869a0490 Allow entire app config to be shared as link (see https://github.com/ImranR98/apps.obtainium.imranr.dev/issues/5) 2024-01-12 23:46:50 -05:00
102be5fa2e Merge pull request #1280 from ImranR98/dev
- Fix form input issues (related to #1272)
- HTML Source bugfix (related to #1259)
2024-01-12 22:32:49 -05:00
a25c04b390 Update packages, increment version, dart fix 2024-01-12 22:32:33 -05:00
d46f0a1c33 HTML Source bugfix (related to #1259) 2024-01-12 22:16:06 -05:00
5c7f5a99e1 Attempt to fix form input issues for recursive forms (NOT FULLY TESTED) 2024-01-12 21:51:48 -05:00
d949a80f19 Merge pull request #1279 from gidano/main
Update hu.json
2024-01-12 20:29:33 -05:00
6b5d4e2027 Merge pull request #1278 from mehdeej/main
Update fa.json
2024-01-12 20:29:25 -05:00
199d071ee8 Update hu.json 2024-01-12 15:45:26 +01:00
5b78de5d61 Merge branch 'ImranR98:main' into main 2024-01-12 05:46:33 -03:00
db4f13e2e1 Update fa.json 2024-01-12 07:32:52 +03:30
5e869b7e03 Update release.yml 2024-01-11 21:58:48 -05:00
34fee36132 Merge pull request #1277 from ImranR98/dev
- Fix APKPure downloads (#1250)
- F-Droid bugfix (#1264)
- Allow versionCode to be used as the version for comparison (#1269)
- Add custom header support to HTML (#709, #1272)
- Disabled Mullvad source (#1276)
- Bugfixes: Don't make URLs lowercase, never auto-select Jenkins
2024-01-11 21:44:36 -05:00
ea09bc36a5 Merge branch 'main' into dev 2024-01-11 21:44:24 -05:00
f7e0678cb2 Remove unused variable 2024-01-11 21:39:41 -05:00
223ae378a9 Update packages, increment version 2024-01-11 21:39:26 -05:00
6f52a48991 Merge remote-tracking branch 'origin/main' into dev 2024-01-11 21:36:15 -05:00
0280935955 Merge pull request #1268 from bluefly000/japanese-translation
Update ja.json
2024-01-11 21:36:03 -05:00
eebc7d9ab3 Merge pull request #1271 from pmtpro/main
update vi.json
2024-01-11 21:35:53 -05:00
aa7b5652ff Fix APKPure downloads (#1250) 2024-01-11 21:34:46 -05:00
ec6683a198 Bugfixes: Don't make URLs lowercase, never auto-select Jenkins 2024-01-11 21:28:15 -05:00
05372924a0 F-Droid bugfix (#1264) 2024-01-11 21:16:25 -05:00
e63c1399dd Allow versionCode to be used as the version for comparison (#1269) 2024-01-11 20:10:20 -05:00
4fcad92e1d Disabled Mullvad source (#1276) 2024-01-11 19:50:51 -05:00
e18e7298bc GeneratedFormSubForm UI improvements 2024-01-11 19:43:17 -05:00
76a6a509cd Header usage bugfix 2024-01-11 19:23:59 -05:00
7a03561ff6 Add custom header support to HTML (#709, #1272) 2024-01-11 19:01:17 -05:00
70e54ce14a F-Droid small fix 2024-01-10 18:51:22 -05:00
b5f86f0e79 update vi.json 2024-01-10 10:20:59 +07:00
4ebca49ef7 Update ja.json 2024-01-09 22:26:11 +09:00
49cfa95463 Merge pull request #1265 from ImranR98/dev
- Multi-host support + add '.net' host to APKPure source (#1250)
- HTML link parsing bugfix (#1259)
- APKMirror version extraction bugfix (#1264)
2024-01-08 19:28:31 -05:00
4600ab0593 Increment version 2024-01-08 19:20:08 -05:00
7f2ca98bde Multi-host support + add '.net' host to APKPure source (#1250) 2024-01-08 19:17:50 -05:00
6511485bcf APKMirror version extraction bugfix (#1264) 2024-01-08 18:33:24 -05:00
fd22113e44 HTML link parsing bugfix (#1259) 2024-01-08 18:18:57 -05:00
f2ae078723 Merge branch 'ImranR98:main' into main 2024-01-08 18:20:27 -03:00
c3dacf2b9b Translation: tiny bug 2024-01-08 18:18:57 -03:00
e8580dc1d5 Merge pull request #1257 from ImranR98/dev
Add F-Droid changelogs (#1255), Fix corrupt pt.json (#1256)
2024-01-07 21:59:17 -05:00
daffff7eb0 Add F-Droid changelogs (#1255) 2024-01-07 21:57:23 -05:00
751fda5e37 Increment version 2024-01-07 21:45:41 -05:00
1e38abc500 Fix corrupt pt.json (#1256) 2024-01-07 21:40:56 -05:00
8e7137815b Merge pull request #1254 from ImranR98/dev
URL parsing bugfix for HTML source (#1253)
2024-01-07 12:37:51 -05:00
4226ee453f Merge remote-tracking branch 'origin/main' into dev 2024-01-07 12:37:14 -05:00
568a110443 Merge pull request #1249 from LilligantMatsuri/main
Update Chinese translation
2024-01-07 12:37:00 -05:00
7fd7a6ca8d Merge pull request #1252 from jont4/main
Translation: many fixes in PT translation
2024-01-07 12:36:47 -05:00
3092c854ff Increment version 2024-01-07 12:36:20 -05:00
a9566f4b23 Remove redundant function call 2024-01-07 12:34:09 -05:00
7a5aa3c11d URL parsing bugfix for HTML source (#1253) 2024-01-07 12:33:06 -05:00
f2454bb028 Translation: many fixes in PT translation 2024-01-07 12:28:24 -03:00
2c1023a6fd Update zh.json
- Add & translate new strings
- Correct inaccurate translations

Signed-off-by: Matsuri <matsuri@vmoe.info>
2024-01-07 16:55:00 +08:00
9187ac6684 Merge pull request #1248 from ImranR98/dev
Removed Steam Source (existing apps auto-switched to HTML) (#1244) + Bugfixes
2024-01-06 23:39:11 -05:00
9640e43bc5 Upgrade packages, increment version 2024-01-06 23:38:36 -05:00
09b24b36f2 Removed Steam Source (existing apps auto-switched to HTML) (#1244) + bugfixes 2024-01-06 23:37:27 -05:00
06a761c0d0 Merge pull request #1247 from CertainBot/main
Update Spanish
2024-01-06 22:46:06 -05:00
6ff7d7fcd7 Merge pull request #1246 from bluefly000/japanese-translation
Update ja.json
2024-01-06 22:45:47 -05:00
0f27c79303 Merge pull request #1243 from pmtpro/patch-1
Update vi.json
2024-01-06 22:45:25 -05:00
9961ad081f Update Spanish
- English: new strings, typos, minor changes
- Español: strings nuevos, correcciones, algunas mejoras
2024-01-07 02:55:18 +01:00
02056b4f78 Update ja.json 2024-01-06 01:05:52 +09:00
0492588c25 Update vi.json 2024-01-04 09:26:37 +07:00
ad8463ac8b Update README.md 2024-01-03 20:28:49 -05:00
7843de240a Merge pull request #1241 from ImranR98/dev
Don't use numpad for version extraction match group
2024-01-03 20:19:18 -05:00
0037a08017 Don't use numpad for version extraction match group 2024-01-03 20:18:59 -05:00
92ba432992 Merge pull request #1240 from ImranR98/dev
- Remove reference to old plugin to avoid crashes (#1221)
- Confirmation box for link-based imports (#1232)
- Construct extracted versions from match groups (#1235)
- Fix the WebView 'cleartext' error caused by HTTP sites (#1235)
- Make GitHub's (and Codeberg's) "fallback" work with the APK filter (#1236)
- Make version extraction universal (#1237)
- HTML Bugfix (#1238)
2024-01-03 20:16:19 -05:00
3a521f4014 Update packages, increment version 2024-01-03 20:13:47 -05:00
e8bbc9799c Fix the WebView 'cleartext' error caused by HTTP sites 2024-01-03 20:11:52 -05:00
96a48b4813 Construct extracted versions from match groups (#1235) 2024-01-03 20:02:44 -05:00
355450e82d Merge duplicate version extraction code into one function 2024-01-03 19:28:45 -05:00
99307c5b0c Make version extraction universal (#1237) 2024-01-03 19:20:03 -05:00
ace8be6514 Remove reference to old plugin to avoid crashes (#1221) 2024-01-03 19:04:36 -05:00
1b538931b1 Confirmation box for link-based imports (#1232) 2024-01-03 19:03:05 -05:00
7ccd08ee2b Make GitHub's (and Codeberg's) "fallback" work with the APK filter (#1236) 2024-01-03 18:32:09 -05:00
104beed594 HTML Bugfix (#1238) 2024-01-03 18:25:02 -05:00
e8df594edb Merge pull request #1233 from iDazai/main
added missing strings in some languages, translated for DE
2024-01-03 18:06:29 -05:00
6e922a84f8 Merge pull request #1230 from re7gog/re7gog
Fixes and system font
2024-01-03 18:06:04 -05:00
b74bf86277 Corrections 2024-01-03 14:39:33 +03:00
6cbe50c9ef Update vi.json 2024-01-02 07:57:32 +01:00
14fcca040b Update tr.json 2024-01-02 07:57:21 +01:00
7bb545cff9 Update sv.json 2024-01-02 07:57:07 +01:00
f52b1a246c Update pl.json 2024-01-02 07:56:41 +01:00
273dfd89cc Update nl.json 2024-01-02 07:56:17 +01:00
52d72d287b Update ja.json 2024-01-02 07:56:01 +01:00
e8d8fcbe69 Update hu.json 2024-01-02 07:55:44 +01:00
30c6c1afd3 Update fr.json 2024-01-02 07:55:16 +01:00
c8c8093b3a Update fa.json 2024-01-02 07:55:03 +01:00
c970b2cf2e Update es.json 2024-01-02 07:54:23 +01:00
0815283d31 Update bs.json 2024-01-02 07:53:32 +01:00
55ee2d93b8 Update de.json
added missing strings and translated
2024-01-02 07:53:07 +01:00
c9e17ed42b Merge branch 'main' into re7gog 2024-01-01 18:50:24 +03:00
76a91b7fe0 Don't load font if loaded 2024-01-01 18:42:38 +03:00
f9b3169b6a Update README.md 2024-01-01 07:55:00 -05:00
4f42b5a3ee Merge pull request #1228 from ImranR98/dev
Save Search Preferences (#1226)
2023-12-31 23:42:22 -05:00
5d9645eaff Save Search Preferences (#1226) 2023-12-31 23:41:46 -05:00
c032808d82 Merge pull request #1227 from ImranR98/dev
- Add www subdomain support for various sources (#1222)
- Disable standard version detection for WhatsApp (should never have been enabled)
2023-12-31 23:29:31 -05:00
282c94266e Merge remote-tracking branch 'origin/main' into dev 2023-12-31 23:28:09 -05:00
e2f7d52bee Increment version 2023-12-31 23:27:23 -05:00
6317f0162a Disable standard version detection for WhatsApp (should never have been enabled) 2023-12-31 22:05:50 -05:00
436a6310d7 Add www subdomain support for various sources (#1222) 2023-12-31 15:59:44 -05:00
0f74195255 Replace okay with ok 2023-12-31 19:42:28 +03:00
5ba33786ab System font and newer dependencies 2023-12-31 19:33:33 +03:00
70fcfc1753 Merge remote-tracking branch 'origin/main' into dev 2023-12-30 10:50:22 -05:00
1e34048c0c Merge pull request #1218 from LilligantMatsuri/main
Update Chinese translation
2023-12-30 10:50:12 -05:00
45b1b23262 Merge pull request #1215 from oSoWoSo/cz
Update cs.json
2023-12-30 10:50:04 -05:00
07842ace4e Merge pull request #1217 from gidano/main
Update hu.json
2023-12-30 10:49:34 -05:00
8e75280093 Merge pull request #1220 from ImranR98/dev
Fix intermediate link bug (#1219)
2023-12-30 10:49:21 -05:00
029b9ef498 Fix intermediate link bug (#1219) 2023-12-30 10:49:05 -05:00
51970abce7 Update zh.json
- Add & translate new strings
- Minor improvements

Signed-off-by: Matsuri <matsuri@vmoe.info>
2023-12-30 16:55:01 +08:00
f6faa19e5f Update hu.json 2023-12-30 09:45:46 +01:00
dd7217ca54 Update cs.json 2023-12-30 04:31:05 +01:00
6e13457eb2 Merge pull request #1210 from iDazai/main
Update de.json
2023-12-29 12:44:09 -06:00
3b319ee19b Merge pull request #1206 from gidano/main
Update hu.json
2023-12-29 12:44:02 -06:00
8ea8daa811 Merge pull request #1212 from ImranR98/dev
HTML intermediate link bugfix (#1211)
2023-12-29 12:43:49 -06:00
eb29b908c2 Increment version 2023-12-29 13:43:06 -05:00
9935cb482e HTML intermediate link bugfix (#1211) 2023-12-29 13:39:56 -05:00
0d6e7181cf Update de.json 2023-12-29 17:35:25 +01:00
d225650e15 Update hu.json 2023-12-29 10:12:13 +01:00
bfe09791d5 Merge pull request #1205 from ImranR98/dev
Bugfix in HTML intermediate link UI (incomplete)
2023-12-28 18:24:03 -06:00
85d103f3f6 Bugfix in HTML intermediate link UI (incomplete) 2023-12-28 19:16:16 -05:00
9e6dbe2465 Merge pull request #1189 from iDazai/main
Update de.json
2023-12-28 16:09:12 -06:00
355e5ccda6 Merge branch 'main' into main 2023-12-28 16:09:03 -06:00
a5f6f05e10 Merge pull request #1190 from unbranched/patch-4
Update it.json
2023-12-28 16:08:29 -06:00
db0d35d80b Merge pull request #1196 from LucasTavaresA/main
Update pt.json
2023-12-28 16:08:21 -06:00
6fca2a3931 Merge pull request #1197 from CertainBot/main
Update Spanish 3rd pass
2023-12-28 16:08:11 -06:00
0305a42b02 Merge branch 'main' into main 2023-12-28 16:08:04 -06:00
77d81716ed Switch to a New Background Task Plugin (#608), Add Link Text Filter for HTML Links (#1182), Add Support for Multiple Intermediate Links to HTML Source (#1204)
- Switch to a New Background Task Plugin (#608)
- Add Link Text Filter for HTML Links (#1182)
- Add Support for Multiple Intermediate Links to HTML Source
2023-12-28 17:06:11 -05:00
1fc8ee6fee Fix all 2023-12-28 17:50:12 +03:00
3e54e80eb6 Update it.json
Added missing strings.
2023-12-27 09:15:22 +00:00
3c9bb63d32 Update es.json
- English: updated new strings, few minor corrections.
- Español: actualizacion de frases nuevas, correcciones menores.
2023-12-25 16:04:51 +01:00
617ab9efab Update pt.json 2023-12-25 10:45:12 -03:00
bc574097e2 Update it.json 2023-12-25 09:40:29 +00:00
4cc64dc233 Update de.json
translated three new strings, fixed on with hyphen missing
2023-12-25 10:30:44 +01:00
45fa0a165a Merge pull request #1188 from ImranR98/dev
Typo, minor error reporting bug
2023-12-24 21:08:06 -06:00
0e5c07a078 Update packages, increment version 2023-12-24 22:07:27 -05:00
601a742c71 Merge remote-tracking branch 'origin/main' into dev 2023-12-24 22:04:51 -05:00
c972401b6e Merge pull request #1186 from CertainBot/main
Update Spanish 2nd pass
2023-12-24 21:04:35 -06:00
024e81cf01 bug 2023-12-24 22:03:29 -05:00
975ed402d5 Merge remote-tracking branch 'origin/main' into dev 2023-12-24 22:03:05 -05:00
b9e8083744 Merge pull request #1184 from re7gog/re7gog
Shizuku and Root
2023-12-24 21:02:48 -06:00
bb859708bc Typo 2023-12-24 21:14:18 -05:00
3cf2c221ac Update Spanish 2nd pass
- English: update new strings, homogenize expressions.
-Español: actualizar frases nuevas, homogeneizar expresiones.
2023-12-24 21:00:37 +01:00
6edd7edcd2 No delay when already has permission 2023-12-24 19:43:34 +03:00
4e26a02d78 Merge 2023-12-24 18:49:33 +03:00
bb36a57053 Merge branch 'main' into re7gog 2023-12-24 18:37:11 +03:00
b291c800f1 Now it looks good 2023-12-24 18:26:11 +03:00
b63a798d86 Merge pull request #1180 from ImranR98/dev
- Fix installed version bug when importing apps (#1179)
- Share button now shares Obtainium "protocol" links
2023-12-22 20:14:07 -06:00
eacf3777a4 Update packages, increment version 2023-12-22 21:13:15 -05:00
a5a7436bb1 Share button now shares Obtainium "protocol" links 2023-12-22 21:12:07 -05:00
2a4cc35df7 Fix installed version bug when importing apps (#1179) 2023-12-22 21:10:11 -05:00
cdccf58b76 Merge remote-tracking branch 'origin/dev' 2023-12-22 21:00:09 -05:00
27300383a1 Add Wiki link 2023-12-22 20:59:49 -05:00
375b9bce30 Working shizuku installer, need refactor 2023-12-22 16:27:54 +03:00
b6b8db48df request Shizuku permission 2023-12-22 16:08:41 +03:00
36e6c267b9 Shizuku dependencies 2023-12-22 14:21:18 +03:00
13066b3b4a Merge pull request #1177 from ImranR98/dev
- Add "Don't Sort" option to the HTML Source (#1168 )
- Fix syntax error in translation file (#1169)
- Parallel download option (#1175)
2023-12-21 15:02:58 -06:00
ccbe9d00c8 Update packages, increment version 2023-12-21 16:01:42 -05:00
ce291582cb Add "Don't Sort" option to the HTML Source (#1168 ) 2023-12-21 15:57:59 -05:00
bb37bc3b51 Fix syntax error in translation file (#1169) 2023-12-21 15:46:38 -05:00
5a7747acd1 Merge remote-tracking branch 'origin/main' into dev 2023-12-21 15:45:03 -05:00
1bc2ec9461 Parallel download option (#1169) 2023-12-21 15:44:38 -05:00
2b977fc2b0 Merge pull request #1173 from drizzt/fix_1142
Resize adaptative icon to 108x108dp (#1142)
2023-12-21 14:24:21 -06:00
de60c4ee9e Root install 2023-12-20 16:21:12 +03:00
de67e40c00 Add installMethod in settings 2023-12-20 11:57:56 +03:00
cc4b016c64 Resize adaptative icon to 108x108dp (#1142)
Android documentation [1] explicitly specify that adaptive icons must be
108x108dp.
Having bigger Adaptive icons triggers a bug in Android 14 QPR1 that
prevent to install apps from apk directly when the icons are bigger.

[1] https://developer.android.com/develop/ui/views/launch/icon_design_adaptive
2023-12-20 00:00:45 +01:00
f64f561d6f Merge pull request #1167 from ImranR98/dev
Update issue templates
2023-12-17 16:00:25 -06:00
80bddf8a6b Update issue templates 2023-12-17 16:59:23 -05:00
cbaaec961c Merge pull request #1166 from ImranR98/dev
- Get real author name for F-Droid (#1076)
- Always add Track-only apps with random ID (#1138)
- Minor UI fix (#1162)
- Fix 'verify latest' option for GitHub (#1163)
2023-12-17 13:57:34 -06:00
5477b3f936 Update packages, increment version, run dart fix 2023-12-17 14:54:54 -05:00
fd59a93ede Get real author name for F-Droid (#1076) 2023-12-17 14:47:22 -05:00
cd316b7138 Always add Track-only apps with random ID (#1138) 2023-12-17 14:36:06 -05:00
d1955192ed Minor UI fix (#1162) 2023-12-17 14:14:46 -05:00
9beb839bf4 Fix 'verify latest' option for GitHub (#1163) 2023-12-17 14:13:26 -05:00
29ea303093 Merge pull request #1161 from ImranR98/dev
- Custom link support (#368, #918)
- Export settings (#1157)
- Use public GitLab search API (#1147)
- Fix unauthorized error (#1153)
2023-12-16 03:12:10 -06:00
feff6751ca Merge remote-tracking branch 'origin/main' into dev 2023-12-16 04:08:56 -05:00
ca33fdf752 Merge pull request #1133 from CertainBot/patch-1
Update Spanish translation
2023-12-16 03:07:03 -06:00
fdcdfe89d6 Merge pull request #1149 from gidano/main
Update hu.json
2023-12-16 03:06:53 -06:00
48ed2115a7 Merge pull request #1150 from Erudaro/main
Update bs.json
2023-12-16 03:06:44 -06:00
65988f4e08 Link UI bugfix 2023-12-16 04:02:10 -05:00
ede65eda6c bug 2023-12-16 03:47:29 -05:00
5da56acac8 bug 2023-12-16 03:45:15 -05:00
5720c55301 bugs 2023-12-16 03:43:55 -05:00
ffefa4b30e Update packages, increment version 2023-12-16 02:57:08 -05:00
80e4986b23 Export settings (#1157) 2023-12-16 02:55:05 -05:00
dc92ccda0a Use public GitLab search API (#1147) 2023-12-16 02:01:43 -05:00
f9bab18076 Fix unauthorized error (#1153) 2023-12-16 01:44:02 -05:00
2dec52e221 Bugfix 2023-12-16 01:24:43 -05:00
7413f693d7 JSON import link support (#368) 2023-12-16 00:31:32 -05:00
415460df75 Custom link support (#918) 2023-12-15 23:37:04 -05:00
125a194468 Update bs.json 2023-12-10 22:07:14 +01:00
32e9afbf36 Update hu.json 2023-12-10 17:16:08 +01:00
3eca704f4a Merge pull request #1137 from ImranR98/dev
- Add regex filter to all select dialogs (#1110)
- Let users store a custom note per app (#1126)
- Better GitLab error message (#1106)
2023-12-07 20:57:48 -06:00
9c95129311 Better GitLab error message (#1106) 2023-12-07 21:55:35 -05:00
bf34c1bcdb Let users store a custom note per app (#1126) 2023-12-07 21:47:56 -05:00
284c687d77 Add regex filter to all select dialogs (#1110) 2023-12-07 21:38:16 -05:00
09afb5a3f5 Upgrade packages, increment version 2023-12-07 21:00:51 -05:00
0138721451 Merge pull request #1118 from DwainZwerg/patch-9
Update de.json
2023-12-07 19:56:13 -06:00
2d5f610941 Merge branch 'main' into patch-9 2023-12-07 19:56:07 -06:00
864fa7762b Merge pull request #1119 from iDazai/patch-2
Update de.json
2023-12-07 19:55:16 -06:00
4fde38ee6a Merge pull request #1125 from Daviteusz/weblate-obtainium-translate
Update Polish translation
2023-12-07 19:55:05 -06:00
6cdf0f10d4 Merge pull request #1136 from mehdeej/main
Update (Persian) fa.json
2023-12-07 19:54:56 -06:00
b66592c25f Update (Persian) fa.json 2023-12-07 20:58:26 +03:30
43616c566d Update es.json
- Spanish translation updated. Typos corrected.
- Traducción al castellano actualizada. Corrección de erratas.
2023-12-06 00:35:30 +01:00
62f1dc17a0 Update Polish translations 2023-11-28 18:08:57 +01:00
0e9a8a937a Update de.json
translated newly added strings
2023-11-25 14:06:50 +01:00
9a86b245ce Update de.json 2023-11-25 12:52:32 +00:00
64533f7a3f Fix GitHub actions build error 2023-11-24 20:27:01 -05:00
0b7de8d387 Merge pull request #1115 from ImranR98/dev
Support for fixed APK URL in HTML source (#1101), Fix IzzyDroid release finding bug (#1104), More search options (#1107), Third party GitLab search (#1108), GitHub: Don't infer AppID if many found (#1112), Add www support back to APKMirror (#1114)
2023-11-24 19:16:28 -06:00
8eba4860fe Don't apply #1101 feature to existing apps 2023-11-24 20:14:16 -05:00
b53e2f57e6 Fix local build error 2023-11-24 19:54:03 -05:00
e1e834297b Merge remote-tracking branch 'origin/main' into dev 2023-11-24 19:35:23 -05:00
e37dc6e341 Update packages, increment version 2023-11-24 19:34:22 -05:00
c91c896854 Fix IzzyDroid release finding bug (#1104) 2023-11-24 19:32:46 -05:00
7e5dfa03d6 GitHub: Don't infer AppID if many found (#1112) 2023-11-24 19:24:19 -05:00
1a4ec3f049 Add www support back to APKMirror (#1114) 2023-11-24 19:12:42 -05:00
756763fcbe Third party GitLab search (#1108) 2023-11-24 18:58:10 -05:00
93036c4e67 Make fixed APK URL support (HTML) default (#1101) 2023-11-24 18:15:04 -05:00
15bf972ef6 UI fixes for previous commit (#1107) 2023-11-24 18:12:27 -05:00
bcb4567382 More search options (#1107) 2023-11-24 17:59:59 -05:00
3890c4ffb9 Support for fixed APK URL in HTML source (#1101) 2023-11-24 16:39:44 -05:00
8dd8f471a2 Update vi.json 2023-11-20 10:09:45 +07:00
657d1cd042 Update vi.json 2023-11-20 10:00:08 +07:00
c8d82f24a8 Merge pull request #1103 from ImranR98/dev
Increment versionCode (#1098) + ran 'dart fix'
2023-11-19 15:02:42 -06:00
367e740a9c Increment versionCode (#1098) + ran 'dart fix' 2023-11-19 16:02:16 -05:00
5b5a51bdad Merge pull request #1098 from gidano/main
Update hu.json
2023-11-19 14:58:46 -06:00
7fc030a53e Merge pull request #1099 from DwainZwerg/patch-8
Update de.json
2023-11-19 14:58:38 -06:00
65087fb5f8 Update de.json
Small improvements
2023-11-19 14:11:05 +00:00
d5e789af3c Update hu.json 2023-11-19 10:32:57 +01:00
45212c699f Update release.yml 2023-11-18 16:05:56 -05:00
03106f3522 Merge pull request #1096 from ImranR98/dev
Dev
2023-11-18 15:57:58 -05:00
cd2857cb94 Add language menu entries (+ tr fix), increment version 2023-11-18 15:56:44 -05:00
b3ddb8658f F-Droid flavour updates + update packages 2023-11-18 15:42:32 -05:00
7ae80b6b49 Merge pull request #236 from p1gp1g/flavors
Add fdroid flavor
2023-11-18 15:01:37 -05:00
34f27f9cd4 Merge branch 'main' into flavors 2023-11-18 14:56:30 -05:00
4c53b58fd8 Fix broken thrid-party f-droid search (#1094) 2023-11-18 14:53:43 -05:00
6102ab4be8 Merge remote-tracking branch 'origin/main' into dev 2023-11-18 14:42:32 -05:00
6fcf565974 Bug 2023-11-18 14:42:24 -05:00
77bd16c7cf Merge pull request #1081 from JohnBetaro/main
Small optimization
2023-11-18 14:41:23 -05:00
7d593080ec Merge pull request #1068 from LilligantMatsuri/main
Update Chinese translation
2023-11-18 14:41:05 -05:00
96ea74abeb Merge pull request #1072 from Bardesss/main
Update nl.json
2023-11-18 14:40:58 -05:00
e50e3957ec Merge pull request #1078 from Daviteusz/weblate-obtainium-translate
Update Polish translation
2023-11-18 14:40:51 -05:00
8cb9420939 Merge pull request #1083 from ngocanhtve/main
Create vn.json
2023-11-18 14:40:41 -05:00
bbb7b8caa2 Merge pull request #1089 from mamiyaso/patch-1
Create tr.json
2023-11-18 14:40:34 -05:00
cc284f3c9e Merge pull request #1092 from bluefly000/japanese-translation
Update ja.json
2023-11-18 14:40:22 -05:00
bd8aae5fbf Rename vn.json to vi.json
Correct the country code.
2023-11-18 13:57:28 +07:00
3d162f33df Update ja.json 2023-11-17 20:35:33 +09:00
ff3c37f1b4 Update ja.json 2023-11-17 14:34:30 +09:00
35160ce385 Create tr.json
Added Turkish translation
2023-11-14 17:48:59 +03:00
c8eef91813 Create vn.json
Translation for Vietnamese language!
2023-11-11 15:44:56 +07:00
6791b20121 Update release.yml 2023-11-10 21:20:21 -10:00
3311c49236 Update release.yml 2023-11-10 21:18:35 -10:00
5223e58f83 Update build.gradle 2023-11-10 21:17:40 -10:00
e0f9fc233d Update release.yml 2023-11-10 21:15:57 -10:00
509bd21655 Update Polish translations 2023-11-09 15:52:30 +01:00
5be7229c4b Update nl.json 2023-11-07 08:49:35 +00:00
efd3c461e0 Update zh.json
- Translate new strings
- Minor improvements

Signed-off-by: Matsuri <matsuri@vmoe.info>
2023-11-05 14:56:41 +08:00
13aed69f0e Merge pull request #1063 from ImranR98/dev
Various bugfixes and minor enhancements (#454, #1026, #1050, #1052, #1060)
2023-11-03 19:44:28 -04:00
b03675811c Added new language menu entries 2023-11-03 19:40:19 -04:00
e4beac185e Merge remote-tracking branch 'origin/main' into dev 2023-11-03 19:38:23 -04:00
bdc7d9dd84 Merge pull request #1058 from Bardesss/main
Add nl.json
2023-11-03 19:38:01 -04:00
b49d1e0529 Merge pull request #998 from Mr-Bajs/main
Adding swedish translation
2023-11-03 19:37:55 -04:00
3c0eb48d53 Merge pull request #1027 from unbranched/patch-3
Update it.json
2023-11-03 19:37:36 -04:00
0d65531ec1 Merge pull request #1028 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-11-03 19:37:31 -04:00
3848f9822b Merge pull request #1036 from iDazai/main
Update de.json
2023-11-03 19:37:24 -04:00
e1cdc002b9 Merge pull request #1043 from gidano/main
Update hu.json
2023-11-03 19:37:15 -04:00
168c1cf1ce Upgrade packages, increment version 2023-11-03 19:36:39 -04:00
5b142b4401 Various fixes and improvements (#454, #1026, #1050, #1051, #1052, #1060) 2023-11-03 19:35:42 -04:00
9be3d76590 Add nl.json
Adding Dutch translation to Obtanium
2023-11-01 10:01:44 +00:00
26971aa109 Upgrade packages 2023-10-25 18:22:58 -04:00
18f9049bc6 locale(pl): Update Polish translations 2023-10-24 11:51:19 +02:00
53cf253b67 Update hu.json 2023-10-23 10:20:51 +02:00
6d416f45a9 Higher versionCode after revert 2023-10-22 12:51:30 -04:00
a34a447164 Revert "Switched to WorkManager for reliability (#608)"
This reverts commit d3247a9ec1.
2023-10-22 12:50:54 -04:00
d3247a9ec1 Switched to WorkManager for reliability (#608) 2023-10-22 00:59:51 -04:00
dfb5a2b97f Update de.json
translated latest addition
2023-10-21 17:19:20 +02:00
deae96e191 Update it.json
Missed one string & fixed one
2023-10-19 08:56:18 +00:00
b8c0e18bb4 Merge pull request #1024 from ImranR98/dev
Don't replace / in versions (#1023), Fix HTML version extraction (#1021), Update check only for installed apps (#1012)
2023-10-18 19:47:34 -04:00
a083da1546 Upgrade packages, increment version 2023-10-18 19:46:11 -04:00
2518c70ec8 Bugfixes
Don't replace / in versions (#1023)
Fix HTML version extraction (#1021)
Update check only for installed apps (#1012)
2023-10-18 19:42:15 -04:00
6ead8d261c Merge pull request #1011 from LucasTavaresA/main
Update pt.json
2023-10-18 19:12:46 -04:00
b5f76a6ebc Merge pull request #1014 from DwainZwerg/patch-4
Update de.json (small improvements)
2023-10-18 19:12:40 -04:00
5e38bca535 Merge pull request #1015 from unbranched/patch-2
Update it.json
2023-10-18 19:12:34 -04:00
c39142ee77 Merge pull request #1016 from k03mad/ru_locale
Update ru translation
2023-10-18 19:12:23 -04:00
d0174479d7 update ru translation 2023-10-17 17:50:10 +03:00
aa23267d70 Update it.json 2023-10-17 09:58:12 +00:00
92f5da306d Update de.json (small improvements 2023-10-17 09:10:18 +00:00
8601e2af7a Update sv.json 2023-10-16 14:22:38 +00:00
5d9f31b99e Update sv.json 2023-10-16 14:21:50 +00:00
8b29158d8b Update sv.json 2023-10-16 14:17:13 +00:00
b68cf3c671 Update sv.json 2023-10-16 14:12:09 +00:00
858a50a414 Update pt.json 2023-10-15 20:13:45 -03:00
598df624df Update sv.json 2023-10-14 19:31:08 +00:00
e6da2b73ed Update sv.json 2023-10-14 19:16:26 +00:00
f44424d37a Update sv.json 2023-10-14 19:11:25 +00:00
623804ae68 Update sv.json 2023-10-14 18:35:37 +00:00
b7544939c2 Merge pull request #1008 from ImranR98/dev
Fix broken search (#1006)
2023-10-14 13:27:01 -04:00
63fa6d4660 Increment version 2023-10-14 13:25:49 -04:00
9506c11951 Fix broken search (#1006) 2023-10-14 13:25:26 -04:00
ce5639bb98 Update sv.json 2023-10-14 12:48:03 +00:00
99ef6ca861 Update sv.json 2023-10-14 12:32:28 +00:00
43d5a3da27 Update sv.json
updated
2023-10-14 12:30:55 +00:00
30723110af Merge branch 'ImranR98:main' into main 2023-10-14 12:07:11 +00:00
a0ecb4e2bb Merge pull request #1003 from ImranR98/dev
Fix Source selection (HTML) which broke in the last release
2023-10-14 05:24:49 -04:00
a726b09f26 Fix Source selection (HTML) which broke in the last release 2023-10-14 05:24:08 -04:00
52b1d1fe33 Merge pull request #1001 from ImranR98/dev
Fixed syntax errors in de.json
2023-10-14 01:36:49 -04:00
8b4709c132 Fixed syntax errors in de.json 2023-10-14 01:36:26 -04:00
b4217a791e Merge pull request #994 from DwainZwerg/patch-3
Update de.json
2023-10-14 01:33:33 -04:00
9b3a982d54 Merge pull request #997 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-10-14 01:33:11 -04:00
0a47d3eab5 Merge pull request #1000 from ImranR98/dev
Switch back to parallelized BG task (#963), Make Third Party F-Droid Repos Searchable (#995)
2023-10-14 01:31:50 -04:00
7d7803247d Update packages, increment version 2023-10-14 01:30:37 -04:00
aa8d45e636 Make Third Party F-Droid Repos Searchable (#995) 2023-10-14 01:29:02 -04:00
7f3e87767c Switch back to parallelized BG task (#963) + better logging 2023-10-13 23:39:24 -04:00
f76ea9bba5 Merge branch 'ImranR98:main' into main 2023-10-13 12:52:23 +00:00
1eefeae060 locale(pl): Update Polish translations 2023-10-13 13:03:33 +02:00
03447c33be Update de.json 2023-10-13 07:30:23 +00:00
f6c6cd5cb8 Merge pull request #993 from ImranR98/dev
Separate notif channel title translations (#979), Add 'skip update notification' per-app toggle (#980), Better error for some incompatible APK cases (#981), Add whole-page version extraction for HTML (#989), Better relative link resolution (#989), Clearer wording (#991), Fixed issues in some translation files (#992)
2023-10-12 19:54:12 -04:00
67b56cee50 Upgrade packages, increment version 2023-10-12 19:51:55 -04:00
2d7465cca6 Separate notif channel title translations (#979) 2023-10-12 19:51:04 -04:00
d06f20690d Add 'skip update notification' per-app toggle (#980) 2023-10-12 19:33:38 -04:00
e613a494ff Better error for some incompatible APK cases (#981) 2023-10-12 19:24:23 -04:00
503a01675e Clearer wording (#991) 2023-10-12 19:10:02 -04:00
723f7e63e9 Add whole-page version extraction for HTML (#989) 2023-10-12 19:06:59 -04:00
7ff6916e5f Better relative link resolution (#989) 2023-10-12 18:57:47 -04:00
910ed26525 Fixed issues in some translation files 2023-10-12 18:31:31 -04:00
c0fffa6293 Merge pull request #987 from ImranR98/dev
Fix issues with last conflit resolution commit
2023-10-11 21:07:18 -04:00
d800d3ba41 Fix issues with last conflit resolution commit 2023-10-11 21:03:23 -04:00
d267343c64 Merge pull request #986 from ImranR98/dev
Switch back to serial BG installs (#984), Fix UpToDown again (#982)
2023-10-11 21:01:09 -04:00
0f72e37272 Merge branch 'main' into dev 2023-10-11 21:00:37 -04:00
89e44d581f Update packages, increment version 2023-10-11 20:56:26 -04:00
c908a710de Fix UpToDown again (#982) 2023-10-11 20:55:09 -04:00
f0809cde72 Merge pull request #977 from iDazai/main
updated translations
2023-10-11 20:44:12 -04:00
e6da8c1c18 Merge pull request #978 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-10-11 20:44:06 -04:00
81ea67afa8 Remove unnecessary log 2023-10-11 20:43:27 -04:00
488049821e Switch back to serial BG installs (#984) 2023-10-11 20:42:33 -04:00
fc7408a8f8 locale(pl): Update Polish translations 2023-10-09 20:14:22 +02:00
6955191fdd Update pl.json
fixed line breaks
2023-10-09 15:22:32 +02:00
ba59693d90 Update pl.json
Changed order of the lines so it's the same order for every language and better to compare
2023-10-09 15:17:52 +02:00
ce6e51128d Update it.json
added three missing lines, no translation
2023-10-09 15:04:45 +02:00
a7a26037ae Update hu.json
added four missing lines, no translation
2023-10-09 15:02:51 +02:00
00854abd1a Update fr.json
added three missing lines, no translation
2023-10-09 14:59:14 +02:00
c26649d5f2 Update fa.json
added three missing lines, no translation
2023-10-09 14:58:42 +02:00
63b76a249f Update es.json
added three missing lines, no translation
2023-10-09 14:57:52 +02:00
95f19208ad Update bs.json
added three missing lines, no translation
2023-10-09 14:54:24 +02:00
f4a902ee47 Update de.json
added three missing lines and translated them, reverted translation of variables so log function can work again.
2023-10-09 14:52:50 +02:00
036823cbb6 Merge remote-tracking branch 'origin/main' into dev 2023-10-08 17:33:12 -04:00
547c2c8c0d Merge pull request #975 from ImranR98/dev
Less notif spam, no check in aeroplane mode (#974)
2023-10-08 17:33:05 -04:00
7453d19d27 Increment version, update packages 2023-10-08 17:32:41 -04:00
2a0b68d637 Less notif spam, no check in aeroplane mode (#974) 2023-10-08 17:30:08 -04:00
02f374fdf0 Merge pull request #969 from ImranR98/dev
Enabled WhatsApp Source (#357)
2023-10-07 13:31:45 -04:00
3536dcd775 Increment version 2023-10-07 13:31:02 -04:00
6fa887e536 Merge pull request #967 from JohnBetaro/main
Better version detection for F-Droid
2023-10-07 13:16:39 -04:00
71755763b9 Enabled WhatsApp Source (#357) 2023-10-07 13:15:22 -04:00
5aabcccfd4 Update fdroid.dart 2023-10-07 09:53:34 +01:00
1e009e2211 Update release.yml 2023-10-07 02:03:18 -04:00
811bc6434b Update release.yml 2023-10-07 02:00:13 -04:00
a5b2d06742 Update release.yml 2023-10-07 01:33:34 -04:00
2c00674835 Update release.yml 2023-10-07 01:20:03 -04:00
9bbff1f436 Update release.yml 2023-10-07 01:08:43 -04:00
c75416f9be Update release.yml 2023-10-07 01:02:53 -04:00
2cb750a7b0 Update release.yml 2023-10-07 00:56:27 -04:00
abfec51964 Update release.yml 2023-10-07 00:40:34 -04:00
e314717a3e Update release.yml 2023-10-07 00:33:50 -04:00
290a78acb5 Update release.yml 2023-10-07 00:30:09 -04:00
b40a4dd243 Update release.yml 2023-10-07 00:09:18 -04:00
b38f6d0581 Update release.yml 2023-10-06 23:58:33 -04:00
5c562a6bdb Update release.yml 2023-10-06 23:45:00 -04:00
238d43f916 Update release.yml 2023-10-06 23:18:25 -04:00
818dc23089 Update release.yml 2023-10-06 22:55:59 -04:00
ddb50940ce Update release.yml 2023-10-06 22:55:50 -04:00
96fb97f4ef Update release.yml 2023-10-06 22:53:13 -04:00
6c0459c2ae Update release.yml 2023-10-06 22:51:30 -04:00
30a9e1ee4b Update release.yml 2023-10-06 22:48:21 -04:00
15a1f1e6e0 Update release.yml 2023-10-06 22:46:11 -04:00
827e2b161c Update release.yml 2023-10-06 22:45:20 -04:00
e95230859e Update release.yml 2023-10-06 22:43:41 -04:00
95cb8ca493 Update release.yml 2023-10-06 22:41:47 -04:00
5735293efb Update release.yml 2023-10-06 22:40:27 -04:00
035df1f338 Update release.yml 2023-10-06 22:38:01 -04:00
36a8b04c4f Update release.yml 2023-10-06 22:35:40 -04:00
3d5411ef28 Update release.yml 2023-10-06 22:32:23 -04:00
df7b74e727 Update release.yml 2023-10-06 22:28:02 -04:00
0138599120 Update release.yml 2023-10-06 22:23:45 -04:00
66446cbffc Update release.yml 2023-10-06 22:16:41 -04:00
ef40f3900f Update release.yml 2023-10-06 22:11:25 -04:00
ce259764a8 Update release.yml 2023-10-06 22:09:33 -04:00
65187cb17b Update release.yml 2023-10-06 22:04:55 -04:00
8f25245ad1 Update release.yml 2023-10-06 21:47:25 -04:00
58b8baa019 Merge pull request #966 from ImranR98/dev
Run GH action manually only
2023-10-06 21:21:44 -04:00
ba1db88c8d Run GH action manually only 2023-10-06 21:21:26 -04:00
c8f2f42a35 Merge pull request #965 from ImranR98/dev
Parallelize Update Checking (#963), Bugfixes (#954, #962)
2023-10-06 21:20:19 -04:00
4e5a9b2af5 Updated GitHub actions 2023-10-06 21:19:46 -04:00
d1ab961c14 Merge remote-tracking branch 'origin/main' into dev 2023-10-06 20:45:02 -04:00
33caf4644e Ran dart fix 2023-10-06 20:43:06 -04:00
f34ffe18a8 Update packages, increment version 2023-10-06 20:42:09 -04:00
4b1c5e111d Merge pull request #958 from JohnBetaro/main
Workflow to build and release
2023-10-06 20:40:48 -04:00
dbd7c296c6 Merge pull request #951 from DwainZwerg/patch-2
Update de.json
2023-10-06 20:38:08 -04:00
df93cbde8f Fix UpToDown (#962) 2023-10-06 20:37:14 -04:00
d8cbc121a7 Merge pull request #964 from ImranR98/963
Parallelize Update Checking (#963)
2023-10-06 20:07:18 -04:00
8163cd5c8f Improvements, bugfixes 2023-10-06 19:58:46 -04:00
e9e9adb174 Tweaks 2023-10-06 19:34:08 -04:00
21fdfc1eef Attempting to parallelize update checks 2023-10-06 19:23:18 -04:00
4304251e1e Remove checking for APKs
This is because I couldn't check for prereleases because I don't know how, maybe you can.
2023-10-05 11:31:42 +01:00
ae0cd74b0e Update android.yml 2023-10-05 11:29:03 +01:00
6935bff244 Update android.yml 2023-10-05 11:22:29 +01:00
102b9da617 Update android.yml 2023-10-05 11:19:46 +01:00
8bd0d185ae Create android.yml 2023-10-05 11:16:42 +01:00
7bfc5ae0a8 Bugfix (#954) 2023-10-03 21:34:24 -04:00
c72a41db9d Update de.json
and small improvements
2023-10-01 12:05:49 +00:00
5fbb1c2e32 Merge pull request #947 from LilligantMatsuri/main
Update Chinese translation
2023-09-30 10:16:52 -04:00
850dd53c69 Merge pull request #949 from ImranR98/dev
"Naive" version detection for some Sources (#946)
2023-09-30 10:16:36 -04:00
e3baf91037 Increment version, upgrade packages 2023-09-30 10:16:10 -04:00
4c811c9c04 "Naive" version detection for some Sources (#946) 2023-09-30 10:12:49 -04:00
4bc9f5826e Update zh.json
- Translate new strings
- Slight improvements

Signed-off-by: Matsuri <matsuri@vmoe.info>
2023-09-30 20:30:00 +08:00
9f19e4dc83 Merge pull request #945 from ImranR98/dev
Add export dir pick button + update packages
2023-09-29 12:13:38 -04:00
c9cb865c9c Add export dir pick button + update packages 2023-09-29 12:13:11 -04:00
b8a7dd984d Merge pull request #934 from LucasTavaresA/main
Update pt.json
2023-09-29 12:12:55 -04:00
3ede46c445 Merge pull request #937 from TangyWrecker/main
Update ru.json
2023-09-29 12:12:39 -04:00
87c4af94d3 Merge pull request #944 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-09-29 12:12:32 -04:00
6c30bd36d1 Create sv.json 2023-09-29 14:54:39 +00:00
7e85ccaf28 locale(pl): Update Polish translations 2023-09-29 02:39:18 +02:00
db3a262410 Update ru.json
oops
2023-09-26 01:13:01 +03:00
70162da491 Update ru.json 2023-09-26 01:09:19 +03:00
f3632a4033 Update pt.json 2023-09-24 15:22:56 -03:00
2f4e176116 Merge pull request #933 from ImranR98/dev
Downgrade permission handler to fix #932 + APKPure improvement
2023-09-23 17:19:52 -04:00
3ea8dc598c Downgrade permission handler to fix #932 + APKPure improvement 2023-09-23 17:18:12 -04:00
3f63dc0180 Merge pull request #930 from gidano/main
Update hu.json
2023-09-23 14:37:19 -04:00
1f6701b183 Update hu.json 2023-09-23 20:36:00 +02:00
3a170fbf90 Merge pull request #931 from ImranR98/dev
Fix major GitHub bug from previous release (#929)
2023-09-23 14:32:46 -04:00
b57e523a07 Increment version 2023-09-23 14:32:13 -04:00
8c4509f255 Fix major GitHub bug (#929) 2023-09-23 14:31:52 -04:00
3878c287be Update hu.json 2023-09-23 20:23:25 +02:00
7789e3f3a7 Removed excessive logs 2023-09-23 14:02:55 -04:00
94ac744f41 Merge pull request #928 from ImranR98/dev
Fix version number
2023-09-23 13:43:25 -04:00
a83211f260 Fix version number 2023-09-23 13:43:04 -04:00
4f733affc5 Merge pull request #927 from ImranR98/dev
- Change a default F-Droid Source option
- Add GitHub "don't sort" toggle (#925)
- Better IzzyOnDroid support (#926)
- Allow 'm.' subdomain for APKPure
- Added HTML reverse sorting (#915)
2023-09-23 13:41:08 -04:00
ffb2a982bc Merge branch 'main' into dev 2023-09-23 13:40:32 -04:00
9658a65661 Upgrade packages, increment version 2023-09-23 13:36:46 -04:00
68d4083708 Added HTML reverse sorting (#915)
+ translatable strings (#916)
2023-09-23 13:31:27 -04:00
af5377d2eb Allow 'm.' subdomain for APKPure 2023-09-23 13:21:48 -04:00
6ac8ad543c Better IzzyOnDroid support (#926) 2023-09-23 13:16:51 -04:00
c10a63e76e Add GitHub "don't sort" toggle (#925) 2023-09-23 12:48:21 -04:00
b423a2af52 Change a default F-Droid Source option 2023-09-22 00:22:54 -04:00
9b70289345 Merge pull request #914 from ygxbnet/main
Update zh.json
2023-09-18 20:11:08 -04:00
2a94c1f33a Update main.dart 2023-09-19 00:51:58 +08:00
ea205c1acb Update zh.json 2023-09-19 00:32:20 +08:00
6e1767730b Update zh.json 2023-09-18 00:45:45 +08:00
3fc1ab37d7 Merge pull request #911 from ImranR98/dev
Enable Brazil translation (#830)
2023-09-16 17:41:58 -04:00
c4a3f7333d Enable Brazil translation (#830) 2023-09-16 16:45:06 -04:00
fb820e01b1 Merge pull request #910 from ImranR98/dev
Remove nonsense hint
2023-09-16 16:35:37 -04:00
504aca5287 Merge pull request #908 from oSoWoSo/cz
Add Czech translation
2023-09-16 16:35:25 -04:00
ae7d5546ae Remove nonsense hint 2023-09-16 16:34:15 -04:00
8bcb10b281 Add Czech translation 2023-09-16 22:32:42 +02:00
845eaab73e Merge pull request #909 from ImranR98/dev
Bugfix: HTML Source was broken (could not add apps)
2023-09-16 15:27:11 -04:00
298ff190ec Bugfix: HTML Source was broken (could not add apps) 2023-09-16 15:26:35 -04:00
734a548bc3 Merge pull request #906 from ImranR98/dev
Increment version
2023-09-16 09:28:57 -04:00
591973d97f Increment version 2023-09-16 09:28:45 -04:00
a2f57ecd66 Merge pull request #903 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-09-16 09:26:34 -04:00
13dcfb479d Merge pull request #902 from gidano/main
Update hu.json
2023-09-16 09:26:28 -04:00
3328d80130 Merge pull request #905 from saymanrifat/saymanrifat-721
Add back button to app detail page (#721)
2023-09-16 09:26:03 -04:00
f9df3ac0e2 Reduce top padding as we no longer need it 2023-09-16 09:25:26 -04:00
61d66e80d8 Add back button to app detail page (#721) 2023-09-16 18:31:57 +06:00
93e0360116 locale(pl): Update Polish translations 2023-09-16 12:45:50 +02:00
2cec5f7934 Update hu.json 2023-09-16 11:28:36 +02:00
8d4a09b007 Merge pull request #894 from markus-gitdev/main
Update de.json
2023-09-16 04:39:06 -04:00
6d8d2fa99d Merge branch 'main' into main 2023-09-16 04:38:48 -04:00
59ecd55530 Merge pull request #895 from DwainZwerg/patch-1
edit de.json
2023-09-16 04:38:05 -04:00
77fcc89e37 Merge branch 'main' into patch-1 2023-09-16 04:35:12 -04:00
7d63da4d9c Merge pull request #893 from bluefly000/japanese-translation
Update ja.json
2023-09-16 04:32:42 -04:00
8eea0bae99 Merge pull request #892 from iDazai/main
Update de.json
2023-09-16 04:32:35 -04:00
f5dcd8f776 Merge pull request #901 from ImranR98/dev
Fix background update issue (#896)
2023-09-16 04:31:29 -04:00
e1f2baeeda Fix background update issue (#896) 2023-09-16 04:31:03 -04:00
84d8ff8b0b Small improvement of the previous translation (especially "" instead of the English ''; my translations of the new features to be translated are mostly based on iDazai (https://github.com/ImranR98/Obtainium/pull/892/files) and markus-gitdev (https://github.com/ImranR98/Obtainium/pull/894/files)) 2023-09-14 08:46:51 +00:00
9862c22fdb Update de.json 2023-09-14 09:27:36 +02:00
8c82f53dd2 Update ja.json 2023-09-14 15:44:27 +09:00
5cf4c21ce3 Update de.json
Translated latest strings
2023-09-14 08:37:46 +02:00
4951f62d4a Merge pull request #890 from ImranR98/dev
- Fix export encoding (#887)
- Fix repeating background install for some apps (#886)
- More version filtering options for F-Droid (#885)
- Trim user URL input
2023-09-13 22:20:49 -04:00
4c0c4b7010 Trim user URL input 2023-09-13 22:19:09 -04:00
96051e614c Merge remote-tracking branch 'origin/main' into dev 2023-09-13 22:17:11 -04:00
a2e494b2ba More version filtering options for F-Droid (#885) 2023-09-13 22:15:10 -04:00
2d5a9bec84 Increment version, update packages 2023-09-13 21:27:18 -04:00
7d9571cfdd Fix repeating background install for some apps (#886) 2023-09-13 21:24:25 -04:00
acc6a780fa Fix export encoding (#887) 2023-09-13 21:01:39 -04:00
0e36d42a06 Merge pull request #863 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-09-13 19:22:57 -04:00
5cfddd807a locale(pl): Update Polish translations 2023-09-11 22:05:32 +02:00
17b5604f2a Merge pull request #882 from ImranR98/dev
Bugfix
2023-09-10 23:29:38 -04:00
fdb6eed6d0 Slight tweak 2023-09-10 23:28:37 -04:00
13de0437b8 Bugfix 2023-09-10 23:23:35 -04:00
a43c45f310 Merge pull request #881 from ImranR98/dev
Pick export dir + auto-export (#283, #600) + UI fix
2023-09-10 23:15:36 -04:00
9c56a4d1fc Bugs 2023-09-10 23:15:16 -04:00
2aea1d2631 Bugfixes 2023-09-10 23:11:06 -04:00
118e05a0fa Bugfix 2023-09-10 22:47:04 -04:00
05f497787e Build script tweak 2023-09-10 22:37:32 -04:00
53cf4d0234 Pick export dir + auto-export (#283, #600) 2023-09-10 22:35:28 -04:00
6e735b1763 Enable auto-export on update checks 2023-09-10 22:24:18 -04:00
873a1a0683 Allow for alternative app dirs (unfinished) 2023-09-10 15:55:34 -04:00
27b1149d1c Fix padding when touch targets not highlighted 2023-09-10 14:16:19 -04:00
c1e64f111e Merge pull request #878 from ImranR98/dev
Fix Codeberg not finding APKs (#877), Make touch highlight visible in dark theme (#860)
2023-09-10 14:03:48 -04:00
b2af8448fd Increment version 2023-09-10 14:02:26 -04:00
8f44338e76 Make touch highlight visible in dark theme (#860) 2023-09-10 13:56:39 -04:00
e4a55abcb3 Fix Codeberg not finding APKs (#877) 2023-09-10 13:49:04 -04:00
d7348b4973 Merge pull request #871 from ImranR98/dev
Make less obvious target highlighting optional
2023-09-09 07:30:31 -04:00
09421230f2 Make less obvious target highlighting optional 2023-09-09 07:29:35 -04:00
4596e32258 Merge pull request #870 from ImranR98/dev
- Add Support for Private GitHub Repos (#857)
- Add Uptodown Source (#853)
- Add User-Defined Version Extraction for HTML Source (#861)
- Make release notes tap target more obvious (#860)
- Fix Missing Download Notification on App Add (#858)
- Prevent Access Token from Showing in Logs (#714)
2023-09-09 06:54:12 -04:00
4dc007a4f6 Update packages, increment version 2023-09-09 06:50:13 -04:00
c53a156969 Slight UI tweak 2023-09-09 06:48:55 -04:00
94bd0774fb Make release notes tap target more obvious (#860) 2023-09-09 06:00:36 -04:00
b178b1d780 Bugfix 2023-09-09 05:46:56 -04:00
cbc840378c Add Uptodown (#853) 2023-09-09 05:31:04 -04:00
aa7989c16d Custom version extraction for HTML (#861) 2023-09-09 04:41:44 -04:00
85f9336804 Re-add dl notification when adding app (#858) 2023-09-09 03:58:54 -04:00
d66be3ecda Private GitHub repos now work (#857) 2023-09-09 03:55:52 -04:00
c08e05bd6c Trying to use header-based HTTP auth (not working) 2023-09-06 21:30:45 -04:00
e08ab89fd4 Update issue templates 2023-09-06 18:33:04 -04:00
8ba0a0a776 Merge pull request #852 from ImranR98/dev
Fix Aptoide App ID inferral error (#851)
2023-09-04 03:57:56 -04:00
73ed0cea88 Increment version 2023-09-04 03:56:41 -04:00
58a378d212 Fix Aptoide App ID inferral error (#851) 2023-09-04 03:55:13 -04:00
553307ba70 Merge pull request #850 from ImranR98/dev
Auto Select Highest VersionCode APK (F-Droid) (#846)
2023-09-03 16:12:24 -04:00
78f73a9049 Auto Select Highest VersionCode APK (F-Droid) (#846) 2023-09-03 16:11:17 -04:00
abc69e7a0e Merge pull request #849 from ImranR98/dev
Bugfix in HTML Source (#848)
2023-09-03 15:37:43 -04:00
503914dbce Bugfix in HTML Source (#848) 2023-09-03 15:37:26 -04:00
69680f8680 Merge pull request #844 from gidano/main
Update hu.json
2023-09-03 00:15:41 -04:00
1a616aacb7 Merge pull request #847 from ImranR98/dev
Add Aptoide as a Source (#843)
2023-09-03 00:15:01 -04:00
52d19f267e Upgrade packages, increment version 2023-09-03 00:14:23 -04:00
75a8dc9ee4 Add Aptoide as a Source (#843) 2023-09-02 21:28:30 -04:00
8c63920ef6 Update hu.json 2023-09-02 15:41:10 +02:00
dda5619cdc Update issue templates 2023-09-01 11:25:53 -04:00
9cc25fd931 Update issue templates 2023-09-01 11:18:42 -04:00
f5a9eb4295 Update issue templates 2023-09-01 11:13:04 -04:00
ebe256e482 Update issue templates 2023-09-01 11:05:49 -04:00
e215585a64 Merge pull request #840 from ImranR98/dev
Bugfix: BG update fail leads to infinite retries (#838), Group update notifications into one (#829), Temporarily exclude Obtainium from BG updates (#836)
2023-08-30 22:36:31 -04:00
8b01fc03ec Increment version 2023-08-30 22:35:11 -04:00
9af2c8370d Bugfix: BG update fail leads to infinite retries (#838) 2023-08-30 22:34:12 -04:00
01f9003b8d Group update notifications into one (#829) 2023-08-30 22:07:30 -04:00
73a3c7eb71 Temporarily exclude Obtainium from BG updates (#836) 2023-08-30 21:41:26 -04:00
370ec1432e Fix BG update OS requirement 2023-08-30 21:40:05 -04:00
4b63c124bb Merge pull request #835 from ImranR98/dev
VLC: Postpone mirror-dependent request until download time (#821)
2023-08-30 18:43:47 -04:00
3d7df604b1 Upgrade packages 2023-08-30 18:43:03 -04:00
59d1d275bc Increment version 2023-08-30 18:41:55 -04:00
f7f0332b13 VLC: Postpone mirror-dependent request to download time (#821) 2023-08-30 18:41:34 -04:00
917c5f5083 Merge pull request #833 from iDazai/main
Update de.json
2023-08-30 18:14:06 -04:00
370cf05615 Merge pull request #834 from bluefly000/japanese-translation
Update ja.json
2023-08-30 18:13:58 -04:00
101d892c7f Update ja.json 2023-08-30 14:09:11 +09:00
db2faf6511 Update de.json
updated newly added strings, added "APK" for the line "customLinkFilterRegex" which was added in other languages too.
2023-08-30 07:01:06 +02:00
3a83d1bf79 Merge pull request #831 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-08-29 13:06:16 -04:00
070e309aa6 Merge pull request #832 from ImranR98/dev
Disable Brazil language to unblock stuck users (temporary - until fix is found) (#830)
2023-08-29 13:06:05 -04:00
11ca7c3f7d Increment version 2023-08-29 13:05:17 -04:00
7a0acaefb3 Disable BR lang. to unblock users (temp.) (#830) 2023-08-29 13:04:58 -04:00
486f3664ef locale(pl): Update Polish translations 2023-08-29 18:59:54 +02:00
387b165314 Merge pull request #825 from ImranR98/dev
Increment version
2023-08-28 22:15:51 -04:00
4ba3f7996e Increment version 2023-08-28 22:08:37 -04:00
7ce41dfb67 Merge pull request #824 from LucasTavaresA/main
Fix and update brasilian translation
2023-08-28 22:07:44 -04:00
efd55c8d36 Fix and update brasilian translation 2023-08-28 22:10:54 -03:00
71543c64d4 Merge pull request #823 from ImranR98/dev
Various Enhancements and Bugfixes
2023-08-28 20:27:03 -04:00
408c1a541f Increment version 2023-08-28 20:26:21 -04:00
8f739d9e0b WiFi only BG update toggle (#819) + typo fix 2023-08-28 20:24:15 -04:00
bd8f608ee6 Allow apps to be exempted from BG updates (#822) 2023-08-28 20:02:09 -04:00
551643b11c More UI feedback when app updated (#814) 2023-08-28 19:51:49 -04:00
075ecae540 Re-add VLC with better error messaging when no mirror available (#821) 2023-08-28 19:36:02 -04:00
dcb8807fa7 Add "Intermediate Link" option to HTML Source (#820) 2023-08-28 19:11:22 -04:00
77ec2df31c Merge pull request #818 from LucasTavaresA/main
Add brasilian translation
2023-08-27 17:45:19 -04:00
d92e812554 Add brasilian translation 2023-08-27 18:27:09 -03:00
0a6e1f9cc6 Switch back to upstream package manager (from custom branch) 2023-08-27 15:43:17 -04:00
f3c3680382 Merge pull request #817 from ImranR98/dev
Increment version
2023-08-27 14:27:13 -04:00
f7e783a556 Increment version 2023-08-27 14:26:37 -04:00
fd1b72563d Merge pull request #816 from ImranR98/dev
Remove VLC (#801)
2023-08-27 14:25:11 -04:00
5a94ef82dd Merge remote-tracking branch 'origin/main' into dev 2023-08-27 14:24:59 -04:00
3ad46b7e21 Merge pull request #803 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-08-27 14:23:59 -04:00
1e94d71665 locale(pl): Update Polish translations 2023-08-27 19:59:19 +02:00
0899a576ff Merge pull request #815 from bluefly000/japanese-translation
Update ja.json
2023-08-27 13:21:42 -04:00
db2476f3a5 Update ja.json 2023-08-28 01:36:14 +09:00
8ba182870d Merge pull request #812 from LilligantMatsuri/main
Update Chinese translation
2023-08-27 07:48:04 -04:00
d81085a9e8 Update zh.json
- Translate new strings
- Slight improvements

Signed-off-by: Matsuri <matsuri@vmoe.info>
2023-08-27 15:30:01 +08:00
ae92a459b7 Remove VLC (#801) 2023-08-26 15:35:08 -04:00
e101c434d5 Merge pull request #809 from bluefly000/japanese-translation
Update ja.json
2023-08-26 14:54:48 -04:00
9686d0f0ca Added missing enableBackgroundUpdates text 2023-08-27 01:20:51 +09:00
1dd0392b78 Update ja.json 2023-08-27 01:15:08 +09:00
5e184d733b Merge pull request #806 from ImranR98/dev
Update README
2023-08-25 21:01:29 -04:00
ef0b20887b Update README 2023-08-25 21:00:57 -04:00
5cb4bd998b Merge pull request #805 from ImranR98/dev
Update packages, increment version
2023-08-25 20:54:18 -04:00
57f499c6a5 Update packages, increment version 2023-08-25 20:53:23 -04:00
c2ae6e19f9 Merge pull request #804 from ImranR98/dev
'Verify latest tag' toggle (#798, #740)
2023-08-25 20:41:59 -04:00
16104fde03 Merge branch 'main' into dev 2023-08-25 20:41:52 -04:00
13e10692b1 'Verify latest tag' toggle (#798, #740) 2023-08-25 20:40:35 -04:00
7fc93f23c0 Merge pull request #802 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-08-25 17:01:09 -04:00
d6ddf87365 locale(pl): Update Polish translations
Polish translation has been updated

Signed-off-by: Daviteusz <daviteusz0@gmail.com>
2023-08-25 22:49:54 +02:00
05172744cd Merge pull request #800 from ImranR98/dev
Enable Background Updates (#25)
2023-08-25 10:54:38 -04:00
2504ae24fc Fix bgcheck error reporting (per-app), move code around 2023-08-24 15:05:07 -04:00
5e41d5762b BG task: notif, retry, log tweaks 2023-08-24 10:46:11 -04:00
57d44c972f Update build script to create zips 2023-08-23 20:05:08 -04:00
be0b57ac00 Added logs, BG install cooldown 2023-08-23 19:51:52 -04:00
862bb2b276 chmod +x build.sh 2023-08-23 19:39:23 -04:00
5eac851f80 Added convenience build script 2023-08-23 19:36:24 -04:00
0deab8296f bug 2023-08-23 18:28:16 -04:00
6785708661 BG update toggle has an effect 2023-08-22 19:57:42 -04:00
5307fd0901 bug 2023-08-22 19:43:23 -04:00
788c4c7917 Try less messy bg update method 2023-08-22 19:14:56 -04:00
3f6d96289d Bugfix, logging 2023-08-22 18:13:28 -04:00
5cfd80e510 Added debug menu with on-demand bg task 2023-08-22 17:36:13 -04:00
9eb32ae55a Don't reschedule bg checks if app is restarted 2023-08-22 17:13:15 -04:00
82e08150ab bugs 2023-08-22 16:28:22 -04:00
e956ee9254 Trying a new recursive BG update task due2 mem limits 2023-08-22 12:51:55 -04:00
bb4f34317b Bugfix + version increment + update packages 2023-08-21 23:55:54 -04:00
d08ff3fbae Add BG update toggle 2023-08-21 20:32:41 -04:00
f5479ec82f Max 5 attempts for bg check fail due to rate/net 2023-08-21 20:15:57 -04:00
3eb25c4060 Switch to per-app BG update tasks 2023-08-21 20:10:30 -04:00
03bb1ad9a6 bugfix 2023-08-21 09:48:35 -04:00
b59d3e77f9 Enable experimental BG update support (not well tested) (#25) 2023-08-20 22:32:33 -04:00
7c41692d5f Enable version correction in background (replace plugin) 2023-08-20 16:03:41 -04:00
ce89d456e1 Merge pull request #788 from ImranR98/dev
Pub update
2023-08-19 01:44:36 -04:00
a0c48fcca6 Pub update 2023-08-19 01:44:02 -04:00
d0cba6d6bc Merge pull request #787 from ImranR98/dev
Enable Android TV 'OK' Button (#281), Add Huawei AppGallery (#756), Fix VLC Source (#758)
2023-08-19 01:41:31 -04:00
6baf6ccf4b Slightly better error reporting for failed xapk install 2023-08-19 01:40:14 -04:00
a2571e61a8 Fix VLC Source (#758) 2023-08-19 01:28:25 -04:00
f61824ff0d Add Huawei AppGallery (#756) 2023-08-19 00:19:52 -04:00
734a1aeb01 Enable Android TV 'OK' Button (#281) 2023-08-18 22:12:16 -04:00
5269aad90d Merge pull request #786 from ImranR98/dev
Don't Send "Foreground" Notification if Not Needed + Small UI Fix
2023-08-18 20:11:34 -04:00
eaeee188eb Upgrade packages, increment version 2023-08-18 19:58:54 -04:00
8c850e06ca Merge pull request #774 from iDazai/main
Update de.json
2023-08-18 19:56:59 -04:00
0f754a8da8 Merge pull request #775 from bluefly000/japanese-translation
Update ja.json
2023-08-18 19:56:31 -04:00
81c4d4f393 Fix default multi-"app change" selection bug 2023-08-18 19:55:31 -04:00
5317aee18d Merge pull request #776 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-08-18 19:54:44 -04:00
b66eeba3b5 Merge pull request #781 from mehdeej/main
Update fa.json
2023-08-18 19:54:22 -04:00
522ff1ddf7 Merge pull request #784 from Nriver/task/update-chinese-translation
update chinese translation
2023-08-18 19:54:06 -04:00
7ef9c43ee3 Don't wait for foreground if install is silent 2023-08-18 19:36:56 -04:00
05ac76e3e9 update chinese translation 2023-08-18 16:56:20 +08:00
4838402797 Update fa.json 2023-08-16 18:54:58 +00:00
0de12c7c07 locale(pl): Update Polish translations
Polish translation has been updated

Signed-off-by: Daviteusz <daviteusz0@gmail.com>
2023-08-14 23:24:16 +02:00
0dadd8bffe Update ja.json 2023-08-15 02:57:31 +09:00
75a0cb1189 Update de.json
translated newly added line
2023-08-14 14:38:38 +02:00
sim
7987083555 Add flutter as a submodule 2023-02-02 21:56:32 +01:00
sim
e94e195e73 Rename main flavor ('no') to 'github' 2023-01-29 22:42:22 +01:00
sim
869ebd90df Add fdroid flavor 2023-01-24 19:46:48 +01:00
115 changed files with 15044 additions and 4335 deletions

1
.flutter Submodule

Submodule .flutter added at 35c388afb5

34
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,34 @@
---
name: Bug report
about: Something isn't working right.
title: ''
labels: bug, to check
assignees: ''
---
**Prerequisites**
<!-- Please ensure your request is not part of an existing issue. -->
<!-- Please ensure you have checked the Obtainium Wiki. -->
<!-- Please ensure your request is an actual bug and not intended behaviour (this is frequently the case for issues involving version strings and the HTML source. -->
**Describe the bug**
<!-- A clear and concise description of what the bug is. -->
**To Reproduce**
<!-- Steps to reproduce the behavior:
1. Go to '...'
2. Tap on '....'
3. Scroll down to '....'
4. See error -->
**Screenshots and Logs**
<!-- If applicable, add screenshots, logs, and any other artifacts (like some/all files under `/Android/data/dev.imranr.obtainium/`) that you think may help troubleshoot the issue. -->
**Please complete the following information:**
- Device: <!-- [e.g. Pixel 7] -->
- OS: <!-- [e.g. GrapheneOS] -->
- Obtainium Version: <!-- [e.g. 0.14.6-beta] -->
**Additional context**
<!-- Add any other context about the problem here. -->

View File

@ -0,0 +1,33 @@
---
name: Feature request
about: Suggest a new Source, setting, or other feature.
title: ''
labels: enhancement, to check
assignees: ''
---
**Prerequisites**
<!-- Please ensure your request is not part of an existing issue. -->
<!-- Please ensure you have checked the Obtainium Wiki. -->
**Describe the feature**
<!-- A clear and concise description of what you want to happen.
For new Sources, please ensure:
1. It is not already possible to use the HTML Source for your purposes.
2. It must be possible to extract the following details from the Source in a reliable way:
- The App version (or any release-specific identifier - a "pseudo-version") for the latest release
- One or more APK URL(s) for the latest release
- Above details for previous releases (optional)
If you're not sure about 1 or 2, open a discussion item instead.
Note that the Web scraper cannot deal with JavaScript-enabled content. -->
**Describe alternatives you've considered (if applicable)**
<!-- A clear and concise description of any alternative solutions or features you've considered.
Note that app-specific Sources are less likely to be added. In those cases, see if the HTML Source will work for you (if not, see if a generally-applicable enhancement to the HTML Source would work, and suggest that instead). -->
**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->

74
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,74 @@
name: Build and Release
on:
workflow_dispatch:
inputs:
beta:
type: boolean
description: Is beta?
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: subosito/flutter-action@v2
with:
channel: stable
- uses: actions/setup-java@v4
with:
distribution: 'temurin' # See 'Supported distributions' for available options
java-version: '17'
- name: Flutter Doctor
id: flutter_doctor
run: |
flutter doctor -v
- name: Check submodule
id: check_submodule
run: |
git checkout ${{ inputs.checkout }}
- name: Extract Version
id: extract_version
run: |
VERSION=$(grep -oP "^version: [^\+]+" pubspec.yaml | tail -c +10)
echo "version=$VERSION" >> $GITHUB_OUTPUT
if [ ${{ inputs.beta }} == true ]; then BETA=true; else BETA=false; fi
echo "beta=$BETA" >> $GITHUB_OUTPUT
TAG="v$VERSION"
echo "tag=$TAG" >> $GITHUB_OUTPUT
- name: Build APKs
run: |
sed -i 's/signingConfig signingConfigs.release//g' android/app/build.gradle
flutter build apk --flavor normal && flutter build apk --split-per-abi --flavor normal
for file in build/app/outputs/flutter-apk/app-*normal*.apk*; do mv "$file" "${file//-normal/}"; done
flutter build apk --flavor fdroid -t lib/main_fdroid.dart && flutter build apk --split-per-abi --flavor fdroid -t lib/main_fdroid.dart
rm ./build/app/outputs/flutter-apk/*.sha1
cp ./sign.sh ./build/app/outputs/flutter-apk/
ls -l ./build/app/outputs/flutter-apk/
- name: Save Unsigned APKs as Action Artifacts
uses: actions/upload-artifact@v4
with:
path: build/app/outputs/flutter-apk/*
- name: Create Tag
uses: mathieudutour/github-tag-action@v6.1
with:
github_token: ${{ secrets.GH_ACCESS_TOKEN }}
custom_tag: "${{ steps.extract_version.outputs.tag }}"
tag_prefix: ""
- name: Create Draft Release
uses: ncipollo/release-action@v1
with:
token: ${{ secrets.GH_ACCESS_TOKEN }}
tag: "${{ steps.extract_version.outputs.tag }}"
prerelease: "${{ steps.extract_version.outputs.beta }}"
draft: "true"
generateReleaseNotes: true

3
.gitignore vendored
View File

@ -5,9 +5,11 @@
*.swp *.swp
.DS_Store .DS_Store
.atom/ .atom/
.build/
.buildlog/ .buildlog/
.history .history
.svn/ .svn/
.swiftpm/
migrate_working_dir/ migrate_working_dir/
.vscode/ .vscode/
@ -43,6 +45,7 @@ app.*.map.json
/android/app/debug /android/app/debug
/android/app/profile /android/app/profile
/android/app/release /android/app/release
/android/app/.cxx
# Custom # Custom
TODO.txt TODO.txt

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule ".flutter"]
path = .flutter
url = https://github.com/flutter/flutter/

View File

@ -1,11 +1,11 @@
# This file tracks properties of this Flutter project. # This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc. # Used by Flutter tool to assess capabilities and perform upgrades etc.
# #
# This file should be version controlled. # This file should be version controlled and should not be manually edited.
version: version:
revision: 543dac2f35de563fcb6905e9146bdce712c44000 revision: "17025dd88227cd9532c33fa78f5250d548d87e9a"
channel: master channel: "stable"
project_type: app project_type: app
@ -13,14 +13,26 @@ project_type: app
migration: migration:
platforms: platforms:
- platform: root - platform: root
create_revision: 543dac2f35de563fcb6905e9146bdce712c44000 create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
base_revision: 543dac2f35de563fcb6905e9146bdce712c44000 base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
- platform: android - platform: android
create_revision: 543dac2f35de563fcb6905e9146bdce712c44000 create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
base_revision: 543dac2f35de563fcb6905e9146bdce712c44000 base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
- platform: ios - platform: ios
create_revision: 543dac2f35de563fcb6905e9146bdce712c44000 create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
base_revision: 543dac2f35de563fcb6905e9146bdce712c44000 base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
- platform: linux
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
- platform: macos
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
- platform: web
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
- platform: windows
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
# User provided section # User provided section

View File

@ -1,40 +1,70 @@
# ![Obtainium Icon](./assets/graphics/icon_small.png) Obtainium # ![Obtainium Icon](./assets/graphics/icon_small.png) Obtainium
Get Android App Updates Directly From the Source. [![Ceasefire Now](https://badge.techforpalestine.org/default)](https://techforpalestine.org/learn-more)
Obtainium allows you to install and update Open-Source Apps directly from their releases pages, and receive notifications when new releases are made available. Get Android app updates straight from the source.
Motivation: [Side Of Burritos - You should use this instead of F-Droid | How to use app RSS feed](https://youtu.be/FFz57zNR_M0) Obtainium allows you to install and update apps directly from their releases pages, and receive notifications when new releases are made available.
More info:
- [Obtainium Wiki](https://wiki.obtainium.imranr.dev/) ([repository](https://github.com/ImranR98/Obtainium-Wiki))
- [AppVerifier](https://github.com/soupslurpr/AppVerifier) - App verification tool (recommended, integrates with Obtainium)
- [apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev/) - Crowdsourced app configurations ([repository](https://github.com/ImranR98/apps.obtainium.imranr.dev))
- [Side Of Burritos - You should use this instead of F-Droid | How to use app RSS feed](https://youtu.be/FFz57zNR_M0) - Original motivation for this app
- [Website](https://obtainium.imranr.dev) ([repository](https://github.com/ImranR98/obtainium.imranr.dev))
- [Source code](https://github.com/ImranR98/Obtainium)
Currently supported App sources: Currently supported App sources:
- [GitHub](https://github.com/) - Open Source - General:
- [GitLab](https://gitlab.com/) - [GitHub](https://github.com/)
- [Codeberg](https://codeberg.org/) - [GitLab](https://gitlab.com/)
- [F-Droid](https://f-droid.org/) - [Forgejo](https://forgejo.org/) ([Codeberg](https://codeberg.org/))
- [IzzyOnDroid](https://android.izzysoft.de/) - [F-Droid](https://f-droid.org/)
- [Mullvad](https://mullvad.net/en/) - Third Party F-Droid Repos
- [Signal](https://signal.org/) - [IzzyOnDroid](https://android.izzysoft.de/)
- [SourceForge](https://sourceforge.net/) - [SourceHut](https://git.sr.ht/)
- [SourceHut](https://git.sr.ht/) - Other - General:
- [APKMirror](https://apkmirror.com/) (Track-Only) - [APKPure](https://apkpure.net/)
- [APKPure](https://apkpure.com/) - [Aptoide](https://aptoide.com/)
- Third Party F-Droid Repos - [Uptodown](https://uptodown.com/)
- Jenkins Jobs - [Huawei AppGallery](https://appgallery.huawei.com/)
- [Steam](https://store.steampowered.com/mobile) - [Tencent App Store](https://sj.qq.com/)
- [Telegram App](https://telegram.org) - [RuStore](https://rustore.ru/)
- [VLC](https://www.videolan.org/vlc/download-android.html) - Jenkins Jobs
- [Neutron Code](https://neutroncode.com) - [APKMirror](https://apkmirror.com/) (Track-Only)
- "HTML" (Fallback) - Other - App-Specific:
- Any other URL that returns an HTML page with links to APK files (if multiple, the last file alphabetically is picked) - [Telegram App](https://telegram.org/)
- [Neutron Code](https://neutroncode.com/)
- Direct APK Link
- "HTML" (Fallback): Any other URL that returns an HTML page with links to APK files
## Finding App Configurations
You can find crowdsourced app configurations at [apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev).
If you can't find the configuration for an app you want, feel free to leave a request on the [discussions page](https://github.com/ImranR98/apps.obtainium.imranr.dev/discussions/new?category=app-requests).
Or, contribute some configurations to the website by creating a PR at [this repo](https://github.com/ImranR98/apps.obtainium.imranr.dev).
## Installation ## Installation
[<img src="https://github.com/machiav3lli/oandbackupx/blob/034b226cea5c1b30eb4f6a6f313e4dadcbb0ece4/badge_github.png" [<img src="https://github.com/machiav3lli/oandbackupx/blob/034b226cea5c1b30eb4f6a6f313e4dadcbb0ece4/badge_github.png"
alt="Get it on GitHub" alt="Get it on GitHub"
height="80">](https://github.com/ImranR98/Obtainium/releases) height="80">](https://github.com/ImranR98/Obtainium/releases)
[<img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png"
alt="Get it on IzzyOnDroid"
height="80">](https://apt.izzysoft.de/fdroid/index/apk/dev.imranr.obtainium)
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
alt="Get it on F-Droid"
height="80">](https://f-droid.org/packages/dev.imranr.obtainium.fdroid/)
Verification info:
- Package ID: `dev.imranr.obtainium`
- SHA-256 Hash of Signing Certificate: `B3:53:60:1F:6A:1D:5F:D6:60:3A:E2:F5:0B:E8:0C:F3:01:36:7B:86:B6:AB:8B:1F:66:24:3D:A9:6C:D5:73:62`
- Note: The above signature is also valid for the F-Droid flavour of Obtainium, thanks to [reproducible builds](https://f-droid.org/docs/Reproducible_Builds/).
- [PGP Public Key](https://keyserver.ubuntu.com/pks/lookup?search=contact%40imranr.dev&fingerprint=on&op=index) (to verify APK hashes)
## Limitations ## Limitations
- Auto (unattended) updates are unsupported due to a lack of any capable Flutter plugin.
- For some sources, data is gathered using Web scraping and can easily break due to changes in website design. In such cases, more reliable methods may be unavailable. - For some sources, data is gathered using Web scraping and can easily break due to changes in website design. In such cases, more reliable methods may be unavailable.
## Screenshots ## Screenshots

View File

@ -13,8 +13,7 @@ linter:
# The lint rules applied to this project can be customized in the # The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml` # section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints # included above or to enable additional rules. A list of all available lints
# and their documentation is published at # and their documentation is published at https://dart.dev/lints.
# https://dart-lang.github.io/linter/lints/index.html.
# #
# Instead of disabling a lint rule for the entire project in the # Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code # section below, it can also be suppressed for a single line of code

2
android/.gitignore vendored
View File

@ -7,7 +7,7 @@ gradle-wrapper.jar
GeneratedPluginRegistrant.java GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore. # Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app # See https://flutter.dev/to/reference-keystore
key.properties key.properties
**/*.keystore **/*.keystore
**/*.jks **/*.jks

View File

@ -1,3 +1,10 @@
plugins {
id "com.android.application"
id "kotlin-android"
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties() def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties') def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) { if (localPropertiesFile.exists()) {
@ -6,11 +13,6 @@ if (localPropertiesFile.exists()) {
} }
} }
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode') def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) { if (flutterVersionCode == null) {
flutterVersionCode = '1' flutterVersionCode = '1'
@ -21,10 +23,6 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0' flutterVersionName = '1.0'
} }
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
def keystoreProperties = new Properties() def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties') def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) { if (keystorePropertiesFile.exists()) {
@ -32,33 +30,43 @@ if (keystorePropertiesFile.exists()) {
} }
android { android {
compileSdkVersion 33 namespace = "dev.imranr.obtainium"
ndkVersion flutter.ndkVersion compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8
} }
kotlinOptions { kotlinOptions {
jvmTarget = '1.8' jvmTarget = JavaVersion.VERSION_1_8
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
} }
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "dev.imranr.obtainium" applicationId = "dev.imranr.obtainium"
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. // For more information, see: https://flutter.dev/to/review-gradle-config.
minSdkVersion 23 minSdk = 24
targetSdkVersion 33 targetSdk = flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger() versionCode = flutter.versionCode
versionName flutterVersionName versionName = flutter.versionName
} }
flavorDimensions "flavor"
productFlavors {
normal {
dimension "flavor"
applicationIdSuffix ""
}
fdroid {
dimension "flavor"
applicationIdSuffix ".fdroid"
}
}
signingConfigs { signingConfigs {
release { release {
keyAlias keystoreProperties['keyAlias'] keyAlias keystoreProperties['keyAlias']
@ -67,17 +75,31 @@ android {
storePassword keystoreProperties['storePassword'] storePassword keystoreProperties['storePassword']
} }
} }
buildTypes { buildTypes {
release { release {
signingConfig signingConfigs.release signingConfig signingConfigs.release
} }
debug {
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug"
}
} }
} }
flutter { flutter {
source '../..' source = "../.."
} }
dependencies { ext.abiCodes = ["x86_64": 1, "armeabi-v7a": 2, "arm64-v8a": 3]
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" import com.android.build.OutputFile
} android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def abiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
if (abiVersionCode != null) {
output.versionCodeOverride = variant.versionCode * 10 + abiVersionCode
} else {
output.versionCodeOverride = variant.versionCode * 10
}
}
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="label">Obtainium Debug</string>
</resources>

View File

@ -1,14 +1,18 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="dev.imranr.obtainium"> package="dev.imranr.obtainium">
<application <application
android:label="Obtainium" android:label="@string/label"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:requestLegacyExternalStorage="true"> android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
android:localeConfig="@xml/locales_config">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme" android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
@ -18,17 +22,23 @@
while the Flutter UI initializes. After that, this theme continues while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. --> to determine the Window background behind the Flutter UI. -->
<meta-data <meta-data
android:name="io.flutter.embedding.android.NormalTheme" android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" android:resource="@style/NormalTheme"
/> />
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action <action
android:name="com.android_package_installer.content.SESSION_API_PACKAGE_INSTALLED" android:name="com.android_package_installer.content.SESSION_API_PACKAGE_INSTALLED"
android:exported="false"/> android:exported="false" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="obtainium" />
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Don't delete the meta-data below. <!-- Don't delete the meta-data below.
@ -36,39 +46,42 @@
<meta-data <meta-data
android:name="flutterEmbedding" android:name="flutterEmbedding"
android:value="2" /> android:value="2" />
<service
android:name="dev.fluttercommunity.plus.androidalarmmanager.AlarmService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/>
<receiver
android:name="dev.fluttercommunity.plus.androidalarmmanager.AlarmBroadcastReceiver"
android:exported="false"/>
<receiver
android:name="dev.fluttercommunity.plus.androidalarmmanager.RebootBroadcastReceiver"
android:enabled="false"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="dev.imranr.obtainium" android:authorities="${applicationId}"
android:grantUriPermissions="true"> android:grantUriPermissions="true">
<meta-data <meta-data
android:name="android.support.FILE_PROVIDER_PATHS" android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/> android:resource="@xml/file_paths" />
</provider> </provider>
<provider
android:name="rikka.shizuku.ShizukuProvider"
android:authorities="${applicationId}.shizuku"
android:multiprocess="false"
android:enabled="true"
android:exported="true"
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
</application> </application>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" /> <uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission <uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29"/> android:maxSdkVersion="29" />
</manifest> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>

View File

@ -2,5 +2,4 @@ package dev.imranr.obtainium
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() { class MainActivity: FlutterActivity()
}

View File

@ -1,8 +1,8 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt" <vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
android:viewportWidth="142.129" android:viewportWidth="142.129"
android:viewportHeight="142.129" android:viewportHeight="142.129"
android:width="503.6066dp" android:width="108dp"
android:height="503.6066dp"> android:height="108dp">
<group <group
android:translateX="-30.39437" android:translateX="-30.39437"
android:translateY="-54.68043"> android:translateY="-54.68043">

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="label">Obtainium</string>
</resources>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="bs"/>
<locale android:name="cs"/>
<locale android:name="de"/>
<locale android:name="en"/>
<locale android:name="es"/>
<locale android:name="fa"/>
<locale android:name="fr"/>
<locale android:name="hu"/>
<locale android:name="it"/>
<locale android:name="ja"/>
<locale android:name="nl"/>
<locale android:name="pl"/>
<locale android:name="pt"/>
<locale android:name="ru"/>
<locale android:name="sv"/>
<locale android:name="tr"/>
<locale android:name="uk"/>
<locale android:name="vi"/>
<locale android:name="zh"/>
</locale-config>

View File

@ -1,29 +1,20 @@
buildscript {
ext.kotlin_version = '1.7.10'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects { allprojects {
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
maven {
// [required] background_fetch
url "${project(':background_fetch').projectDir}/libs"
}
} }
} }
rootProject.buildDir = '../build' rootProject.buildDir = "../build"
subprojects { subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}" project.buildDir = "${rootProject.buildDir}/${project.name}"
} }
subprojects { subprojects {
project.evaluationDependsOn(':app') project.evaluationDependsOn(":app")
} }
tasks.register("clean", Delete) { tasks.register("clean", Delete) {

View File

@ -1,3 +1,3 @@
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true

View File

@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip

View File

@ -1,11 +1,25 @@
include ':app' pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}()
def localPropertiesFile = new File(rootProject.projectDir, "local.properties") includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
def properties = new Properties()
assert localPropertiesFile.exists() repositories {
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } google()
mavenCentral()
gradlePluginPortal()
}
}
def flutterSdkPath = properties.getProperty("flutter.sdk") plugins {
assert flutterSdkPath != null, "flutter.sdk not set in local.properties" id "dev.flutter.flutter-plugin-loader" version "1.0.0"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" id "com.android.application" version "8.1.0" apply false
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
}
include ":app"

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

After

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 KiB

After

Width:  |  Height:  |  Size: 264 KiB

View File

@ -1,298 +1,382 @@
{ {
"invalidURLForSource": "Nije važeći URL aplikacije {}", "invalidURLForSource": "Nije važeći URL aplikacije {}",
"noReleaseFound": "Nije moguće pronaći odgovarajuće izdanje", "noReleaseFound": "Nije moguće pronaći odgovarajuće izdanje",
"noVersionFound": "Nije moguće odrediti verziju izdanja", "noVersionFound": "Nije moguće odrediti verziju izdanja",
"urlMatchesNoSource": "URL se ne podudara s poznatim izvorom", "urlMatchesNoSource": "URL se ne podudara s poznatim izvorom",
"cantInstallOlderVersion": "Nije moguće instalirati stariju verziju aplikacije", "cantInstallOlderVersion": "Nije moguće instalirati stariju verziju aplikacije",
"appIdMismatch": "ID preuzetog paketa se ne podudara s postojećim ID-om aplikacije", "appIdMismatch": "ID preuzetog paketa se ne podudara s postojećim ID-om aplikacije",
"functionNotImplemented": "Ova klasa nije implementirala ovu funkciju", "functionNotImplemented": "Ova klasa nije implementirala ovu funkciju",
"placeholder": "Rezervirano mjesto", "placeholder": "Rezervirano mjesto",
"someErrors": "Došlo je do nekih grešaka", "someErrors": "Došlo je do nekih grešaka",
"unexpectedError": "Neočekivana greška", "unexpectedError": "Neočekivana greška",
"ok": "Dobro", "ok": "Dobro",
"and": "i", "and": "i",
"startedBgUpdateTask": "Započeo je pozadinski zadatak provjere ažuriranja", "githubPATLabel": "GitHub token za lični pristup (eng. PAT, povećava ograničenje stope)",
"bgUpdateIgnoreAfterIs": "ignoreAfter pozadinskog zadataka je {}", "includePrereleases": "Uključi preliminarna izdanja",
"startedActualBGUpdateCheck": "Započela je stvarna provjera ažuriranja", "fallbackToOlderReleases": "Povratak na starija izdanja",
"bgUpdateTaskFinished": "Završen zadatak provjere ažuriranja", "filterReleaseTitlesByRegEx": "Filtrirajte naslove izdanja prema regularnom izrazu",
"firstRun": "Ovo je prvi put da pokrećete Obtainium", "invalidRegEx": "Nevažeći regularni izraz",
"settingUpdateCheckIntervalTo": "Podešavanje intervala ažuriranja na {}", "noDescription": "Bez opisa",
"githubPATLabel": "GitHub token za lični pristup (eng. PAT, povećava ograničenje stope)", "cancel": "Otkaži",
"githubPATHint": "PAT mora biti u ovom formatu: korisničko_ime:token", "continue": "Nastavite",
"githubPATFormat": "korisničko_ime:token", "requiredInBrackets": "(obavezno)",
"includePrereleases": "Uključi preliminarna izdanja", "dropdownNoOptsError": "GREŠKA: PADAJUĆI MENI MORA IMATI NAJMANJE JEDNU OPCIJU",
"fallbackToOlderReleases": "Povratak na starija izdanja", "colour": "Boja",
"filterReleaseTitlesByRegEx": "Filtrirajte naslove izdanja prema regularnom izrazu", "standard": "Standard",
"invalidRegEx": "Nevažeći regularni izraz", "custom": "Custom",
"noDescription": "Bez opisa", "useMaterialYou": "Koristi Material You temu",
"cancel": "Otkaži", "githubStarredRepos": "GitHub repo-i sa zvjezdicom",
"continue": "Nastavite", "uname": "Korisničko ime",
"requiredInBrackets": "(obavezno)", "wrongArgNum": "Naveden je pogrešan broj argumenata",
"dropdownNoOptsError": "GREŠKA: PADAJUĆI MENI MORA IMATI NAJMANJE JEDNU OPCIJU", "xIsTrackOnly": "{} je samo za praćenje",
"colour": "Boja", "source": "Izvor",
"githubStarredRepos": "GitHub repo-i sa zvjezdicom", "app": "Aplikacija. ",
"uname": "Korisničko ime", "appsFromSourceAreTrackOnly": "Aplikacije iz ovog izvora su 'Samo za praćenje'.",
"wrongArgNum": "Naveden je pogrešan broj argumenata", "youPickedTrackOnly": "Odabrali ste opciju „Samo za praćenje”.",
"xIsTrackOnly": "{} je samo za praćenje", "trackOnlyAppDescription": "Aplikacija će se pratiti radi ažuriranja, ali Obtainium neće moći da je preuzme ili instalira.",
"source": "Izvor", "cancelled": "Otkazano",
"app": "Aplikacija. ", "appAlreadyAdded": "Aplikacija je već dodana",
"appsFromSourceAreTrackOnly": "Aplikacije iz ovog izvora su 'Samo za praćenje'.", "alreadyUpToDateQuestion": "Aplikacija je već ažurirana?",
"youPickedTrackOnly": "Odabrali ste opciju „Samo za praćenje”.", "addApp": "Dodaj aplikaciju",
"trackOnlyAppDescription": "Aplikacija će se pratiti radi ažuriranja, ali Obtainium neće moći da je preuzme ili instalira.", "appSourceURL": "Izvorni URL aplikacije",
"cancelled": "Otkazano", "error": "Greška",
"appAlreadyAdded": "Aplikacija je već dodana", "add": "Dodaj",
"alreadyUpToDateQuestion": "Aplikacija je već ažurirana?", "searchSomeSourcesLabel": "Pretraživanje (samo neki izvori)",
"addApp": "Dodaj aplikaciju", "search": "Pretraživanje",
"appSourceURL": "Izvorni URL aplikacije", "additionalOptsFor": "Dodatne opcije za {}",
"error": "Greška", "supportedSources": "Podržani izvori",
"add": "Dodaj", "trackOnlyInBrackets": "(Samo za praćenje)",
"searchSomeSourcesLabel": "Pretraživanje (samo neki izvori)", "searchableInBrackets": "(Može se pretraživati)",
"search": "Pretraživanje", "appsString": "Aplikacije",
"additionalOptsFor": "Dodatne opcije za {}", "noApps": "Nema aplikacija",
"supportedSourcesBelow": "Podržani izvori:", "noAppsForFilter": "Nema aplikacija za filter",
"trackOnlyInBrackets": "(Samo za praćenje)", "byX": "Autor {}",
"searchableInBrackets": "(Može se pretraživati)", "percentProgress": "Napredak: {}%",
"appsString": "Aplikacije", "pleaseWait": "Molimo sačekajte",
"noApps": "Nema aplikacija", "updateAvailable": "Ažuriranje dostupno",
"noAppsForFilter": "Nema aplikacija za filter", "notInstalled": "Nije instalirano",
"byX": "Autor {}", "pseudoVersion": "pseudo-verzija",
"percentProgress": "Napredak: {}%", "selectAll": "Označi sve",
"pleaseWait": "Molimo sačekajte", "deselectX": "Poništi odabir {}",
"updateAvailable": "Ažuriranje dostupno", "xWillBeRemovedButRemainInstalled": "{} će biti uklonjen iz Obtainiuma, ali će ostati instaliran na uređaju.",
"estimateInBracketsShort": "(Procjena)", "removeSelectedAppsQuestion": "Želite li ukloniti odabrane aplikacije?",
"notInstalled": "Nije instalirano", "removeSelectedApps": "Ukloni odabrane aplikacije",
"estimateInBrackets": "(Procjena)", "updateX": "Nadogradi {}",
"selectAll": "Označi sve", "installX": "Instaliraj {}",
"deselectN": "Poništi odabir {}", "markXTrackOnlyAsUpdated": "Označi {}\n(samo za praćenje)\nkao ažurirano",
"xWillBeRemovedButRemainInstalled": "{} će biti uklonjen iz Obtainiuma, ali će ostati instaliran na uređaju.", "changeX": "Promjena {}",
"removeSelectedAppsQuestion": "Želite li ukloniti odabrane aplikacije?", "installUpdateApps": "Instalirajte/ažurirajte aplikacije",
"removeSelectedApps": "Ukloni odabrane aplikacije", "installUpdateSelectedApps": "Instalirajte/ažurirajte odabrane aplikacije",
"updateX": "Nadogradi {}", "markXSelectedAppsAsUpdated": "Označite {} odabrane aplikacije kao ažurirane?",
"installX": "Instaliraj {}", "no": "Ne",
"markXTrackOnlyAsUpdated": "Označi {}\n(samo za praćenje)\nkao ažurirano", "yes": "Da",
"changeX": "Promjena {}", "markSelectedAppsUpdated": "Označi odabrane aplikacije kao ažurirane",
"installUpdateApps": "Instalirajte/ažurirajte aplikacije", "pinToTop": "Prikvači na vrh",
"installUpdateSelectedApps": "Instalirajte/ažurirajte odabrane aplikacije", "unpinFromTop": "Otkvači sa vrha",
"markXSelectedAppsAsUpdated": "Označite {} odabrane aplikacije kao ažurirane?", "resetInstallStatusForSelectedAppsQuestion": "Resetujte status instalacije za odabrane aplikacije?",
"no": "Ne", "installStatusOfXWillBeResetExplanation": "Status instalacije bilo koje odabrane aplikacije će se resetovati.\n\nTo može pomoći kada je verzija aplikacije prikazana u Obtainiumu netačna zbog neuspjelih ažuriranja ili drugih problema.",
"yes": "Da", "customLinkMessage": "Ove veze rade na uređajima s instaliranim Obtainiumom",
"markSelectedAppsUpdated": "Označi odabrane aplikacije kao ažurirane", "shareAppConfigLinks": "Podijelite konfiguraciju aplikacije kao HTML vezu",
"pinToTop": "Prikvači na vrh", "shareSelectedAppURLs": "Podijeli odabrane URL-ove aplikacija",
"unpinFromTop": "Otkvači sa vrha", "resetInstallStatus": "Resetujte status instalacije",
"resetInstallStatusForSelectedAppsQuestion": "Resetujte status instalacije za odabrane aplikacije?", "more": "Više",
"installStatusOfXWillBeResetExplanation": "Status instalacije bilo koje odabrane aplikacije će se resetovati.\n\nTo može pomoći kada je verzija aplikacije prikazana u Obtainiumu netačna zbog neuspjelih ažuriranja ili drugih problema.", "removeOutdatedFilter": "Uklonite zastarjeli filter aplikacija",
"shareSelectedAppURLs": "Podijeli odabrane URL-ove aplikacija", "showOutdatedOnly": "Prikaži samo zastarjele aplikacije",
"resetInstallStatus": "Resetujte status instalacije", "filter": "Filtriranje",
"more": "Više", "filterApps": "Filtriraj aplikacije",
"removeOutdatedFilter": "Uklonite zastarjeli filter aplikacija", "appName": "Naziv aplikacije",
"showOutdatedOnly": "Prikaži samo zastarjele aplikacije", "author": "Autor",
"filter": "Filtriranje", "upToDateApps": "Ažurirane aplikacije",
"filterActive": "Filtriranje", "nonInstalledApps": "Neinstalirane aplikacije",
"filterApps": "Filtriraj aplikacije", "importExport": "Uvoz/izvoz",
"appName": "Naziv aplikacije", "settings": "Postavke",
"author": "Autor", "exportedTo": "Izvezeno u {}",
"upToDateApps": "Ažurirane aplikacije", "obtainiumExport": "Obtainium izvoz",
"nonInstalledApps": "Neinstalirane aplikacije", "invalidInput": "Neispravan unos.",
"importExport": "Uvoz/izvoz", "importedX": "Uvezeno {}",
"settings": "Postavke", "obtainiumImport": "Obtainium uvoz",
"exportedTo": "Izvezeno u {}", "importFromURLList": "Uvoz iz URL liste",
"obtainiumExport": "Obtainium Export", "searchQuery": "Pretraga za: ",
"invalidInput": "Neispravan unos.", "appURLList": "Lista URL adresa aplikacija",
"importedX": "Uvezeno {}", "line": "Linija",
"obtainiumImport": "Obtainium uvoz", "searchX": "Pretraživanje {}",
"importFromURLList": "Uvoz iz URL liste", "noResults": "Nema rezultata",
"searchQuery": "Pretraga za: ", "importX": "Uvoz {}",
"appURLList": "Lista URL adresa aplikacija", "importedAppsIdDisclaimer": "Uvezene aplikacije mogu se pogrešno prikazati kao „Nije instalirano”.\nDa biste to riješili, ponovo ih instalirajte putem aplikacije Obtainium.\nTo ne bi trebalo uticati na podatke aplikacije.\n\nUtječe samo na URL i metode uvoza treće strane.",
"line": "Linija", "importErrors": "Uvezi greške",
"searchX": "Pretraživanje {}", "importedXOfYApps": "{} od {} aplikacija uvezeno.",
"noResults": "Nema rezultata", "followingURLsHadErrors": "Sljedeći URL-ovi su imali greške:",
"importX": "Uvoz {}", "selectURL": "Odaberite URL",
"importedAppsIdDisclaimer": "Uvezene aplikacije mogu se pogrešno prikazati kao „Nije instalirano”.\nDa biste to riješili, ponovo ih instalirajte putem aplikacije Obtainium.\nTo ne bi trebalo uticati na podatke aplikacije.\n\nUtječe samo na URL i metode uvoza treće strane.", "selectURLs": "Odaberite URL-ove",
"importErrors": "Uvezi greške", "pick": "Odaberi",
"importedXOfYApps": "{} od {} aplikacija uvezeno.", "theme": "Tema",
"followingURLsHadErrors": "Sljedeći URL-ovi su imali greške:", "dark": "Tamna",
"okay": "Dobro", "light": "Svijetla",
"selectURL": "Odaberite URL", "followSystem": "Pratite sistem",
"selectURLs": "Odaberite URL-ove", "followSystemThemeExplanation": "Praćenje sistemske teme je moguće jedino koristeći aplikacije treće strane",
"pick": "Odaberi", "useBlackTheme": "Koristite čisto crnu tamnu temu",
"theme": "Tema", "appSortBy": "Aplikacije sortirane po",
"dark": "Tamna", "authorName": "Autor/Ime",
"light": "Svijetla", "nameAuthor": "Ime/Autor",
"followSystem": "Pratite sistem", "asAdded": "Kao što je dodano",
"obtainium": "Obtainium", "appSortOrder": "Redoslijed sortiranja aplikacija",
"materialYou": "Material You", "ascending": "Uzlazno",
"useBlackTheme": "Koristite čisto crnu tamnu temu", "descending": "Silazno",
"appSortBy": "Aplikacije sortirane po", "bgUpdateCheckInterval": "Interval provjere ažuriranja u pozadini",
"authorName": "Autor/Ime", "neverManualOnly": "Nikada - samo ručno",
"nameAuthor": "Ime/Autor", "appearance": "Izgled",
"asAdded": "Kao što je dodano", "showWebInAppView": "Prikaži izvornu web stranicu u prikazu aplikacije",
"appSortOrder": "Redoslijed sortiranja aplikacija", "pinUpdates": "Prikvačite ažuriranja na vrh prikaza aplikacija",
"ascending": "Uzlazno", "updates": "Nadogradnje",
"descending": "Silazno", "sourceSpecific": "Specifično za izvor",
"bgUpdateCheckInterval": "Interval provjere ažuriranja u pozadini", "appSource": "Izvor aplikacije",
"neverManualOnly": "Nikada - samo ručno", "noLogs": "Nema evidencije",
"appearance": "Izgled", "appLogs": "Evidencije aplikacija",
"showWebInAppView": "Prikaži izvornu web stranicu u prikazu aplikacije", "close": "Zatvori",
"pinUpdates": "Prikvačite ažuriranja na vrh prikaza aplikacija", "share": "Podijeli",
"updates": "Nadogradnje", "appNotFound": "Aplikacija nije pronađena",
"sourceSpecific": "Specifično za izvor", "obtainiumExportHyphenatedLowercase": "obtainium-izvoz",
"appSource": "Izvor aplikacije", "pickAnAPK": "Odaberite APK",
"noLogs": "Nema evidencije", "appHasMoreThanOnePackage": "{} ima više od jednog paketa:",
"appLogs": "Evidencije aplikacija", "deviceSupportsXArch": "Vaš uređaj podržava {} arhitekturu procesora.",
"close": "Zatvori", "deviceSupportsFollowingArchs": "Vaš uređaj podržava sljedeće arhitekture procesora:",
"share": "Podijeli", "warning": "Upozorenje",
"appNotFound": "Aplikacija nije pronađena", "sourceIsXButPackageFromYPrompt": "Izvor aplikacije je '{}', ali paket za izdavanje dolazi iz '{}'. Želite li nastaviti?",
"obtainiumExportHyphenatedLowercase": "obtainium-export", "updatesAvailable": "Dostupna ažuriranja",
"pickAnAPK": "Odaberite APK", "updatesAvailableNotifDescription": "Obavještava korisnika da su ažuriranja dostupna za jednu ili više aplikacija koje prati Obtainium",
"appHasMoreThanOnePackage": "{} ima više od jednog paketa:", "noNewUpdates": "Nema novih ažuriranja.",
"deviceSupportsXArch": "Vaš uređaj podržava {} arhitekturu procesora.", "xHasAnUpdate": "{} ima ažuriranje.",
"deviceSupportsFollowingArchs": "Vaš uređaj podržava sljedeće arhitekture procesora:", "appsUpdated": "Aplikacije su ažurirane",
"warning": "Upozorenje", "appsNotUpdated": "Neuspješno ažuriranje aplikacija",
"sourceIsXButPackageFromYPrompt": "Izvor aplikacije je '{}', ali paket za izdavanje dolazi iz '{}'. Želite li nastaviti?", "appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija",
"updatesAvailable": "Dostupna ažuriranja", "xWasUpdatedToY": "{} je ažuriran na {}.",
"updatesAvailableNotifDescription": "Obavještava korisnika da su ažuriranja dostupna za jednu ili više aplikacija koje prati Obtainium", "xWasNotUpdatedToY": "Neuspješno ažuriranje {} na {}.",
"noNewUpdates": "Nema novih ažuriranja.", "errorCheckingUpdates": "Greška pri provjeri ažuriranja",
"xHasAnUpdate": "{} ima ažuriranje.", "errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije",
"appsUpdated": "Aplikacije su ažurirane", "appsRemoved": "Aplikacije su uklonjene",
"appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija", "appsRemovedNotifDescription": "Obavještava korisnika da je jedna ili više aplikacija uklonjeno zbog grešaka prilikom učitavanja",
"xWasUpdatedToY": "{} je ažuriran na {}.", "xWasRemovedDueToErrorY": "{} je uklonjen zbog ove greške: {}",
"errorCheckingUpdates": "Greška pri provjeri ažuriranja", "completeAppInstallation": "Dovršite instalaciju aplikacije",
"errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije", "obtainiumMustBeOpenToInstallApps": "Obtainium mora biti otvoren za instalaciju aplikacija",
"appsRemoved": "Aplikacije su uklonjene", "completeAppInstallationNotifDescription": "Traži od korisnika da se vrati u Obtainium kako bi dovršio instalaciju aplikacije",
"appsRemovedNotifDescription": "Obavještava korisnika da je jedna ili više aplikacija uklonjeno zbog grešaka prilikom učitavanja", "checkingForUpdates": "Tražim moguće nadogradnje",
"xWasRemovedDueToErrorY": "{} je uklonjen zbog ove greške: {}", "checkingForUpdatesNotifDescription": "Privremeno obavještenje koje se pojavljuje prilikom provjere ažuriranja",
"completeAppInstallation": "Dovršite instalaciju aplikacije", "pleaseAllowInstallPerm": "Dozvolite Obtainiumu da instalira aplikacije",
"obtainiumMustBeOpenToInstallApps": "Obtainium mora biti otvoren za instalaciju aplikacija", "trackOnly": "Samo za praćenje",
"completeAppInstallationNotifDescription": "Traži od korisnika da se vrati u Obtainium kako bi dovršio instalaciju aplikacije", "errorWithHttpStatusCode": "Greška {}",
"checkingForUpdates": "Tražim moguće nadogradnje", "versionCorrectionDisabled": "Ispravka verzije je onemogućena (izgleda da plugin ne radi)",
"checkingForUpdatesNotifDescription": "Privremeno obavještenje koje se pojavljuje prilikom provjere ažuriranja", "unknown": "Nepoznato",
"pleaseAllowInstallPerm": "Dozvolite Obtainiumu da instalira aplikacije", "none": "Ništa",
"trackOnly": "Samo za praćenje", "never": "Nikad",
"errorWithHttpStatusCode": "Greška {}", "latestVersionX": "Najnovija verzija: {}",
"versionCorrectionDisabled": "Ispravka verzije je onemogućena (izgleda da plugin ne radi)", "installedVersionX": "Instalirana verzija: {}",
"unknown": "Nepoznato", "lastUpdateCheckX": "Posljednja provjera ažuriranja: {}",
"none": "Ništa", "remove": "Izbriši",
"never": "Nikad", "yesMarkUpdated": "Da, označi kao ažurirano",
"latestVersionX": "Najnovija verzija: {}", "fdroid": "Službeni F-Droid",
"installedVersionX": "Instalirana verzija: {}", "appIdOrName": "ID ili ime aplikacije",
"lastUpdateCheckX": "Posljednja provjera ažuriranja: {}", "appId": "Apl ID",
"remove": "Izbriši", "appWithIdOrNameNotFound": "Nije pronađena aplikacija s tim ID-om ili imenom",
"yesMarkUpdated": "Da, označi kao ažurirano", "reposHaveMultipleApps": "Repo-i mogu sadržavati više aplikacija",
"fdroid": "F-Droid Official", "fdroidThirdPartyRepo": "F-Droid Repo treće strane",
"appIdOrName": "ID ili ime aplikacije", "install": "Instaliraj",
"appId": "Apl ID", "markInstalled": "Označi kao instalirano",
"appWithIdOrNameNotFound": "Nije pronađena aplikacija s tim ID-om ili imenom", "update": "Nadogradi",
"reposHaveMultipleApps": "Repo-i mogu sadržavati više aplikacija", "markUpdated": "Označi kao ažurirano",
"fdroidThirdPartyRepo": "F-Droid Repo treće strane", "additionalOptions": "Dodatne opcije",
"steam": "Steam", "disableVersionDetection": "Onemogući detekciju verzije",
"steamMobile": "Steam Mobile", "noVersionDetectionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno.",
"steamChat": "Razgovor na Steamu (chat)", "downloadingX": "Preuzimanje {}",
"install": "Instaliraj", "downloadX": "Download {}",
"markInstalled": "Označi kao instalirano", "downloadedX": "Downloaded {}",
"update": "Nadogradi", "releaseAsset": "Fajlovi verzije",
"markUpdated": "Označi kao ažurirano", "downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije",
"additionalOptions": "Dodatne opcije", "noAPKFound": "APK nije pronađen",
"disableVersionDetection": "Onemogući detekciju verzije", "noVersionDetection": "Nema detekcije verzije",
"noVersionDetectionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno.", "categorize": "Kategoriziraj",
"downloadingX": "Preuzimanje {}", "categories": "Kategorije",
"downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije", "category": "Kategorija",
"noAPKFound": "APK nije pronađen", "noCategory": "Nema kategorije",
"noVersionDetection": "Nema detekcije verzije", "noCategories": "Nema kategorija",
"categorize": "Kategoriziraj", "deleteCategoriesQuestion": "Želite li izbrisati kategorije?",
"categories": "Kategorije", "categoryDeleteWarning": "Sve aplikacije u izbrisanim kategorijama će biti postavljene kao nekategorisane.",
"category": "Kategorija", "addCategory": "Dodaj kategoriju",
"noCategory": "Nema kategorije", "label": "Oznaka",
"noCategories": "Nema kategorija", "language": "Jezik",
"deleteCategoriesQuestion": "Želite li izbrisati kategorije?", "copiedToClipboard": "Podaci kopirani u međuspremnik",
"categoryDeleteWarning": "Sve aplikacije u izbrisanim kategorijama će biti postavljene kao nekategorisane.", "storagePermissionDenied": "Dozvola za pohranu je odbijena",
"addCategory": "Dodaj kategoriju", "selectedCategorizeWarning": "Ovo će zamijeniti sve postojeće postavke kategorije za odabrane aplikacije.",
"label": "Oznaka", "filterAPKsByRegEx": "Filtrirajte APK-ove prema regularnom izrazu",
"language": "Jezik", "removeFromObtainium": "Ukloni iz Obtainiuma",
"copiedToClipboard": "Podaci kopirani u međuspremnik", "uninstallFromDevice": "Deinstaliraj s uređaja",
"storagePermissionDenied": "Dozvola za pohranu je odbijena", "onlyWorksWithNonVersionDetectApps": "Radi samo za aplikacije s onemogućenom detekcijom verzije.",
"selectedCategorizeWarning": "Ovo će zamijeniti sve postojeće postavke kategorije za odabrane aplikacije.", "releaseDateAsVersion": "Koristi datum izdanja kao verziju",
"filterAPKsByRegEx": "Filtrirajte APK-ove prema regularnom izrazu", "releaseTitleAsVersion": "Use release title as version string",
"removeFromObtainium": "Ukloni iz Obtainiuma", "releaseDateAsVersionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno, ali je datum izdavanja dostupan.",
"uninstallFromDevice": "Deinstaliraj s uređaja", "changes": "Promjene",
"onlyWorksWithNonVersionDetectApps": "Radi samo za aplikacije s onemogućenom detekcijom verzije.", "releaseDate": "Datum izdavanja",
"releaseDateAsVersion": "Koristi datum izdanja kao verziju", "importFromURLsInFile": "Uvoz iz URL-ova u datoteci (kao što je OPML)",
"releaseDateAsVersionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno, ali je datum izdavanja dostupan.", "versionDetectionExplanation": "Pomiri niz verzije sa verzijom otkrivenom iz OS-a",
"changes": "Promjene", "versionDetection": "Otkrivanje verzije",
"releaseDate": "Datum izdavanja", "standardVersionDetection": "Detekcija standardne verzije",
"importFromURLsInFile": "Uvoz iz URL-ova u datoteci (kao što je OPML)", "groupByCategory": "Grupiši po kategoriji",
"versionDetection": "Otkrivanje verzije", "autoApkFilterByArch": "Pokušajte filtrirati APK-ove po arhitekturi procesora ako je moguće",
"standardVersionDetection": "Detekcija standardne verzije", "overrideSource": "Premosti izvor",
"groupByCategory": "Grupiši po kategoriji", "dontShowAgain": "Ne prikazuj ovo ponovo",
"autoApkFilterByArch": "Pokušajte filtrirati APK-ove po arhitekturi procesora ako je moguće", "dontShowTrackOnlyWarnings": "Ne prikazuj upozorenja „Samo za praćenje”",
"overrideSource": "Premosti izvor", "dontShowAPKOriginWarnings": "Ne prikazuj upozorenja o porijeklu APK-a",
"dontShowAgain": "Ne prikazuj ovo ponovo", "moveNonInstalledAppsToBottom": "Premjesti neinstalirane aplikacije na dno prikaza aplikacija",
"dontShowTrackOnlyWarnings": "Ne prikazuj upozorenja „Samo za praćenje”", "gitlabPATLabel": "GitLab token za lični pristup",
"dontShowAPKOriginWarnings": "Ne prikazuj upozorenja o porijeklu APK-a", "about": "O nama",
"moveNonInstalledAppsToBottom": "Premjesti neinstalirane aplikacije na dno prikaza aplikacija", "requiresCredentialsInSettings": "{}: Za ovo su potrebni dodatni akreditivi (u Postavkama)",
"gitlabPATLabel": "GitLab token za lični pristup\n(Omogućava pretraživanje i bolje otkrivanje APK-a)", "checkOnStart": "Provjerite ima li novosti pri pokretanju",
"about": "O nama", "tryInferAppIdFromCode": "Pokušati otkriti ID aplikacije iz izvornog koda",
"requiresCredentialsInSettings": "Za ovo su potrebni dodatni akreditivi (u Postavkama)", "removeOnExternalUninstall": "Automatski ukloni eksterno deinstalirane aplikacije",
"checkOnStart": "Provjerite ima li novosti pri pokretanju", "pickHighestVersionCode": "Automatski odaberite najviši kôd verzije APK-a",
"tryInferAppIdFromCode": "Pokušati otkriti ID aplikacije iz izvornog koda", "checkUpdateOnDetailPage": "Provjerite ima li novosti pri otvaranju stranice s detaljima aplikacije",
"removeOnExternalUninstall": "Automatski ukloni eksterno deinstalirane aplikacije", "disablePageTransitions": "Ugasite animaciju prijelaza stranice",
"pickHighestVersionCode": "Automatski odaberite najviši kôd verzije APK-a", "reversePageTransitions": "Reverzne animacije prijelaza stranice",
"checkUpdateOnDetailPage": "Provjerite ima li novosti pri otvaranju stranice s detaljima aplikacije", "minStarCount": "Najmanji broj zvjezdica",
"disablePageTransitions": "Ugasite animaciju prijelaza stranice", "addInfoBelow": "Dodajte ove informacije ispod.",
"reversePageTransitions": "Reverzne animacije prijelaza stranice", "addInfoInSettings": "Dodajte ove informacije u Postavkama.",
"minStarCount": "Minimum Star Count", "githubSourceNote": "GitHub ograničavanje se može izbjeći korišćenjem tokena za lični pristup.",
"addInfoBelow": "Add this info below.", "sortByLastLinkSegment": "Sortiraj samo po zadnjem segmentu veze",
"addInfoInSettings": "Add this info in the Settings.", "filterReleaseNotesByRegEx": "Filtirajte promjene u izdanju po regularnom izrazu",
"githubSourceNote": "GitHub rate limiting can be avoided using an API key.", "customLinkFilterRegex": "Prilagođeni APK link filtrira se po regularnom izrazu (Zadano '.apk$')",
"gitlabSourceNote": "GitLab APK extraction may not work without an API key.", "appsPossiblyUpdated": "Pokušano ažuriranje aplikacija",
"sortByFileNamesNotLinks": "Sort by file names instead of full links", "appsPossiblyUpdatedNotifDescription": "Obavještava korisnika da je ažuriranje jedne ili više aplikacija potencijalno izvršeno u pozadini",
"filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", "xWasPossiblyUpdatedToY": "{} aplikacija bi trebala biti ažurirana na {}.",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "enableBackgroundUpdates": "Dozvolite ažuriranja u pozadini",
"removeAppQuestion": { "backgroundUpdateReqsExplanation": "Ažuriranja u pozadini možda neće raditi za sve aplikacije.",
"one": "Želite li ukloniti aplikaciju?", "backgroundUpdateLimitsExplanation": "Uspjeh ažuriranja u pozadini se može provjeriti tek kada otvorite Obtainium.",
"other": "Želite li ukloniti aplikacije?" "verifyLatestTag": "Provjerite 'posljednu' ('latest') oznaku",
}, "intermediateLinkRegex": "Filter za 'srednju' vezu za posjetu",
"tooManyRequestsTryAgainInMinutes": { "filterByLinkText": "Filtriraj linkove prema tekstu linka",
"one": "Previše zahtjeva (ograničena broj zahteva) - pokušajte ponovo za {} minutu", "intermediateLinkNotFound": "Intermediate veza nije nađena",
"other": "Previše zahtjeva (ograničena cijena) - pokušajte ponovo za {} min." "intermediateLink": "Intermediate veza",
}, "exemptFromBackgroundUpdates": "Izuzmi iz ažuriranja u pozadini (ako su uključeni)",
"bgUpdateGotErrorRetryInMinutes": { "bgUpdatesOnWiFiOnly": "Isključite ažuriranje u pozadini kada niste na Wi-Fi-ju",
"one": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} minutu", "bgUpdatesWhileChargingOnly": "Disable background updates when not charging",
"other": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} min." "autoSelectHighestVersionCode": "Automatski izaberite najveću (verziju) versionCode APK-a",
}, "versionExtractionRegEx": "RegEx ekstrakcija verzije",
"bgCheckFoundUpdatesWillNotifyIfNeeded": { "trimVersionString": "Trim Version String With RegEx",
"one": "Provjera ažuriranja u pozadini je pronašla {} ažuriranje - korisnik će biti obavješten ako je to potrebno", "matchGroupToUseForX": "Match Group to Use for \"{}\"",
"other": "Provjera ažuriranja u pozadini je pronašla {} ažuriranja - korisnik će biti obavješten ako je to potrebno" "matchGroupToUse": "Podjesite grupu za upotebu",
}, "highlightTouchTargets": "Istaknite manje vidljive touch mete",
"apps": { "pickExportDir": "Izaberite datoteku za izvoz",
"one": "{} aplikacija", "autoExportOnChanges": "Automatski izvezite pri promjenama",
"other": "{} aplikacije" "includeSettings": "Uključi postavke",
}, "filterVersionsByRegEx": "Filtrirajte verzije po regulatnom izrazu",
"url": { "trySelectingSuggestedVersionCode": "Probajte izabrati preloženu (verziju) versionCode APK-a",
"one": "{} URL", "dontSortReleasesList": "Zadrži redosled izdanja iz API-a",
"other": "{} URL-ovi" "reverseSort": "Obrni redosled",
}, "takeFirstLink": "Uzmi prvi link",
"minute": { "skipSort": "Preskoči sortiranje",
"one": "{} minuta", "debugMenu": "Meni za otkrivanje grešaka",
"other": "min." "bgTaskStarted": "Rad u pozadini pokrenut - provjerite log-ove.",
}, "runBgCheckNow": "Pokrenite pozadinsku provjeru ažuriranja sad",
"hour": { "versionExtractWholePage": "Primjenite Regex ekstrakciju verzije na cijelu stranicu",
"one": "{} sat", "installing": "Instaliranje",
"other": "{} sat/i" "skipUpdateNotifications": "Ne prikazujte obavještenja ažuriranja",
}, "updatesAvailableNotifChannel": "Dostupna ažuriranja",
"day": { "appsUpdatedNotifChannel": "Aplikacije su ažurirane",
"one": "{} dan", "appsPossiblyUpdatedNotifChannel": "Pokušano ažuriranje aplikacija",
"other": "{} dana" "errorCheckingUpdatesNotifChannel": "Greška pri provjeri ažuriranja",
}, "appsRemovedNotifChannel": "Aplikacije su uklonjene",
"clearedNLogsBeforeXAfterY": { "downloadingXNotifChannel": "Preuzimanje {}",
"one": "Izbrisan {n} log (prije = {before}, nakon = {after})", "completeAppInstallationNotifChannel": "Dovršite instalaciju aplikacije",
"other": "Izbrisano {n} log-ova (prije = {before}, nakon = {after})" "checkingForUpdatesNotifChannel": "Tražim moguće nadogradnje",
}, "onlyCheckInstalledOrTrackOnlyApps": "Isključivo provjerite ažuriranje za instalirane i aplikacije 'samo za praćenje'",
"xAndNMoreUpdatesAvailable": { "supportFixedAPKURL": "Podržite fiksne APK URL-ove",
"one": "{} i još 1 aplikacija ima ažuriranja.", "selectX": "Izaberite {}",
"other": "{} i još {} aplikacija imaju ažuriranja." "parallelDownloads": "Dozvoli paralelna preuzimanja",
}, "useShizuku": "Koristi Shizuku ili Sui za instaliranje",
"xAndNMoreUpdatesInstalled": { "shizukuBinderNotFound": "Shizuku nije pokrenut",
"one": "{} i još 1 aplikacija je ažurirana.", "shizukuOld": "Stara Shizuku verzija (<11) - ažurirajte je",
"other": "{} i još {} aplikacija je ažurirano." "shizukuOldAndroidWithADB": "Shizuku pokrenut na Android-u < 8.1 pomoću ADB-a - ažurirajte Android ili koristite Sui",
} "shizukuPretendToBeGooglePlay": "Postavi Google Play kao izvor instalacije (samo ako je Shizuku u upotrebi)",
"useSystemFont": "Koristite sistemski font",
"useVersionCodeAsOSVersion": "Koristite kod verzije aplikacije kao verziju koju je otkrio OS",
"requestHeader": "Zaglavlje zahtjeva",
"useLatestAssetDateAsReleaseDate": "Koristite najnovije otpremanje materijala kao datum izdavanja",
"defaultPseudoVersioningMethod": "Zadana metoda pseudo-verzija",
"partialAPKHash": "Djelomični APK Hash",
"APKLinkHash": "APK Link Hash",
"directAPKLink": "Direktna APK veza",
"pseudoVersionInUse": "Pseudo-verzija je u upotrebi",
"installed": "Instalirano",
"latest": "Najnoviji",
"invertRegEx": "Obrni regularni izraz",
"note": "Zabelješke",
"selfHostedNote": "\"{}\" padajući meni se može koristiti da dosegnete vlastite/prilagođene instance bilo kojeg izvora.",
"badDownload": "APK ne može biti raščlanjen (nekomaptibilno ili delimično preuzimanje)",
"beforeNewInstallsShareToAppVerifier": "Dijeli nove aplikacije sa AppVerifier-om (ako je dostupno)",
"appVerifierInstructionToast": "Dijeli sa AppVerifier-om, zatim se vratite kada ste spremni.",
"wiki": "Pomoć/Wiki",
"crowdsourcedConfigsLabel": "Konfiguracije aplikacije obezbeđene pomoću velikog broja ljudi (crowdsourcing) (koristite na svoju odgovornost)",
"crowdsourcedConfigsShort": "Crowdsourced App Configs",
"allowInsecure": "Allow insecure HTTP requests",
"stayOneVersionBehind": "Stay one version behind latest",
"refreshBeforeDownload": "Refresh app details before download",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "Želite li ukloniti aplikaciju?",
"other": "Želite li ukloniti aplikacije?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "Previše zahtjeva (ograničena broj zahteva) - pokušajte ponovo za {} minutu",
"other": "Previše zahtjeva (ograničena cijena) - pokušajte ponovo za {} min."
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} minutu",
"other": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} min."
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Provjera ažuriranja u pozadini je pronašla {} ažuriranje - korisnik će biti obavješten ako je to potrebno",
"other": "Provjera ažuriranja u pozadini je pronašla {} ažuriranja - korisnik će biti obavješten ako je to potrebno"
},
"apps": {
"one": "{} aplikacija",
"other": "{} aplikacije"
},
"url": {
"one": "{} URL",
"other": "{} URL-ovi"
},
"minute": {
"one": "{} minuta",
"other": "min."
},
"hour": {
"one": "{} sat",
"other": "{} sat/i"
},
"day": {
"one": "{} dan",
"other": "{} dana"
},
"clearedNLogsBeforeXAfterY": {
"one": "Izbrisan {n} log (prije = {before}, nakon = {after})",
"other": "Izbrisano {n} log-ova (prije = {before}, nakon = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} i još 1 aplikacija ima ažuriranja.",
"other": "{} i još {} aplikacija imaju ažuriranja."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} i još 1 aplikacija je ažurirana.",
"other": "{} i još {} aplikacija je ažurirano."
},
"xAndNMoreUpdatesFailed": {
"one": "Failed to update {} and 1 more app.",
"other": "Failed to update {} and {} more apps."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} i još jedna aplikacija je vjerovatno ažurirana.",
"other": "{} i još {} aplikacija su vjerovatno ažurirane."
},
"apk": {
"one": "{} APK",
"other": "{} APK-a"
}
} }

382
assets/translations/cs.json Normal file
View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "Žádná platná {} adresa URL aplikace",
"noReleaseFound": "Nebyla nalezena odpovídající verze",
"noVersionFound": "Nelze určit verzi vydání",
"urlMatchesNoSource": "URL neodpovídá žádnému známému zdroji",
"cantInstallOlderVersion": "Nelze nainstalovat starší verzi aplikace",
"appIdMismatch": "ID staženého balíčku neodpovídá ID existující aplikace",
"functionNotImplemented": "Tato třída nemá implementovánu tuto funkci",
"placeholder": "Zástupce",
"someErrors": "Vyskytly se nějaké chyby",
"unexpectedError": "Neočekávaná chyba",
"ok": "Ok",
"and": "a",
"githubPATLabel": "GitHub Personal Access Token (zvyšuje limit rychlosti)",
"includePrereleases": "Zahrnout předběžné verze",
"fallbackToOlderReleases": "Přechod na starší verze",
"filterReleaseTitlesByRegEx": "Filtrovat názvy verzí podle regulárního výrazu",
"invalidRegEx": "Neplatný regulární výraz",
"noDescription": "Žádný popis",
"cancel": "Zrušit",
"continue": "Pokračovat",
"requiredInBrackets": "(Požadované)",
"dropdownNoOptsError": "ERROR: DROPDOWN MUSÍ MÍT AŽ JEDNU MOŽNOST",
"colour": "Barva",
"standard": "Standardní",
"custom": "Vlastní",
"useMaterialYou": "Použijte materiál, který jste",
"githubStarredRepos": "GitHub označená hvězdičkou",
"uname": "Uživatelské jméno",
"wrongArgNum": "Nesprávný počet zadaných argumentů",
"xIsTrackOnly": "{} je určeno pouze pro sledování",
"source": "Zdroj",
"app": "Aplikace",
"appsFromSourceAreTrackOnly": "Aplikace z tohoto zdroje jsou Jen sledovány.",
"youPickedTrackOnly": "Vybrali jste možnost Jen sledovat.",
"trackOnlyAppDescription": "Aplikace je sledována kvůli aktualizacím, ale Obtainium ji nebude stahovat ani instalovat.",
"cancelled": "Zrušeno",
"appAlreadyAdded": "Aplikace již přidána",
"alreadyUpToDateQuestion": "App already up to date?",
"addApp": "Přidat aplikaci",
"appSourceURL": "Zdrojová adresa URL aplikace",
"error": "Chyba",
"add": "Přidat",
"searchSomeSourcesLabel": "Vyhledávání (pouze pro určité zdroje)",
"search": "Hledat",
"additionalOptsFor": "Další možnosti pro {}",
"supportedSources": "Podporované zdroje",
"trackOnlyInBrackets": "(Pouze stopy)",
"searchableInBrackets": "(s možností vyhledávání)",
"appsString": "Apky",
"noApps": "Žádné aplikace",
"noAppsForFilter": "Žádné aplikace pro vybraný filtr",
"byX": "Od {}",
"percentProgress": "Pokrok: {}%",
"pleaseWait": "Počkejte prosím",
"updateAvailable": "Aktualizace je k dispozici",
"notInstalled": "Není nainstalováno",
"pseudoVersion": "pseudoverze",
"selectAll": "Vybrat vše",
"deselectX": "{} deselected",
"xWillBeRemovedButRemainInstalled": "{} bude odstraněn z Obtainium, ale zůstane nainstalován v zařízení.",
"removeSelectedAppsQuestion": "Odebrat vybrané aplikace?",
"removeSelectedApps": "Odebrat vybrané aplikace",
"updateX": "Aktualizovat {}",
"installX": "Instalovat {}",
"markXTrackOnlyAsUpdated": "Označit {}\n(Jen sledované)\njako aktualizované",
"changeX": "Změnit {}",
"installUpdateApps": "Instalovat/aktualizovat aplikace",
"installUpdateSelectedApps": "Instalovat/aktualizovat vybrané aplikace",
"markXSelectedAppsAsUpdated": "Označit {} vybrané aplikace jako aktuální?",
"no": "Ne",
"yes": "Ano",
"markSelectedAppsUpdated": "Označit vybrané aplikace jako aktuální",
"pinToTop": "Připnout nahoru",
"unpinFromTop": "Odepnout shora",
"resetInstallStatusForSelectedAppsQuestion": "Obnovit stav instalace vybraných aplikací?",
"installStatusOfXWillBeResetExplanation": "Stav instalace vybraných aplikací bude resetován. To může být užitečné, pokud je verze aplikace zobrazená v Obtainium nesprávná z důvodu neúspěšných aktualizací nebo jiných problémů.",
"customLinkMessage": "Tyto odkazy fungují na zařízeních s nainstalovaným Obtainium",
"shareAppConfigLinks": "Sdílet konfiguraci aplikace jako odkaz HTML",
"shareSelectedAppURLs": "Sdílet adresy URL vybraných aplikací",
"resetInstallStatus": "Obnovit stav instalace",
"more": "Více",
"removeOutdatedFilter": "Odstranit filtr Neaktuální",
"showOutdatedOnly": "Zobrazovat pouze zastaralé aplikace",
"filter": "Filtr",
"filterApps": "Filtrovat aplikace",
"appName": "Název aplikace",
"author": "Autor",
"upToDateApps": "Aktuální apky",
"nonInstalledApps": "Neinstalované apky",
"importExport": "Import Export",
"settings": "Nastavení",
"exportedTo": "Exportováno do {}",
"obtainiumExport": "Export obtainia",
"invalidInput": "Neplatný vstup",
"importedX": "Importováno {}",
"obtainiumImport": "Dovoz obtainia",
"importFromURLList": "Import ze seznamu URL",
"searchQuery": "Vyhledávací dotaz",
"appURLList": "Seznam adres aplikací",
"line": "Linka",
"searchX": "Vyhledávání {}",
"noResults": "Nebyly nalezeny žádné výsledky",
"importX": "Import {}",
"importedAppsIdDisclaimer": "Importované aplikace mohou být nesprávně zobrazeny jako \"Neinstalovány\". Chcete-li to opravit, nainstalujte je znovu prostřednictvím Obtainium. To nemá vliv na data aplikací. Ovlivňuje pouze metody importu URL a třetích stran.",
"importErrors": "Chyba importu",
"importedXOfYApps": "{}importováno z {} aplikací.",
"followingURLsHadErrors": "U následujících adres došlo k chybám:",
"selectURL": "Vybrat adresu",
"selectURLs": "Select adresy",
"pick": "Vybrat",
"theme": "Téma",
"dark": "Tmavé",
"light": "Světlé",
"followSystem": "Jako systém",
"followSystemThemeExplanation": "Sledování motivu systému je možné pouze pomocí aplikací třetích stran.",
"useBlackTheme": "Použít čistě černé tmavé téma",
"appSortBy": "Seřadit podle",
"authorName": "Autor/Jméno",
"nameAuthor": "Jméno/Autor",
"asAdded": "Přidáno",
"appSortOrder": "Seřadit",
"ascending": "Vzestupně",
"descending": "Sestupně",
"bgUpdateCheckInterval": "Interval kontroly aktualizace na pozadí",
"neverManualOnly": "Nikdy - pouze ručně",
"appearance": "Vzhled",
"showWebInAppView": "Zobrazit zdrojové webové stránky v zobrazení aplikace",
"pinUpdates": "Připnout aplikace s aktualizacemi nahoru",
"updates": "Aktualizace",
"sourceSpecific": "Specifické pro zdroj",
"appSource": "Zdroj aplikace",
"noLogs": "Žádné protokoly",
"appLogs": "Záznamy apky",
"close": "Zavřít",
"share": "Sdílet",
"appNotFound": "Aplikace nenalezena",
"obtainiumExportHyphenatedLowercase": "obtainium-export",
"pickAnAPK": "Vybrat APK",
"appHasMoreThanOnePackage": "{} má více než jeden balíček:",
"deviceSupportsXArch": "Vaše zařízení podporuje architekturu CPU {}.",
"deviceSupportsFollowingArchs": "Vaše zařízení podporuje následující architektury CPU:",
"warning": "Varování",
"sourceIsXButPackageFromYPrompt": "Zdroj aplikace je '{}', ale balíček pro vydání je z '{}'. Pokračovat?",
"updatesAvailable": "Dostupné aktualizace",
"updatesAvailableNotifDescription": "Upozorňuje uživatele, že jsou k dispozici aktualizace pro jednu nebo více aplikací sledovaných Obtainium",
"noNewUpdates": "Žádné nové aktualizace.",
"xHasAnUpdate": "{} má aktualizaci.",
"appsUpdated": "Aplikace aktualizovány",
"appsNotUpdated": "Nepodařilo se aktualizovat aplikace",
"appsUpdatedNotifDescription": "Upozornit, že byly provedeny aktualizace jedné nebo více aplikací na pozadí",
"xWasUpdatedToY": "{} byla aktualizována na {}",
"xWasNotUpdatedToY": "Nepodařilo se aktualizovat {} na {}.",
"errorCheckingUpdates": "Chyba kontroly aktualizací",
"errorCheckingUpdatesNotifDescription": "Zobrazit oznámení při neúspěšné kontrole aktualizací na pozadí",
"appsRemoved": "Odstraněné aplikace",
"appsRemovedNotifDescription": "Oznámit, že jedna nebo více aplikací bylo odstraněno z důvodu chyb při načítání",
"xWasRemovedDueToErrorY": "{} byla odstraněna z důvodu následující chyby: {}",
"completeAppInstallation": "Dokončit instalaci aplikace",
"obtainiumMustBeOpenToInstallApps": "Obtainium musí být otevřeno, aby bylo možné instalovat aplikace",
"completeAppInstallationNotifDescription": "Vyzvat k návratu do Obtainium pro dokončení instalace aplikací",
"checkingForUpdates": "Zkontrolovat aktualizace",
"checkingForUpdatesNotifDescription": "Dočasné oznámení zobrazené při kontrole aktualizací",
"pleaseAllowInstallPerm": "Povolte prosím Obtainium instalovat aplikace",
"trackOnly": "Jen sledovat",
"errorWithHttpStatusCode": "Chyba {}",
"versionCorrectionDisabled": "Oprava verze zakázána (zásuvný modul zřejmě nefunguje)",
"unknown": "Neznám",
"none": "Žádný",
"never": "Nikdy",
"latestVersionX": "Nejnovější verze: {}",
"installedVersionX": "Nainstalovaná verze: {}",
"lastUpdateCheckX": "Poslední kontrola aktualizace: {}",
"remove": "Odebrat",
"yesMarkUpdated": "Ano, označit jako aktualizované",
"fdroid": "Oficiální repozitář F-Droid",
"appIdOrName": "ID nebo název apky",
"appId": "ID aplikace",
"appWithIdOrNameNotFound": "Žádná aplikace s tímto ID nebo názvem nebyla nalezena",
"reposHaveMultipleApps": "Repozitáře mohou obsahovat více aplikací",
"fdroidThirdPartyRepo": "F-Droid repozitář třetí strany",
"install": "Nainstalujte",
"markInstalled": "Označit jako nainstalovaný",
"update": "Aktualizovat",
"markUpdated": "Označit jako aktuální",
"additionalOptions": "Další možnosti",
"disableVersionDetection": "Deaktivovat detekci verze",
"noVersionDetectionExplanation": "Tato možnost by měla být použita pouze u aplikace, kde detekce verzí nefunguje správně.",
"downloadingX": "Stáhnout {}",
"downloadX": "Stáhnout {}",
"downloadedX": "Staženo {}",
"releaseAsset": "Vydání aktiva",
"downloadNotifDescription": "Informuje uživatele o průběhu stahování aplikace",
"noAPKFound": "Žádná APK nebyla nalezena",
"noVersionDetection": "Žádná detekce verze",
"categorize": "Kategorizovat",
"categories": "Kategorie",
"category": "Kategorie",
"noCategory": "Žádná kategorie",
"noCategories": "Žádné kategorie",
"deleteCategoriesQuestion": "Smazat kategorie?",
"categoryDeleteWarning": "Všechny aplikace v odstraněných kategoriích budou nastaveny na nekategorizované.",
"addCategory": "Přidat kategorii",
"label": "Štítek",
"language": "Jazyk",
"copiedToClipboard": "Zkopírováno do schránky",
"storagePermissionDenied": "Oprávnění k ukládání odepřeno",
"selectedCategorizeWarning": "Toto nahradí všechna stávající nastavení kategorií pro vybrané aplikace.",
"filterAPKsByRegEx": "Filtrovat APK podle regulárního výrazu",
"removeFromObtainium": "Odebrat z Obtainium",
"uninstallFromDevice": "Odinstalovat ze zařízení",
"onlyWorksWithNonVersionDetectApps": "Funguje pouze pro aplikace s vypnutou detekcí verze.",
"releaseDateAsVersion": "Použít datum vydání jako verzi",
"releaseTitleAsVersion": "Použít název verze jako řetězec verze",
"releaseDateAsVersionExplanation": "Tato možnost by měla být použita pouze u aplikace, kde detekce verzí nefunguje správně, ale je k dispozici datum vydání.",
"changes": "Změny",
"releaseDate": "Datum vydání",
"importFromURLsInFile": "Importovat adresy URL ze souboru (např. OPML)",
"versionDetectionExplanation": "Sloučit řetězec verze s verzí zjištěnou z OS",
"versionDetection": "Detekce verze",
"standardVersionDetection": "Standardní detekce verze",
"groupByCategory": "Seskupit podle kategorie",
"autoApkFilterByArch": "Pokud je to možné, pokuste se filtrovat soubory APK podle architektury procesoru",
"overrideSource": "Přepsat zdroj",
"dontShowAgain": "Nezobrazovat znovu",
"dontShowTrackOnlyWarnings": "Nezobrazovat varování pro 'Jen sledované'",
"dontShowAPKOriginWarnings": "Nezobrazovat varování pro původ APK",
"moveNonInstalledAppsToBottom": "Přesunout nenainstalované aplikace na konec zobrazení Aplikace",
"gitlabPATLabel": "Osobní přístupový token GitLab",
"about": "O",
"requiresCredentialsInSettings": "{}: Vyžaduje další pověření (v nastavení)",
"checkOnStart": "Zkontrolovat jednou při spuštění",
"tryInferAppIdFromCode": "Pokusit se určit ID aplikace ze zdrojového kódu",
"removeOnExternalUninstall": "Automaticky odstranit externě odinstalované aplikace",
"pickHighestVersionCode": "Automaticky vybrat nejvyšší verzi APK",
"checkUpdateOnDetailPage": "Zkontrolovat aktualizaci při otevření stránky s podrobnostmi aplikace",
"disablePageTransitions": "Zakázat animace pro přechody stránek",
"reversePageTransitions": "Obrátit animace pro přechody stránek",
"minStarCount": "Minimální počet hvězdiček",
"addInfoBelow": "Přidat tuto informaci na konec stránky.",
"addInfoInSettings": "Přidat tuto informaci do nastavení.",
"githubSourceNote": "Omezení rychlosti GitHub lze obejít pomocí klíče API.",
"sortByLastLinkSegment": "Seřadit pouze podle poslední části odkazu",
"filterReleaseNotesByRegEx": "Filtrovat poznámky k vydání podle regulárního výrazu",
"customLinkFilterRegex": "Vlastní filtr odkazů APK podle regulárního výrazu (výchozí '.apk$')",
"appsPossiblyUpdated": "Byly provedeny pokusy o aktualizaci aplikací",
"appsPossiblyUpdatedNotifDescription": "Upozorňuje uživatele, že na pozadí mohly být provedeny aktualizace jedné nebo více aplikací",
"xWasPossiblyUpdatedToY": "{} mohlo být aktualizováno na {}.",
"enableBackgroundUpdates": "Povolit aktualizace na pozadí",
"backgroundUpdateReqsExplanation": "Aktualizace na pozadí nemusí být možná pro všechny aplikace.",
"backgroundUpdateLimitsExplanation": "Úspěšnost instalace na pozadí lze určit pouze v případě, že je otevřeno Obtainium.",
"verifyLatestTag": "Zkontrolovat značku latest",
"intermediateLinkRegex": "Filtrovat mezipropojení, které by mělo být navštíveno jako první",
"filterByLinkText": "Filtrovat odkazy podle textu odkazu",
"intermediateLinkNotFound": "Připojený odkaz nenalezen",
"intermediateLink": "Připojený odkaz",
"exemptFromBackgroundUpdates": "Vyloučit z aktualizací na pozadí (je-li povoleno)",
"bgUpdatesOnWiFiOnly": "Deaktivovat aktualizace na pozadí, pokud není k dispozici Wi-Fi",
"bgUpdatesWhileChargingOnly": "Zakázat aktualizace na pozadí, když se nenabíjí",
"autoSelectHighestVersionCode": "Automaticky vybrat nejvyšší verzi APK",
"versionExtractionRegEx": "Extrakce verze pomocí RegEx",
"trimVersionString": "Oříznutí řetězce verze pomocí příkazu RegEx",
"matchGroupToUseForX": "Skupina shody, která se použije pro \"{}\"",
"matchGroupToUse": "Odpovídá použité skupině",
"highlightTouchTargets": "Zvýraznit méně zjevné cíle dotyku",
"pickExportDir": "Vybrat adresář pro export",
"autoExportOnChanges": "Automatický export při změně",
"includeSettings": "Zahrnout nastavení",
"filterVersionsByRegEx": "Filtrovat verze podle regulárních výrazů",
"trySelectingSuggestedVersionCode": "Zkusit vybrat navrhovanou verzi APK",
"dontSortReleasesList": "Seřadit vydání z rozhraní API",
"reverseSort": "Obrácené třídění",
"takeFirstLink": "Použít první odkaz",
"skipSort": "Přeskočit třídění",
"debugMenu": "Nabídka ladění",
"bgTaskStarted": "Spuštěna úloha na pozadí - zkontrolujte protokoly.",
"runBgCheckNow": "Spustit kontrolu aktualizací na pozadí nyní",
"versionExtractWholePage": "Použít extrakci verze pomocí RegEx na celou stránku",
"installing": "Instaluji",
"skipUpdateNotifications": "Neposkytovat oznámení o aktualizaci",
"updatesAvailableNotifChannel": "Dostupné aktualizace",
"appsUpdatedNotifChannel": "Apky aktualizovány",
"appsPossiblyUpdatedNotifChannel": "Byly provedeny pokusy o aktualizace aplikací",
"errorCheckingUpdatesNotifChannel": "Chyba při kontrole aktualizací",
"appsRemovedNotifChannel": "Odstraněné apky",
"downloadingXNotifChannel": "Stáhnout {}",
"completeAppInstallationNotifChannel": "Dokončit instalaci aplikace",
"checkingForUpdatesNotifChannel": "Zkontrolovat aktualizace",
"onlyCheckInstalledOrTrackOnlyApps": "Na aktualizace kontrolovat pouze nainstalované aplikace a aplikace označené Track only",
"supportFixedAPKURL": "Odhadnout novější verzi na základě prvních třiceti číslic kontrolního součtu adresy URL APK, pokud není podporována jinak",
"selectX": "Vybrat {}",
"parallelDownloads": "Povolit souběžné stahování",
"useShizuku": "K instalaci použijte Shizuku nebo Sui",
"shizukuBinderNotFound": "Shizuku neběží",
"shizukuOld": "Stará verze Shizuku (<11) - aktualizujte ji",
"shizukuOldAndroidWithADB": "Shizuku běží na Androidu < 8.1 s ADB - aktualizujte Android nebo místo toho použijte Sui",
"shizukuPretendToBeGooglePlay": "Nastavení Google Play jako zdroje instalace (pokud se používá Shizuku)",
"useSystemFont": "Použít systémové písmo",
"useVersionCodeAsOSVersion": "Použít kód verze aplikace jako verzi zjištěnou OS",
"requestHeader": "Hlavička požadavku",
"useLatestAssetDateAsReleaseDate": "Použít poslední nahrané dílo jako datum vydání",
"defaultPseudoVersioningMethod": "Výchozí metoda pseudoverze",
"partialAPKHash": "Částečný hash APK",
"APKLinkHash": "Odkaz APK Hash",
"directAPKLink": "Přímý odkaz APK",
"pseudoVersionInUse": "Pseudoverze se používá",
"installed": "Instalováno",
"latest": "Nejnovější",
"invertRegEx": "Invertovat regulární výraz",
"note": "Poznámka",
"selfHostedNote": "Rozbalovací seznam \"{}\" lze použít k dosažení vlastních/obvyklých instancí libovolného zdroje.",
"badDownload": "APK nelze analyzovat (nekompatibilní nebo částečné stažení)",
"beforeNewInstallsShareToAppVerifier": "Sdílení nových aplikací s aplikací AppVerifier (pokud je k dispozici)",
"appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.",
"wiki": "Nápověda/Wiki",
"crowdsourcedConfigsLabel": "Konfigurace aplikací s využitím crowdsourcingu (použití na vlastní nebezpečí)",
"crowdsourcedConfigsShort": "Konfigurace aplikací s využitím crowdsourcingu",
"allowInsecure": "Povolení nezabezpečených požadavků HTTP",
"stayOneVersionBehind": "Zůstaňte o jednu verzi pozadu za nejnovější",
"refreshBeforeDownload": "Obnovení údajů o aplikaci před stažením",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "Odstranit Apku?",
"other": "Odstranit Apky?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "Příliš mnoho požadavků (omezená rychlost) - zkuste to znovu za {} minutu",
"other": "Příliš mnoho požadavků (omezená rychlost) - zkuste to znovu za {} minut"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Při kontrole aktualizace na pozadí byla zjištěna chyba {}, opakování bude naplánováno za {} minut",
"other": "Při kontrole aktualizací na pozadí byla zjištěna chyba {}, opakování bude naplánováno za {} minut"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Při kontrole aktualizací na pozadí nalezena {}aktualizace - v případě potřeby upozorní uživatele",
"other": "Kontrola aktualizací na pozadí nalezla {} aktualizací - v případě potřeby upozorní uživatele"
},
"apps": {
"one": "{} Apka",
"other": "{} Apky"
},
"url": {
"one": "{} Adresa",
"other": "{} Adres"
},
"minute": {
"one": "{} Minuta",
"other": "{} Minut"
},
"hour": {
"one": "{} Hodina",
"other": "{} Hodin"
},
"day": {
"one": "{} Den",
"other": "{} Dnů"
},
"clearedNLogsBeforeXAfterY": {
"one": "{n} Záznam vymazán (před = {before}, po = {after})",
"other": "{n} Záznamů vymazáno (před = {before}, po = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} a 1 další aplikace mají aktualizace.",
"other": "{} a {} další aplikace mají aktualizace."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} a 1 další aplikace mají aktualizace.",
"other": "{} a {} další aplikace byly aktualizovány."
},
"xAndNMoreUpdatesFailed": {
"one": "Nepodařilo se aktualizovat {} a 1 další aplikaci.",
"other": "Nepodařilo se aktualizovat {} a {} další aplikace."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} a 1 další aplikace možno aktualizovat",
"other": "{} a {} další aplikace mohou být aktualizovány."
},
"apk": {
"one": "{} APK",
"other": "{} APK"
}
}

382
assets/translations/da.json Normal file
View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "Ikke et gyldigt {} app-URL",
"noReleaseFound": "Kunne ikke finde en passende udgivelse",
"noVersionFound": "Kunne ikke afgøre udgivelsesversion",
"urlMatchesNoSource": "URL'en matcher ikke en kendt kilde",
"cantInstallOlderVersion": "Kan ikke installere en ældre version af en app",
"appIdMismatch": "Hentet pakke-ID matcher ikke eksisterende app-ID",
"functionNotImplemented": "Denne klasse har ikke implementeret denne funktion",
"placeholder": "Pladsholder",
"someErrors": "Nogle fejl opstod",
"unexpectedError": "Uventet fejl",
"ok": "Okay",
"and": "og",
"githubPATLabel": "GitHub Personlig Adgangstoken (øger hastighedsgrænse)",
"includePrereleases": "Inkluder forudgivelser",
"fallbackToOlderReleases": "Fallback til ældre udgivelser",
"filterReleaseTitlesByRegEx": "Filtrer udgivelsestitler efter regulært udtryk",
"invalidRegEx": "Ugyldigt regulært udtryk",
"noDescription": "Ingen beskrivelse",
"cancel": "Annuller",
"continue": "Fortsæt",
"requiredInBrackets": "(Påkrævet)",
"dropdownNoOptsError": "FEJL: RULLEMENU SKAL HAVE MINDST ÉT TILVALG",
"colour": "Farve",
"standard": "Standard",
"custom": "Brugerdefineret",
"useMaterialYou": "Brug Material You",
"githubStarredRepos": "Stjernemarkeret GitHub-repos",
"uname": "Brugernavn",
"wrongArgNum": "Forkert antal argumenter angivet",
"xIsTrackOnly": "{} er 'Følg Kun'",
"source": "Kilde",
"app": "App",
"appsFromSourceAreTrackOnly": "Apps fra denne kilde er 'Følg Kun'.",
"youPickedTrackOnly": "Du har valgt 'Følg Kun'-indstillingen.",
"trackOnlyAppDescription": "Appen tjekkes for opdateringer, men Obtainium kan ikke hente eller installere den.",
"cancelled": "Annulleret",
"appAlreadyAdded": "Appen er allerede tilføjet",
"alreadyUpToDateQuestion": "Er appen allerede opdateret?",
"addApp": "Tilføj app",
"appSourceURL": "URL til app-kilde",
"error": "Fejl",
"add": "Tilføj",
"searchSomeSourcesLabel": "Søg (kun visse kilder)",
"search": "Søg",
"additionalOptsFor": "Flere indstillinger for {}",
"supportedSources": "Understøttede kilder",
"trackOnlyInBrackets": "(Følg Kun)",
"searchableInBrackets": "(Kan Søges)",
"appsString": "Apps",
"noApps": "Ingen apps",
"noAppsForFilter": "Ingen apps til filter",
"byX": "Af {}",
"percentProgress": "Hentning: {}%",
"pleaseWait": "Vent venligst",
"updateAvailable": "Opdatering tilgængelig",
"notInstalled": "Ikke installeret",
"pseudoVersion": "pseudo-version",
"selectAll": "Vælg alle",
"deselectX": "Fravælg {}",
"xWillBeRemovedButRemainInstalled": "{} fjernes fra Obtainium, men forbliver installeret på enheden.",
"removeSelectedAppsQuestion": "Fjern valgte apps?",
"removeSelectedApps": "Fjern valgte apps",
"updateX": "Opdater {}",
"installX": "Installer {}",
"markXTrackOnlyAsUpdated": "Markér {}\n(Følg Kun)\nsom opdateret",
"changeX": "Skift {}",
"installUpdateApps": "Installer/Opdater apps",
"installUpdateSelectedApps": "Installer/Opdater valgte apps",
"markXSelectedAppsAsUpdated": "Markér {} valgte apps som opdateret?",
"no": "Nej",
"yes": "Ja",
"markSelectedAppsUpdated": "Markér valgte apps som opdateret",
"pinToTop": "Fastgør til toppen",
"unpinFromTop": "Frigør fra toppen",
"resetInstallStatusForSelectedAppsQuestion": "Nulstil installationsstatus for valgte apps?",
"installStatusOfXWillBeResetExplanation": "Installationsstatus for alle valgte apps nulstilles.\n\nDette kan hjælpe, når en forkert app-version vises i Obtainium grundet mislykkede opdateringer eller andre problemer.",
"customLinkMessage": "Disse links virker på enheder med Obtainium installeret",
"shareAppConfigLinks": "Del app-konfiguration som HTML-link",
"shareSelectedAppURLs": "Del valgte app-URL'er",
"resetInstallStatus": "Nulstil installationsstatus",
"more": "Mere",
"removeOutdatedFilter": "Fjern forældet app-filter",
"showOutdatedOnly": "Vis kun forældede apps",
"filter": "Filtrer",
"filterApps": "Filtrer Apps",
"appName": "Appnavn",
"author": "Udvikler",
"upToDateApps": "Opdaterede apps",
"nonInstalledApps": "Ikke-installerede apps",
"importExport": "Import/Eksport",
"settings": "Indstillinger",
"exportedTo": "Eksportér til {}",
"obtainiumExport": "Obtainium-eksport",
"invalidInput": "Ugyldigt input",
"importedX": "Importerede {}",
"obtainiumImport": "Obtainium-import",
"importFromURLList": "Importér fra URL-liste",
"searchQuery": "Søgning",
"appURLList": "Liste over app-URL'er",
"line": "Linje",
"searchX": "Søg {}",
"noResults": "Ingen resultater fundet",
"importX": "Importér {}",
"importedAppsIdDisclaimer": "Importerede apps vises muligvis forkert som \"Ikke installeret\".\nFor at løse dette, geninstaller dem via Obtainium.\nDette bør ikke påvirke app-data.\n\nPåvirker kun URL- og tredjepartsimportmetoder.",
"importErrors": "Importfejl",
"importedXOfYApps": "{} af {} app importeret.",
"followingURLsHadErrors": "Følgende URL'er havde fejl:",
"selectURL": "Vælg URL",
"selectURLs": "Vælg URL'er",
"pick": "Vælg",
"theme": "Tema",
"dark": "Mørk",
"light": "Lys",
"followSystem": "Følg system",
"followSystemThemeExplanation": "Det er kun muligt at følge systemtemaet ved brug af tredjepartsapplikationer",
"useBlackTheme": "Brug rent sort mørkt tema",
"appSortBy": "Sortér apps efter:",
"authorName": "Udvikler/Navn",
"nameAuthor": "Navn/Udvikler",
"asAdded": "Som tilføjet",
"appSortOrder": "Sorteringsrækkefølge for apps",
"ascending": "Stigende",
"descending": "Faldende",
"bgUpdateCheckInterval": "Kontrolinterval for baggrundsopdatering",
"neverManualOnly": "Aldrig - Kun manuelt",
"appearance": "Udseende",
"showWebInAppView": "Vis kildewebsiden i app-visning",
"pinUpdates": "Fastgør opdateringer øverst i app-visning",
"updates": "Opdateringer",
"sourceSpecific": "Kildespecifik",
"appSource": "App-kilde",
"noLogs": "Ingen logs",
"appLogs": "App-logs",
"close": "Luk",
"share": "Del",
"appNotFound": "App ikke fundet",
"obtainiumExportHyphenatedLowercase": "obtainium-eksport",
"pickAnAPK": "Vælg en APK",
"appHasMoreThanOnePackage": "{} har mere end én pakke:",
"deviceSupportsXArch": "Din enhed understøtter CPU-arkitekturen {}.",
"deviceSupportsFollowingArchs": "Din enhed understøtter følgende CPU-arkitekturer:",
"warning": "Advarsel",
"sourceIsXButPackageFromYPrompt": "App-kilden er '{}', men udgivelsespakken kommer fra '{}'. Fortsæt?",
"updatesAvailable": "Opdateringer tilgængelige",
"updatesAvailableNotifDescription": "Underretter brugeren om tilgængelige opdateringer for en eller flere apps, som Obtainium følger",
"noNewUpdates": "Ingen nye opdateringer.",
"xHasAnUpdate": "{} har en opdatering.",
"appsUpdated": "Apps opdateret",
"appsNotUpdated": "Kunne ikke opdatere applikationerne",
"appsUpdatedNotifDescription": "Underretter brugeren om, at opdateringer til en eller flere apps blev udført i baggrunden",
"xWasUpdatedToY": "{} blev opdateret til {}.",
"xWasNotUpdatedToY": "Kunne ikke opdatere {} til {}.",
"errorCheckingUpdates": "Fejl ved tjek for opdateringer",
"errorCheckingUpdatesNotifDescription": "En meddelelse, der vises, opdateringstjek i baggrunden mislykkes",
"appsRemoved": "Apps fjernet",
"appsRemovedNotifDescription": "Underretter brugeren om, at en eller flere apps blev fjernet grundet fejl under indlæsning af dem",
"xWasRemovedDueToErrorY": "{} blev fjernet grundet denne fejl: {}",
"completeAppInstallation": "Færdiggør app-installation",
"obtainiumMustBeOpenToInstallApps": "Obtainium skal være åben for at installere apps",
"completeAppInstallationNotifDescription": "Beder brugeren om at gå tilbage til Obtainium for at færdiggøre installation af en app",
"checkingForUpdates": "Tjekker for opdateringer",
"checkingForUpdatesNotifDescription": "Kortvarig meddelelse ved tjek for opdateringer",
"pleaseAllowInstallPerm": "Tillad venligst Obtainium at installere apps",
"trackOnly": "Følg Kun",
"errorWithHttpStatusCode": "Fejl {}",
"versionCorrectionDisabled": "Versionskorrektion deaktiveret (plugin ser ikke ud til at virke)",
"unknown": "Ukendt",
"none": "Ingen",
"never": "Aldrig",
"latestVersionX": "Seneste: {}",
"installedVersionX": "Installeret: {}",
"lastUpdateCheckX": "Sidste opdateringstjek: {}",
"remove": "Fjern",
"yesMarkUpdated": "Ja, markér som opdateret",
"fdroid": "F-Droid Officiel",
"appIdOrName": "App-ID eller -navn",
"appId": "App-ID",
"appWithIdOrNameNotFound": "Ingen app med det ID eller navn blev fundet",
"reposHaveMultipleApps": "Repos kan indeholde flere apps",
"fdroidThirdPartyRepo": "F-Droid Tredjeparts-repo",
"install": "Installer",
"markInstalled": "Markér som installeret",
"update": "Opdater",
"markUpdated": "Markér som opdateret",
"additionalOptions": "Flere indstillinger",
"disableVersionDetection": "Deaktivér versionsregistrering",
"noVersionDetectionExplanation": "Denne indstilling bør kun bruges til apps, hvor versionsregistrering ikke virker korrekt.",
"downloadingX": "Henter {}",
"downloadX": "Hent {}",
"downloadedX": "Hentede {}",
"releaseAsset": "Udgivelsesressource",
"downloadNotifDescription": "Underretter brugeren om status på hentning af en app",
"noAPKFound": "Ingen APK fundet",
"noVersionDetection": "Ingen versionsregistrering",
"categorize": "Kategoriser",
"categories": "Kategorier",
"category": "Kategori",
"noCategory": "Ingen kategori",
"noCategories": "Ingen kategorier",
"deleteCategoriesQuestion": "Slet kategorier?",
"categoryDeleteWarning": "Alle apps i slettede kategorier indstilles til ukategoriseret.",
"addCategory": "Tilføj kategori",
"label": "Etiket",
"language": "Sprog",
"copiedToClipboard": "Kopieret til udklipsholder",
"storagePermissionDenied": "Lagringstilladelse nægtet",
"selectedCategorizeWarning": "Dette erstatter alle eksisterende kategoriindstillinger for de valgte apps.",
"filterAPKsByRegEx": "Filtrer APK'er efter regulært udtryk",
"removeFromObtainium": "Fjern fra Obtainium",
"uninstallFromDevice": "Afinstaller fra enhed",
"onlyWorksWithNonVersionDetectApps": "Virker kun for apps med versionsregistrering deaktiveret.",
"releaseDateAsVersion": "Brug udgivelsesdato som versionsstreng",
"releaseTitleAsVersion": "Brug udgivelsestitel som versionsstreng",
"releaseDateAsVersionExplanation": "Denne indstilling bør kun bruges til apps, hvor versionsregistrering ikke virker korrekt, men hvor en udgivelsesdato er tilgængelig.",
"changes": "Ændringer",
"releaseDate": "Udgivelsesdato",
"importFromURLsInFile": "Importér fra URL'er i fil (som OPML)",
"versionDetectionExplanation": "Afstem versionsstreng med versionen registreret fra OS",
"versionDetection": "Versionsregistrering",
"standardVersionDetection": "Standard versionsregistrering",
"groupByCategory": "Gruppér efter kategori",
"autoApkFilterByArch": "Forsøg at filtrere APK'er efter CPU-arkitektur, hvis muligt",
"overrideSource": "Tilsidesæt kilde",
"dontShowAgain": "Vis ikke igen",
"dontShowTrackOnlyWarnings": "Vis ikke 'Følg Kun'-advarsler",
"dontShowAPKOriginWarnings": "Vis ikke advarsler om APK-oprindelse",
"moveNonInstalledAppsToBottom": "Flyt ikke-installerede apps nederst i app-visning",
"gitlabPATLabel": "GitLab Personlig Adgangstoken",
"about": "Om",
"requiresCredentialsInSettings": "{} kræver yderligere legitimation (i Indstillinger)",
"checkOnStart": "Tjek for opdateringer ved opstart",
"tryInferAppIdFromCode": "Forsøg at udlede app-ID fra kildekode",
"removeOnExternalUninstall": "Fjern automatisk eksternt afinstallerede apps",
"pickHighestVersionCode": "Auto-vælg højeste versionKode af APK",
"checkUpdateOnDetailPage": "Tjek for opdateringer ved åbning af appens detaljeside",
"disablePageTransitions": "Deaktivér sideovergangsanimationer",
"reversePageTransitions": "Omvendte sideovergangsanimationer",
"minStarCount": "Minimum antal stjerner",
"addInfoBelow": "Tilføj denne info nedenfor.",
"addInfoInSettings": "Tilføj denne info i Indstillinger.",
"githubSourceNote": "GitHub's hastighedsbegrænsning kan undgås med en API-nøgle.",
"sortByLastLinkSegment": "Sortér kun efter det sidste segment af linket",
"filterReleaseNotesByRegEx": "Filtrer udgivelsesnoter efter regulært udtryk",
"customLinkFilterRegex": "Brugerdefineret APK-linkfilter efter regulært udtryk (standard '.apk$')",
"appsPossiblyUpdated": "App-opdateringer forsøgt",
"appsPossiblyUpdatedNotifDescription": "Underretter brugeren om, at opdateringer til en eller flere apps muligvis blev udført i baggrunden",
"xWasPossiblyUpdatedToY": "{} er muligvis blevet opdateret til {}.",
"enableBackgroundUpdates": "Aktivér baggrundsopdateringer",
"backgroundUpdateReqsExplanation": "Baggrundsopdateringer er måske ikke mulige for alle apps.",
"backgroundUpdateLimitsExplanation": "En vellykket baggrundsinstallation kan kun afgøres, når Obtainium åbnes.",
"verifyLatestTag": "Verificer 'seneste'-tagget",
"intermediateLinkRegex": "Filtrer efter et 'mellemliggende' link at besøge",
"filterByLinkText": "Filtrer links efter linktekst",
"intermediateLinkNotFound": "Mellemliggende link ikke fundet",
"intermediateLink": "Mellemliggende link",
"exemptFromBackgroundUpdates": "Undtag fra baggrundsopdateringer (hvis aktiveret)",
"bgUpdatesOnWiFiOnly": "Deaktiver baggrundsopdateringer, når du ikke er på Wi-Fi",
"bgUpdatesWhileChargingOnly": "Deaktiver baggrundsopdateringer, når du ikke oplader",
"autoSelectHighestVersionCode": "Auto-vælg højeste versionKode af APK",
"versionExtractionRegEx": "RegEx for versionsstrengsudtrækning",
"trimVersionString": "Trim versionsstreng med RegEx",
"matchGroupToUseForX": "Match-gruppe til brug for \"{}\"",
"matchGroupToUse": "RegEx-matchgruppe til brug for versionsstrengsudtrækning",
"highlightTouchTargets": "Fremhæv mindre åbenlyse berøringsmål",
"pickExportDir": "Vælg eksportmappe",
"autoExportOnChanges": "Auto-eksportér ved ændringer",
"includeSettings": "Inkluder indstillinger",
"filterVersionsByRegEx": "Filtrer versioner efter regulært udtryk",
"trySelectingSuggestedVersionCode": "Forsøg at vælge den foreslåede versionKode af APK",
"dontSortReleasesList": "Behold udgivelsesrækkefølge fra API",
"reverseSort": "Omvendt sortering",
"takeFirstLink": "Tag første link",
"skipSort": "Spring sortering over",
"debugMenu": "Fejlfindingsmenu",
"bgTaskStarted": "Baggrundsopgave startet - tjek logfiler.",
"runBgCheckNow": "Kør baggrundsopdateringstjek nu",
"versionExtractWholePage": "Anvend RegEx til versionsstrengsudtrækning på hele siden",
"installing": "Installerer",
"skipUpdateNotifications": "Spring opdateringsmeddelelser over",
"updatesAvailableNotifChannel": "Opdateringer tilgængelige",
"appsUpdatedNotifChannel": "Apps opdateret",
"appsPossiblyUpdatedNotifChannel": "App-opdateringer forsøgt",
"errorCheckingUpdatesNotifChannel": "Fejl ved opdateringstjek",
"appsRemovedNotifChannel": "Apps fjernet",
"downloadingXNotifChannel": "Henter {}",
"completeAppInstallationNotifChannel": "Færdiggør app-installation",
"checkingForUpdatesNotifChannel": "Tjekker for opdateringer",
"onlyCheckInstalledOrTrackOnlyApps": "Tjek kun installerede og 'Følg Kun'-apps for opdateringer",
"supportFixedAPKURL": "Understøt fikserede APK-URL'er",
"selectX": "Vælg {}",
"parallelDownloads": "Tillad samtidige overførsler",
"useShizuku": "Brug Shizuku eller Sui til at installere",
"shizukuBinderNotFound": "Shizuku-tjeneste kører ikke",
"shizukuOld": "Forældet Shizuku-version (<11). Opdater den",
"shizukuOldAndroidWithADB": "Shizuku kører på Android <8.1 med ADB. Opdater Android eller brug Sui i stedet",
"shizukuPretendToBeGooglePlay": "Indstil Google Play som installationskilde (hvis Shizuku bruges)",
"useSystemFont": "Brug systemskrifttype",
"useVersionCodeAsOSVersion": "Brug app-versionKode som OS-registreret version",
"requestHeader": "Anmodningsheader",
"useLatestAssetDateAsReleaseDate": "Brug seneste ressourceupload som udgivelsesdato",
"defaultPseudoVersioningMethod": "Standard pseudo-versioneringsmetode",
"partialAPKHash": "Delvis APK-hash",
"APKLinkHash": "Hash for APK-link",
"directAPKLink": "Direkte APK-link",
"pseudoVersionInUse": "En pseudo-version er i brug",
"installed": "Installeret",
"latest": "Seneste",
"invertRegEx": "Inverter regulært udtryk",
"note": "Bemærk",
"selfHostedNote": "Rullemenuen \"{}\" kan bruges til at nå selvhostede/brugerdefinerede instanser af enhver kilde.",
"badDownload": "APK'en kunne ikke analyseres (inkompatibel eller delvis hentning)",
"beforeNewInstallsShareToAppVerifier": "Del nye apps med AppVerifier (hvis tilgængelig)",
"appVerifierInstructionToast": "Del til AppVerifier, og vend tilbage, når du er klar.",
"wiki": "Hjælp/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourcede app-konfigurationer (brug på egen risiko)",
"crowdsourcedConfigsShort": "Crowdsourcede app-konfigurationer",
"allowInsecure": "Tillad usikre HTTP-anmodninger",
"stayOneVersionBehind": "Forbliv én version bagud den seneste",
"refreshBeforeDownload": "Opdater app-detaljer før download",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "Fjern app?",
"other": "Fjern apps?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "For mange anmodninger (begrænset hastighed). Prøv igen om {} minut",
"other": "For mange anmodninger (begrænset hastighed). Prøv igen om {} minutter"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Baggrundsopdateringstjek stødte på en {}. Planlægger et nyt tjek om {} minut",
"other": "Baggrundsopdateringstjek stødte på en {}. Planlægger et nyt tjek om {} minutter"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Baggrundsopdateringstjek fandt {} opdatering. Underretter brugeren, hvis nødvendigt",
"other": "Baggrundsopdateringstjek fandt {} opdateringer. Underretter brugeren, hvis nødvendigt"
},
"apps": {
"one": "{} App",
"other": "{} Apps"
},
"url": {
"one": "{} URL",
"other": "{} URL'er"
},
"minute": {
"one": "{} Minut",
"other": "{} Minutter"
},
"hour": {
"one": "{} Time",
"other": "{} Timer"
},
"day": {
"one": "{} Dag",
"other": "{} Dage"
},
"clearedNLogsBeforeXAfterY": {
"one": "Ryddet {n} log (før = {before}, efter = {after})",
"other": "Ryddede {n} logs (før = {before}, efter = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} og 1 anden app har opdateringer.",
"other": "{} og {} andre apps har opdateringer."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} og 1 anden app blev opdateret.",
"other": "{} og {} andre apps blev opdateret."
},
"xAndNMoreUpdatesFailed": {
"one": "Kunne ikke opdatere {} og 1 anden app.",
"other": "Kunne ikke opdatere {} og {} andre apps."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} og 1 anden app blev muligvis opdateret.",
"other": "{} og {} andre apps blev muligvis opdateret."
},
"apk": {
"one": "{} APK",
"other": "{} APK'er"
}
}

View File

@ -9,17 +9,9 @@
"placeholder": "Platzhalter", "placeholder": "Platzhalter",
"someErrors": "Es traten einige Fehler auf", "someErrors": "Es traten einige Fehler auf",
"unexpectedError": "Unerwarteter Fehler", "unexpectedError": "Unerwarteter Fehler",
"ok": "Okay", "ok": "OK",
"and": "und", "and": "und",
"startedBgUpdateTask": "Hintergrundaktualisierungsprüfung gestartet", "githubPATLabel": "Persönlicher Zugangstoken für GitHub (erhöht das Ratenlimit)",
"bgUpdateIgnoreAfterIs": "Hintergrundaktualisierung 'ignoreAfter' ist {}",
"startedActualBGUpdateCheck": "Überprüfung der Hintergrundaktualisierung gestartet",
"bgUpdateTaskFinished": "Hintergrundaktualisierungsprüfung abgeschlossen",
"firstRun": "Dies ist der erste Start von Obtainium überhaupt",
"settingUpdateCheckIntervalTo": "Aktualisierungsintervall auf {} stellen",
"githubPATLabel": "GitHub Personal Access Token (Erhöht das Ratenlimit)",
"githubPATHint": "PAT muss in diesem Format sein: Benutzername:Token",
"githubPATFormat": "Benutzername:Token",
"includePrereleases": "Vorabversionen einbeziehen", "includePrereleases": "Vorabversionen einbeziehen",
"fallbackToOlderReleases": "Fallback auf ältere Versionen", "fallbackToOlderReleases": "Fallback auf ältere Versionen",
"filterReleaseTitlesByRegEx": "Release-Titel nach regulärem Ausdruck\nfiltern", "filterReleaseTitlesByRegEx": "Release-Titel nach regulärem Ausdruck\nfiltern",
@ -27,18 +19,21 @@
"noDescription": "Keine Beschreibung", "noDescription": "Keine Beschreibung",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"continue": "Weiter", "continue": "Weiter",
"requiredInBrackets": "(Benötigt)", "requiredInBrackets": "(wird benötigt)",
"dropdownNoOptsError": "FEHLER: DROPDOWN MUSS MINDESTENS EINE OPTION HABEN", "dropdownNoOptsError": "FEHLER: DROPDOWN MUSS MINDESTENS EINE OPTION HABEN",
"colour": "Farbe", "colour": "Farbe",
"standard": "Standard",
"custom": "Benutzerdefiniert",
"useMaterialYou": "Material You verwenden",
"githubStarredRepos": "GitHub Starred Repos", "githubStarredRepos": "GitHub Starred Repos",
"uname": "Benutzername", "uname": "Benutzername",
"wrongArgNum": "Falsche Anzahl von Argumenten übermittelt", "wrongArgNum": "Falsche Anzahl von Argumenten (Parametern) übermittelt",
"xIsTrackOnly": "{} ist nur zur Nachverfolgung", "xIsTrackOnly": "{} ist nur zur Nachverfolgung",
"source": "Quelle", "source": "Quelle",
"app": "App", "app": "App",
"appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind 'Nur Nachverfolgen'.", "appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind nur zur Nachverfolgung.",
"youPickedTrackOnly": "Sie haben die Option 'Nur Nachverfolgen' gewählt.", "youPickedTrackOnly": "Du hast die Option Nur nachverfolgen gewählt.",
"trackOnlyAppDescription": "Die App wird auf Updates überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.", "trackOnlyAppDescription": "Die App wird auf neue verfügbare Versionen überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.",
"cancelled": "Abgebrochen", "cancelled": "Abgebrochen",
"appAlreadyAdded": "App bereits hinzugefügt", "appAlreadyAdded": "App bereits hinzugefügt",
"alreadyUpToDateQuestion": "App bereits auf dem neuesten Stand?", "alreadyUpToDateQuestion": "App bereits auf dem neuesten Stand?",
@ -46,11 +41,11 @@
"appSourceURL": "Quell-URL der App", "appSourceURL": "Quell-URL der App",
"error": "Fehler", "error": "Fehler",
"add": "Hinzufügen", "add": "Hinzufügen",
"searchSomeSourcesLabel": "Suche (nur bestimmte Quellen)", "searchSomeSourcesLabel": "Suche (nur für bestimmte Quellen)",
"search": "Suchen", "search": "Suchen",
"additionalOptsFor": "Zusatzoptionen für {}", "additionalOptsFor": "Zusatzoptionen für {}",
"supportedSourcesBelow": "Unterstützte Quellen:", "supportedSources": "Unterstützte Quellen",
"trackOnlyInBrackets": "(Nur Nachverfolgen)", "trackOnlyInBrackets": "(Nur nachverfolgen)",
"searchableInBrackets": "(Durchsuchbar)", "searchableInBrackets": "(Durchsuchbar)",
"appsString": "Apps", "appsString": "Apps",
"noApps": "Keine Apps", "noApps": "Keine Apps",
@ -59,115 +54,115 @@
"percentProgress": "Fortschritt: {}%", "percentProgress": "Fortschritt: {}%",
"pleaseWait": "Bitte warten", "pleaseWait": "Bitte warten",
"updateAvailable": "Aktualisierung verfügbar", "updateAvailable": "Aktualisierung verfügbar",
"estimateInBracketsShort": "(ca.)",
"notInstalled": "Nicht installiert", "notInstalled": "Nicht installiert",
"estimateInBrackets": "(Ungefähr)", "pseudoVersion": "Pseudoversion",
"selectAll": "Alle auswählen", "selectAll": "Alle auswählen",
"deselectN": "{} abgewählt", "deselectX": "{} abgewählt",
"xWillBeRemovedButRemainInstalled": "{} wird aus Obtainium entfernt, bleibt aber auf dem Gerät installiert.", "xWillBeRemovedButRemainInstalled": "{} wird aus Obtainium entfernt, bleibt aber auf dem Gerät installiert.",
"removeSelectedAppsQuestion": "Ausgewählte Apps entfernen?", "removeSelectedAppsQuestion": "Ausgewählte Apps entfernen?",
"removeSelectedApps": "Ausgewählte Apps entfernen", "removeSelectedApps": "Ausgewählte Apps entfernen",
"updateX": "Aktualisiere {}", "updateX": "{} aktualisieren",
"installX": "Installiere {}", "installX": "{} installieren",
"markXTrackOnlyAsUpdated": "Markiere {}\n(Nur Nachverfolgen)\nals aktualisiert", "markXTrackOnlyAsUpdated": "Markiere {}\n(Nur nachverfolgen)\nals aktualisiert",
"changeX": "Ändere {}", "changeX": "{} ändern",
"installUpdateApps": "Apps installieren/aktualisieren", "installUpdateApps": "Apps installieren/aktualisieren",
"installUpdateSelectedApps": "Ausgewählte Apps installieren/aktualisieren", "installUpdateSelectedApps": "Ausgewählte Apps installieren/aktualisieren",
"markXSelectedAppsAsUpdated": "Markiere {} ausgewählte Apps als aktuell?", "markXSelectedAppsAsUpdated": "{} ausgewählte Apps als aktuell markieren?",
"no": "Nein", "no": "Nein",
"yes": "Ja", "yes": "Ja",
"markSelectedAppsUpdated": "Markiere ausgewählte Apps als aktuell", "markSelectedAppsUpdated": "Ausgewählte Apps als aktuell markieren",
"pinToTop": "Oben anheften", "pinToTop": "Oben anheften",
"unpinFromTop": "'Oben anheften' aufheben", "unpinFromTop": "Oben anheften aufheben",
"resetInstallStatusForSelectedAppsQuestion": "Installationsstatus für ausgewählte Apps zurücksetzen?", "resetInstallStatusForSelectedAppsQuestion": "Installationsstatus für ausgewählte Apps zurücksetzen?",
"installStatusOfXWillBeResetExplanation": "Der Installationsstatus der ausgewählten Apps wird zurückgesetzt. Dies kann hilfreich sein, wenn die in Obtainium angezeigte App-Version aufgrund fehlgeschlagener Aktualisierungen oder anderer Probleme falsch ist.", "installStatusOfXWillBeResetExplanation": "Der Installationsstatus der ausgewählten Apps wird zurückgesetzt. Dies kann hilfreich sein, wenn die in Obtainium angezeigte App-Version aufgrund fehlgeschlagener Aktualisierungen oder anderer Probleme falsch ist.",
"customLinkMessage": "Diese Links funktionieren auf Geräten, wo Obtainium installiert ist",
"shareAppConfigLinks": "App-Konfiguration als HTML-Link teilen",
"shareSelectedAppURLs": "Ausgewählte App-URLs teilen", "shareSelectedAppURLs": "Ausgewählte App-URLs teilen",
"resetInstallStatus": "Installationsstatus zurücksetzen", "resetInstallStatus": "Installationsstatus zurücksetzen",
"more": "Mehr", "more": "Mehr",
"removeOutdatedFilter": "App-Filter 'Nicht aktuell' entfernen", "removeOutdatedFilter": "App-Filter Nicht aktuell entfernen",
"showOutdatedOnly": "Nur nicht aktuelle Apps anzeigen", "showOutdatedOnly": "Nur nicht aktuelle Apps anzeigen",
"filter": "Filter", "filter": "Filter",
"filterActive": "Filter *",
"filterApps": "Apps filtern", "filterApps": "Apps filtern",
"appName": "App Name", "appName": "App-Name",
"author": "Autor", "author": "Herausgebende",
"upToDateApps": "Apps mit aktueller Version", "upToDateApps": "Apps mit aktuellster Version",
"nonInstalledApps": "Nicht installierte Apps", "nonInstalledApps": "Nicht installierte Apps",
"importExport": "Import/Export", "importExport": "Import/Export",
"settings": "Einstellungen", "settings": "Einstellungen",
"exportedTo": "Exportiert zu {}", "exportedTo": "Exportiert nach {}",
"obtainiumExport": "Obtainium Export", "obtainiumExport": "Obtainium-Export",
"invalidInput": "Ungültige Eingabe", "invalidInput": "Ungültige Eingabe",
"importedX": "Importiert {}", "importedX": "{} importiert",
"obtainiumImport": "Obtainium Import", "obtainiumImport": "Obtainium-Import",
"importFromURLList": "Importieren aus URL-Liste", "importFromURLList": "Aus URL-Liste importieren",
"searchQuery": "Suchanfrage", "searchQuery": "Suchanfrage",
"appURLList": "App URL-Liste", "appURLList": "App-URL-Liste",
"line": "Linie", "line": "Linie",
"searchX": "Suche {}", "searchX": "{} suchen",
"noResults": "Keine Ergebnisse gefunden", "noResults": "Keine Ergebnisse gefunden",
"importX": "Import {}", "importX": "{} importieren",
"importedAppsIdDisclaimer": "Importierte Apps werden möglicherweise fälschlicherweise als \"Nicht installiert\" angezeigt. Um dies zu beheben, installieren Sie sie erneut über Obtainium. Dies hat keine Auswirkungen auf App-Daten. Es betrifft nur URL- und Drittanbieter-Importmethoden.", "importedAppsIdDisclaimer": "Importierte Apps werden manchmal fälschlicherweise als Nicht installiert angezeigt. Um dies zu beheben, installiere sie erneut über Obtainium. Dies hat keine Auswirkungen auf App-Daten. Es betrifft nur URL- und Drittanbieter-Importmethoden.",
"importErrors": "Importfehler", "importErrors": "Importfehler",
"importedXOfYApps": "{} von {} Apps importiert.", "importedXOfYApps": "{} von {} Apps importiert.",
"followingURLsHadErrors": "Bei folgenden URLs traten Fehler auf:", "followingURLsHadErrors": "Bei folgenden URLs traten Fehler auf:",
"okay": "Okay",
"selectURL": "URL auswählen", "selectURL": "URL auswählen",
"selectURLs": "URLs auswählen", "selectURLs": "URLs auswählen",
"pick": "Auswählen", "pick": "Auswählen",
"theme": "Theme", "theme": "Design",
"dark": "Dunkel", "dark": "Dunkel",
"light": "Hell", "light": "Hell",
"followSystem": "System folgen", "followSystem": "Systemstandard",
"obtainium": "Obtainium", "followSystemThemeExplanation": "Das Abrufen des Systemdesigns ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich",
"materialYou": "Material You", "useBlackTheme": "Rein schwarzen Hintergrund verwenden",
"useBlackTheme": "Verwende Pure Black Dark Theme",
"appSortBy": "App sortieren nach", "appSortBy": "App sortieren nach",
"authorName": "Autor/Name", "authorName": "Hrsg./Name",
"nameAuthor": "Name/Autor", "nameAuthor": "Name/Hrsg.",
"asAdded": "Wie hinzugefügt", "asAdded": "Wie hinzugefügt",
"appSortOrder": "App sortieren nach", "appSortOrder": "App sortieren nach",
"ascending": "Aufsteigend", "ascending": "Aufsteigend",
"descending": "Absteigend", "descending": "Absteigend",
"bgUpdateCheckInterval": "Prüfintervall für Hintergrundaktualisierung", "bgUpdateCheckInterval": "Prüfintervall für Hintergrundaktualisierung",
"neverManualOnly": "Nie - nur manuell", "neverManualOnly": "Nie nur manuell",
"appearance": "Aussehen", "appearance": "Aussehen",
"showWebInAppView": "Quellwebseite in der App-Ansicht anzeigen", "showWebInAppView": "Quellwebseite in der App-Ansicht anzeigen",
"pinUpdates": "Apps mit Aktualisierungen oben anheften", "pinUpdates": "Apps mit Aktualisierungen oben anheften",
"updates": "Aktualisierungen", "updates": "Aktualisierungen",
"sourceSpecific": "Quellenspezifisch", "sourceSpecific": "Quellenspezifisch",
"appSource": "App-Quelle", "appSource": "App-Quelle",
"noLogs": "Keine Protokolle", "noLogs": "Keine Logs",
"appLogs": "App Protokolle", "appLogs": "App-Logs",
"close": "Schließen", "close": "Schließen",
"share": "Teilen", "share": "Teilen",
"appNotFound": "App nicht gefunden", "appNotFound": "App nicht gefunden",
"obtainiumExportHyphenatedLowercase": "obtainium-export", "obtainiumExportHyphenatedLowercase": "Obtainium-Export",
"pickAnAPK": "APK auswählen", "pickAnAPK": "APK auswählen",
"appHasMoreThanOnePackage": "{} verfügt über mehr als ein Paket:", "appHasMoreThanOnePackage": "{} verfügt über mehr als ein Paket:",
"deviceSupportsXArch": "Ihr Gerät unterstützt die CPU-Architektur {}.", "deviceSupportsXArch": "Dein Gerät unterstützt die CPU-Architektur {}.",
"deviceSupportsFollowingArchs": "Ihr Gerät unterstützt die folgenden CPU-Architekturen:", "deviceSupportsFollowingArchs": "Dein Gerät unterstützt die folgenden CPU-Architekturen:",
"warning": "Warnung", "warning": "Warnung",
"sourceIsXButPackageFromYPrompt": "Die App-Quelle ist '{}', aber das Release-Paket stammt von '{}'. Fortfahren?", "sourceIsXButPackageFromYPrompt": "Die App-Quelle ist '{}', aber das Release-Paket stammt von '{}'. Fortfahren?",
"updatesAvailable": "Aktualisierungen verfügbar", "updatesAvailable": "Aktualisierungen verfügbar",
"updatesAvailableNotifDescription": "Benachrichtigt den Nutzer, dass Aktualisierungen für eine oder mehrere von Obtainium verfolgte Apps verfügbar sind", "updatesAvailableNotifDescription": "Benachrichtigt, wenn Aktualisierungen für eine oder mehrere von Obtainium verfolgte Apps verfügbar sind",
"noNewUpdates": "Keine neuen Aktualisierungen.", "noNewUpdates": "Keine neuen Aktualisierungen.",
"xHasAnUpdate": "{} hat eine Aktualisierung.", "xHasAnUpdate": "{} hat eine Aktualisierung.",
"appsUpdated": "Apps aktualisiert", "appsUpdated": "App wurde aktualisiert",
"appsUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps im Hintergrund durchgeführt wurden", "appsNotUpdated": "Aktualisierung der Apps fehlgeschlagen",
"appsUpdatedNotifDescription": "Benachrichtigt, wenn Aktualisierungen für eine oder mehrere Apps im Hintergrund durchgeführt wurden",
"xWasUpdatedToY": "{} wurde auf {} aktualisiert.", "xWasUpdatedToY": "{} wurde auf {} aktualisiert.",
"xWasNotUpdatedToY": "Die Aktualisierung von {} auf {} ist fehlgeschlagen.",
"errorCheckingUpdates": "Fehler beim Prüfen auf Aktualisierungen", "errorCheckingUpdates": "Fehler beim Prüfen auf Aktualisierungen",
"errorCheckingUpdatesNotifDescription": "Eine Benachrichtigung, die angezeigt wird, wenn die Prüfung der Hintergrundaktualisierung fehlschlägt", "errorCheckingUpdatesNotifDescription": "Benachrichtigt, wenn die Prüfung der Hintergrundaktualisierung fehlgeschlagen ist",
"appsRemoved": "Apps entfernt", "appsRemoved": "Apps entfernt",
"appsRemovedNotifDescription": "Benachrichtigt den Benutzer, dass eine oder mehrere Apps aufgrund von Fehlern beim Laden entfernt wurden", "appsRemovedNotifDescription": "Benachrichtigt, wenn eine oder mehrere Apps aufgrund von Fehlern beim Laden entfernt wurden",
"xWasRemovedDueToErrorY": "{} wurde aufgrund des folgenden Fehlers entfernt: {}", "xWasRemovedDueToErrorY": "{} wurde aufgrund des folgenden Fehlers entfernt: {}",
"completeAppInstallation": "App Installation abschließen", "completeAppInstallation": "App-Installation abschließen",
"obtainiumMustBeOpenToInstallApps": "Obtainium muss geöffnet sein, um Apps zu installieren", "obtainiumMustBeOpenToInstallApps": "Obtainium muss geöffnet sein, um Apps zu installieren",
"completeAppInstallationNotifDescription": "Aufforderung an den Benutzer, zu Obtainium zurückzukehren, um die Installation einer App abzuschließen", "completeAppInstallationNotifDescription": "Aufforderung zu Obtainium zurückzukehren, um die Installation einer App abzuschließen",
"checkingForUpdates": "Nach Aktualisierungen suchen", "checkingForUpdates": "Nach Aktualisierungen suchen",
"checkingForUpdatesNotifDescription": "Vorübergehende Benachrichtigung, die bei der Suche nach Aktualisierungen angezeigt wird", "checkingForUpdatesNotifDescription": "Vorübergehende Benachrichtigung, die bei der Suche nach Aktualisierungen angezeigt wird",
"pleaseAllowInstallPerm": "Bitte erlauben Sie Obtainium die Installation von Apps", "pleaseAllowInstallPerm": "Bitte erlaube Obtainium die Installation von Apps",
"trackOnly": "Nur Nachverfolgen", "trackOnly": "Nur nachverfolgen",
"errorWithHttpStatusCode": "Fehler {}", "errorWithHttpStatusCode": "Fehler {}",
"versionCorrectionDisabled": "Versionskorrektur deaktiviert (Plugin scheint nicht zu funktionieren)", "versionCorrectionDisabled": "Versionskorrektur deaktiviert (Plugin scheint nicht zu funktionieren)",
"unknown": "Unbekannt", "unknown": "Unbekannt",
@ -178,24 +173,24 @@
"lastUpdateCheckX": "Letzte Aktualisierungsprüfung: {}", "lastUpdateCheckX": "Letzte Aktualisierungsprüfung: {}",
"remove": "Entfernen", "remove": "Entfernen",
"yesMarkUpdated": "Ja, als aktualisiert markieren", "yesMarkUpdated": "Ja, als aktualisiert markieren",
"fdroid": "F-Droid Official", "fdroid": "Offizielles F-Droid-Repo",
"appIdOrName": "App ID oder Name", "appIdOrName": "App-ID oder Name",
"appId": "App ID", "appId": "App-ID",
"appWithIdOrNameNotFound": "Es wurde keine App mit dieser ID oder diesem Namen gefunden", "appWithIdOrNameNotFound": "Es wurde keine App mit dieser ID oder diesem Namen gefunden",
"reposHaveMultipleApps": "Repos können mehrere Apps enthalten", "reposHaveMultipleApps": "Repos können mehrere Apps enthalten",
"fdroidThirdPartyRepo": "F-Droid Third-Party Repo", "fdroidThirdPartyRepo": "F-Droid-Drittanbieter-Repo",
"steam": "Steam",
"steamMobile": "Steam Mobile",
"steamChat": "Steam Chat",
"install": "Installieren", "install": "Installieren",
"markInstalled": "Als Installiert markieren", "markInstalled": "Als installiert markieren",
"update": "Aktualisieren", "update": "Aktualisieren",
"markUpdated": "Als Aktuell markieren", "markUpdated": "Als aktuell markieren",
"additionalOptions": "Zusätzliche Optionen", "additionalOptions": "Zusätzliche Optionen",
"disableVersionDetection": "Versionsermittlung deaktivieren", "disableVersionDetection": "Versionserkennung deaktivieren",
"noVersionDetectionExplanation": "Diese Option sollte nur für Apps verwendet werden, bei denen die Versionserkennung nicht korrekt funktioniert.", "noVersionDetectionExplanation": "Diese Option sollte nur für Apps verwendet werden, bei denen die Versionserkennung nicht korrekt funktioniert.",
"downloadingX": "Lade {} herunter", "downloadingX": "{} wird heruntergeladen",
"downloadNotifDescription": "Benachrichtigt den Nutzer über den Fortschritt beim Herunterladen einer App", "downloadX": "{} herunterladen",
"downloadedX": "{} heruntergeladen",
"releaseAsset": "Release-Asset",
"downloadNotifDescription": "Zeigt den Fortschritt beim Herunterladen einer App",
"noAPKFound": "Keine APK gefunden", "noAPKFound": "Keine APK gefunden",
"noVersionDetection": "Keine Versionserkennung", "noVersionDetection": "Keine Versionserkennung",
"categorize": "Kategorisieren", "categorize": "Kategorisieren",
@ -216,52 +211,129 @@
"uninstallFromDevice": "Vom Gerät deinstallieren", "uninstallFromDevice": "Vom Gerät deinstallieren",
"onlyWorksWithNonVersionDetectApps": "Funktioniert nur bei Apps mit deaktivierter Versionserkennung.", "onlyWorksWithNonVersionDetectApps": "Funktioniert nur bei Apps mit deaktivierter Versionserkennung.",
"releaseDateAsVersion": "Veröffentlichungsdatum als Version verwenden", "releaseDateAsVersion": "Veröffentlichungsdatum als Version verwenden",
"releaseTitleAsVersion": "Versionstitel als Versionsstring verwenden",
"releaseDateAsVersionExplanation": "Diese Option sollte nur für Apps verwendet werden, bei denen die Versionserkennung nicht korrekt funktioniert, aber ein Veröffentlichungsdatum verfügbar ist.", "releaseDateAsVersionExplanation": "Diese Option sollte nur für Apps verwendet werden, bei denen die Versionserkennung nicht korrekt funktioniert, aber ein Veröffentlichungsdatum verfügbar ist.",
"changes": "Änderungen", "changes": "Änderungen",
"releaseDate": "Veröffentlichungsdatum", "releaseDate": "Veröffentlichungsdatum",
"importFromURLsInFile": "Importieren von URLs aus Datei (z. B. OPML)", "importFromURLsInFile": "URLs aus Datei importieren (z. B. OPML)",
"versionDetectionExplanation": "Abgleich der Versionsnummer mit der vom Betriebssystem erkannten Version",
"versionDetection": "Versionserkennung", "versionDetection": "Versionserkennung",
"standardVersionDetection": "Standardversionserkennung", "standardVersionDetection": "Standardversionserkennung",
"groupByCategory": "Nach Kategorie gruppieren", "groupByCategory": "Nach Kategorie gruppieren",
"autoApkFilterByArch": "Nach Möglichkeit versuchen, APKs nach CPU-Architektur zu filtern", "autoApkFilterByArch": "Nach Möglichkeit versuchen, APKs nach CPU-Architektur zu filtern",
"overrideSource": "Quelle überschreiben", "overrideSource": "Quelle überschreiben",
"dontShowAgain": "Nicht noch einmal zeigen", "dontShowAgain": "Nicht noch einmal anzeigen",
"dontShowTrackOnlyWarnings": "Warnung für 'Nur Nachverfolgen' nicht anzeigen", "dontShowTrackOnlyWarnings": "Warnung für Nur nachverfolgen nicht anzeigen",
"dontShowAPKOriginWarnings": "Warnung für APK-Herkunft nicht anzeigen", "dontShowAPKOriginWarnings": "Warnung für APK-Herkunft nicht anzeigen",
"moveNonInstalledAppsToBottom": "Nicht installierte Apps ans Ende der Apps Ansicht verschieben", "moveNonInstalledAppsToBottom": "Nicht installierte Apps ans Ende der App-Ansicht verschieben",
"gitlabPATLabel": "GitLab Personal Access Token\n(Aktiviert Suche und bessere APK Entdeckung)", "gitlabPATLabel": "Persönlicher Zugangstoken für GitLab",
"about": "Über", "about": "Über",
"requiresCredentialsInSettings": "Benötigt zusätzliche Anmeldedaten (in den Einstellungen)", "requiresCredentialsInSettings": "{}: Benötigt zusätzliche Anmeldedaten (in den Einstellungen)",
"checkOnStart": "Überprüfe einmalig beim Start", "checkOnStart": "Einmalig beim Start überprüfen",
"tryInferAppIdFromCode": "Versuche, die App-ID aus dem Quellcode zu ermitteln", "tryInferAppIdFromCode": "Versuchen, die App-ID aus dem Quellcode zu ermitteln",
"removeOnExternalUninstall": "Automatisches Entfernen von extern deinstallierten Apps", "removeOnExternalUninstall": "Extern deinstallierte Apps automatische entfernen",
"pickHighestVersionCode": "Automatische Auswahl des APK mit höchstem Versionscode", "pickHighestVersionCode": "Automatische Auswahl des APK mit höchstem Versionscode",
"checkUpdateOnDetailPage": "Nach Updates suchen, wenn eine App-Detailseite geöffnet wird", "checkUpdateOnDetailPage": "Nach Aktualisierungen suchen, wenn eine App-Detailseite geöffnet wird",
"disablePageTransitions": "Animationen für Seitenübergänge deaktivieren", "disablePageTransitions": "Animationen für Seitenübergänge deaktivieren",
"reversePageTransitions": "Umgekehrte Animationen für Seitenübergänge", "reversePageTransitions": "Umgekehrte Animationen für Seitenübergänge",
"minStarCount": "Minimale Anzahl von Sternen", "minStarCount": "Minimale Anzahl von Sternen",
"addInfoBelow": "Fügen Sie diese Informationen unten hinzu.", "addInfoBelow": "Diese Information unten hinzufügen.",
"addInfoInSettings": "Fügen Sie diese Info in den Einstellungen hinzu.", "addInfoInSettings": "Diese Information in den Einstellungen hinzufügen.",
"githubSourceNote": "Die GitHub-Ratenbegrenzung kann mit einem API-Schlüssel umgangen werden.", "githubSourceNote": "Die GitHub-Ratenbegrenzung kann mit einem API-Schlüssel umgangen werden.",
"gitlabSourceNote": "GitLab APK-Extraktion funktioniert möglicherweise nicht ohne API-Schlüssel", "sortByLastLinkSegment": "Nur nach dem letzten Teil des Links sortieren",
"sortByFileNamesNotLinks": "Sortiere nach Dateinamen, anstelle von ganzen Links", "filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck\nfiltern",
"filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck filtern", "customLinkFilterRegex": "Benutzerdefinierter APK-Linkfilter durch regulären Ausdruck (Standard '.apk$')",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "appsPossiblyUpdated": "App-Aktualisierungen wurden versucht",
"appsPossiblyUpdatedNotifDescription": "Benachrichtigt, dass möglicherweise eine oder mehrere Apps im Hintergrund aktualisiert wurden",
"xWasPossiblyUpdatedToY": "{} wurde eventuell auf Version {} aktualisiert.",
"enableBackgroundUpdates": "Hintergrundaktualisierungen aktivieren",
"backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist unter Umständen nicht für alle Apps möglich.",
"backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.",
"verifyLatestTag": "„Latest“-Tag überprüfen",
"intermediateLinkRegex": "Filter für einen „Zwischen“-Link, der zuerst besucht werden soll",
"filterByLinkText": "Links durch Linktext filtern",
"intermediateLinkNotFound": "„Zwischen“-Link nicht gefunden",
"intermediateLink": "„Zwischen“-Link",
"exemptFromBackgroundUpdates": "Von Hintergrundaktualisierungen (falls aktiviert) ausschließen",
"bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen nur im WLAN ausführen",
"bgUpdatesWhileChargingOnly": "Hintergrundaktualisierungen nur ausführen, während das Gerät geladen wird",
"autoSelectHighestVersionCode": "Automatisch höchste APK-Version auswählen",
"versionExtractionRegEx": "Versionsextraktion per RegEx",
"trimVersionString": "Versionszeichenfolge mit RegEx kürzen",
"matchGroupToUseForX": "Zu verwendende Abgleichsgruppe für\n„{}“",
"matchGroupToUse": "Zu verwendende Gruppe abgleichen",
"highlightTouchTargets": "Weniger offensichtliche Touch-Ziele hervorheben",
"pickExportDir": "Export-Verzeichnis wählen",
"autoExportOnChanges": "Automatischer Export bei Änderung(en)",
"includeSettings": "Einstellungen einbeziehen",
"filterVersionsByRegEx": "Versionen nach regulären Ausdrücken filtern",
"trySelectingSuggestedVersionCode": "Versuchen, den vorgeschlagenen APK-Versionscode auszuwählen",
"dontSortReleasesList": "Releases-Sortierung der API beibehalten",
"reverseSort": "Umgekehrtes Sortieren",
"takeFirstLink": "Ersten Link verwenden",
"skipSort": "Sortieren überspringen",
"debugMenu": "Debug-Menü",
"bgTaskStarted": "Hintergrundaufgabe gestartet Logs prüfen.",
"runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen",
"versionExtractWholePage": "Versionsextraktion per RegEx auf die gesamte Seite anwenden",
"installing": "Installieren",
"skipUpdateNotifications": "Update-Benachrichtigungen überspringen",
"updatesAvailableNotifChannel": "Aktualisierungen verfügbar",
"appsUpdatedNotifChannel": "Apps aktualisiert",
"appsPossiblyUpdatedNotifChannel": "App-Aktualisierungen wurden versucht",
"errorCheckingUpdatesNotifChannel": "Fehler beim Prüfen auf Aktualisierungen",
"appsRemovedNotifChannel": "Apps entfernt",
"downloadingXNotifChannel": "{} herunterladen",
"completeAppInstallationNotifChannel": "App-Installation abschließen",
"checkingForUpdatesNotifChannel": "Nach Aktualisierungen suchen",
"onlyCheckInstalledOrTrackOnlyApps": "Nur installierte und mit „Nur nachverfolgen“ markierte Apps auf Aktualisierungen prüfen",
"supportFixedAPKURL": "Unterstützung von festen APK-URLs",
"selectX": "{} wählen",
"parallelDownloads": "Parallele Downloads erlauben",
"useShizuku": "Shizuku oder Sui zur Installation verwenden",
"shizukuBinderNotFound": "Kompatibler Shizuku-Dienst wurde nicht gefunden",
"shizukuOld": "Veraltete Shizuku-Version (< 11) - bitte aktualisiere sie",
"shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB - aktualisiere die Android-Version oder verwende stattdessen Sui",
"shizukuPretendToBeGooglePlay": "(Mittels Shizuku) Google Play als Installationsquelle registrieren",
"useSystemFont": "Systemschriftart verwenden",
"useVersionCodeAsOSVersion": "Versionscode (versionCode) als erkannte Version vom Betriebssystem verwenden",
"requestHeader": "Kopfzeile („Header“) anfordern",
"useLatestAssetDateAsReleaseDate": "Letzten Asset-Upload als Veröffentlichungsdatum verwenden",
"defaultPseudoVersioningMethod": "Standardmäßiges Verfahren zur Pseudo-Versionierung",
"partialAPKHash": "Partieller APK-Hash",
"APKLinkHash": "APK-Link-Hash",
"directAPKLink": "Direkter APK-Link",
"pseudoVersionInUse": "Es werden Pseudoversionen verwendet",
"installed": "Installiert",
"latest": "Neueste Version",
"invertRegEx": "Regulären Ausdruck invertieren",
"note": "Hinweis",
"selfHostedNote": "Das „{}“-Drop-down-Menü kann verwendet werden, um selbst gehostete/angepasste Instanzen einer beliebigen Quelle zu erreichen.",
"badDownload": "Die APK konnte nicht gelesen werden (inkompatibler oder unfertiger Download)",
"beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)",
"appVerifierInstructionToast": "Teile die Daten mit AppVerifier und kehre im Anschluss hierher zurück.",
"wiki": "Hilfe/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App-Konfigurationen (Verwendung auf eigene Gefahr)",
"crowdsourcedConfigsShort": "Crowdsourced App-Konfigurationen",
"allowInsecure": "Unsichere HTTP-Anfragen zulassen",
"stayOneVersionBehind": "Eine Version hinter der neuesten Version bleiben",
"refreshBeforeDownload": "App-Details vor dem Download aktualisieren",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": { "removeAppQuestion": {
"one": "App entfernen?", "one": "App entfernen?",
"other": "Apps entfernen?" "other": "Apps entfernen?"
}, },
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {
"one": "Zu viele Anfragen (Rate begrenzt) - versuchen Sie es in {} Minute erneut", "one": "Zu viele Anfragen (Rate begrenzt) versuche es in {} Minute erneut",
"other": "Zu viele Anfragen (Rate begrenzt) - versuchen Sie es in {} Minuten erneut" "other": "Zu viele Anfragen (Rate begrenzt) versuche es in {} Minuten erneut"
}, },
"bgUpdateGotErrorRetryInMinutes": { "bgUpdateGotErrorRetryInMinutes": {
"one": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minute geplant", "one": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minute geplant",
"other": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minuten geplant" "other": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minuten geplant"
}, },
"bgCheckFoundUpdatesWillNotifyIfNeeded": { "bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Hintergrundaktualisierungsprüfung fand {} Aktualisierung - benachrichtigt den Benutzer, falls erforderlich", "one": "Die Aktualisierungsprüfung fand {} Aktualisierung benachrichtigt, falls erforderlich",
"other": "Hintergrundaktualisierungsprüfung fand {} Aktualisierungen - benachrichtigt den Benutzer, falls erforderlich" "other": "Die Aktualisierungsprüfung fand {} Aktualisierungen benachrichtigt, falls erforderlich"
}, },
"apps": { "apps": {
"one": "{} App", "one": "{} App",
@ -284,15 +356,27 @@
"other": "{} Tage" "other": "{} Tage"
}, },
"clearedNLogsBeforeXAfterY": { "clearedNLogsBeforeXAfterY": {
"one": "{n} Protokoll gelöscht (vorher = {vorher}, nachher = {nachher})", "one": "{n} Log gelöscht (vorher = {before}, nachher = {after})",
"other": "{n} Protokolle gelöscht (vorher = {vorher}, nachher = {nachher})" "other": "{n} Logs gelöscht (vorher = {before}, nachher = {after})"
}, },
"xAndNMoreUpdatesAvailable": { "xAndNMoreUpdatesAvailable": {
"one": "{} und 1 weitere App haben Aktualisierungen.", "one": "{} und 1 weitere App können aktualisiert werden.",
"other": "{} und {} weitere Apps haben Aktualisierungen." "other": "{} und {} weitere Apps können aktualisiert werden."
}, },
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "{} und 1 weitere Anwendung wurden aktualisiert.", "one": "{} und 1 weitere App wurden aktualisiert.",
"other": "{} und {} weitere Anwendungen wurden aktualisiert." "other": "{} und {} weitere Apps wurden aktualisiert."
},
"xAndNMoreUpdatesFailed": {
"one": "Die Aktualisierung von {} und 1 weiteren App ist fehlgeschlagen.",
"other": "Die Aktualisierung von {} und {} weiteren Apps ist fehlgeschlagen."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} und 1 weitere App wurden möglicherweise aktualisiert.",
"other": "{} und {} weitere Apps wurden möglicherweise aktualisiert."
},
"apk": {
"one": "{} APK",
"other": "{} APKs"
} }
} }

View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "Nevalida apo-URL {}",
"noReleaseFound": "Ne eblas trovi taŭgan eldonon",
"noVersionFound": "Ne eblas determini la eldonversion",
"urlMatchesNoSource": "La URL ne konformas al konata fonto",
"cantInstallOlderVersion": "Ne eblas instali malnovan version de la Apo",
"appIdMismatch": "La identigilo de la elŝutita pakaĵo ne konformas al la identigilo de la ekzistanta apo",
"functionNotImplemented": "Tiu klaso ne fasonadas tiun funkcion",
"placeholder": "Rezervilo",
"someErrors": "Eraroj okazis",
"unexpectedError": "Neatendita eraro",
"ok": "Okej",
"and": "kaj",
"githubPATLabel": "Github persona atingoĵetono (pliigas la kvantolimon)",
"includePrereleases": "Inkluzivi la pra-eldonojn",
"fallbackToOlderReleases": "Reveno al malnovaj versioj",
"filterReleaseTitlesByRegEx": "Filtri la eldontitoljn per regula esprimo",
"invalidRegEx": "Nevalida regula esprimo",
"noDescription": "Neniu priskribo",
"cancel": "Nuligi",
"continue": "Daŭrigi",
"requiredInBrackets": "(Neprigata)",
"dropdownNoOptsError": "ERARO: LA MALVOLVANTA LISTO DEVAS HAVI ALMENAŬ UNU OPCION",
"colour": "Koloro",
"standard": "Norma",
"custom": "Agordita",
"useMaterialYou": "Uzi Material You",
"githubStarredRepos": "Stelaj GitHub-deponejoj",
"uname": "Uzantnomo",
"wrongArgNum": "Malĝusta nombro da provizitaj argumentoj",
"xIsTrackOnly": "{} estas nur sekvitaj",
"source": "Fonto",
"app": "Apo",
"appsFromSourceAreTrackOnly": "Apoj el tiu fonto estas 'Nur sekvitaj'.",
"youPickedTrackOnly": "Vi selektis la opcion 'Nur sekvitaj'.",
"trackOnlyAppDescription": "La apo estas sekvota por ĝisdatigoj, sed Obtainium ne povos elŝuti aŭ instali ĝin.",
"cancelled": "Nuligita",
"appAlreadyAdded": "Jam aldonita apo",
"alreadyUpToDateQuestion": "Ĉu la apo estas ĝisdata?",
"addApp": "Aldoni apon",
"appSourceURL": "URL de la apofonto",
"error": "Eraro",
"add": "Aldoni",
"searchSomeSourcesLabel": "Serĉi (nur kelkaj fontoj)",
"search": "Serĉi",
"additionalOptsFor": "Kromaj opcioj por {}",
"supportedSources": "Taskiĝata fontoj",
"trackOnlyInBrackets": "(Nur sekvita)",
"searchableInBrackets": "(Serĉebla)",
"appsString": "Apoj",
"noApps": "Neniu apo",
"noAppsForFilter": "Neniu apo por filtri",
"byX": "Laŭ {}",
"percentProgress": "Progreso: {}%",
"pleaseWait": "Bonvolu atendi",
"updateAvailable": "Havebla ĝisdatigo",
"notInstalled": "Neinstalita",
"pseudoVersion": "Pseŭdoversio",
"selectAll": "Selekti ĉion",
"deselectX": "Malselekti {}",
"xWillBeRemovedButRemainInstalled": "{} estas farigota de Obtainium sed restos instalata en la disponaĵo.",
"removeSelectedAppsQuestion": "Farigi la selektitajn apojn?",
"removeSelectedApps": "Farigi la selektitajn apojn",
"updateX": "Ĝisdatigi {}",
"installX": "Instali {}",
"markXTrackOnlyAsUpdated": "Marki {}\n(Nur sekvita)\nkiel ĝisdata",
"changeX": "Ŝanĝi {}",
"installUpdateApps": "Instali/ĝisdatigi apojn",
"installUpdateSelectedApps": "Instali/ĝisdatigi la selektitajn apojn",
"markXSelectedAppsAsUpdated": "Marki la {} selektitajn apojn kiel ĝisdataj?",
"no": "Ne",
"yes": "Jes",
"markSelectedAppsUpdated": "Marki la selektitajn apojn kiel ĝisdataj",
"pinToTop": "Alpingli supre",
"unpinFromTop": "Malalpingli el supro",
"resetInstallStatusForSelectedAppsQuestion": "Rekomenci la instaladostaton de la selektitaj apoj?",
"installStatusOfXWillBeResetExplanation": "Instaladostato de ĉiuj selektitaj apoj estas rekomencota.\n\nTio povas utili kiam la versio de la montrata application en Obtainium estas malĝusta kaŭze de malsukcesaj ĝidatigoj aŭ aliaj problemoj.",
"customLinkMessage": "Tiuj ligiloj funkcias en disponaĵoj kun Obtainium instalita",
"shareAppConfigLinks": "Diskonigi la apo-agordojn kiel HTML ligilo",
"shareSelectedAppURLs": "Diskonigi la selektitajn apo-URLjn",
"resetInstallStatus": "Rekomenci la instaladostaton de la apoj",
"more": "Pli",
"removeOutdatedFilter": "Forigi la filtron de malmodernaj apoj",
"showOutdatedOnly": "Nur montri malmodernajn apojn",
"filter": "Filtro",
"filterApps": "Filtri la apojn",
"appName": "Aponomo",
"author": "Aŭtoro",
"upToDateApps": "Ĝisdataj apoj",
"nonInstalledApps": "Neinstalita apoj",
"importExport": "Importi/Eksporti",
"settings": "Agordoj",
"exportedTo": "Eksportita en {}",
"obtainiumExport": "Eksporti Obtainium-n",
"invalidInput": "Nevalida enigo",
"importedX": "Importita {}",
"obtainiumImport": "Importi Obtainium-n",
"importFromURLList": "Eksporti el URL-listo",
"searchQuery": "Informmendo de serĉo",
"appURLList": "Listo de URLj de la apo",
"line": "Horizontalo",
"searchX": "Serĉi {}",
"noResults": "Neniu rezulto",
"importX": "Importi {}",
"importedAppsIdDisclaimer": "La importitaj apoj povas montriĝi malĝuste kiel \"Neinstalitaj\".\nPor solvi tion, reinstalu ilin per Obtainium.\nTiu ne afekcios la apodatumoj.\n\nAkefcias nur la URL-ajn lak triajn importmetodojn.",
"importErrors": "Eraroj de importado",
"importedXOfYApps": "{} apoj el {} importitaj.",
"followingURLsHadErrors": "La sekvantaj URLj havis erarojn:",
"selectURL": "Selekti URLn",
"selectURLs": "Selekti URLjn",
"pick": "Elekti",
"theme": "Temo",
"dark": "Malhela",
"light": "Hela",
"followSystem": "Konformi al sistemo",
"followSystemThemeExplanation": "Konformi al sistemtemo nur eblas kun triaj aplikaĵoj.",
"useBlackTheme": "Uzi puran nigran temon",
"appSortBy": "Klasi apojn laŭ",
"authorName": "Aŭtoro/Nomo",
"nameAuthor": "Nomo/Aŭtoro",
"asAdded": "Aldondato",
"appSortOrder": "Ordo de la apoklasifiko",
"ascending": "Kreskanta",
"descending": "Malkreskanta",
"bgUpdateCheckInterval": "Serĉo-intertempo de fonaj ĝisdatigoj",
"neverManualOnly": "Neniam - Nur Malaŭtomata",
"appearance": "Aspekto",
"showWebInAppView": "Montri la fonta retpaĝo en la langeto 'Apoj'",
"pinUpdates": "Alpingli ĝisatigojn en la supro de la langeto 'Apoj'",
"updates": "Ĝisdatigoj",
"sourceSpecific": "Fontspecifa",
"appSource": "Apofonto",
"noLogs": "Neniu protokolo",
"appLogs": "Apoprotokoloj",
"close": "Fermi",
"share": "Diskonigi",
"appNotFound": "Netrovebla apo",
"obtainiumExportHyphenatedLowercase": "eksporto-obtainium",
"pickAnAPK": "Selektu APKn",
"appHasMoreThanOnePackage": "{} havas pli ol unu pakaĵon:",
"deviceSupportsXArch": "Via disponaĵo taskiĝas la CPU-arkitekturon {}.",
"deviceSupportsFollowingArchs": "Via disponaĵo taskiĝas la sekvantajn CPU-arkitekturojn:",
"warning": "Avertu",
"sourceIsXButPackageFromYPrompt": "La apofonto estas '{}' sed la pakaĵo de ĝisdatigo devenas de '{}'. Daŭrigi?",
"updatesAvailable": "Haveblaj ĝisdatigoj",
"updatesAvailableNotifDescription": "Sciigas al la uzanto, ke ĝisdatigoj haveblas por unu aŭ pluraj apoj sekvitaj fare de Obtainium.",
"noNewUpdates": "Neniu nova ĝisdatigo.",
"xHasAnUpdate": "{} havas ĝisdatigon.",
"appsUpdated": "Ĝisdataj apoj",
"appsNotUpdated": "Malsukcesis ĝisdatigi aplikaĵojn",
"appsUpdatedNotifDescription": "Sciigas al la uzanto, ke ĝisdatigoj de unu aŭ pluraj apoj estas instalitaj fone.",
"xWasUpdatedToY": "{} estas ĝidatigita en {}.",
"xWasNotUpdatedToY": "Malsukcesas ĝisdatigi de {} en {}.",
"errorCheckingUpdates": "Eraro serĉante ĝisdatigojn",
"errorCheckingUpdatesNotifDescription": "Sciigas al la uzanto, kiam la serĉo de fonaj ĝisdatigoj malsukcesas.",
"appsRemoved": "Forigitaj Apoj",
"appsRemovedNotifDescription": "Sciigas al la uzanto, ke unu aŭ pluraj apoj estas forigitaj kaŭze de eraroj dum ilia ŝarĝado.",
"xWasRemovedDueToErrorY": "{} estas forigita kaŭze de tiu eraro: {}",
"completeAppInstallation": "Kompleta instalado de la apo",
"obtainiumMustBeOpenToInstallApps": "Obtainium devas esti malfermita por instali apojn",
"completeAppInstallationNotifDescription": "Petas la uzanton reiri en Obtainium por fini la instaladon de apo",
"checkingForUpdates": "Serĉante ĝisdatigojn",
"checkingForUpdatesNotifDescription": "Dumtempa sciigo kiu aperas dum la serĉo de ĝisdatigoj",
"pleaseAllowInstallPerm": "Bonvolu permesi al Obtainium instali apojn",
"trackOnly": "Nur sekvita",
"errorWithHttpStatusCode": "Eraro {}",
"versionCorrectionDisabled": "Versiokorekto malaktivigita (ŝajnas, ke la kromaĵo ne funkcias)",
"unknown": "Nekonata",
"none": "Nenio",
"never": "Neniam",
"latestVersionX": "Lasta versio: {}",
"installedVersionX": "Instalita versio: {}",
"lastUpdateCheckX": "Lasta serĉo de ĝisdatigoj: {}",
"remove": "Forigi",
"yesMarkUpdated": "Jes, marki kiel ĝisdata",
"fdroid": "Oficiala F-Droid",
"appIdOrName": "Identigilo aŭ nomo de la apo",
"appId": "Identigilo de la apo",
"appWithIdOrNameNotFound": "Neniu apo estas trovita kun tiu identigilo aŭ nomo",
"reposHaveMultipleApps": "Deponejoj povas enhavi plurajn apojn",
"fdroidThirdPartyRepo": "Tria deponejo de F-Droid",
"install": "Instali",
"markInstalled": "Marki kiel instalita",
"update": "Ĝisdatigi",
"markUpdated": "Marki kiel ĝisdata",
"additionalOptions": "Kromaj opcioj",
"disableVersionDetection": "Malaktivigi la versiodetekto",
"noVersionDetectionExplanation": "Tiu opcio devas esti uzata nur por apoj, kie la versiodetekto ne funkcias ĝuste.",
"downloadingX": "Elŝutante {}",
"downloadX": "Elŝuti {}",
"downloadedX": "Elŝutita {}",
"releaseAsset": "Aktiva versio",
"downloadNotifDescription": "Sciigas al la uzanto pri la progreso de apo-elŝuton",
"noAPKFound": "Neniu trovita APK",
"noVersionDetection": "Neniu versiodetekto",
"categorize": "Kategorii",
"categories": "Kategorioj",
"category": "Kategorio",
"noCategory": "Neniu kategorio",
"noCategories": "Neniuj kategorioj",
"deleteCategoriesQuestion": "Forigi la kategoriojn?",
"categoryDeleteWarning": "Ĉiuj apoj el forigitaj kategorioj iĝos nekategoriitaj.",
"addCategory": "Aldoni kategorion",
"label": "Etikedo",
"language": "Lingvo",
"copiedToClipboard": "Kopiita en la tondujo",
"storagePermissionDenied": "Permeso de stoko malkonsentita",
"selectedCategorizeWarning": "Tio substituos ĉiujn difinitajn kategoriojn de la selektitaj apoj.",
"filterAPKsByRegEx": "Filtri APKj per regula esprimo",
"removeFromObtainium": "Forigi el Obtainium",
"uninstallFromDevice": "Malinstali el la disponaĵo",
"onlyWorksWithNonVersionDetectApps": "Funkcias nur por apoj kun malaktiva versiodetekto.",
"releaseDateAsVersion": "Uzi eldondato kiel versioĉeno",
"releaseTitleAsVersion": "Use release title as version string",
"releaseDateAsVersionExplanation": "Tiu opcio devas esti uzata nur por apoj, por kiu la versiodetekto ne funkcias ĝuste, sed eldondato estas havebla.",
"changes": "Modifoj",
"releaseDate": "Eldondato",
"importFromURLsInFile": "Importi el URLj en dosiero (kiel OPML)",
"versionDetectionExplanation": "Akordigi la versioĉeno laŭ la versio detektita fare de la operaciumo",
"versionDetection": "Versiodetekto",
"standardVersionDetection": "Norma versiodetekto",
"groupByCategory": "Grupigi per kategorio",
"autoApkFilterByArch": "Provi filtri APKj per CPU-arkitekturo se ebla",
"overrideSource": "Substitui la fonton",
"dontShowAgain": "Ne plu montri",
"dontShowTrackOnlyWarnings": "Ne plu montri 'Nur sekvita' avertojn",
"dontShowAPKOriginWarnings": "Ne plu montri avertojn pri APK-origino",
"moveNonInstalledAppsToBottom": "Movi neinstalatajn apojn al malsupro de la langeto Apoj",
"gitlabPATLabel": "GitLab persona atingoĵetono",
"about": "Pri",
"requiresCredentialsInSettings": "{} bezonas kromajn informojn (en Agordoj)",
"checkOnStart": "Serĉi ĝisdatigojn starte",
"tryInferAppIdFromCode": "Provi dedukti la identigilon de la apo el la fontkodo",
"removeOnExternalUninstall": "Aŭtomate forigi ekstere malinstalitajn apojn",
"pickHighestVersionCode": "Aŭtomate selekti la plej ĵusan version el APK-kodo",
"checkUpdateOnDetailPage": "Serĉi ĝisdatigojn dum la malfermo de la detala apopaĝo",
"disablePageTransitions": "Malaktivigi la animaciojn de paĝotransiro",
"reversePageTransitions": "Inversigi la animaciojn de paĝotransiro",
"minStarCount": "Minimuma nombro da steloj",
"addInfoBelow": "Aldonu ĉi tiu informo ĉi-suba.",
"addInfoInSettings": "Aldonu tiu informo en la agordoj.",
"githubSourceNote": "La kvantolimo de GitHub povas esti evitata danke al API-ŝlosilo.",
"sortByLastLinkSegment": "Klasi laŭ la lasta segmento de la ligilo",
"filterReleaseNotesByRegEx": "Filtri versionotojn per regula esprimo",
"customLinkFilterRegex": "Filtro de APK-ligilo agordita per regula esprimo (defaŭlte '.apk$')",
"appsPossiblyUpdated": "Provitaj apoĝisdatigoj",
"appsPossiblyUpdatedNotifDescription": "Sciigas al la uzanto, ke ĝisdatigoj de unu aŭ pluraj apoj eble estas aplikitaj fone",
"xWasPossiblyUpdatedToY": "{} povas esti ĝisdata kiel {}.",
"enableBackgroundUpdates": "Aktivigi fonajn ĝisdatigojn",
"backgroundUpdateReqsExplanation": "Fonaj ĝisdatigoj ne eblas por ĉiuj apoj.",
"backgroundUpdateLimitsExplanation": "La sukceso de fona instalado povas esti nur determinata dum la malfermo de Obtainium.",
"verifyLatestTag": "Inspekti la etikedon 'latest'",
"intermediateLinkRegex": "Filtri por 'pera' vizitota ligilo",
"filterByLinkText": "Filtri ligilojn laŭ ligiloteksto",
"intermediateLinkNotFound": "Netrovebla pera ligilo",
"intermediateLink": "Pera ligilo",
"exemptFromBackgroundUpdates": "Escepti el la fonaj ĝisdatigoj (se aktiva)",
"bgUpdatesOnWiFiOnly": "Malaktivigi fonajn ĝisdatigojn se sen vifio",
"bgUpdatesWhileChargingOnly": "Disable background updates when not charging",
"autoSelectHighestVersionCode": "Aŭtomate selekti la plej ĵusan version de la APK-kodo",
"versionExtractionRegEx": "Ekstrakti la versioĉenon per regula esprimo",
"trimVersionString": "Mallongigi la versioĉenon per regula esprimo",
"matchGroupToUseForX": "Konformecogrupo uzota por \"{}\"",
"matchGroupToUse": "Grupo de konformeco uzota por la eltiraĵo de la versio per regula esprimo",
"highlightTouchTargets": "Emfazi malpi evidentajn klavojn",
"pickExportDir": "Selekti la dosierujon de eksporto",
"autoExportOnChanges": "Aŭtomate eksporti dum modifoj",
"includeSettings": "Inkluzivi la agordojn",
"filterVersionsByRegEx": "Filtri versiojn per regula esprimo",
"trySelectingSuggestedVersionCode": "Provi selekti la sugestitan version fare de la APK-kodo",
"dontSortReleasesList": "Konservi la ordo de la API-versio",
"reverseSort": "Inversigi klasifikon",
"takeFirstLink": "Uzi la unuan ligilon",
"skipSort": "Salti la klasifikon",
"debugMenu": "Menu de eraroserĉado",
"bgTaskStarted": "Fona tasko startita - inspektu la protokolojn.",
"runBgCheckNow": "Ruli la serĉo de fonaj ĝisdatigoj nun",
"versionExtractWholePage": "Apliki eltiraĵon de la versioĉeno per regula esprimo al la tuta paĝo",
"installing": "Instalante",
"skipUpdateNotifications": "Salti la sciigojn de ĝisdatigo",
"updatesAvailableNotifChannel": "Haveblaj ĝisdatigoj",
"appsUpdatedNotifChannel": "Ĝisdataj aplikaĵoj",
"appsPossiblyUpdatedNotifChannel": "Provitaj apoĝisdatigoj",
"errorCheckingUpdatesNotifChannel": "Eraro serĉante ĝisdatigojn",
"appsRemovedNotifChannel": "Forigitaj aplikaĵoj",
"downloadingXNotifChannel": "Elŝutante {}",
"completeAppInstallationNotifChannel": "Kompleta apo instalado",
"checkingForUpdatesNotifChannel": "Serĉante ĝisdatigojn",
"onlyCheckInstalledOrTrackOnlyApps": "Nur serĉi la ĝisdatigojn de instalitaj kaj 'nur sekvitaj' apoj",
"supportFixedAPKURL": "Taskiĝo de la fiksaj APK URLj",
"selectX": "Selekti {}",
"parallelDownloads": "Permesi dumajn elŝutojn",
"useShizuku": "Uzi Shizuku aŭ Sui por instali",
"shizukuBinderNotFound": "La servo Shizuku estas netrovebla",
"shizukuOld": "Malnova versio de Shizuku (<11) - bonvolu ĝisdatigi ĝin",
"shizukuOldAndroidWithADB": "Shizuku funkcias en Android < 8.1 kun ADB - bonvolu ĝisdatigi Android aŭ uzu Sui anstataŭe",
"shizukuPretendToBeGooglePlay": "Determini Google Play kiel instalfonto (se Shizuku estas uzata)",
"useSystemFont": "Uzi la sistema tiparo",
"useVersionCodeAsOSVersion": "Uzi versiokodo de la apo kiel versio detektita fare de la operaciumo",
"requestHeader": "Titolo de la informmendo",
"useLatestAssetDateAsReleaseDate": "Uzi la lastan publikigitan elementon kiel eldondato",
"defaultPseudoVersioningMethod": "Defaŭlta metodo de fikcia versio",
"partialAPKHash": "Parta APKa haketo",
"APKLinkHash": "Haketo de la APKa ligilo",
"directAPKLink": "Rekta APKa ligilo",
"pseudoVersionInUse": "Pseŭdoversio estas uzata",
"installed": "Instalita",
"latest": "Lasta versio",
"invertRegEx": "Inversigi la regula esprimo",
"note": "Noto",
"selfHostedNote": "La malvolvanta listo \"{}\" povas esti uzata por aliri al memgastigataj/agordata instancoj el ajna fonto.",
"badDownload": "La APK ne povis esti analizita (neakordigebla aŭ nekompleta elŝuto)",
"beforeNewInstallsShareToAppVerifier": "Diskonigi novajn aplikaĵojn kun AppVerifier (se havebla)",
"appVerifierInstructionToast": "Diskonigu kun AppVerifier, poste revenu ĉi tie kiam preta.",
"wiki": "Helpo/Vikio",
"crowdsourcedConfigsLabel": "Komunumaj apo-agordoj (uzu kun singardo)",
"crowdsourcedConfigsShort": "Crowdsourced App Configs",
"allowInsecure": "Allow insecure HTTP requests",
"stayOneVersionBehind": "Stay one version behind latest",
"refreshBeforeDownload": "Refresh app details before download",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "Forigi la aplikaĵon?",
"other": "Forigi la aplikaĵojn?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "Tro da informmendoj (limigita kvanto) - reprovu en {} minuto",
"other": "Tro da informmendoj (limigita kvanto) - reprovu en {} minutoj"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "La serĉo de fonaj ĝisdatigoj renkontis al {}, nova programota provo en {} minuto",
"other": "La serĉo de fonaj ĝisdatigoj renkontis al {}, nova programota provo en {} minutoj"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "La serĉo de fonaj ĝisdatigoj trovis {} ĝisdatigon - la uzanto estas sciigota se necesa",
"other": "La serĉo de fonaj ĝisdatigoj trovis {} ĝisdatigojn - la uzanto estas sciigota se necesa"
},
"apps": {
"one": "{} Apo",
"other": "{} Apoj"
},
"url": {
"one": "{} URL",
"other": "{} URLj"
},
"minute": {
"one": "{} Minuto",
"other": "{} Minutoj"
},
"hour": {
"one": "{} Horo",
"other": "{} Horoj"
},
"day": {
"one": "{} Tago",
"other": "{} Tagoj"
},
"clearedNLogsBeforeXAfterY": {
"one": "Purigis {n} protokolon (antaŭe = {before}, malantaŭe = {after})",
"other": "Purigis {n} protokolojn (antaŭe = {before}, malantaŭe = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} kaj 1 alia apo havas ĝisdatigojn.",
"other": "{} kaj {} aliaj apoj havas ĝisdatigojn."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} kaj 1 alia apo ĝisdatiĝis.",
"other": "{} kaj {} aliaj apoj ĝisdatiĝis."
},
"xAndNMoreUpdatesFailed": {
"one": "Ne eblas ĝisdatigi {} kaj 1 alian apon.",
"other": "Ne eblas ĝisdatigi {} et {} aliajn apojn."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} kaj 1 alia apo eble ĝisdatiĝis.",
"other": "{} kaj {} aliaj apoj eble ĝisdatiĝis."
},
"apk": {
"one": "{} APK",
"other": "{} APKj"
}
}

View File

@ -11,15 +11,7 @@
"unexpectedError": "Unexpected Error", "unexpectedError": "Unexpected Error",
"ok": "Okay", "ok": "Okay",
"and": "and", "and": "and",
"startedBgUpdateTask": "Started BG update check task",
"bgUpdateIgnoreAfterIs": "Bg update ignoreAfter is {}",
"startedActualBGUpdateCheck": "Started actual BG update checking",
"bgUpdateTaskFinished": "Finished BG update check task",
"firstRun": "This is the first ever run of Obtainium",
"settingUpdateCheckIntervalTo": "Setting update interval to {}",
"githubPATLabel": "GitHub Personal Access Token (Increases Rate Limit)", "githubPATLabel": "GitHub Personal Access Token (Increases Rate Limit)",
"githubPATHint": "PAT must be in this format: username:token",
"githubPATFormat": "username:token",
"includePrereleases": "Include prereleases", "includePrereleases": "Include prereleases",
"fallbackToOlderReleases": "Fallback to older releases", "fallbackToOlderReleases": "Fallback to older releases",
"filterReleaseTitlesByRegEx": "Filter Release Titles by Regular Expression", "filterReleaseTitlesByRegEx": "Filter Release Titles by Regular Expression",
@ -30,6 +22,9 @@
"requiredInBrackets": "(Required)", "requiredInBrackets": "(Required)",
"dropdownNoOptsError": "ERROR: DROPDOWN MUST HAVE AT LEAST ONE OPT", "dropdownNoOptsError": "ERROR: DROPDOWN MUST HAVE AT LEAST ONE OPT",
"colour": "Colour", "colour": "Colour",
"standard": "Standard",
"custom": "Custom",
"useMaterialYou": "Use Material You",
"githubStarredRepos": "GitHub Starred Repos", "githubStarredRepos": "GitHub Starred Repos",
"uname": "Username", "uname": "Username",
"wrongArgNum": "Wrong number of arguments provided", "wrongArgNum": "Wrong number of arguments provided",
@ -49,7 +44,7 @@
"searchSomeSourcesLabel": "Search (Some Sources Only)", "searchSomeSourcesLabel": "Search (Some Sources Only)",
"search": "Search", "search": "Search",
"additionalOptsFor": "Additional Options for {}", "additionalOptsFor": "Additional Options for {}",
"supportedSourcesBelow": "Supported Sources:", "supportedSources": "Supported Sources",
"trackOnlyInBrackets": "(Track-Only)", "trackOnlyInBrackets": "(Track-Only)",
"searchableInBrackets": "(Searchable)", "searchableInBrackets": "(Searchable)",
"appsString": "Apps", "appsString": "Apps",
@ -59,11 +54,10 @@
"percentProgress": "Progress: {}%", "percentProgress": "Progress: {}%",
"pleaseWait": "Please Wait", "pleaseWait": "Please Wait",
"updateAvailable": "Update Available", "updateAvailable": "Update Available",
"estimateInBracketsShort": "(Est.)",
"notInstalled": "Not Installed", "notInstalled": "Not Installed",
"estimateInBrackets": "(Estimate)", "pseudoVersion": "pseudo-version",
"selectAll": "Select All", "selectAll": "Select All",
"deselectN": "Deselect {}", "deselectX": "Deselect {}",
"xWillBeRemovedButRemainInstalled": "{} will be removed from Obtainium but remain installed on device.", "xWillBeRemovedButRemainInstalled": "{} will be removed from Obtainium but remain installed on device.",
"removeSelectedAppsQuestion": "Remove Selected Apps?", "removeSelectedAppsQuestion": "Remove Selected Apps?",
"removeSelectedApps": "Remove Selected Apps", "removeSelectedApps": "Remove Selected Apps",
@ -81,13 +75,14 @@
"unpinFromTop": "Unpin from top", "unpinFromTop": "Unpin from top",
"resetInstallStatusForSelectedAppsQuestion": "Reset Install Status for Selected Apps?", "resetInstallStatusForSelectedAppsQuestion": "Reset Install Status for Selected Apps?",
"installStatusOfXWillBeResetExplanation": "The install status of any selected Apps will be reset.\n\nThis can help when the App version shown in Obtainium is incorrect due to failed updates or other issues.", "installStatusOfXWillBeResetExplanation": "The install status of any selected Apps will be reset.\n\nThis can help when the App version shown in Obtainium is incorrect due to failed updates or other issues.",
"customLinkMessage": "These links work on devices with Obtainium installed",
"shareAppConfigLinks": "Share app configuration as HTML link",
"shareSelectedAppURLs": "Share Selected App URLs", "shareSelectedAppURLs": "Share Selected App URLs",
"resetInstallStatus": "Reset Install Status", "resetInstallStatus": "Reset Install Status",
"more": "More", "more": "More",
"removeOutdatedFilter": "Remove Out-of-Date App Filter", "removeOutdatedFilter": "Remove Out-of-Date App Filter",
"showOutdatedOnly": "Show Out-of-Date Apps Only", "showOutdatedOnly": "Show Out-of-Date Apps Only",
"filter": "Filter", "filter": "Filter",
"filterActive": "Filter *",
"filterApps": "Filter Apps", "filterApps": "Filter Apps",
"appName": "App Name", "appName": "App Name",
"author": "Author", "author": "Author",
@ -111,7 +106,6 @@
"importErrors": "Import Errors", "importErrors": "Import Errors",
"importedXOfYApps": "{} of {} Apps imported.", "importedXOfYApps": "{} of {} Apps imported.",
"followingURLsHadErrors": "The following URLs had errors:", "followingURLsHadErrors": "The following URLs had errors:",
"okay": "Okay",
"selectURL": "Select URL", "selectURL": "Select URL",
"selectURLs": "Select URLs", "selectURLs": "Select URLs",
"pick": "Pick", "pick": "Pick",
@ -119,8 +113,7 @@
"dark": "Dark", "dark": "Dark",
"light": "Light", "light": "Light",
"followSystem": "Follow System", "followSystem": "Follow System",
"obtainium": "Obtainium", "followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
"materialYou": "Material You",
"useBlackTheme": "Use pure black dark theme", "useBlackTheme": "Use pure black dark theme",
"appSortBy": "App Sort By", "appSortBy": "App Sort By",
"authorName": "Author/Name", "authorName": "Author/Name",
@ -154,8 +147,10 @@
"noNewUpdates": "No new updates.", "noNewUpdates": "No new updates.",
"xHasAnUpdate": "{} has an update.", "xHasAnUpdate": "{} has an update.",
"appsUpdated": "Apps Updated", "appsUpdated": "Apps Updated",
"appsNotUpdated": "Failed to update applications",
"appsUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were applied in the background", "appsUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were applied in the background",
"xWasUpdatedToY": "{} was updated to {}.", "xWasUpdatedToY": "{} was updated to {}.",
"xWasNotUpdatedToY": "Failed to update {} to {}.",
"errorCheckingUpdates": "Error Checking for Updates", "errorCheckingUpdates": "Error Checking for Updates",
"errorCheckingUpdatesNotifDescription": "A notification that shows when background update checking fails", "errorCheckingUpdatesNotifDescription": "A notification that shows when background update checking fails",
"appsRemoved": "Apps Removed", "appsRemoved": "Apps Removed",
@ -173,8 +168,8 @@
"unknown": "Unknown", "unknown": "Unknown",
"none": "None", "none": "None",
"never": "Never", "never": "Never",
"latestVersionX": "Latest Version: {}", "latestVersionX": "Latest: {}",
"installedVersionX": "Installed Version: {}", "installedVersionX": "Installed: {}",
"lastUpdateCheckX": "Last Update Check: {}", "lastUpdateCheckX": "Last Update Check: {}",
"remove": "Remove", "remove": "Remove",
"yesMarkUpdated": "Yes, Mark as Updated", "yesMarkUpdated": "Yes, Mark as Updated",
@ -184,9 +179,6 @@
"appWithIdOrNameNotFound": "No App was found with that ID or Name", "appWithIdOrNameNotFound": "No App was found with that ID or Name",
"reposHaveMultipleApps": "Repos may contain multiple Apps", "reposHaveMultipleApps": "Repos may contain multiple Apps",
"fdroidThirdPartyRepo": "F-Droid Third-Party Repo", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo",
"steam": "Steam",
"steamMobile": "Steam Mobile",
"steamChat": "Steam Chat",
"install": "Install", "install": "Install",
"markInstalled": "Mark Installed", "markInstalled": "Mark Installed",
"update": "Update", "update": "Update",
@ -195,6 +187,9 @@
"disableVersionDetection": "Disable Version Detection", "disableVersionDetection": "Disable Version Detection",
"noVersionDetectionExplanation": "This option should only be used for Apps where version detection does not work correctly.", "noVersionDetectionExplanation": "This option should only be used for Apps where version detection does not work correctly.",
"downloadingX": "Downloading {}", "downloadingX": "Downloading {}",
"downloadX": "Download {}",
"downloadedX": "Downloaded {}",
"releaseAsset": "Release Asset",
"downloadNotifDescription": "Notifies the user of the progress in downloading an App", "downloadNotifDescription": "Notifies the user of the progress in downloading an App",
"noAPKFound": "No APK found", "noAPKFound": "No APK found",
"noVersionDetection": "No version detection", "noVersionDetection": "No version detection",
@ -215,11 +210,13 @@
"removeFromObtainium": "Remove from Obtainium", "removeFromObtainium": "Remove from Obtainium",
"uninstallFromDevice": "Uninstall from Device", "uninstallFromDevice": "Uninstall from Device",
"onlyWorksWithNonVersionDetectApps": "Only works for Apps with version detection disabled.", "onlyWorksWithNonVersionDetectApps": "Only works for Apps with version detection disabled.",
"releaseDateAsVersion": "Use Release Date as Version", "releaseDateAsVersion": "Use release date as version string",
"releaseTitleAsVersion": "Use release title as version string",
"releaseDateAsVersionExplanation": "This option should only be used for Apps where version detection does not work correctly, but a release date is available.", "releaseDateAsVersionExplanation": "This option should only be used for Apps where version detection does not work correctly, but a release date is available.",
"changes": "Changes", "changes": "Changes",
"releaseDate": "Release Date", "releaseDate": "Release Date",
"importFromURLsInFile": "Import from URLs in File (like OPML)", "importFromURLsInFile": "Import from URLs in File (like OPML)",
"versionDetectionExplanation": "Reconcile version string with version detected from OS",
"versionDetection": "Version Detection", "versionDetection": "Version Detection",
"standardVersionDetection": "Standard version detection", "standardVersionDetection": "Standard version detection",
"groupByCategory": "Group by Category", "groupByCategory": "Group by Category",
@ -229,9 +226,9 @@
"dontShowTrackOnlyWarnings": "Don't show 'Track-Only' warnings", "dontShowTrackOnlyWarnings": "Don't show 'Track-Only' warnings",
"dontShowAPKOriginWarnings": "Don't show APK origin warnings", "dontShowAPKOriginWarnings": "Don't show APK origin warnings",
"moveNonInstalledAppsToBottom": "Move non-installed Apps to bottom of Apps view", "moveNonInstalledAppsToBottom": "Move non-installed Apps to bottom of Apps view",
"gitlabPATLabel": "GitLab Personal Access Token\n(Enables Search and Better APK Discovery)", "gitlabPATLabel": "GitLab Personal Access Token",
"about": "About", "about": "About",
"requiresCredentialsInSettings": "This needs additional credentials (in Settings)", "requiresCredentialsInSettings": "{} needs additional credentials (in Settings)",
"checkOnStart": "Check for updates on startup", "checkOnStart": "Check for updates on startup",
"tryInferAppIdFromCode": "Try inferring App ID from source code", "tryInferAppIdFromCode": "Try inferring App ID from source code",
"removeOnExternalUninstall": "Automatically remove externally uninstalled Apps", "removeOnExternalUninstall": "Automatically remove externally uninstalled Apps",
@ -243,10 +240,85 @@
"addInfoBelow": "Add this info below.", "addInfoBelow": "Add this info below.",
"addInfoInSettings": "Add this info in the Settings.", "addInfoInSettings": "Add this info in the Settings.",
"githubSourceNote": "GitHub rate limiting can be avoided using an API key.", "githubSourceNote": "GitHub rate limiting can be avoided using an API key.",
"gitlabSourceNote": "GitLab APK extraction may not work without an API key.", "sortByLastLinkSegment": "Sort by only the last segment of the link",
"sortByFileNamesNotLinks": "Sort by file names instead of full links",
"filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')",
"appsPossiblyUpdated": "App Updates Attempted",
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
"enableBackgroundUpdates": "Enable background updates",
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
"verifyLatestTag": "Verify the 'latest' tag",
"intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit",
"filterByLinkText": "Filter links by link text",
"intermediateLinkNotFound": "Intermediate link not found",
"intermediateLink": "Intermediate link",
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
"bgUpdatesOnWiFiOnly": "Disable background updates when not on Wi-Fi",
"bgUpdatesWhileChargingOnly": "Disable background updates when not charging",
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
"versionExtractionRegEx": "Version String Extraction RegEx",
"trimVersionString": "Trim Version String With RegEx",
"matchGroupToUseForX": "Match Group to Use for \"{}\"",
"matchGroupToUse": "Match Group to Use for Version String Extraction RegEx",
"highlightTouchTargets": "Highlight less obvious touch targets",
"pickExportDir": "Pick Export Directory",
"autoExportOnChanges": "Auto-export on changes",
"includeSettings": "Include settings",
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
"dontSortReleasesList": "Retain release order from API",
"reverseSort": "Reverse sorting",
"takeFirstLink": "Take first link",
"skipSort": "Skip sorting",
"debugMenu": "Debug Menu",
"bgTaskStarted": "Background task started - check logs.",
"runBgCheckNow": "Run Background Update Check Now",
"versionExtractWholePage": "Apply version string extraction Regex to entire page",
"installing": "Installing",
"skipUpdateNotifications": "Skip update notifications",
"updatesAvailableNotifChannel": "Updates Available",
"appsUpdatedNotifChannel": "Apps Updated",
"appsPossiblyUpdatedNotifChannel": "App Updates Attempted",
"errorCheckingUpdatesNotifChannel": "Error Checking for Updates",
"appsRemovedNotifChannel": "Apps Removed",
"downloadingXNotifChannel": "Downloading {}",
"completeAppInstallationNotifChannel": "Complete App Installation",
"checkingForUpdatesNotifChannel": "Checking for Updates",
"onlyCheckInstalledOrTrackOnlyApps": "Only check installed and Track-Only apps for updates",
"supportFixedAPKURL": "Support fixed APK URLs",
"selectX": "Select {}",
"parallelDownloads": "Allow parallel downloads",
"useShizuku": "Use Shizuku or Sui to install",
"shizukuBinderNotFound": "Shizuku service not running",
"shizukuOld": "Old Shizuku version (<11) - update it",
"shizukuOldAndroidWithADB": "Shizuku running on Android < 8.1 with ADB - update Android or use Sui instead",
"shizukuPretendToBeGooglePlay": "Set Google Play as the installation source (if Shizuku is used)",
"useSystemFont": "Use the system font",
"useVersionCodeAsOSVersion": "Use app versionCode as OS-detected version",
"requestHeader": "Request header",
"useLatestAssetDateAsReleaseDate": "Use latest asset upload as release date",
"defaultPseudoVersioningMethod": "Default Pseudo-Versioning Method",
"partialAPKHash": "Partial APK Hash",
"APKLinkHash": "APK Link Hash",
"directAPKLink": "Direct APK Link",
"pseudoVersionInUse": "A Pseudo-Version is in Use",
"installed": "Installed",
"latest": "Latest",
"invertRegEx": "Invert regular expression",
"note": "Note",
"selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.",
"badDownload": "The APK could not be parsed (incompatible or partial download)",
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
"wiki": "Help/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
"crowdsourcedConfigsShort": "Crowdsourced App Configs",
"allowInsecure": "Allow insecure HTTP requests",
"stayOneVersionBehind": "Stay one version behind latest",
"refreshBeforeDownload": "Refresh app details before download",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Remove App?", "one": "Remove App?",
"other": "Remove Apps?" "other": "Remove Apps?"
@ -292,7 +364,19 @@
"other": "{} and {} more apps have updates." "other": "{} and {} more apps have updates."
}, },
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "{} and 1 more app were updated.", "one": "{} and 1 more app was updated.",
"other": "{} and {} more apps were updated." "other": "{} and {} more apps were updated."
},
"xAndNMoreUpdatesFailed": {
"one": "Failed to update {} and 1 more app.",
"other": "Failed to update {} and {} more apps."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} and 1 more app may have been updated.",
"other": "{} and {} more apps may have been updated."
},
"apk": {
"one": "{} APK",
"other": "{} APKs"
} }
} }

View File

@ -1,267 +1,339 @@
{ {
"invalidURLForSource": "URL de la aplicación {} no válida", "invalidURLForSource": "El URL de la aplicación {} no es válido",
"noReleaseFound": "No se ha podido encontrar una versión válida", "noReleaseFound": "No se ha encontrado una versión válida",
"noVersionFound": "No se ha podido determinar la versión de la publicación", "noVersionFound": "No se ha podido determinar la versión",
"urlMatchesNoSource": "La URL no coincide con ninguna fuente conocida", "urlMatchesNoSource": "El URL no coincide con ninguna fuente conocida",
"cantInstallOlderVersion": "No se puede instalar una versión previa de la aplicación", "cantInstallOlderVersion": "No se puede instalar una versión previa de la aplicación",
"appIdMismatch": "La ID del paquete descargado no coincide con la ID de la aplicación instalada", "appIdMismatch": "El ID del paquete descargado no coincide con el ID de la aplicación instalada",
"functionNotImplemented": "Esta clase no ha implementado esta función", "functionNotImplemented": "Esta clase no ha implementado esta función",
"placeholder": "Espacio reservado", "placeholder": "Espacio reservado",
"someErrors": "Han ocurrido algunos errores", "someErrors": "Han ocurrido algunos errores",
"unexpectedError": "Error Inesperado", "unexpectedError": "Error inesperado",
"ok": "Correcto", "ok": "Aceptar",
"and": "y", "and": "y",
"startedBgUpdateTask": "Empezada la tarea de comprobación de actualizaciones en segundo plano", "githubPATLabel": "Token de acceso personal a GitHub\n(reduce tiempos de espera)",
"bgUpdateIgnoreAfterIs": "El parámetro ignoreAfter de la actualización en segundo plano es {}",
"startedActualBGUpdateCheck": "Ha comenzado la comprobación de actualizaciones en segundo plano",
"bgUpdateTaskFinished": "Ha finalizado la comprobación de actualizaciones en segundo plano",
"firstRun": "Esta es la primera ejecución de Obtainium",
"settingUpdateCheckIntervalTo": "Cambiando intervalo de actualización a {}",
"githubPATLabel": "Token de Acceso Personal de GitHub (Reduce tiempos de espera)",
"githubPATHint": "El TAP debe tener este formato: nombre_de_usuario:token",
"githubPATFormat": "nombre_de_usuario:token",
"includePrereleases": "Incluir versiones preliminares", "includePrereleases": "Incluir versiones preliminares",
"fallbackToOlderReleases": "Retorceder a versiones previas", "fallbackToOlderReleases": "Retroceder a versiones previas",
"filterReleaseTitlesByRegEx": "Filtra Títulos de Versiones mediantes Expresiones Regulares", "filterReleaseTitlesByRegEx": "Filtrar por título de versión",
"invalidRegEx": "Expresión regular inválida", "invalidRegEx": "Expresión inválida",
"noDescription": "Sin descripción", "noDescription": "Sin descripción",
"cancel": "Cancelar", "cancel": "Cancelar",
"continue": "Continuar", "continue": "Continuar",
"requiredInBrackets": "(Requerido)", "requiredInBrackets": "(Requerido)",
"dropdownNoOptsError": "ERROR: EL DESPLEGABLE DEBE TENER AL MENOS UNA OPCIÓN", "dropdownNoOptsError": "ERROR: EL DESPLEGABLE DEBE TENER AL MENOS UNA OPCIÓN",
"colour": "Color", "colour": "color",
"githubStarredRepos": "Repositorios favoritos de GitHub", "standard": "Estándar",
"custom": "A medida",
"useMaterialYou": "Aplicar 'Material You'",
"githubStarredRepos": "repositorios favoritos en GitHub",
"uname": "Nombre de usuario", "uname": "Nombre de usuario",
"wrongArgNum": "Número de argumentos provistos inválido", "wrongArgNum": "Número de argumentos provistos inválido",
"xIsTrackOnly": "{} es de 'Solo Seguimiento'", "xIsTrackOnly": "{} es de 'lo seguimiento'",
"source": "Origen", "source": "origen",
"app": "Aplicación", "app": "Aplicación",
"appsFromSourceAreTrackOnly": "Las aplicaciones de este origen son de 'Solo Seguimiento'.", "appsFromSourceAreTrackOnly": "Las aplicaciones de este origen son solo para seguimiento.",
"youPickedTrackOnly": "Debes seleccionar la opción de 'Solo Seguimiento'.", "youPickedTrackOnly": "Debe seleccionar la opción de 'solo para seguimiento'.",
"trackOnlyAppDescription": "Se monitorizará la aplicación en busca de actualizaciones, pero Obtainium no será capaz de descargarla o acutalizarla.", "trackOnlyAppDescription": "Se hará el seguimiento de actualizaciones para la aplicación, pero Obtainium no será capaz de descargar o actualizarla.",
"cancelled": "Cancelado", "cancelled": "Cancelado",
"appAlreadyAdded": "Aplicación ya añadida", "appAlreadyAdded": "Aplicación añadida anteriormente",
"alreadyUpToDateQuestion": "¿Aplicación ya actualizada?", "alreadyUpToDateQuestion": "¿Aplicación actualizada previamente?",
"addApp": "Añadir Aplicación", "addApp": "Añadir aplicación",
"appSourceURL": "URL de Origen de la Aplicación", "appSourceURL": "URL de origen de la aplicación",
"error": "Error", "error": "Error",
"add": "Añadir", "add": "Añadir",
"searchSomeSourcesLabel": "Buscar (Solo Algunas Fuentes)", "searchSomeSourcesLabel": "Buscar (solo algunas fuentes)",
"search": "Buscar", "search": "Buscar",
"additionalOptsFor": "Opciones Adicionales para {}", "additionalOptsFor": "Opciones adicionales para {}",
"supportedSourcesBelow": "Fuentes Soportadas:", "supportedSources": "Fuentes admitidas",
"trackOnlyInBrackets": "(Solo Seguimiento)", "trackOnlyInBrackets": "(Solo para seguimiento)",
"searchableInBrackets": "(Soporta Búsquedas)", "searchableInBrackets": "(permite búsqueda)",
"appsString": "Aplicaciones", "appsString": "Aplicaciones",
"noApps": "Sin Aplicaciones", "noApps": "Sin Aplicaciones",
"noAppsForFilter": "Sin Aplicaciones para Filtrar", "noAppsForFilter": "Sin aplicaciones para filtrar",
"byX": "Por {}", "byX": "por: {}",
"percentProgress": "Progreso: {}%", "percentProgress": "Progreso: {} %",
"pleaseWait": "Por favor, espere", "pleaseWait": "Espere...",
"updateAvailable": "Actualización Disponible", "updateAvailable": "Actualización disponible",
"estimateInBracketsShort": "(Aprox.)", "notInstalled": "No instalado",
"notInstalled": "No Instalado", "pseudoVersion": "pseudoversión",
"estimateInBrackets": "(Aproximado)", "selectAll": "Seleccionar todo",
"selectAll": "Seleccionar Todo", "deselectX": "Deseleccionar {}",
"deselectN": "Deseleccionar {}", "xWillBeRemovedButRemainInstalled": "{} se eliminará de Obtainium pero continuará instalada en el dispositivo.",
"xWillBeRemovedButRemainInstalled": "{} será borrada de Obtainium pero continuará instalada en el dispositivo.", "removeSelectedAppsQuestion": "¿Eliminar aplicaciones seleccionadas?",
"removeSelectedAppsQuestion": "¿Borrar aplicaciones seleccionadas?", "removeSelectedApps": "Eliminar aplicaciones seleccionadas",
"removeSelectedApps": "Borrar Aplicaciones Seleccionadas",
"updateX": "Actualizar {}", "updateX": "Actualizar {}",
"installX": "Instalar {}", "installX": "Instalar {}",
"markXTrackOnlyAsUpdated": "Marcar {}\n(Solo Seguimient)\ncomo Actualizada", "markXTrackOnlyAsUpdated": "Marcar {}\n(solo para seguimiento)\ncomo actualizada",
"changeX": "Cambiar {}", "changeX": "Cambiar {}",
"installUpdateApps": "Instalar/Actualizar Aplicaciones", "installUpdateApps": "Instalar/actualizar aplicaciones",
"installUpdateSelectedApps": "Instalar/Actualizar Aplicaciones Seleccionadas", "installUpdateSelectedApps": "Instalar/actualizar aplicaciones seleccionadas",
"markXSelectedAppsAsUpdated": "¿Marcar {} Aplicaciones Seleccionadas como Actualizadas?", "markXSelectedAppsAsUpdated": "¿Marcar {} aplicaciones seleccionadas como actualizadas?",
"no": "No", "no": "No",
"yes": "Sí", "yes": "Sí",
"markSelectedAppsUpdated": "Marcar Aplicaciones Seleccionadas como Actualizadas", "markSelectedAppsUpdated": "Marcar aplicaciones seleccionadas como actualizadas",
"pinToTop": "Fijar arriba", "pinToTop": "Anclar al principio",
"unpinFromTop": "Desfijar de arriba", "unpinFromTop": "Desanclar del principio",
"resetInstallStatusForSelectedAppsQuestion": "¿Restuarar Estado de Instalación para las Aplicaciones Seleccionadas?", "resetInstallStatusForSelectedAppsQuestion": "¿Restuarar estado de instalación para las aplicaciones seleccionadas?",
"installStatusOfXWillBeResetExplanation": "El estado de instalación de las aplicaciones seleccionadas será restaurado.\n\nEsto puede ser de utilidad cuando la versión de la aplicación mostrada en Obtainium es incorrecta por actualizaciones fallidas u otros motivos.", "installStatusOfXWillBeResetExplanation": "Se restaurará el estado de instalación de las aplicaciones seleccionadas.\n\nEsto puede ser de útil cuando la versión de la aplicación mostrada en Obtainium es incorrecta por actualizaciones fallidas u otros motivos.",
"shareSelectedAppURLs": "Compartir URLs de las Aplicaciones Seleccionadas", "customLinkMessage": "Estos enlaces funcionan en dispositivos con Obtainium instalado",
"resetInstallStatus": "Restaurar Estado de Instalación", "shareAppConfigLinks": "Compartir la configuración de la aplicación como enlace HTML",
"shareSelectedAppURLs": "Compartir URL de las aplicaciones seleccionadas",
"resetInstallStatus": "Restaurar estado de instalación",
"more": "Más", "more": "Más",
"removeOutdatedFilter": "Elimiar Filtro de Aplicaciones Desactualizado", "removeOutdatedFilter": "Eliminar filtro de aplicaciones desactualizado",
"showOutdatedOnly": "Mostrar solo Aplicaciones Desactualizadas", "showOutdatedOnly": "Mostrar solo aplicaciones desactualizadas",
"filter": "Filtrar", "filter": "Filtrar",
"filterActive": "Filtrar *", "filterApps": "Filtrar actualizaciones",
"filterApps": "Filtrar Actualizaciones", "appName": "Nombre de la aplicación",
"appName": "Nombre de la Aplicación",
"author": "Autor", "author": "Autor",
"upToDateApps": "Aplicaciones Actualizadas", "upToDateApps": "Aplicaciones actualizadas",
"nonInstalledApps": "Aplicaciones No Instaladas", "nonInstalledApps": "Aplicaciones no instaladas",
"importExport": "Importar/Exportar", "importExport": "Importar/exportar",
"settings": "Ajustes", "settings": "Ajustes",
"exportedTo": "Exportado a {}", "exportedTo": "Exportado a {}",
"obtainiumExport": "Exportar Obtainium", "obtainiumExport": "Exportar Obtainium",
"invalidInput": "Input incorrecto", "invalidInput": "Entrada no válida",
"importedX": "Importado {}", "importedX": "Importado {}",
"obtainiumImport": "Importar Obtainium", "obtainiumImport": "Importar Obtainium",
"importFromURLList": "Importar desde lista de URLs", "importFromURLList": "Importar desde lista de URL",
"searchQuery": "Consulta de Búsqueda", "searchQuery": "Término de búsqueda",
"appURLList": "Lista de URLs de Aplicaciones", "appURLList": "Lista de URL de aplicaciones",
"line": "Línea", "line": "Línea",
"searchX": "Buscar {}", "searchX": "Buscar {}",
"noResults": "Resultados no encontrados", "noResults": "No se ha encontrado ningún resultado",
"importX": "Importar {}", "importX": "Importar desde {}",
"importedAppsIdDisclaimer": "Las Aplicaciones Importadas pueden mostrarse incorrectamente como \"No Instalada\".\nPara arreglar esto, reinstálalas a través de Obtainium.\nEsto no debería afectar a los datos de las aplicaciones.\n\nSolo afecta a las URLs y a los métodos de importación mediante terceros.", "importedAppsIdDisclaimer": "Las aplicaciones importadas podrían mostrarse incorrectamente como «No instalada».\nPara solucionarlo, reinstálelas a través de Obtainium.\nEsto no debería afectar a los datos de las aplicaciones.\n\nSolo afecta a los URL y a los métodos de importación mediante terceros.",
"importErrors": "Import Errors", "importErrors": "Errores de Importación",
"importedXOfYApps": "{} de {} Aplicaciones importadas.", "importedXOfYApps": "{} de {} aplicaciones importadas.",
"followingURLsHadErrors": "Las siguientes URLs tuvieron problemas:", "followingURLsHadErrors": "Los URL siguientes han tenido problemas:",
"okay": "Correcto",
"selectURL": "Seleccionar URL", "selectURL": "Seleccionar URL",
"selectURLs": "Seleccionar URLs", "selectURLs": "Seleccionar URLs",
"pick": "Escoger", "pick": "Escoger",
"theme": "Tema", "theme": "Tema",
"dark": "Oscuro", "dark": "Oscuro",
"light": "Claro", "light": "Claro",
"followSystem": "Seguir al Sistema", "followSystem": "Seguir al sistema",
"obtainium": "Obtainium", "followSystemThemeExplanation": "Seguir el tema del sistema sólo es posible utilizando aplicaciones de terceros",
"materialYou": "Material You", "useBlackTheme": "Negro puro en tema oscuro",
"useBlackTheme": "Usar tema oscuro con negros puros", "appSortBy": "Ordenar aplicaciones por",
"appSortBy": "Ordenar Aplicaciones Por", "authorName": "Autor/nombre",
"authorName": "Autor/Nombre",
"nameAuthor": "Nombre/Autor", "nameAuthor": "Nombre/Autor",
"asAdded": "Según se Añadieron", "asAdded": "Según se Añadieron",
"appSortOrder": "Orden de Clasificación de Aplicaciones", "appSortOrder": "Orden de Clasificación",
"ascending": "Ascendente", "ascending": "Ascendente",
"descending": "Descendente", "descending": "Descendente",
"bgUpdateCheckInterval": "Intervalo de Comprobación de Actualizaciones en Segundo Plano", "bgUpdateCheckInterval": "Comprobar actualizaciones en segundo plano",
"neverManualOnly": "Nunca - Solo Manual", "neverManualOnly": "Nunca, solo manual",
"appearance": "Apariencia", "appearance": "Apariencia",
"showWebInAppView": "Mostrar Vista de la Web de Origen", "showWebInAppView": "Mostrar vista de la web de origen",
"pinUpdates": "Fijar Actualizaciones en la Parte Superior de la Vista de Aplicaciones", "pinUpdates": "Anclar actualizaciones al principio",
"updates": "Actualizaciones", "updates": "Actualizaciones",
"sourceSpecific": "Fuente Específica", "sourceSpecific": "Fuente específica",
"appSource": "Fuente de la Aplicación", "appSource": "Filtrar por fuente",
"noLogs": "Sin Logs", "noLogs": "Ningún registro",
"appLogs": "Logs de la Aplicación", "appLogs": "Registros",
"close": "Cerrar", "close": "Cerrar",
"share": "Compartir", "share": "Compartir",
"appNotFound": "Aplicación no encontrada", "appNotFound": "Aplicación no encontrada",
"obtainiumExportHyphenatedLowercase": "obtainium-export", "obtainiumExportHyphenatedLowercase": "obtainium-exportación",
"pickAnAPK": "Elige una APK", "pickAnAPK": "Seleccione una APK",
"appHasMoreThanOnePackage": "{} tiene más de un paquete:", "appHasMoreThanOnePackage": "{} tiene más de un paquete:",
"deviceSupportsXArch": "Tu dispositivo soporta las siguientes arquitecturas de procesador: {}.", "deviceSupportsXArch": "Su dispositivo admite las siguientes arquitecturas de procesador: {}.",
"deviceSupportsFollowingArchs": "Tu dispositivo soporta las siguientes arquitecturas de procesador:", "deviceSupportsFollowingArchs": "Su dispositivo admite las siguientes arquitecturas de procesador:",
"warning": "Aviso", "warning": "Aviso",
"sourceIsXButPackageFromYPrompt": "La fuente de la aplicación es '{}' pero el paquete de la actualización viene de '{}'. ¿Desea continuar?", "sourceIsXButPackageFromYPrompt": "La fuente de la aplicación es «{}» pero el paquete de la actualización viene de «{}». ¿Desea continuar?",
"updatesAvailable": "Actualizaciones Disponibles", "updatesAvailable": "Actualizaciones Disponibles",
"updatesAvailableNotifDescription": "Notifica al usuario de que hay actualizaciones para una o más aplicaciones monitorizadas por Obtainium", "updatesAvailableNotifDescription": "Notifica al usuario de que hay actualizaciones para una o más aplicaciones monitoreadas por Obtainium",
"noNewUpdates": "No hay nuevas actualizaciones.", "noNewUpdates": "No hay nuevas actualizaciones.",
"xHasAnUpdate": "{} tiene una actualización.", "xHasAnUpdate": "{} tiene una actualización.",
"appsUpdated": "Aplicaciones Actualizadas", "appsUpdated": "Aplicaciones actualizadas",
"appsNotUpdated": "Error al actualizar las aplicaciones",
"appsUpdatedNotifDescription": "Notifica al usuario de que una o más aplicaciones han sido actualizadas en segundo plano", "appsUpdatedNotifDescription": "Notifica al usuario de que una o más aplicaciones han sido actualizadas en segundo plano",
"xWasUpdatedToY": "{} ha sido actualizada a {}.", "xWasUpdatedToY": "{} ha sido actualizada a {}.",
"errorCheckingUpdates": "Error Buscando Actualizaciones", "xWasNotUpdatedToY": "Error al actualizar {} a {}.",
"errorCheckingUpdates": "Error al buscar actualizaciones",
"errorCheckingUpdatesNotifDescription": "Una notificación que muestra cuándo la comprobación de actualizaciones en segundo plano falla", "errorCheckingUpdatesNotifDescription": "Una notificación que muestra cuándo la comprobación de actualizaciones en segundo plano falla",
"appsRemoved": "Aplicaciones Eliminadas", "appsRemoved": "Aplicaciones eliminadas",
"appsRemovedNotifDescription": "Notifica al usuario que una o más aplicaciones fueron eliminadas por problemas al cargarlas", "appsRemovedNotifDescription": "Notifica al usuario que una o más aplicaciones fueron eliminadas por problemas al cargarlas",
"xWasRemovedDueToErrorY": "{} ha sido eliminada por: {}", "xWasRemovedDueToErrorY": "{} ha sido eliminada por: {}",
"completeAppInstallation": "Instalación Completa de la Aplicación", "completeAppInstallation": "Instalación completa de la aplicación",
"obtainiumMustBeOpenToInstallApps": "Obtainium debe estar abierta para instalar aplicaciones", "obtainiumMustBeOpenToInstallApps": "Obtainium debe estar abierto para instalar aplicaciones",
"completeAppInstallationNotifDescription": "Pide al usuario volver a Obtainium para teminar de instalar una aplicación", "completeAppInstallationNotifDescription": "Le pide volver a Obtainium para terminar de instalar una aplicación",
"checkingForUpdates": "Buscando Actualizaciones", "checkingForUpdates": "Buscando actualizaciones...",
"checkingForUpdatesNotifDescription": "Notificación temporal que aparece al buscar actualizaciones", "checkingForUpdatesNotifDescription": "Notificación temporal que aparece al buscar actualizaciones",
"pleaseAllowInstallPerm": "Por favor, permite a Obtainium instalar aplicaciones", "pleaseAllowInstallPerm": "Permita que Obtainium instale aplicaciones",
"trackOnly": "Solo Seguimiento", "trackOnly": "Solo para seguimiento",
"errorWithHttpStatusCode": "Error {}", "errorWithHttpStatusCode": "Error {}",
"versionCorrectionDisabled": "Corrección de versiones desactivada (el plugin parece no funcionar)", "versionCorrectionDisabled": "Corrección de versiones desactivada (el plugin parece no funcionar)",
"unknown": "Desconocido", "unknown": "Desconocido",
"none": "Ninguno", "none": "Ninguno",
"never": "Nunca", "never": "Nunca",
"latestVersionX": "Última Versión: {}", "latestVersionX": "Última versión: {}",
"installedVersionX": "Versión Instalada: {}", "installedVersionX": "Versión instalada: {}",
"lastUpdateCheckX": "Última Comprobación: {}", "lastUpdateCheckX": "Última comprobación: {}",
"remove": "Eliminar", "remove": "Eliminar",
"yesMarkUpdated": "Sí, Marcar como Actualizada", "yesMarkUpdated": "Sí, marcar como actualizada",
"fdroid": "Repositorio oficial de F-Droid", "fdroid": "Repositorio oficial F-Droid",
"appIdOrName": "ID o Nombre de la Aplicación", "appIdOrName": "ID o Nombre de la Aplicación",
"appId": "ID de la Aplicación", "appId": "ID de la Aplicación",
"appWithIdOrNameNotFound": "No se han encontrado aplicaciones con esa ID o nombre", "appWithIdOrNameNotFound": "No se han encontrado aplicaciones con ese ID o nombre",
"reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones", "reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones",
"fdroidThirdPartyRepo": "Rpositorios de terceros de F-Droid", "fdroidThirdPartyRepo": "Repositorio de terceros F-Droid",
"steam": "Steam",
"steamMobile": "Steam Mobile",
"steamChat": "Steam Chat",
"install": "Instalar", "install": "Instalar",
"markInstalled": "Marcar como Instalda", "markInstalled": "Marcar como instalada",
"update": "Actualizar", "update": "Actualizar",
"markUpdated": "Marcar como Actualizada", "markUpdated": "Marcar como actualizada",
"additionalOptions": "Opciones Adicionales", "additionalOptions": "Opciones adicionales",
"disableVersionDetection": "Descativar Detección de Versiones", "disableVersionDetection": "Desactivar la detección de versiones",
"noVersionDetectionExplanation": "Esta opción solo se debe usar en aplicaciones en las que la deteción de versiones pueda no funcionar correctamente.", "noVersionDetectionExplanation": "Esta opción solo se debe usar en aplicaciones en las que la deteción de versiones pueda que no funcionar correctamente.",
"downloadingX": "Descargando {}", "downloadingX": "Descargando {}",
"downloadNotifDescription": "Notifica al usuario de progreso de descarga de una aplicación", "downloadX": "Descargar {}",
"noAPKFound": "APK no encontrada", "downloadedX": "Descargado {}",
"releaseAsset": "Recurso publicado",
"downloadNotifDescription": "Notifica al usuario del progreso de descarga de una aplicación",
"noAPKFound": "No se ha encontrado el paquete de instalación APK",
"noVersionDetection": "Sin detección de versiones", "noVersionDetection": "Sin detección de versiones",
"categorize": "Catogorizar", "categorize": "Catogorizar",
"categories": "Categorías", "categories": "Categorías",
"category": "Categoría", "category": "Categoría",
"noCategory": "Sin Categoría", "noCategory": "Sin categoría",
"noCategories": "Sin Categorías", "noCategories": "Sin categorías",
"deleteCategoriesQuestion": "¿Borrar Categorías?", "deleteCategoriesQuestion": "¿Eliminar categorías?",
"categoryDeleteWarning": "Todas las aplicaciones en las categorías borradas serán margadas como 'Sin Categoría'.", "categoryDeleteWarning": "Todas las aplicaciones en las categorías eliminadas se marcarán como «Sin categoría».",
"addCategory": "Añadir Categoría", "addCategory": "Añadir categoría",
"label": "Nombre", "label": "Nombre",
"language": "Idioma", "language": "Idioma",
"copiedToClipboard": "Copiado al Portapapeles", "copiedToClipboard": "Copiado en el portapapeles",
"storagePermissionDenied": "Permiso de Almacenamiento rechazado", "storagePermissionDenied": "Permiso de almacenamiento rechazado",
"selectedCategorizeWarning": "Esto reemplazará cualquier ajuste de categoría para las aplicaicones seleccionadas.", "selectedCategorizeWarning": "Esto reemplazará cualquier ajuste de categoría para las aplicaciones seleccionadas.",
"filterAPKsByRegEx": "Filtrar APKs mediante Expresiones Regulares", "filterAPKsByRegEx": "Filtrar por APK",
"removeFromObtainium": "Eliminar de Obtainium", "removeFromObtainium": "Eliminar de Obtainium",
"uninstallFromDevice": "Desinstalar del Dispositivo", "uninstallFromDevice": "Desinstalar del dispositivo",
"onlyWorksWithNonVersionDetectApps": "Solo funciona para aplicaciones con la detección de versiones desactivada.", "onlyWorksWithNonVersionDetectApps": "Solo funciona para aplicaciones con la detección de versiones desactivada.",
"releaseDateAsVersion": "Usar Fecha de Publicación como Versión", "releaseDateAsVersion": "Por fecha de publicación",
"releaseTitleAsVersion": "Utilizar el título de la versión como cadena de versión",
"releaseDateAsVersionExplanation": "Esta opción solo se debería usar con aplicaciones en las que la detección de versiones no funciona pero hay disponible una fecha de publicación.", "releaseDateAsVersionExplanation": "Esta opción solo se debería usar con aplicaciones en las que la detección de versiones no funciona pero hay disponible una fecha de publicación.",
"changes": "Cambios", "changes": "Cambios",
"releaseDate": "Fecha de Publicación", "releaseDate": "Fecha de publicación",
"importFromURLsInFile": "Importar de URls en un Archivo (como OPML)", "importFromURLsInFile": "Importar URLs desde archivo (como OPML)",
"versionDetection": "Detección de Versiones", "versionDetectionExplanation": "Conciliar la cadena de versión con la versión detectada desde el sistema operativo",
"standardVersionDetection": "Detección de versiones estándar", "versionDetection": "Detección de versiones",
"groupByCategory": "Agrupar por Categoría", "standardVersionDetection": "Por versión",
"autoApkFilterByArch": "Tratar de filtrar las APKs mediante arquitecturas de procesador si es posible", "groupByCategory": "Agrupar por categorías",
"overrideSource": "Sobrescribir Fuente", "autoApkFilterByArch": "Filtrar APK por arquitectura del procesador (si es posible)",
"overrideSource": "Forzar desde la fuente",
"dontShowAgain": "No mostrar de nuevo", "dontShowAgain": "No mostrar de nuevo",
"dontShowTrackOnlyWarnings": "No mostrar avisos de 'Solo Seguimiento'", "dontShowTrackOnlyWarnings": "No mostrar avisos sobre apps 'solo para seguimiento'",
"dontShowAPKOriginWarnings": "No mostrar avisos de las fuentes de las APks", "dontShowAPKOriginWarnings": "No mostrar avisos sobre las fuentes de las APKs",
"moveNonInstalledAppsToBottom": "Move non-installed Apps to bottom of Apps view", "moveNonInstalledAppsToBottom": "Mover apps no instaladas al final",
"gitlabPATLabel": "GitLab Personal Access Token\n(Enables Search and Better APK Discovery)", "gitlabPATLabel": "Token de acceso personal a GitLab",
"about": "About", "about": "Acerca",
"requiresCredentialsInSettings": "This needs additional credentials (in Settings)", "requiresCredentialsInSettings": "{}: Esto requiere credenciales adicionales (en ajustes)",
"checkOnStart": "Check for updates on startup", "checkOnStart": "Comprobar actualizaciones al inicio",
"tryInferAppIdFromCode": "Try inferring App ID from source code", "tryInferAppIdFromCode": "Intentar deducir el ID de la app por el código fuente",
"removeOnExternalUninstall": "Automatically remove externally uninstalled Apps", "removeOnExternalUninstall": "Auto eliminar apps desinstaladas externamente",
"pickHighestVersionCode": "Auto-select highest version code APK", "pickHighestVersionCode": "Auto selección de versión superior del paquete APK",
"checkUpdateOnDetailPage": "Check for updates on opening an App detail page", "checkUpdateOnDetailPage": "Comprobar actualizaciones al abrir detalles de la app",
"disablePageTransitions": "Disable page transition animations", "disablePageTransitions": "Deshabilitar animaciones de transición",
"reversePageTransitions": "Reverse page transition animations", "reversePageTransitions": "Invertir animaciones de transición",
"minStarCount": "Minimum Star Count", "minStarCount": "Número Mínimo de Estrellas",
"addInfoBelow": "Add this info below.", "addInfoBelow": "Añadir esta información debajo.",
"addInfoInSettings": "Add this info in the Settings.", "addInfoInSettings": "Puede añadir esta información en Ajustes.",
"githubSourceNote": "GitHub rate limiting can be avoided using an API key.", "githubSourceNote": "La limitación de velocidad de GitHub puede evitarse con un 'token de acceso personal'.",
"gitlabSourceNote": "GitLab APK extraction may not work without an API key.", "sortByLastLinkSegment": "Ordenar sólo por el último segmento del enlace",
"sortByFileNamesNotLinks": "Sort by file names instead of full links", "filterReleaseNotesByRegEx": "Filtrar por notas de versión (release notes)",
"filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", "customLinkFilterRegex": "Filtro personalizado de enlace APK (por defecto '.apk$')",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "appsPossiblyUpdated": "Actualización de apps intentada",
"appsPossiblyUpdatedNotifDescription": "Notifica al usuario que las actualizaciones en segundo plano podrían haberse realizado para una o más aplicaciones",
"xWasPossiblyUpdatedToY": "{} podría estar actualizada a {}.",
"enableBackgroundUpdates": "Habilitar actualizaciones en segundo plano",
"backgroundUpdateReqsExplanation": "Las actualizaciones en segundo plano pueden no estar disponibles para todas las aplicaciones.",
"backgroundUpdateLimitsExplanation": "El éxito de las instalaciones en segundo plano solo se puede comprobar con Obtainium abierto.",
"verifyLatestTag": "Comprobar la etiqueta 'Latest'",
"intermediateLinkRegex": "Filtrar por enlace 'intermedio' para visitar primero",
"filterByLinkText": "Filtrar enlaces por texto del enlace",
"intermediateLinkNotFound": "Enlace intermedio no encontrado",
"intermediateLink": "Enlace intermedio",
"exemptFromBackgroundUpdates": "Exenta de actualizciones en segundo plano (si están habilitadas)",
"bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin Wi-Fi",
"bgUpdatesWhileChargingOnly": "Desactiva las actualizaciones en segundo plano cuando no estés cargando",
"autoSelectHighestVersionCode": "Auto selección del paquete APK con versión más reciente",
"versionExtractionRegEx": "Versión de extracción RegEx",
"trimVersionString": "Recortar cadena de versión con RegEx",
"matchGroupToUseForX": "Grupo de coincidencia a utilizar para \"{}\"",
"matchGroupToUse": "Grupo a usar para versión de extracción RegEx",
"highlightTouchTargets": "Resaltar objetivos menos obvios",
"pickExportDir": "Directorio para exportar",
"autoExportOnChanges": "Auto exportar cuando haya cambios",
"includeSettings": "Incluir ajustes",
"filterVersionsByRegEx": "Filtrar por versiones",
"trySelectingSuggestedVersionCode": "Pruebe seleccionando la versión del paquete APK sugerida",
"dontSortReleasesList": "Mantener el order de publicación de la fuente original",
"reverseSort": "Orden inverso",
"takeFirstLink": "Usar primer enlace",
"skipSort": "Omitir orden",
"debugMenu": "Menu Depurar",
"bgTaskStarted": "Iniciada tarea en segundo plano; revise los registros.",
"runBgCheckNow": "Ejecutar verficiación de actualizaciones en segundo plano",
"versionExtractWholePage": "Aplicar la versión de extracción RegEx a la página entera",
"installing": "Instalando",
"skipUpdateNotifications": "No notificar sobre actualizaciones",
"updatesAvailableNotifChannel": "Actualizaciones disponibles",
"appsUpdatedNotifChannel": "Aplicaciones actualizadas",
"appsPossiblyUpdatedNotifChannel": "Se ha intentado actualizar la aplicación",
"errorCheckingUpdatesNotifChannel": "Error buscando actualizaciones",
"appsRemovedNotifChannel": "Aplicaciones eliminadas",
"downloadingXNotifChannel": "Descargando {}",
"completeAppInstallationNotifChannel": "Instalación completada",
"checkingForUpdatesNotifChannel": "Buscando actualizaciones",
"onlyCheckInstalledOrTrackOnlyApps": "Comprobar actualizaciones solo para apps instaladas o en seguimiento",
"supportFixedAPKURL": "Soporte para URLs fijas de APK",
"selectX": "Elija {}",
"parallelDownloads": "Permitir descargas paralelas",
"useShizuku": "Usar Shizuku o Sui para instalar",
"shizukuBinderNotFound": "Shizuku no funciona",
"shizukuOld": "Versión antigua de Shizuku (<11) - actualícela",
"shizukuOldAndroidWithADB": "Shizuku corriendo en Android < 8.1 con ADB - actualiza Android o usa Sui en su lugar",
"shizukuPretendToBeGooglePlay": "Establecer Google Play como fuente de instalación (si se usa Shizuku)",
"useSystemFont": "Usar fuente del sistema",
"useVersionCodeAsOSVersion": "Usar la versión de la aplicación como versión detectada por el sistema operativo",
"requestHeader": "Encabezado de solicitud",
"useLatestAssetDateAsReleaseDate": "Usar la última carga del recurso como fecha de lanzamiento",
"defaultPseudoVersioningMethod": "Método de pseudoversionado predeterminado",
"partialAPKHash": "Hash de APK parcial",
"APKLinkHash": "Hash de enlace APK",
"directAPKLink": "Enlace APK directo",
"pseudoVersionInUse": "Se está usando una pseudoversión",
"installed": "Instalado",
"latest": "Versión más reciente",
"invertRegEx": "Invertir expresión regular",
"note": "Nota",
"selfHostedNote": "El desplegable «{}» puede usarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.",
"badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)",
"beforeNewInstallsShareToAppVerifier": "Compartir aplicaciones nuevas con AppVerifier (si está instalado)",
"appVerifierInstructionToast": "Compartir con AppVerifier y vuelver aquí cuando esté listo.",
"wiki": "Ayuda/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use bajo su responsabilidad)",
"crowdsourcedConfigsShort": "Configuración de aplicaciones por crowdsourcing",
"allowInsecure": "Permitir peticiones HTTP inseguras",
"stayOneVersionBehind": "Mantenerse una versión por detrás de la última",
"refreshBeforeDownload": "Actualiza los datos de la aplicación antes de descargarla",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": { "removeAppQuestion": {
"one": "¿Eliminar Aplicación?", "one": "¿Eliminar aplicación?",
"other": "¿Eliminar Aplicaciones?" "other": "¿Eliminar aplicaciones?"
}, },
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {
"one": "Muchas peticiones (limitado) - prueba de nuevo en {} minuto", "one": "Muchas peticiones (limitado); pruebe de nuevo en {} minuto",
"other": "Muchas peticiones (limitado) - prueba de nuevo en {} minutos" "other": "Muchas peticiones (limitado); pruebe de nuevo en {} minutos"
}, },
"bgUpdateGotErrorRetryInMinutes": { "bgUpdateGotErrorRetryInMinutes": {
"one": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}, se volverá a probar en {} minuto", "one": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}; se volverá a probar en {} minuto",
"other": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}, se volverá a probar en {} minutos" "other": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}; se volverá a probar en {} minutos"
}, },
"bgCheckFoundUpdatesWillNotifyIfNeeded": { "bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualización - se notificará al usuario si es necesario", "one": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualización; se le notificará si es necesario",
"other": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualizaciones - se notificará al usuario si es necesario" "other": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualizaciones; se le notificará si es necesario"
}, },
"apps": { "apps": {
"one": "{} Aplicación", "one": "{} Aplicación",
@ -269,30 +341,42 @@
}, },
"url": { "url": {
"one": "{} URL", "one": "{} URL",
"other": "{} URLs" "other": "{} URL"
}, },
"minute": { "minute": {
"one": "{} Minuto", "one": "{} minuto",
"other": "{} Minutos" "other": "{} minutos"
}, },
"hour": { "hour": {
"one": "{} Hora", "one": "{} hora",
"other": "{} Horas" "other": "{} horas"
}, },
"day": { "day": {
"one": "{} Día", "one": "{} día",
"other": "{} Días" "other": "{} días"
}, },
"clearedNLogsBeforeXAfterY": { "clearedNLogsBeforeXAfterY": {
"one": "Borrado {n} log (previo a = {before}, posterior a = {after})", "one": "Eliminado {n} registro (previo a = {before}, posterior a = {after})",
"other": "Borrados {n} logs (previos a = {before}, posteriores a = {after})" "other": "Eliminados {n} registros (previos a = {before}, posteriores a = {after})"
}, },
"xAndNMoreUpdatesAvailable": { "xAndNMoreUpdatesAvailable": {
"one": "{} y 1 aplicación más tiene actualizaciones.", "one": "{} y 1 aplicación más tiene actualizaciones.",
"other": "{} y {} aplicaciones más tiene actualizaciones." "other": "{} y {} aplicaciones más tienen actualizaciones."
}, },
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "{} y 1 aplicación más han sido actualizadas.", "one": "{} y 1 aplicación más se han actualizado.",
"other": "{} y {} aplicaciones más han sido actualizadas." "other": "{} y {} aplicaciones más se han actualizado."
},
"xAndNMoreUpdatesFailed": {
"one": "Error al actualizar {} y 1 aplicación más.",
"other": "No se han podido actualizar {} y {} aplicaciones más."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} y 1 aplicación más podría haber sido actualizada.",
"other": "{} y {} aplicaciones más podrían haber sido actualizadas."
},
"apk": {
"one": "{} APK",
"other": "{} APKs"
} }
} }

View File

@ -11,15 +11,7 @@
"unexpectedError": "خطای غیرمنتظره", "unexpectedError": "خطای غیرمنتظره",
"ok": "باشه", "ok": "باشه",
"and": "و", "and": "و",
"startedBgUpdateTask": "شروع بررسی بروزرسانی BG",
"bgUpdateIgnoreAfterIs": "نادیده گرفتن بروزرسانی BG بعد از {} است",
"startedActualBGUpdateCheck": "بررسی به‌روزرسانی واقعی BG آغاز شد",
"bgUpdateTaskFinished": "کار بررسی به‌روزرسانی BG تمام شد",
"firstRun": "این اولین اجرای Obtainium است",
"settingUpdateCheckIntervalTo": "تنظیم فاصله به‌روزرسانی روی {}",
"githubPATLabel": "توکن دسترسی شخصی گیت هاب(محدودیت نرخ را افزایش میدهد)", "githubPATLabel": "توکن دسترسی شخصی گیت هاب(محدودیت نرخ را افزایش میدهد)",
"githubPATHint": "PAT باید در این قالب باشد: username:token",
"githubPATFormat": "username:token",
"includePrereleases": "شامل نسخه های اولیه", "includePrereleases": "شامل نسخه های اولیه",
"fallbackToOlderReleases": "بازگشت به نسخه های قدیمی تر", "fallbackToOlderReleases": "بازگشت به نسخه های قدیمی تر",
"filterReleaseTitlesByRegEx": "عناوین انتشار را با بیان منظم فیلتر کنید", "filterReleaseTitlesByRegEx": "عناوین انتشار را با بیان منظم فیلتر کنید",
@ -30,6 +22,9 @@
"requiredInBrackets": "(ضروری)", "requiredInBrackets": "(ضروری)",
"dropdownNoOptsError": "خطا: کشویی باید حداقل یک گزینه داشته باشد", "dropdownNoOptsError": "خطا: کشویی باید حداقل یک گزینه داشته باشد",
"colour": "رنگ", "colour": "رنگ",
"standard": "استاندارد",
"custom": "سفارشی",
"useMaterialYou": "از Material You استفاده کنید",
"githubStarredRepos": "مخازن ستاره دار گیتهاب", "githubStarredRepos": "مخازن ستاره دار گیتهاب",
"uname": "نام کاربری", "uname": "نام کاربری",
"wrongArgNum": "تعداد آرگومان های ارائه شده اشتباه است", "wrongArgNum": "تعداد آرگومان های ارائه شده اشتباه است",
@ -49,7 +44,7 @@
"searchSomeSourcesLabel": "جستجو (فقط برخی منابع)", "searchSomeSourcesLabel": "جستجو (فقط برخی منابع)",
"search": "جستجو کردن", "search": "جستجو کردن",
"additionalOptsFor": "گزینه های اضافی برای {}", "additionalOptsFor": "گزینه های اضافی برای {}",
"supportedSourcesBelow": "منابع پشتیبانی شده:", "supportedSources": "منابع پشتیبانی شده",
"trackOnlyInBrackets": "«فقط ردیابی»", "trackOnlyInBrackets": "«فقط ردیابی»",
"searchableInBrackets": "(قابل جستجو)", "searchableInBrackets": "(قابل جستجو)",
"appsString": "برنامه ها", "appsString": "برنامه ها",
@ -59,11 +54,10 @@
"percentProgress": "پیش رفتن: {}%", "percentProgress": "پیش رفتن: {}%",
"pleaseWait": "لطفا صبر کنید", "pleaseWait": "لطفا صبر کنید",
"updateAvailable": "بروزرسانی در دسترس", "updateAvailable": "بروزرسانی در دسترس",
"estimateInBracketsShort": "(تخمین)",
"notInstalled": "نصب نشده", "notInstalled": "نصب نشده",
"estimateInBrackets": "(تخمین زدن)", "pseudoVersion": "نسخه شبه",
"selectAll": "انتخاب همه", "selectAll": "انتخاب همه",
"deselectN": "لغو انتخاب {}", "deselectX": "لغو انتخاب {}",
"xWillBeRemovedButRemainInstalled": "{} از Obtainium حذف می‌شود اما روی دستگاه نصب می‌ماند.", "xWillBeRemovedButRemainInstalled": "{} از Obtainium حذف می‌شود اما روی دستگاه نصب می‌ماند.",
"removeSelectedAppsQuestion": "برنامه های انتخابی حذف شود؟", "removeSelectedAppsQuestion": "برنامه های انتخابی حذف شود؟",
"removeSelectedApps": "حذف برنامه های انتخاب شده", "removeSelectedApps": "حذف برنامه های انتخاب شده",
@ -81,37 +75,37 @@
"unpinFromTop": "برداشتن پین از بالا", "unpinFromTop": "برداشتن پین از بالا",
"resetInstallStatusForSelectedAppsQuestion": "وضعیت نصب برنامه‌های انتخابی بازنشانی شود؟", "resetInstallStatusForSelectedAppsQuestion": "وضعیت نصب برنامه‌های انتخابی بازنشانی شود؟",
"installStatusOfXWillBeResetExplanation": "وضعیت نصب برنامه‌های انتخاب‌شده بازنشانی می‌شود.\n\nاگر نسخه برنامه نشان‌داده‌شده در Obtainium به دلیل به‌روزرسانی‌های ناموفق یا مشکلات دیگر نادرست باشد، می‌تواند کمک کند.", "installStatusOfXWillBeResetExplanation": "وضعیت نصب برنامه‌های انتخاب‌شده بازنشانی می‌شود.\n\nاگر نسخه برنامه نشان‌داده‌شده در Obtainium به دلیل به‌روزرسانی‌های ناموفق یا مشکلات دیگر نادرست باشد، می‌تواند کمک کند.",
"customLinkMessage": "این پیوندها بر روی دستگاه هایی با Obtainium نصب شده کار می کنند",
"shareAppConfigLinks": "اشتراک گذاری پیکربندی برنامه به عنوان پیوند HTML",
"shareSelectedAppURLs": "اشتراک گذاری آدرس اینترنتی برنامه های انتخاب شده", "shareSelectedAppURLs": "اشتراک گذاری آدرس اینترنتی برنامه های انتخاب شده",
"resetInstallStatus": "بازنشانی وضعیت نصب", "resetInstallStatus": "بازنشانی وضعیت نصب",
"more": "بیشتر", "more": "بیشتر",
"removeOutdatedFilter": "فیلتر برنامه قدیمی را حذف کنید", "removeOutdatedFilter": "فیلتر برنامه قدیمی را حذف کنید",
"showOutdatedOnly": "فقط برنامه های قدیمی را نشان دهید", "showOutdatedOnly": "فقط برنامه های قدیمی را نشان دهید",
"filter": "فیلتر", "filter": "فیلتر",
"filterActive": "فیلتر *",
"filterApps": "فیلتر کردن برنامه ها", "filterApps": "فیلتر کردن برنامه ها",
"appName": "نام برنامه", "appName": "نام برنامه",
"author": "سازنده", "author": "سازنده",
"upToDateApps": "برنامه های به روز", "upToDateApps": "برنامه های به روز",
"nonInstalledApps": "برنامه های نصب نشده", "nonInstalledApps": "برنامه های نصب نشده",
"importExport": "وادر کردن/صادر کردن", "importExport": "وارد کردن/صادر کردن",
"settings": "تنظیمات", "settings": "تنظیمات",
"exportedTo": "صادر کردن به{}", "exportedTo": "صادر کردن به{}",
"obtainiumExport": "صادرکردن Obtainium", "obtainiumExport": "صادر کردن Obtainium",
"invalidInput": "ورودی نامعتبر", "invalidInput": "ورودی نامعتبر",
"importedX": "وارد شده {}", "importedX": "وارد شده {}",
"obtainiumImport": "واردکردن Obtainium", "obtainiumImport": "وارد کردن Obtainium",
"importFromURLList": "وارد کردن از فهرست آدرس اینترنتی", "importFromURLList": "وارد کردن از فهرست آدرس اینترنتی",
"searchQuery": "جستجوی سوال", "searchQuery": "جستجوی سوال",
"appURLList": "فهرست آدرس اینترنتی برنامه", "appURLList": "فهرست آدرس اینترنتی برنامه",
"line": "خط", "line": "خط",
"searchX": "جستجو {}", "searchX": "جستجو {}",
"noResults": "نتیجه ای پیدا نشد", "noResults": "نتیجه ای پیدا نشد",
"importX": "وارد کردن {}", "importX": " وارد کردن {}",
"importedAppsIdDisclaimer": "ممکن است برنامه‌های وارد شده به اشتباه به‌عنوان \"نصب نشده\" نشان داده شوند.\nبرای رفع این مشکل، آنها را دوباره از طریق Obtainium نصب کنید.\nاین نباید روی داده‌های برنامه تأثیر بگذارد.\n\nفقط بر روی آدرس اینترنتی و روش‌های وارد کردن شخص ثالث تأثیر می‌گذارد.", "importedAppsIdDisclaimer": "ممکن است برنامه‌های وارد شده به اشتباه به‌عنوان \"نصب نشده\" نشان داده شوند.\nبرای رفع این مشکل، آنها را دوباره از طریق Obtainium نصب کنید.\nاین نباید روی داده‌های برنامه تأثیر بگذارد.\n\nفقط بر روی آدرس اینترنتی و روش‌های درون ریزی شخص ثالث تأثیر می‌گذارد.",
"importErrors": "خطاهای وارد کردن", "importErrors": "خطاهای وارد کردن",
"importedXOfYApps": "{} از {} برنامه وارد شد.", "importedXOfYApps": "{} از {} برنامه وارد شد.",
"followingURLsHadErrors": "آدرس های اینترنتی زیر دارای خطا بودند:", "followingURLsHadErrors": "آدرس های اینترنتی زیر دارای خطا بودند:",
"okay": "باشه",
"selectURL": "آدرس اینترنتی انتخاب شده", "selectURL": "آدرس اینترنتی انتخاب شده",
"selectURLs": "آدرس های اینترنتی انتخاب شده", "selectURLs": "آدرس های اینترنتی انتخاب شده",
"pick": "انتخاب", "pick": "انتخاب",
@ -119,8 +113,7 @@
"dark": "تاریک", "dark": "تاریک",
"light": "روشن", "light": "روشن",
"followSystem": "هماهنگ با سیستم", "followSystem": "هماهنگ با سیستم",
"obtainium": "Obtainium", "followSystemThemeExplanation": "دنبال کردن تم سیستم فقط با استفاده از برنامه های شخص ثالث امکان پذیر است",
"materialYou": "Material You",
"useBlackTheme": "استفاده از تم تیره سیاه خالص", "useBlackTheme": "استفاده از تم تیره سیاه خالص",
"appSortBy": "مرتب سازی برنامه بر اساس", "appSortBy": "مرتب سازی برنامه بر اساس",
"authorName": "سازنده/اسم", "authorName": "سازنده/اسم",
@ -154,8 +147,10 @@
"noNewUpdates": "به روز رسانی جدیدی وجود ندارد.", "noNewUpdates": "به روز رسانی جدیدی وجود ندارد.",
"xHasAnUpdate": "{} یک به روز رسانی دارد.", "xHasAnUpdate": "{} یک به روز رسانی دارد.",
"appsUpdated": "برنامه ها به روز شدند", "appsUpdated": "برنامه ها به روز شدند",
"appsNotUpdated": "به روز رسانی برنامه ها ناموفق بود",
"appsUpdatedNotifDescription": "به کاربر اطلاع می دهد که به روز رسانی یک یا چند برنامه در پس زمینه اعمال شده است", "appsUpdatedNotifDescription": "به کاربر اطلاع می دهد که به روز رسانی یک یا چند برنامه در پس زمینه اعمال شده است",
"xWasUpdatedToY": "{} به {} به روز شد.", "xWasUpdatedToY": "{} به {} به روز شد.",
"xWasNotUpdatedToY": "به روز رسانی {} به {} انجام نشد.",
"errorCheckingUpdates": "خطا در بررسی به‌روزرسانی‌ها", "errorCheckingUpdates": "خطا در بررسی به‌روزرسانی‌ها",
"errorCheckingUpdatesNotifDescription": "اعلانی که وقتی بررسی به‌روزرسانی پس‌زمینه ناموفق است نشان می‌دهد", "errorCheckingUpdatesNotifDescription": "اعلانی که وقتی بررسی به‌روزرسانی پس‌زمینه ناموفق است نشان می‌دهد",
"appsRemoved": "برنامه ها حذف شدند", "appsRemoved": "برنامه ها حذف شدند",
@ -180,13 +175,10 @@
"yesMarkUpdated": "بله، علامت گذاری به عنوان به روز شده", "yesMarkUpdated": "بله، علامت گذاری به عنوان به روز شده",
"fdroid": "F-Droid Official", "fdroid": "F-Droid Official",
"appIdOrName": "شناسه یا نام برنامه", "appIdOrName": "شناسه یا نام برنامه",
"appId": "App ID", "appId": "شناسه برنامه",
"appWithIdOrNameNotFound": "هیچ برنامه ای با آن شناسه یا نام یافت نشد", "appWithIdOrNameNotFound": "هیچ برنامه ای با آن شناسه یا نام یافت نشد",
"reposHaveMultipleApps": "مخازن ممکن است شامل چندین برنامه باشد", "reposHaveMultipleApps": "مخازن ممکن است شامل چندین برنامه باشد",
"fdroidThirdPartyRepo": "مخازن شخص ثالث F-Droid", "fdroidThirdPartyRepo": "مخازن شخص ثالث F-Droid",
"steam": "Steam",
"steamMobile": "Steam Mobile",
"steamChat": "Steam Chat",
"install": "نصب", "install": "نصب",
"markInstalled": "علامت گذاری به عنوان نصب شده", "markInstalled": "علامت گذاری به عنوان نصب شده",
"update": "به روز رسانی", "update": "به روز رسانی",
@ -195,6 +187,9 @@
"disableVersionDetection": "غیرفعال کردن تشخیص نسخه", "disableVersionDetection": "غیرفعال کردن تشخیص نسخه",
"noVersionDetectionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند.", "noVersionDetectionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند.",
"downloadingX": "در حال دانلود {}", "downloadingX": "در حال دانلود {}",
"downloadX": "دانلود {}",
"downloadedX": "دانلود شده {}",
"releaseAsset": "انتشار دارایی",
"downloadNotifDescription": "کاربر را از پیشرفت دانلود یک برنامه مطلع می کند", "downloadNotifDescription": "کاربر را از پیشرفت دانلود یک برنامه مطلع می کند",
"noAPKFound": "APK پیدا نشد فایل", "noAPKFound": "APK پیدا نشد فایل",
"noVersionDetection": "بدون تشخیص نسخه", "noVersionDetection": "بدون تشخیص نسخه",
@ -216,10 +211,12 @@
"uninstallFromDevice": "حذف نصب از دستگاه", "uninstallFromDevice": "حذف نصب از دستگاه",
"onlyWorksWithNonVersionDetectApps": "فقط برای برنامه‌هایی کار می‌کند که تشخیص نسخه غیرفعال است.", "onlyWorksWithNonVersionDetectApps": "فقط برای برنامه‌هایی کار می‌کند که تشخیص نسخه غیرفعال است.",
"releaseDateAsVersion": "از تاریخ انتشار به عنوان نسخه استفاده کنید", "releaseDateAsVersion": "از تاریخ انتشار به عنوان نسخه استفاده کنید",
"releaseTitleAsVersion": "از عنوان انتشار به عنوان رشته نسخه استفاده کنید",
"releaseDateAsVersionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند، اما تاریخ انتشار در دسترس است.", "releaseDateAsVersionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند، اما تاریخ انتشار در دسترس است.",
"changes": "تغییرات", "changes": "تغییرات",
"releaseDate": "تاریخ انتشار", "releaseDate": "تاریخ انتشار",
"importFromURLsInFile": "وارد کردن از آدرس های اینترنتی موجود در فایل (مانند OPML)", "importFromURLsInFile": "وارد کردن از آدرس های اینترنتی موجود در فایل (مانند OPML)",
"versionDetectionExplanation": "تطبیق رشته نسخه با نسخه شناسایی شده از سیستم عامل",
"versionDetection": "تشخیص نسخه", "versionDetection": "تشخیص نسخه",
"standardVersionDetection": "تشخیص نسخه استاندارد", "standardVersionDetection": "تشخیص نسخه استاندارد",
"groupByCategory": "گروه بر اساس دسته", "groupByCategory": "گروه بر اساس دسته",
@ -229,24 +226,99 @@
"dontShowTrackOnlyWarnings": "هشدار 'فقط ردیابی' را نشان ندهید", "dontShowTrackOnlyWarnings": "هشدار 'فقط ردیابی' را نشان ندهید",
"dontShowAPKOriginWarnings": "هشدارهای منبع APK را نشان ندهید", "dontShowAPKOriginWarnings": "هشدارهای منبع APK را نشان ندهید",
"moveNonInstalledAppsToBottom": "برنامه های نصب نشده را به نمای پایین برنامه ها منتقل کنید", "moveNonInstalledAppsToBottom": "برنامه های نصب نشده را به نمای پایین برنامه ها منتقل کنید",
"gitlabPATLabel": "رمز دسترسی شخصی GitLab\n(جستجو را فعال می کند and Better APK Discovery)", "gitlabPATLabel": "رمز دسترسی شخصی GitLab",
"about": "درباره", "about": "درباره",
"requiresCredentialsInSettings": "این به اعتبارنامه های اضافی نیاز دارد (در تنظیمات)", "requiresCredentialsInSettings": "{}: این به اعتبارنامه های اضافی نیاز دارد (در تنظیمات)",
"checkOnStart": "بررسی در شروع", "checkOnStart": "بررسی در شروع",
"tryInferAppIdFromCode": "شناسه برنامه را از کد منبع استنباط کنید", "tryInferAppIdFromCode": "شناسه برنامه را از کد منبع استنباط کنید",
"removeOnExternalUninstall": "Automatically remove externally uninstalled Apps", "removeOnExternalUninstall": "حذف خودکار برنامه های حذف نصب شده خارجی",
"pickHighestVersionCode": "Auto-select highest version code APK", "pickHighestVersionCode": "انتخاب خودکار بالاترین کد نسخه APK",
"checkUpdateOnDetailPage": "Check for updates on opening an App detail page", "checkUpdateOnDetailPage": "برای باز کردن صفحه جزئیات برنامه، به‌روزرسانی‌ها را بررسی کنید",
"disablePageTransitions": "Disable page transition animations", "disablePageTransitions": "غیرفعال کردن انیمیشن های انتقال صفحه",
"reversePageTransitions": "Reverse page transition animations", "reversePageTransitions": "انیمیشن های انتقال معکوس صفحه",
"minStarCount": "Minimum Star Count", "minStarCount": "حداقل تعداد ستاره",
"addInfoBelow": "Add this info below.", "addInfoBelow": "این اطلاعات را در زیر اضافه کنید",
"addInfoInSettings": "Add this info in the Settings.", "addInfoInSettings": "این اطلاعات را در تنظیمات اضافه کنید.",
"githubSourceNote": "GitHub rate limiting can be avoided using an API key.", "githubSourceNote": "با استفاده از کلید API می توان از محدودیت نرخ GitHub جلوگیری کرد.",
"gitlabSourceNote": "GitLab APK extraction may not work without an API key.", "sortByLastLinkSegment": "فقط بر اساس آخرین بخش پیوند مرتب کنید",
"sortByFileNamesNotLinks": "Sort by file names instead of full links", "filterReleaseNotesByRegEx": "یادداشت های انتشار را با بیان منظم فیلتر کنید",
"filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", "customLinkFilterRegex": "فیلتر پیوند سفارشی بر اساس عبارت منظم (پیش‌فرض '.apk$')",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "appsPossiblyUpdated": "به‌روزرسانی برنامه انجام شد",
"appsPossiblyUpdatedNotifDescription": "به کاربر اطلاع می‌دهد که به‌روزرسانی‌های یک یا چند برنامه به طور بالقوه در پس‌زمینه اعمال شده است",
"xWasPossiblyUpdatedToY": "ممکن است {} به {} به روز شده باشد.",
"enableBackgroundUpdates": "به روز رسانی پس زمینه را فعال کنید",
"backgroundUpdateReqsExplanation": "به روز رسانی پس زمینه ممکن است برای همه برنامه ها امکان پذیر نباشد.",
"backgroundUpdateLimitsExplanation": "موفقیت نصب پس‌زمینه تنها زمانی مشخص می‌شود که Obtainium باز شود.",
"verifyLatestTag": "برچسب \"آخرین\" را تأیید کنید",
"intermediateLinkRegex": "برای بازدید از پیوند «میانگین» فیلتر کنید",
"filterByLinkText": "لینک ها را بر اساس متن پیوند فیلتر کنید",
"intermediateLinkNotFound": "لینک میانی پیدا نشد",
"intermediateLink": "پیوند میانی",
"exemptFromBackgroundUpdates": "معاف از به‌روزرسانی‌های پس‌زمینه (در صورت فعال بودن)",
"bgUpdatesOnWiFiOnly": "به‌روزرسانی‌های پس‌زمینه را در صورت عدم اتصال به Wi-Fi غیرفعال کنید",
"bgUpdatesWhileChargingOnly": "به‌روزرسانی‌های پس‌زمینه را هنگام شارژ نشدن غیرفعال کنید",
"autoSelectHighestVersionCode": "انتخاب خودکار بالاترین نسخه کد APK",
"versionExtractionRegEx": "نسخه استخراج RegEx",
"trimVersionString": "برش رشته نسخه با RegEx",
"matchGroupToUseForX": "مطابقت دادن گروه برای استفاده برای \"{}\"",
"matchGroupToUse": "گروه مورد استفاده را مطابقت دهید",
"highlightTouchTargets": "اهداف لمسی کمتر واضح را برجسته کنید",
"pickExportDir": "فهرست صادر کردن را انتخاب کنید",
"autoExportOnChanges": "صادر کردن خودکار تغییرات",
"includeSettings": "شامل تنظیمات",
"filterVersionsByRegEx": "فیلتر کردن نسخه ها با RegEx",
"trySelectingSuggestedVersionCode": "نسخه پیشنهادی APK نسخه کد را انتخاب کنید",
"dontSortReleasesList": "حفظ سفارش انتشار از API",
"reverseSort": "مرتب سازی معکوس",
"takeFirstLink": "لینک اول را بگیرید",
"skipSort": "از مرتب سازی صرف نظر کنید",
"debugMenu": "منوی اشکال زدایی",
"bgTaskStarted": "کار پس زمینه شروع شد - لاگ های مربوط را بررسی کنید.",
"runBgCheckNow": "اکنون به‌روزرسانی پس‌زمینه را بررسی کنید",
"versionExtractWholePage": "نسخه Extraction Regex را در کل صفحه اعمال کنید",
"installing": "در حال نصب",
"skipUpdateNotifications": "رد شدن از اعلان های به روز رسانی",
"updatesAvailableNotifChannel": "بروزرسانی در دسترس ",
"appsUpdatedNotifChannel": "برنامه ها به روز شدند",
"appsPossiblyUpdatedNotifChannel": "به‌روزرسانی برنامه انجام شد",
"errorCheckingUpdatesNotifChannel": "خطا در بررسی به‌روزرسانی‌ها",
"appsRemovedNotifChannel": "برنامه ها حذف شدند",
"downloadingXNotifChannel": "در حال دانلود {}",
"completeAppInstallationNotifChannel": "نصب کامل برنامه",
"checkingForUpdatesNotifChannel": "بررسی به‌روزرسانی‌ها",
"onlyCheckInstalledOrTrackOnlyApps": "فقط برنامه های نصب شده و فقط ردیابی را برای به روز رسانی بررسی کنید",
"supportFixedAPKURL": "پشتیبانی از URL های APK ثابت",
"selectX": "انتخاب کنید {}",
"parallelDownloads": "اجازه دانلود موازی",
"useShizuku": "برای نصب از Shizuku یا Sui استفاده کنید",
"shizukuBinderNotFound": "Shizuku در حال اجرا نیست",
"shizukuOld": "نسخه قدیمی Shizuku (<11) - آن را به روز کنید",
"shizukuOldAndroidWithADB": "Shizuku در Android < 8.1 با ADB اجرا می شود - اندروید را به روز کنید یا به جای آن از Sui استفاده کنید",
"shizukuPretendToBeGooglePlay": "Google Play را به عنوان منبع نصب تنظیم کنید (در صورت استفاده از Shizuku)",
"useSystemFont": "استفاده از فونت سیستم",
"useVersionCodeAsOSVersion": "استفاده کد نسخه برنامه به جای نسخه شناسایی شده توسط سیستم عامل استفاده کنید",
"requestHeader": "درخواست سطر بالایی",
"useLatestAssetDateAsReleaseDate": "استفاده از آخرین بارگذاری دارایی به عنوان تاریخ انتشار",
"defaultPseudoVersioningMethod": "روش پیش فرض شبه نسخه",
"partialAPKHash": "هش جزئی APK",
"APKLinkHash": "هش پیوند APK",
"directAPKLink": "لینک مستقیم APK",
"pseudoVersionInUse": "یک نسخه شبه در حال استفاده است",
"installed": "نصب شده است",
"latest": "آخرین",
"invertRegEx": "معکوس کردن عبارت منظم",
"note": "یادداشت",
"selfHostedNote": "از منوی کرکره ای \"{}\" می توان برای دسترسی به نمونه های خود میزبانی/سفارشی از هر منبعی استفاده کرد.",
"badDownload": "APK قابل تجزیه نیست (دانلود ناسازگار یا جزئی)",
"beforeNewInstallsShareToAppVerifier": "اشتراک‌گذاری برنامه‌های جدید با AppVerifier (در صورت وجود)",
"appVerifierInstructionToast": "در AppVerifier به اشتراک بگذارید، سپس پس از آماده شدن به اینجا برگردید.",
"wiki": "راهنما/ویکی",
"crowdsourcedConfigsLabel": "تنظیمات برنامه های مشارکت جمعی (با مسئولیت خود استفاده کنید)",
"crowdsourcedConfigsShort": "تنظیمات برنامه های مشارکت جمعی",
"allowInsecure": "درخواست های HTTP ناامن را مجاز کنید",
"stayOneVersionBehind": "یک نسخه از آخرین نسخه پشت سر بگذارید",
"refreshBeforeDownload": "قبل از دانلود، جزئیات برنامه را بازخوانی کنید",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": { "removeAppQuestion": {
"one": "برنامه حذف شود؟", "one": "برنامه حذف شود؟",
"other": "برنامه ها حذف شوند؟" "other": "برنامه ها حذف شوند؟"
@ -294,5 +366,17 @@
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "{} و 1 برنامه دیگر به روز شدند.", "one": "{} و 1 برنامه دیگر به روز شدند.",
"other": "{} و {} برنامه دیگر به روز شدند." "other": "{} و {} برنامه دیگر به روز شدند."
},
"xAndNMoreUpdatesFailed": {
"one": "{} و 1 برنامه دیگر به روز نشد.",
"other": "{} و {} برنامه دیگر به روز نشد."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} و 1 برنامه دیگر ممکن است به روز شده باشند.",
"other": "ممکن است {} و {} برنامه های دیگر به روز شده باشند."
},
"apk": {
"one": "{} APK",
"other": "{} APKs"
} }
} }

View File

@ -1,139 +1,132 @@
{ {
"invalidURLForSource": "URL d'application {} invalide", "invalidURLForSource": "URL de l'application {} invalide",
"noReleaseFound": "Impossible de trouver une version appropriée", "noReleaseFound": "Impossible de trouver une publication correspondante",
"noVersionFound": "Impossible de déterminer la version de la version", "noVersionFound": "Impossible de déterminer la version de la publication",
"urlMatchesNoSource": "L'URL ne correspond pas à une source connue", "urlMatchesNoSource": "L'URL ne correspond pas à une source connue",
"cantInstallOlderVersion": "Impossible d'installer une ancienne version d'une application", "cantInstallOlderVersion": "Impossible d'installer une ancienne version de l'application",
"appIdMismatch": "L'ID de paquet téléchargé ne correspond pas à l'ID de l'application existante", "appIdMismatch": "L'ID du paquet téléchargé ne correspond pas à l'ID de l'application existante",
"functionNotImplemented": "Cette classe n'a pas implémenté cette fonction", "functionNotImplemented": "Cette classe n'implémente pas cette fonction",
"placeholder": "Espace réservé", "placeholder": "Espace réservé",
"someErrors": "Des erreurs se sont produites", "someErrors": "Des erreurs sont survenues",
"unexpectedError": "Erreur inattendue", "unexpectedError": "Erreur inattendue",
"ok": "Okay", "ok": "Ok",
"and": "et", "and": "et",
"startedBgUpdateTask": "Démarrage de la tâche de vérification de mise à jour en arrière-plan", "githubPATLabel": "Jeton d'accès personnel GitHub (augmente la limite de débit)",
"bgUpdateIgnoreAfterIs": "Mise à jour en arrière-plan est ignoré après {}", "includePrereleases": "Inclure les versions préliminaires",
"startedActualBGUpdateCheck": "Démarrage de la vérification de la mise à jour en arrière-plan",
"bgUpdateTaskFinished": "Tâche de vérification de la mise à jour en arrière-plan terminée",
"firstRun": "Il s'agit de la toute première exécution d'Obtainium",
"settingUpdateCheckIntervalTo": "Définition de l'intervalle de mise à jour sur {}",
"githubPATLabel": "Jeton d'Accès Personnel GitHub (Augmente la limite de débit)",
"githubPATHint": "Le JAP doit être dans ce format : username:token",
"githubPATFormat": "username:token",
"includePrereleases": "Inclure les avant-premières",
"fallbackToOlderReleases": "Retour aux anciennes versions", "fallbackToOlderReleases": "Retour aux anciennes versions",
"filterReleaseTitlesByRegEx": "Filtrer les titres de version par expression régulière", "filterReleaseTitlesByRegEx": "Filtrer les titres de version par expression régulière",
"invalidRegEx": "Expression régulière invalide", "invalidRegEx": "Expression régulière invalide",
"noDescription": "Pas de description", "noDescription": "Aucune description",
"cancel": "Annuler", "cancel": "Annuler",
"continue": "Continuer", "continue": "Continuer",
"requiredInBrackets": "(Requis)", "requiredInBrackets": "(Requis)",
"dropdownNoOptsError": "ERREUR : LE DÉROULEMENT DOIT AVOIR AU MOINS UNE OPT", "dropdownNoOptsError": "ERREUR: LA LISTE DÉROULANTE DOIT AVOIR AU MOINS UNE OPTION",
"colour": "Couleur", "colour": "Couleur",
"githubStarredRepos": "Dépôts étoilés GitHub", "standard": "Standard",
"custom": "Personnalisé",
"useMaterialYou": "Utiliser Material You",
"githubStarredRepos": "dépôts étoilés GitHub",
"uname": "Nom d'utilisateur", "uname": "Nom d'utilisateur",
"wrongArgNum": "Mauvais nombre d'arguments fournis", "wrongArgNum": "Nombre incorrect des arguments fournis",
"xIsTrackOnly": "{} est en 'Suivi uniquement'", "xIsTrackOnly": "{} en Suivi uniquement",
"source": "Source", "source": "source",
"app": "Application", "app": "Application",
"appsFromSourceAreTrackOnly": "Les applications de cette source sont en 'Suivi uniquement'.", "appsFromSourceAreTrackOnly": "Les applications de cette source sont en 'Suivi uniquement'.",
"youPickedTrackOnly": "Vous avez sélectionné l'option 'Suivi uniquement'.", "youPickedTrackOnly": "Vous avez sélectionné l'option 'Suivi uniquement'.",
"trackOnlyAppDescription": "L'application sera suivie pour les mises à jour, mais Obtainium ne pourra pas la télécharger ou l'installer.", "trackOnlyAppDescription": "L'application sera suivie pour les mises à jour, mais Obtainium ne pourra pas la télécharger ou l'installer.",
"cancelled": "Annulé", "cancelled": "Annulé",
"appAlreadyAdded": "Application déjà ajoutée", "appAlreadyAdded": "Application déjà ajoutée",
"alreadyUpToDateQuestion": "Application déjà à jour ?", "alreadyUpToDateQuestion": "L'application est à jour?",
"addApp": "Ajouter une application", "addApp": "Ajouter appli",
"appSourceURL": "URL de la source de l'application", "appSourceURL": "URL source de l'application",
"error": "Erreur", "error": "Erreur",
"add": "Ajouter", "add": "Ajouter",
"searchSomeSourcesLabel": "Rechercher (certaines sources uniquement)", "searchSomeSourcesLabel": "Rechercher (certaines sources uniquement)",
"search": "Rechercher", "search": "Rechercher",
"additionalOptsFor": "Options supplémentaires pour {}", "additionalOptsFor": "Options supplémentaires pour {}",
"supportedSourcesBelow": "Sources prises en charge :", "supportedSources": "Sources prises en charge",
"trackOnlyInBrackets": "(Suivi uniquement)", "trackOnlyInBrackets": "(Suivi uniquement)",
"searchableInBrackets": "(Recherchable)", "searchableInBrackets": "(Interrogeable)",
"appsString": "Applications", "appsString": "Applications",
"noApps": "Aucune application", "noApps": "Aucune application",
"noAppsForFilter": "Aucune application pour le filtre", "noAppsForFilter": "Aucune application à filtrer",
"byX": "Par {}", "byX": "Par {}",
"percentProgress": "Progrès: {}%", "percentProgress": "Progression : {}%",
"pleaseWait": "Veuillez patienter", "pleaseWait": "Veuillez patienter",
"updateAvailable": "Mise à jour disponible", "updateAvailable": "Mise à jour disponible",
"estimateInBracketsShort": "(Est.)", "notInstalled": "Non installé",
"notInstalled": "Pas installé", "pseudoVersion": "Version fictive",
"estimateInBrackets": "(Estimation)",
"selectAll": "Tout sélectionner", "selectAll": "Tout sélectionner",
"deselectN": "Déselectionner {}", "deselectX": "Déselectionner {}",
"xWillBeRemovedButRemainInstalled": "{} sera supprimé d'Obtainium mais restera installé sur l'appareil.", "xWillBeRemovedButRemainInstalled": "{} sera supprimée d'Obtainium mais restera installée sur l'appareil.",
"removeSelectedAppsQuestion": "Supprimer les applications sélectionnées ?", "removeSelectedAppsQuestion": "Supprimer les applications sélectionnées ?",
"removeSelectedApps": "Supprimer les applications sélectionnées", "removeSelectedApps": "Supprimer les applications sélectionnées",
"updateX": "Mise à jour {}", "updateX": "Mettre à jour {}",
"installX": "Installer {}", "installX": "Installer {}",
"markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\nas mis à jour", "markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\ncomme étant à jour",
"changeX": "Changer {}", "changeX": "Changer {}",
"installUpdateApps": "Installer/Mettre à jour les applications", "installUpdateApps": "Installer/Mettre à jour les applications",
"installUpdateSelectedApps": "Installer/Mettre à jour les applications sélectionnées", "installUpdateSelectedApps": "Installer/Mettre à jour les applications sélectionnées",
"markXSelectedAppsAsUpdated": "Marquer {} les applications sélectionnées comme mises à jour ?", "markXSelectedAppsAsUpdated": "Marquer les {} applications sélectionnées comme étant à jour ?",
"no": "Non", "no": "Non",
"yes": "Oui", "yes": "Oui",
"markSelectedAppsUpdated": "Marquer les applications sélectionnées comme mises à jour", "markSelectedAppsUpdated": "Marquer les application sélectionnées comme étant à jour",
"pinToTop": "Épingler en haut", "pinToTop": "Épingler en haut",
"unpinFromTop": "Détacher du haut", "unpinFromTop": "Désépingler du haut",
"resetInstallStatusForSelectedAppsQuestion": "Réinitialiser l'état d'installation des applications sélectionnées ?", "resetInstallStatusForSelectedAppsQuestion": "Réinitialiser l'état d'installation des applications sélectionnées ?",
"installStatusOfXWillBeResetExplanation": "L'état d'installation de toutes les applications sélectionnées sera réinitialisé.\n\nCela peut aider lorsque la version de l'application affichée dans Obtainium est incorrecte en raison d'échecs de mises à jour ou d'autres problèmes.", "installStatusOfXWillBeResetExplanation": "L'état d'installation de toutes les applications sélectionnées sera réinitialisé.\n\nCela peut être utile lorsque la version de l'application affichée dans Obtainium est incorrecte en raison de l'échec des mises à jour ou d'autres problèmes.",
"shareSelectedAppURLs": "Partager les URL d'application sélectionnées", "customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtainium est installé",
"resetInstallStatus": "Réinitialiser le statut d'installation", "shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML",
"shareSelectedAppURLs": "Partager les URL des applications sélectionnées",
"resetInstallStatus": "Réinitialiser l'état d'installation des applications",
"more": "Plus", "more": "Plus",
"removeOutdatedFilter": "Supprimer le filtre d'application obsolète", "removeOutdatedFilter": "Supprimer le filtre des applications obsolètes",
"showOutdatedOnly": "Afficher uniquement les applications obsolètes", "showOutdatedOnly": "Afficher uniquement les applications obsolètes",
"filter": "Filtre", "filter": "Filtre",
"filterActive": "Filtre *",
"filterApps": "Filtrer les applications", "filterApps": "Filtrer les applications",
"appName": "Nom de l'application", "appName": "Nom de l'application",
"author": "Auteur", "author": "Auteur",
"upToDateApps": "Applications à jour", "upToDateApps": "Applications à jour",
"nonInstalledApps": "Applications non installées", "nonInstalledApps": "Applications non installées",
"importExport": "Importer/Exporter", "importExport": "Importer/exporter",
"settings": "Paramètres", "settings": "Paramètres",
"exportedTo": "Exporté vers {}", "exportedTo": "Exporté vers {}",
"obtainiumExport": "Exportation d'Obtainium", "obtainiumExport": "Exporter la configuration d'Obtainium",
"invalidInput": "Entrée invalide", "invalidInput": "Entrée invalide",
"importedX": "Importé {}", "importedX": "Importé {}",
"obtainiumImport": "Importation d'Obtainium", "obtainiumImport": "Importer la configuration sur Obtainium",
"importFromURLList": "Importer à partir de la liste d'URL", "importFromURLList": "Importer depuis une liste d'URL",
"searchQuery": "Requête de recherche", "searchQuery": "Requête de recherche",
"appURLList": "Liste d'URL d'application", "appURLList": "Liste d'URL de l'application",
"line": "Queue", "line": "Ligne",
"searchX": "Rechercher {}", "searchX": "Sélectionner {}",
"noResults": "Aucun résultat trouvé", "noResults": "Aucun résultat",
"importX": "Importer {}", "importX": "Importation de {}",
"importedAppsIdDisclaimer": "Les applications importées peuvent s'afficher à tort comme \"Non installées\".\nPour résoudre ce problème, réinstallez-les via Obtainium.\nCela ne devrait pas affecter les données de l'application.\n\nN'affecte que les URL et les méthodes d'importation tierces.", "importedAppsIdDisclaimer": "Les applications importées peuvent s'afficher de manière incorrecte comme étant \"Non installées\".\nPour résoudre ce problème, réinstallez-les via Obtainium.\nCela n'affectera pas les données des applications.\n\nN'affecte que les méthodes d'importation d'URL et par des tiers.",
"importErrors": "Erreurs d'importation", "importErrors": "Erreurs lors de l'importation",
"importedXOfYApps": "{} sur {} applications importées.", "importedXOfYApps": "{} applications sur {} ont été importés.",
"followingURLsHadErrors": "Les URL suivantes comportaient des erreurs :", "followingURLsHadErrors": "Les URL suivants comportent des erreurs :",
"okay": "Okay", "selectURL": "Sélectionner l'URL",
"selectURL": "Sélectionnez l'URL", "selectURLs": "Sélectionner les URL",
"selectURLs": "Sélectionnez les URLs", "pick": "Choisir",
"pick": "Prendre",
"theme": "Thème", "theme": "Thème",
"dark": "Sombre", "dark": "Sombre",
"light": "Clair", "light": "Clair",
"followSystem": "Suivre le système", "followSystem": "Correspondre au système",
"obtainium": "Obtainium", "followSystemThemeExplanation": "Correspondre au thème du système est possible en utilisant des applications tierces.",
"materialYou": "Material You", "useBlackTheme": "Utiliser un thème Noir",
"useBlackTheme": "Use pure black dark theme", "appSortBy": "Trier les applications par",
"appSortBy": "Applications triées par",
"authorName": "Auteur/Nom", "authorName": "Auteur/Nom",
"nameAuthor": "Nom/Auteur", "nameAuthor": "Nom/Auteur",
"asAdded": "Comme ajouté", "asAdded": "Date d'ajout",
"appSortOrder": "Ordre de tri des applications", "appSortOrder": "Ordre de tri des applications",
"ascending": "Ascendant", "ascending": "Ascendant",
"descending": "Descendanr", "descending": "Descendant",
"bgUpdateCheckInterval": "Intervalle de vérification des mises à jour en arrière-plan", "bgUpdateCheckInterval": "Intervalle de recherche de mises à jour en arrière-plan",
"neverManualOnly": "Jamais - Manuel uniquement", "neverManualOnly": "Jamais - Manuellement uniquement",
"appearance": "Apparence", "appearance": "Apparence",
"showWebInAppView": "Afficher la page Web source dans la vue de l'application", "showWebInAppView": "Afficher la page Web source dans l'onglet 'Applications'",
"pinUpdates": "Épingler les mises à jour dans la vue Top des applications", "pinUpdates": "Épingler les mises à jour en haut de l'onglet 'Applications'",
"updates": "Mises à jour", "updates": "Mises à jour",
"sourceSpecific": "Spécifique à la source", "sourceSpecific": "Spécifique à la source",
"appSource": "Source de l'application", "appSource": "Source de l'application",
@ -142,30 +135,32 @@
"close": "Fermer", "close": "Fermer",
"share": "Partager", "share": "Partager",
"appNotFound": "Application introuvable", "appNotFound": "Application introuvable",
"obtainiumExportHyphenatedLowercase": "obtainium-export", "obtainiumExportHyphenatedLowercase": "export-obtainium",
"pickAnAPK": "Choisissez un APK", "pickAnAPK": "Selectionner un APK",
"appHasMoreThanOnePackage": "{} a plus d'un paquet :", "appHasMoreThanOnePackage": "{} a plus d'un paquet:",
"deviceSupportsXArch": "Votre appareil prend en charge l'architecture de processeur {}.", "deviceSupportsXArch": "Votre appareil prend en charge l'architecture CPU {}.",
"deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivantes :", "deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivants: ",
"warning": "Avertissement", "warning": "Avertissement",
"sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais le paquet de version provient de '{}'. Continuer?", "sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais le paquet de mise à jour provient de '{}'. Continuer ?",
"updatesAvailable": "Mises à jour disponibles", "updatesAvailable": "Mises à jour disponibles",
"updatesAvailableNotifDescription": "Avertit l'utilisateur que des mises à jour sont disponibles pour une ou plusieurs applications suivies par Obtainium", "updatesAvailableNotifDescription": "Notifie à l'utilisateur que des mises à jour sont disponibles pour une ou plusieurs applications suivies par Obtainium.",
"noNewUpdates": "Aucune nouvelle mise à jour.", "noNewUpdates": "Aucune nouvelle mise à jour.",
"xHasAnUpdate": "{} a une mise à jour.", "xHasAnUpdate": "{} a une mise à jour.",
"appsUpdated": "Applications mises à jour", "appsUpdated": "Applications mises à jour",
"appsUpdatedNotifDescription": "Avertit l'utilisateur que les mises à jour d'une ou plusieurs applications ont été appliquées en arrière-plan", "appsNotUpdated": "Échec de la mise à jour des applications",
"xWasUpdatedToY": "{} a été mis à jour pour {}.", "appsUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont été installées en arrière-plan.",
"errorCheckingUpdates": "Erreur lors de la vérification des mises à jour", "xWasUpdatedToY": "{} a été mis à jour en {}.",
"errorCheckingUpdatesNotifDescription": "Une notification qui s'affiche lorsque la vérification de la mise à jour en arrière-plan échoue", "xWasNotUpdatedToY": "Échec de la mise à jour de {} vers {}.",
"errorCheckingUpdates": "Erreur lors de la recherche de mises à jour",
"errorCheckingUpdatesNotifDescription": "Notifie l'utilisateur lorsque la recherche de mises à jour en arrière-plan échoue.",
"appsRemoved": "Applications supprimées", "appsRemoved": "Applications supprimées",
"appsRemovedNotifDescription": "Avertit l'utilisateur qu'une ou plusieurs applications ont été supprimées en raison d'erreurs lors de leur chargement", "appsRemovedNotifDescription": "Notifie à l'utilisateur qu'une ou plusieurs applications ont été supprimées en raison d'erreurs lors de leur chargement.",
"xWasRemovedDueToErrorY": "{} a été supprimé en raison de cette erreur : {}", "xWasRemovedDueToErrorY": "{} a été supprimée en raison de cette erreur : {}",
"completeAppInstallation": "Installation complète de l'application", "completeAppInstallation": "Installation complète de l'application",
"obtainiumMustBeOpenToInstallApps": "Obtainium doit être ouvert pour installer des applications", "obtainiumMustBeOpenToInstallApps": "Obtainium doit être ouvert pour installer les applications",
"completeAppInstallationNotifDescription": "Demande à l'utilisateur de retourner sur Obtainium pour terminer l'installation d'une application", "completeAppInstallationNotifDescription": "Demande à l'utilisateur de retourner sur Obtainium pour terminer l'installation d'une application",
"checkingForUpdates": "Vérification des mises à jour", "checkingForUpdates": "Recherche de mises à jour",
"checkingForUpdatesNotifDescription": "Notification transitoire qui apparaît lors de la recherche de mises à jour", "checkingForUpdatesNotifDescription": "Notification temporaire qui apparaît lors de la recherche de mises à jour",
"pleaseAllowInstallPerm": "Veuillez autoriser Obtainium à installer des applications", "pleaseAllowInstallPerm": "Veuillez autoriser Obtainium à installer des applications",
"trackOnly": "Suivi uniquement", "trackOnly": "Suivi uniquement",
"errorWithHttpStatusCode": "Erreur {}", "errorWithHttpStatusCode": "Erreur {}",
@ -173,95 +168,172 @@
"unknown": "Inconnu", "unknown": "Inconnu",
"none": "Aucun", "none": "Aucun",
"never": "Jamais", "never": "Jamais",
"latestVersionX": "Dernière version: {}", "latestVersionX": "Dernière version : {}",
"installedVersionX": "Version installée : {}", "installedVersionX": "Version installée : {}",
"lastUpdateCheckX": "Vérification de la dernière mise à jour : {}", "lastUpdateCheckX": "Dernière recherche de mises à jour : {}",
"remove": "Retirer", "remove": "Supprimer",
"yesMarkUpdated": "Oui, marquer comme mis à jour", "yesMarkUpdated": "Oui, marquer comme étant à jour",
"fdroid": "F-Droid Official", "fdroid": "F-Droid Officiel",
"appIdOrName": "ID ou nom de l'application", "appIdOrName": "ID ou nom de l'application",
"appId": "ID de l'application", "appId": "ID de l'application",
"appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom", "appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom",
"reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications", "reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications",
"fdroidThirdPartyRepo": "Dépôt tiers F-Droid", "fdroidThirdPartyRepo": "Dépôt tiers F-Droid",
"steam": "Steam",
"steamMobile": "Steam Mobile",
"steamChat": "Steam Chat",
"install": "Installer", "install": "Installer",
"markInstalled": "Marquer installée", "markInstalled": "Marquer comme étant installé",
"update": "Mettre à jour", "update": "Mettre à jour",
"markUpdated": "Marquer à jour", "markUpdated": "Marquer comme étant à jour",
"additionalOptions": "Options additionelles", "additionalOptions": "Options supplémentaires",
"disableVersionDetection": "Désactiver la détection de version", "disableVersionDetection": "Désactiver la détection de la version",
"noVersionDetectionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de version ne fonctionne pas correctement.", "noVersionDetectionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de la version ne fonctionne pas correctement.",
"downloadingX": "Téléchargement {}", "downloadingX": "Téléchargement {}",
"downloadNotifDescription": "Avertit l'utilisateur de la progression du téléchargement d'une application", "downloadX": "Télécharger {}",
"downloadedX": "Téléchargé {}",
"releaseAsset": "Version active",
"downloadNotifDescription": "Notifie l'utilisateur sur l'avancement du téléchargement d'une application",
"noAPKFound": "Aucun APK trouvé", "noAPKFound": "Aucun APK trouvé",
"noVersionDetection": "Pas de détection de version", "noVersionDetection": "Aucune version trouvée",
"categorize": "Catégoriser", "categorize": "Catégoriser",
"categories": "Catégories", "categories": "Catégories",
"category": "Catégorie", "category": "Catégorie",
"noCategory": "No Category", "noCategory": "Aucune catégorie",
"noCategories": "Aucune catégorie", "noCategories": "Aucune catégories",
"deleteCategoriesQuestion": "Supprimer les catégories ?", "deleteCategoriesQuestion": "Supprimer les catégories?",
"categoryDeleteWarning": "Toutes les applications dans les catégories supprimées seront définies sur non catégorisées.", "categoryDeleteWarning": "Toutes les applications des catégories supprimées seront définies comme non catégorisées .",
"addCategory": "Ajouter une catégorie", "addCategory": "Ajouter une catégorie",
"label": "Étiquette", "label": "Nom",
"language": "Langue", "language": "Langue",
"copiedToClipboard": "Copied to Clipboard", "copiedToClipboard": "Copié dans le presse-papier",
"storagePermissionDenied": "Autorisation de stockage refusée", "storagePermissionDenied": "Permission de stockage refusée",
"selectedCategorizeWarning": "Cela remplacera tous les paramètres de catégorie existants pour les applications sélectionnées.", "selectedCategorizeWarning": "Cela va remplacer toutes les catégories définies des applications sélectionnées.",
"filterAPKsByRegEx": "Filtrer les APK par expression régulière", "filterAPKsByRegEx": "Filtrer les APK par expression régulière",
"removeFromObtainium": "Supprimer d'Obtainium", "removeFromObtainium": "Supprimer d'Obtainium",
"uninstallFromDevice": "Désinstaller de l'appareil", "uninstallFromDevice": "Désinstaller de l'appareil",
"onlyWorksWithNonVersionDetectApps": "Fonctionne uniquement pour les applications avec la détection de version désactivée.", "onlyWorksWithNonVersionDetectApps": "Ne fonctionne que pour les applications dont la détection de la version est désactivée.",
"releaseDateAsVersion": "Utiliser la date de sortie comme version", "releaseDateAsVersion": "Utiliser la date de sortie comme version",
"releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de version ne fonctionne pas correctement, mais une date de sortie est disponible.", "releaseTitleAsVersion": "Utiliser le titre de la version comme chaîne de caractères de la version",
"changes": "Changements", "releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications pour lesquelles la détection de la version ne fonctionne pas correctement, mais dont une date de sortie est disponible.",
"changes": "Modifications",
"releaseDate": "Date de sortie", "releaseDate": "Date de sortie",
"importFromURLsInFile": "Importer à partir d'URL dans un fichier (comme OPML)", "importFromURLsInFile": "Importer à partir des URLs d'un fichier (comme OPML)",
"versionDetection": "Détection des versions", "versionDetectionExplanation": "Reporter la chaîne de version selon la version détectée par le système d'exploitation",
"standardVersionDetection": "Détection de version standard", "versionDetection": "Détection de la version",
"groupByCategory": "Group by Category", "standardVersionDetection": "Détection de la version standard",
"autoApkFilterByArch": "Attempt to filter APKs by CPU architecture if possible", "groupByCategory": "Grouper par catégorie",
"overrideSource": "Override Source", "autoApkFilterByArch": "Essayer de filtrer les APKs par architecture CPU si possible",
"dontShowAgain": "Don't show this again", "overrideSource": "Remplacer la source",
"dontShowTrackOnlyWarnings": "Don't Show the 'Track-Only' Warning", "dontShowAgain": "Ne plus afficher",
"dontShowAPKOriginWarnings": "Don't show APK origin warnings", "dontShowTrackOnlyWarnings": "Ne plus afficher les erreurs 'Suivi uniquement'",
"moveNonInstalledAppsToBottom": "Move non-installed Apps to bottom of Apps view", "dontShowAPKOriginWarnings": "Ne plus afficher les erreurs sur l'origine de l'APK",
"gitlabPATLabel": "GitLab Personal Access Token\n(Enables Search and Better APK Discovery)", "moveNonInstalledAppsToBottom": "Déplacer les applications non installées vers le bas de la vue Applications",
"about": "About", "gitlabPATLabel": "Jeton d'accès personnel GitLab",
"requiresCredentialsInSettings": "This needs additional credentials (in Settings)", "about": "À propos",
"checkOnStart": "Check for updates on startup", "requiresCredentialsInSettings": "{} a besoin d'un complément d'information (dans les Paramètres)",
"tryInferAppIdFromCode": "Try inferring App ID from source code", "checkOnStart": "Rechercher les mises à jour au démarrage",
"removeOnExternalUninstall": "Automatically remove externally uninstalled Apps", "tryInferAppIdFromCode": "Essayer de déduire l'identifiant de l'application à partir du code source",
"pickHighestVersionCode": "Auto-select highest version code APK", "removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées en externe",
"checkUpdateOnDetailPage": "Check for updates on opening an App detail page", "pickHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK",
"disablePageTransitions": "Disable page transition animations", "checkUpdateOnDetailPage": "Rechercher les mises à jour lors de l'ouverture de la page détaillée d'une application",
"reversePageTransitions": "Reverse page transition animations", "disablePageTransitions": "Désactiver les animations de transition de page",
"minStarCount": "Minimum Star Count", "reversePageTransitions": "Inverser les animations de transition de page",
"addInfoBelow": "Add this info below.", "minStarCount": "Nombre minimum d'étoiles",
"addInfoInSettings": "Add this info in the Settings.", "addInfoBelow": "Ajoutez cette information ci-dessous.",
"githubSourceNote": "GitHub rate limiting can be avoided using an API key.", "addInfoInSettings": "Ajoutez cette information dans les paramètres.",
"gitlabSourceNote": "GitLab APK extraction may not work without an API key.", "githubSourceNote": "La limitation du débit de GitHub peut être évitée à l'aide d'une clé d'API.",
"sortByFileNamesNotLinks": "Sort by file names instead of full links", "sortByLastLinkSegment": "Trier par le dernier segment du lien",
"filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", "filterReleaseNotesByRegEx": "Filtrer les notes de version par expression régulière",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "customLinkFilterRegex": "Filtre de lien APK personnalisé par expression régulière (par défaut '.apk$')",
"appsPossiblyUpdated": "Tentative de mise à jour des applications",
"appsPossiblyUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont potentiellement été appliquées en arrière-plan",
"xWasPossiblyUpdatedToY": "{} peut être mis à jour en {}.",
"enableBackgroundUpdates": "Activer les mises à jour en arrière-plan",
"backgroundUpdateReqsExplanation": "Les mises à jour en arrière-plan peuvent ne pas être possibles pour toutes les applications.",
"backgroundUpdateLimitsExplanation": "Le résultat d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.",
"verifyLatestTag": "Vérifier la balise 'latest'",
"intermediateLinkRegex": "Filtrer un lien 'intermédiaire' à visiter",
"filterByLinkText": "Filtrer les liens par texte du lien",
"intermediateLinkNotFound": "Lien intermédiaire introuvable",
"intermediateLink": "Lien intermédiaire",
"exemptFromBackgroundUpdates": "Exclure de la mise à jour en arrière-plan (si activé)",
"bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas en Wi-Fi",
"bgUpdatesWhileChargingOnly": "Désactiver les mises à jour en arrière-plan lorsque le véhicule n'est pas en charge",
"autoSelectHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK",
"versionExtractionRegEx": "Extraire la version par Expression régulière",
"trimVersionString": "Découper la version par Expression régulière",
"matchGroupToUseForX": "Groupe de correspondance à utiliser pour \"{}\"",
"matchGroupToUse": "Groupe de correspondance à utiliser pour l'extraction de la version par Expression régulière",
"highlightTouchTargets": "Mettre en évidence les touches moins évidentes",
"pickExportDir": "Selectionner le dossier d'exportation",
"autoExportOnChanges": "Exporter automatiquement lors de modifications",
"includeSettings": "Inclure les paramètres",
"filterVersionsByRegEx": "Filtrer les versions par expression régulière",
"trySelectingSuggestedVersionCode": "Essayer de sélectionner la version suggérée du code APK",
"dontSortReleasesList": "Conserver l'ordre de la version de l'API",
"reverseSort": "Tri inversé",
"takeFirstLink": "Utiliser le premier lien",
"skipSort": "Ignorer le tri",
"debugMenu": "Menu de déboggage",
"bgTaskStarted": "Tâche en arrière-plan démarrée - vérifier les journaux.",
"runBgCheckNow": "Exécuter la recherche de mise à jour en arrière-plan maintenant",
"versionExtractWholePage": "Appliquer l'extraction de la version par expression régulière à l'ensemble de la page",
"installing": "Installation",
"skipUpdateNotifications": "Ignorer les notifications de mise à jour",
"updatesAvailableNotifChannel": "Mises à jour disponibles",
"appsUpdatedNotifChannel": "Applications mises à jour",
"appsPossiblyUpdatedNotifChannel": "Essayer de mettre à jour les applications",
"errorCheckingUpdatesNotifChannel": "Erreur lors de la recherche de mises à jour",
"appsRemovedNotifChannel": "Applications supprimées",
"downloadingXNotifChannel": "Téléchargement {}",
"completeAppInstallationNotifChannel": "Installation complète de l'application",
"checkingForUpdatesNotifChannel": "Recherche de mises à jour",
"onlyCheckInstalledOrTrackOnlyApps": "Rechercher uniquement les mises à jour des applications installées et des applications 'Suivi uniquement'",
"supportFixedAPKURL": "Prise en charge des URL APK fixes",
"selectX": "Sélectionner {}",
"parallelDownloads": "Autoriser les téléchargements simultanés",
"useShizuku": "Utiliser Shizuku ou Sui pour l'installation",
"shizukuBinderNotFound": "Le service Shizuku est introuvable",
"shizukuOld": "Ancienne version de Shizuku (<11) - veuillez le mettre à jour",
"shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB - veuillez mettre à jour Android ou utiliser Sui à la place",
"shizukuPretendToBeGooglePlay": "Définir Google Play comme source d'installation (si Shizuku est utilisé)",
"useSystemFont": "Utiliser la police du système",
"useVersionCodeAsOSVersion": "Utiliser le code de version de l'application détectée par le système d'exploitation",
"requestHeader": "Intitulé de la demande",
"useLatestAssetDateAsReleaseDate": "Utiliser le dernier élément mis en ligne comme date de sortie",
"defaultPseudoVersioningMethod": "Méthode de version fictive par défaut",
"partialAPKHash": "Hash partiel de l'APK",
"APKLinkHash": "Hash du lien APK",
"directAPKLink": "Lien direct de l'APK",
"pseudoVersionInUse": "Version fictive utilisé",
"installed": "Installée",
"latest": "Dernière version",
"invertRegEx": "Inverser l'expression régulière",
"note": "Note",
"selfHostedNote": "La liste déroulante \"{}\" peut être utilisée pour accéder à des instances auto-hébergées/personnalisées de n'importe quelle source.",
"badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)",
"beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)",
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque tout est prêt.",
"wiki": "Aide/Wiki",
"crowdsourcedConfigsLabel": "Configuration d'applis communautaires (à utiliser à vos risques et périls)",
"crowdsourcedConfigsShort": "Applis communautaires",
"allowInsecure": "Autoriser les requêtes HTTP non sécurisées",
"stayOneVersionBehind": "Rester à une version de la dernière",
"refreshBeforeDownload": "Actualiser les détails de l'application avant de la télécharger",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Supprimer l'application ?", "one": "Supprimer l'application?",
"other": "Supprimer les applications ?" "other": "Supprimer les applications?"
}, },
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {
"one": "Trop de demandes (taux limité) - réessayez dans {} minute", "one": "Trop de requêtes (taux limité) - réessayez dans {} minute",
"other": "Trop de demandes (taux limité) - réessayez dans {} minutes" "other": "Trop de requêtes (taux limité) - réessayez dans {} minutes"
}, },
"bgUpdateGotErrorRetryInMinutes": { "bgUpdateGotErrorRetryInMinutes": {
"one": "La vérification de la mise à jour en arrière-plan a rencontré un {}, planifiera une nouvelle tentative de vérification dans {} minute", "one": "La recherche de mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative programmée dans {} minute",
"other": "La vérification de la mise à jour en arrière-plan a rencontré un {}, planifiera une nouvelle tentative de vérification dans {} minutes" "other": "La recherche de mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative programmée dans {} minutes"
}, },
"bgCheckFoundUpdatesWillNotifyIfNeeded": { "bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "La vérification des mises à jour en arrière-plan trouvée {} mise à jour - avertira l'utilisateur si nécessaire", "one": "La recherche de mises à jour en arrière-plan à trouvée {} mise à jour - l'utilisateur sera notifié si nécessaire",
"other": "La vérification des mises à jour en arrière-plan a trouvé {} mises à jour - avertira l'utilisateur si nécessaire" "other": "La recherche de mises à jour en arrière-plan à trouvée {} mises à jour - l'utilisateur sera notifié si nécessaire"
}, },
"apps": { "apps": {
"one": "{} Application", "one": "{} Application",
@ -269,7 +341,7 @@
}, },
"url": { "url": {
"one": "{} URL", "one": "{} URL",
"other": "{} URLs" "other": "{} URL"
}, },
"minute": { "minute": {
"one": "{} Minute", "one": "{} Minute",
@ -284,8 +356,8 @@
"other": "{} Jours" "other": "{} Jours"
}, },
"clearedNLogsBeforeXAfterY": { "clearedNLogsBeforeXAfterY": {
"one": "{n} journal effacé (avant = {before}, après = {after})", "one": "Nettoyage du journal {n} (avant = {before}, après = {after})",
"other": "{n} journaux effacés (avant = {before}, après = {after})" "other": "Nettoyage des journaux {n} (avant = {before}, après = {after})"
}, },
"xAndNMoreUpdatesAvailable": { "xAndNMoreUpdatesAvailable": {
"one": "{} et 1 autre application ont des mises à jour.", "one": "{} et 1 autre application ont des mises à jour.",
@ -293,6 +365,18 @@
}, },
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "{} et 1 autre application ont été mises à jour.", "one": "{} et 1 autre application ont été mises à jour.",
"other": "{} et {} autres applications ont été mises à jour." "other": "{} et {} autres applications ont étés mis à jour."
},
"xAndNMoreUpdatesFailed": {
"one": "Échec de la mise à jour de {} et 1 autre application.",
"other": "Échec de la mise à jour de {} et {} autres applications."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} et 1 autre application ont peut-être été mises à jour.",
"other": "{} et {} autres applications ont peut-être étés mis à jour."
},
"apk": {
"one": "{} APK",
"other": "{} APKs"
} }
} }

View File

@ -1,297 +1,382 @@
{ {
"invalidURLForSource": "Érvénytelen a(z) {} app URL-je", "invalidURLForSource": "Érvénytelen a(z) {} alkalmazás webcíme",
"noReleaseFound": "Nem található megfelelő kiadás", "noReleaseFound": "Nem található megfelelő kiadás",
"noVersionFound": "Nem sikerült meghatározni a kiadás verzióját", "noVersionFound": "Nem sikerült meghatározni a kiadás verzióját",
"urlMatchesNoSource": "Az URL nem egyezik ismert forrással", "urlMatchesNoSource": "A webcím nem egyezik egyetlen ismert forrással sem",
"cantInstallOlderVersion": "Nem telepíthető egy app régebbi verziója", "cantInstallOlderVersion": "Nem telepíthető egy alkalmazás régebbi verziója",
"appIdMismatch": "A letöltött csomagazonosító nem egyezik a meglévő app azonosítóval", "appIdMismatch": "A letöltött csomagazonosító nem egyezik a meglévő alkalmazás azonosítóval",
"functionNotImplemented": "Ez az osztály nem valósította meg ezt a függvényt", "functionNotImplemented": "Ebben az ágban nincs implementálva ez a funkció",
"placeholder": "Helykitöltő", "placeholder": "Helyőrző",
"someErrors": "Néhány hiba történt", "someErrors": "Néhány hiba történt",
"unexpectedError": "Váratlan hiba", "unexpectedError": "Váratlan hiba",
"ok": "O", "ok": "OK",
"and": "és", "and": "és",
"startedBgUpdateTask": "Háttérfrissítés ellenőrzési feladat elindítva", "githubPATLabel": "GitHub személyes hozzáférési token (megnöveli a lekérdezés-korlátozást)",
"bgUpdateIgnoreAfterIs": "Háttérfrissítés ignoreAfter a következő: {}", "includePrereleases": "Tartalmazza az előzetes kiadásokat",
"startedActualBGUpdateCheck": "Elkezdődött a tényleges háttérfrissítés ellenőrzése", "fallbackToOlderReleases": "Visszatérés a régebbi kiadásokhoz",
"bgUpdateTaskFinished": "A háttérfrissítés ellenőrzési feladat befejeződött", "filterReleaseTitlesByRegEx": "A kiadás címeinek szűrése reguláris kifejezéssel",
"firstRun": "Ez az Obtainium első futása", "invalidRegEx": "Érvénytelen reguláris kifejezés",
"settingUpdateCheckIntervalTo": "A frissítési intervallum beállítása erre: {}", "noDescription": "Nincs leírás",
"githubPATLabel": "GitHub Personal Access Token (megnöveli a díjkorlátot)", "cancel": "Mégse",
"githubPATHint": "A PAT-nak a következő formátumban kell lennie: felhasználónév:token", "continue": "Folytatás",
"githubPATFormat": "felhasználónév:token", "requiredInBrackets": "(Szükséges)",
"includePrereleases": "Tartalmazza az előzetes kiadásokat", "dropdownNoOptsError": "HIBA: A LEGÖRDÜLŐ LISTÁNAK LEGALÁBB EGY OPCIÓVAL KELL RENDELKEZNIE",
"fallbackToOlderReleases": "Visszatérés a régebbi kiadásokhoz", "colour": "Szín",
"filterReleaseTitlesByRegEx": "A kiadás címeinek szűrése reguláris kifejezéssel", "standard": "Általános",
"invalidRegEx": "Érvénytelen reguláris kifejezés", "custom": "Egyéni",
"noDescription": "Nincs leírás", "useMaterialYou": "Material You használata",
"cancel": "Mégse", "githubStarredRepos": "Csillagozott GitHub tárolók",
"continue": "Tovább", "uname": "Felhasználónév",
"requiredInBrackets": "(Kötelező)", "wrongArgNum": "A megadott argumentumok száma nem megfelelő",
"dropdownNoOptsError": "HIBA: A LEDOBÁST LEGALÁBB EGY OPCIÓHOZ KELL RENDELNI", "xIsTrackOnly": "A(z) {} csak nyomon-követhető",
"colour": "Szín", "source": "Forrás",
"githubStarredRepos": "GitHub Csillagos Repo-k", "app": "Alkalmazás",
"uname": "Felh.név", "appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások „csak nyomon-követhetők”.",
"wrongArgNum": "Rossz számú argumentumot adott meg", "youPickedTrackOnly": "„Csak nyomon-követés” opciót választotta.",
"xIsTrackOnly": "A(z) {} csak nyomonkövethető", "trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.",
"source": "Forrás", "cancelled": "Visszavonva",
"app": "App", "appAlreadyAdded": "Az alkalmazás már hozzá van adva",
"appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások 'Csak nyomon követhetőek'.", "alreadyUpToDateQuestion": "Az alkalmazás már naprakész?",
"youPickedTrackOnly": "A 'Csak követés' opciót választotta.", "addApp": "Hozzáadás",
"trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.", "appSourceURL": "Alkalmazás forrásának webcíme",
"cancelled": "Törölve", "error": "Hiba",
"appAlreadyAdded": "Az app már hozzáadva", "add": "Hozzáadás",
"alreadyUpToDateQuestion": "Az app már naprakész?", "searchSomeSourcesLabel": "Keresés (csak bizonyos források)",
"addApp": "App hozzáadás", "search": "Keresés",
"appSourceURL": "App forrás URL", "additionalOptsFor": "További lehetőségek a következőhöz: {}",
"error": "Hiba", "supportedSources": "Támogatott források",
"add": "Hozzáadás", "trackOnlyInBrackets": "(Csak nyomon-követés)",
"searchSomeSourcesLabel": "Keresés (csak egyes források)", "searchableInBrackets": "(Kereshető)",
"search": "Keresés", "appsString": "Alkalmazások",
"additionalOptsFor": "További lehetőségek a következőhöz: {}", "noApps": "Nincsenek alkalmazások",
"supportedSourcesBelow": "Támogatott források:", "noAppsForFilter": "Nincsenek alkalmazások a szűrőhöz",
"trackOnlyInBrackets": "(Csak nyomonkövetés)", "byX": "Fejlesztő: {}",
"searchableInBrackets": "(Kereshető)", "percentProgress": "Folyamat: {}%",
"appsString": "Appok", "pleaseWait": "Kis türelmet",
"noApps": "Nincs App", "updateAvailable": "Frissítés érhető el",
"noAppsForFilter": "Nincsenek appok a szűrőhöz", "notInstalled": "Nem telepített",
"byX": "Fejlesztő: {}", "pseudoVersion": "pszeudoverzió",
"percentProgress": "Folyamat: {}%", "selectAll": "Összes kiválasztása",
"pleaseWait": "Kis türelmet", "deselectX": "A(z) {} kiválasztásának elvetése",
"updateAvailable": "Frissítés érhető el", "xWillBeRemovedButRemainInstalled": "A(z) {} el lesz távolítva az Obtainiumból, de továbbra is telepítve marad az eszközön.",
"estimateInBracketsShort": "(Becsült)", "removeSelectedAppsQuestion": "A kiválasztott alkalmazások eltávolítása?",
"notInstalled": "Nem telepített", "removeSelectedApps": "A kiválasztott alkalmazások eltávolítása",
"estimateInBrackets": "(Becslés)", "updateX": "{} frissítése",
"selectAll": "Mindet kiválaszt", "installX": "{} telepítése",
"deselectN": "Törölje {} kijelölését", "markXTrackOnlyAsUpdated": "Megjelölés: {}\n(Csak nyomon-követés)\nFrissítettként",
"xWillBeRemovedButRemainInstalled": "A(z) {} el lesz távolítva az Obtainiumból, de továbbra is telepítve marad az eszközön.", "changeX": "{}-változás",
"removeSelectedAppsQuestion": "Eltávolítja a kiválasztott appokat?", "installUpdateApps": "Alkalmazások telepítése/frissítése",
"removeSelectedApps": "Távolítsa el a kiválasztott appokat", "installUpdateSelectedApps": "A kiválasztott alkalmazások telepítése/frissítése",
"updateX": "Frissítés: {}", "markXSelectedAppsAsUpdated": "A(z) {} kiválasztott alkalmazás megjelölése frissítettként?",
"installX": "Telepítés: {}", "no": "Nem",
"markXTrackOnlyAsUpdated": "Jelölje meg: {}\n(Csak nyomon követhető)\nmint Frissített", "yes": "Igen",
"changeX": "Változás {}", "markSelectedAppsUpdated": "A kiválasztott alkalmazások megjelölése frissítettként",
"installUpdateApps": "Appok telepítése/frissítése", "pinToTop": "Kitűzés felülre",
"installUpdateSelectedApps": "Telepítse/frissítse a kiválasztott appokat", "unpinFromTop": "Kitűzés megszüntetése",
"markXSelectedAppsAsUpdated": "Megjelöl {} kiválasztott alkalmazást frissítettként?", "resetInstallStatusForSelectedAppsQuestion": "Visszaállítja a kiválasztott alkalmazások telepítési állapotát?",
"no": "Nem", "installStatusOfXWillBeResetExplanation": "A kiválasztott alkalmazások telepítési állapota visszaáll.\n\nEz akkor segíthet, ha az Obtainiumban megjelenített alkalmazás-verzió hibás, a frissítések vagy egyéb problémák miatt.",
"yes": "Igen", "customLinkMessage": "Ezek a hivatkozások a telepített Obtainiummal rendelkező eszközökön működnek",
"markSelectedAppsUpdated": "Jelölje meg a kiválasztott appokat frissítettként", "shareAppConfigLinks": "Alkalmazás-konfiguráció megosztása HTML-hivatkozásként",
"pinToTop": "Rögzítés felülre", "shareSelectedAppURLs": "A kiválasztott alkalmazás hivatkozásának megosztása",
"unpinFromTop": "Eltávolít felülről", "resetInstallStatus": "Telepítési állapot visszaállítása",
"resetInstallStatusForSelectedAppsQuestion": "Visszaállítja a kiválasztott appok telepítési állapotát?", "more": "További",
"installStatusOfXWillBeResetExplanation": "A kiválasztott appok telepítési állapota visszaáll.\n\nEz akkor segíthet, ha az Obtainiumban megjelenített app verzió hibás, frissítések vagy egyéb problémák miatt.", "removeOutdatedFilter": "Elavult alkalmazás-szűrő eltávolítása",
"shareSelectedAppURLs": "Ossza meg a kiválasztott app URL címeit", "showOutdatedOnly": "Csak az elavult alkalmazások megjelenítése",
"resetInstallStatus": "Telepítési állapot visszaállítása", "filter": "Szűrő",
"more": "További", "filterApps": "Alkalmazások szűrése",
"removeOutdatedFilter": "Távolítsa el az elavult app szűrőt", "appName": "Név",
"showOutdatedOnly": "Csak az elavult appok megjelenítése", "author": "Szerző",
"filter": "Szűrő", "upToDateApps": "Naprakész alkalmazások",
"filterActive": "Szűrő *", "nonInstalledApps": "Nem telepített alkalmazások",
"filterApps": "Appok szűrése", "importExport": "Adatmozgatás",
"appName": "App név", "settings": "Beállítások",
"author": "Szerző", "exportedTo": "Exportálva ide: {}",
"upToDateApps": "Naprakész appok", "obtainiumExport": "Obtainium-adatok exportálása",
"nonInstalledApps": "Nem telepített appok", "invalidInput": "Hibás bemenet",
"importExport": "Importálás/Exportálás", "importedX": "Importálva innen: {}",
"settings": "Beállítások", "obtainiumImport": "Obtainium-adatok importálása",
"exportedTo": "Exportálva ide {}", "importFromURLList": "Importálás webcímlistából",
"obtainiumExport": "Obtainium Adat Exportálás", "searchQuery": "Keresési lekérdezés",
"invalidInput": "Hibás bemenet", "appURLList": "Alkalmazás-webcímlista",
"importedX": "Importálva innen {}", "line": "Sor",
"obtainiumImport": "Obtainium Adat Importálás", "searchX": "{} keresése",
"importFromURLList": "Importálás URL listából", "noResults": "Nincs találat",
"searchQuery": "Keresési lekérdezés", "importX": "{} importálása",
"appURLList": "App URL lista", "importedAppsIdDisclaimer": "Előfordulhat, hogy az importált alkalmazások helytelenül „Nincs telepítve” jelzéssel jelennek meg.\nA probléma megoldásához telepítse újra őket az Obtainiumon keresztül.\nEz nem érinti az alkalmazásadatokat.\n\nCsak a webcímekre és a harmadik féltől származó importálási módszerekre vonatkozik.",
"line": "Sor", "importErrors": "Importálási hibák",
"searchX": "Keresés {}", "importedXOfYApps": "{}/{} alkalmazás importálva.",
"noResults": "Nincs találat", "followingURLsHadErrors": "A következő webcímek hibákat tartalmaztak:",
"importX": "Import {}", "selectURL": "Webcím kiválasztása",
"importedAppsIdDisclaimer": "Előfordulhat, hogy az importált appok helytelenül \"Nincs telepítve\" jelzéssel jelennek meg.\nA probléma megoldásához telepítse újra őket az Obtainiumon keresztül.\nEz nem érinti az alkalmazásadatokat.\n\nCsak az URL-ekre és a harmadik féltől származó importálási módszerekre vonatkozik..", "selectURLs": "Webcímek kiválasztása",
"importErrors": "Importálási hibák", "pick": "Kiválasztás",
"importedXOfYApps": "{}/{} app importálva.", "theme": "Téma",
"followingURLsHadErrors": "A következő URL-ek hibákat tartalmaztak:", "dark": "Sötét",
"okay": "Oké", "light": "Világos",
"selectURL": "Válassza ki az URL-t", "followSystem": "Rendszerbeállítás használata",
"selectURLs": "Kiválasztott URL-ek", "followSystemThemeExplanation": "A következő rendszer téma csak harmadik féltől származó alkalmazások használatával lehetséges",
"pick": "Válasszon", "useBlackTheme": "Használjon teljesen fekete sötét témát",
"theme": "Téma", "appSortBy": "Rendezési szempont",
"dark": "Sötét", "authorName": "Szerző/Név",
"light": "Világos", "nameAuthor": "Név/Szerző",
"followSystem": "Rendszer szerint", "asAdded": "Hozzáadás dátuma",
"obtainium": "Obtainium", "appSortOrder": "Rendezési sorrend",
"materialYou": "Material You", "ascending": "Növekvő",
"useBlackTheme": "Használjon tiszta fekete sötét témát", "descending": "Csökkenő",
"appSortBy": "App rendezés...", "bgUpdateCheckInterval": "Időtartam a frissítések háttérellenőrzése között",
"authorName": "Szerző/Név", "neverManualOnly": "Soha csak kézi",
"nameAuthor": "Név/Szerző", "appearance": "Megjelenés",
"asAdded": "Mint Hozzáadott", "showWebInAppView": "Forrás megjelenítése az alkalmazásnézetben",
"appSortOrder": "Appok rendezése", "pinUpdates": "Frissítések kitűzése az alkalmazásnézet tetejére",
"ascending": "Emelkedő", "updates": "Frissítések",
"descending": "Csökkenő", "sourceSpecific": "Forrásspecifikus",
"bgUpdateCheckInterval": "Háttérfrissítés ellenőrzés időköze", "appSource": "Alkalmazás forrása",
"neverManualOnly": "Soha csak manuális", "noLogs": "Nincsenek naplók",
"appearance": "Megjelenés", "appLogs": "Alkalmazásnaplók",
"showWebInAppView": "Forrás megjelenítése az Appok nézetben", "close": "Bezárás",
"pinUpdates": "Frissítések kitűzése az App nézet tetejére", "share": "Megosztás",
"updates": "Frissítések", "appNotFound": "Az alkalmazás nem található",
"sourceSpecific": "Forrás-specifikus", "obtainiumExportHyphenatedLowercase": "obtainium-adat",
"appSource": "App forrás", "pickAnAPK": "Válasszon egy APK-t",
"noLogs": "Nincsenek naplók", "appHasMoreThanOnePackage": "A(z) {} egynél több csomaggal rendelkezik:",
"appLogs": "App naplók", "deviceSupportsXArch": "Ez az eszköz támogatja a(z) {} CPU architektúrát.",
"close": "Bezárás", "deviceSupportsFollowingArchs": "Ez az eszköz a következő CPU architektúrákat támogatja:",
"share": "Megosztás", "warning": "Figyelem",
"appNotFound": "App nem található", "sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása a(z) „{}” tároló, de a kiadási csomag innen származik: „{}”. Folytatja?",
"obtainiumExportHyphenatedLowercase": "obtainium-export", "updatesAvailable": "Frissítések érhetők el",
"pickAnAPK": "Válasszon egy APK-ot", "updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy egy vagy több, az Obtainium által nyomon-követett alkalmazáshoz frissítések állnak rendelkezésre",
"appHasMoreThanOnePackage": "A(z) {} egynél több csomaggal rendelkezik:", "noNewUpdates": "Nincsenek új frissítések.",
"deviceSupportsXArch": "Eszköze támogatja a {} CPU architektúrát.", "xHasAnUpdate": "A(z) {} frissítést kapott.",
"deviceSupportsFollowingArchs": "Az eszköze a következő CPU architektúrákat támogatja:", "appsUpdated": "Alkalmazások frissítve",
"warning": "Figyelem", "appsNotUpdated": "Nem sikerült frissíteni az alkalmazásokat",
"sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása „{}”, de a kiadási csomag innen származik: „{}”. Folytatja?", "appsUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése a háttérben történt.",
"updatesAvailable": "Frissítések érhetők el", "xWasUpdatedToY": "A(z) {} frissítve lett a következőre: {}.",
"updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy frissítések állnak rendelkezésre egy vagy több, az Obtainium által nyomon követett alkalmazáshoz", "xWasNotUpdatedToY": "Nem sikerült frissíteni a következőt: {}, erre: {}.",
"noNewUpdates": "Nincsenek új frissítések.", "errorCheckingUpdates": "Hiba a frissítések ellenőrzésekor",
"xHasAnUpdate": "A(z) {} frissítést kapott.", "errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, amikor a frissítések ellenőrzése a háttérben nem sikerül",
"appsUpdated": "Alkalmazások frissítve", "appsRemoved": "Alkalmazások eltávolítva",
"appsUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy/több app frissítése megrnt a háttérben", "appsRemovedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás egy bels közbeni hiba miatt el lesz(nek) távolítva",
"xWasUpdatedToY": "{} frissítve a következőre: {}.", "xWasRemovedDueToErrorY": "A(z) {} el lett távolítva a következő hiba miatt: {}",
"errorCheckingUpdates": "Hiba a frissítések keresésekor", "completeAppInstallation": "Teljes alkalmazástelepítés",
"errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, ha a háttérbeli frissítések ellenőrzése sikertelen", "obtainiumMustBeOpenToInstallApps": "Az alkalmazások telepítéséhez az Obtainiumnak megnyitva kell lennie",
"appsRemoved": "Alkalmazások eltávolítva", "completeAppInstallationNotifDescription": "Megkéri a felhasználót, hogy térjen vissza az Obtainiumhoz, hogy befejezze az alkalmazás telepítését",
"appsRemovedNotifDescription": "Értesíti a felhasználót egy vagy több alkalmazás eltávolításáról a betöltésük során fellépő hibák miatt", "checkingForUpdates": "Frissítések ellenőrzése",
"xWasRemovedDueToErrorY": "A(z) {} a következő hiba miatt lett eltávolítva: {}", "checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések ellenőrzésekor jelenik meg",
"completeAppInstallation": "Teljes app telepítés", "pleaseAllowInstallPerm": "Engedélyezze az Obtainiumnak az alkalmazások telepítését",
"obtainiumMustBeOpenToInstallApps": "Az Obtainiumnak megnyitva kell lennie az alkalmazások telepítéséhez", "trackOnly": "Csak nyomon-követés",
"completeAppInstallationNotifDescription": "Megkéri a felhasználót, hogy térjen vissza az Obtainiumhoz, hogy befejezze az alkalmazás telepítését", "errorWithHttpStatusCode": "Hiba {}",
"checkingForUpdates": "Frissítések keresése", "versionCorrectionDisabled": "Verzió-korrekció letiltva (úgy tűnik, hogy a bővítmény nem működik)",
"checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések keresésekor jelenik meg", "unknown": "Ismeretlen",
"pleaseAllowInstallPerm": "Kérjük, engedélyezze az Obtainiumnak az alkalmazások telepítését", "none": "Semmi",
"trackOnly": "Csak követés", "never": "Soha",
"errorWithHttpStatusCode": "Hiba {}", "latestVersionX": "Legújabb verzió: {}",
"versionCorrectionDisabled": "Verzió korrekció letiltva (úgy tűnik, a beépülő modul nem működik)", "installedVersionX": "Telepített verzió: {}",
"unknown": "Ismeretlen", "lastUpdateCheckX": "Frissítések utoljára ellenőrizve: {}",
"none": "Egyik sem", "remove": "Eltávolítás",
"never": "Soha", "yesMarkUpdated": "Igen, megjelölés frissítettként",
"latestVersionX": "Legújabb verzió: {}", "fdroid": "F-Droid hivatalos",
"installedVersionX": "Telepített verzió: {}", "appIdOrName": "Az alkalmazás-azonosító vagy név",
"lastUpdateCheckX": "Frissítés ellenőrizve: {}", "appId": "Alkalmazás-azonosító",
"remove": "Eltávolítás", "appWithIdOrNameNotFound": "Nem található alkalmazás ezzel az azonosítóval vagy névvel",
"yesMarkUpdated": "Igen, megjelölés frissítettként", "reposHaveMultipleApps": "A tárolók több alkalmazást is tartalmazhatnak",
"fdroid": "F-Droid Official", "fdroidThirdPartyRepo": "F-Droid harmadik féltől származó tároló",
"appIdOrName": "App ID vagy név", "install": "Telepítés",
"appId": "App ID", "markInstalled": "Telepítettnek jelölés",
"appWithIdOrNameNotFound": "Nem található app ezzel az azonosítóval vagy névvel", "update": "Frissítés",
"reposHaveMultipleApps": "A repók több alkalmazást is tartalmazhatnak", "markUpdated": "Frissítettnek jelölés",
"fdroidThirdPartyRepo": "F-Droid Harmadik-fél Repo", "additionalOptions": "További beállítások",
"steam": "Steam", "disableVersionDetection": "Verzió-érzékelés letiltása",
"steamMobile": "Steam Mobile", "noVersionDetectionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzió-érzékelés nem működik megfelelően.",
"steamChat": "Steam Chat", "downloadingX": "{} letöltése",
"install": "Telepít", "downloadX": "{} letöltése",
"markInstalled": "Telepítettnek jelöl", "downloadedX": "{} letöltve",
"update": "Frissít", "releaseAsset": "Kiadási csomag",
"markUpdated": "Frissítettnek jelöl", "downloadNotifDescription": "Értesíti a felhasználót az alkalmazás letöltésének előrehaladásáról",
"additionalOptions": "További lehetőségek", "noAPKFound": "Nem található APK",
"disableVersionDetection": "Verzió érzékelés letiltása", "noVersionDetection": "Nincs verzió-érzékelés",
"noVersionDetectionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzióérzékelés nem működik megfelelően.", "categorize": "Kategorizálás",
"downloadingX": "{} letöltés", "categories": "Kategóriák",
"downloadNotifDescription": "Értesíti a felhasználót az app letöltésének előrehaladásáról", "category": "Kategória",
"noAPKFound": "Nem található APK", "noCategory": "Nincs kategória",
"noVersionDetection": "Nincs verzió érzékelés", "noCategories": "Nincsenek kategóriák",
"categorize": "Kategorizálás", "deleteCategoriesQuestion": "Törli a kategóriákat?",
"categories": "Kategóriák", "categoryDeleteWarning": "A törölt kategóriákban lévő összes alkalmazás kategorizálatlanná válik.",
"category": "Kategória", "addCategory": "Kategória hozzáadása",
"noCategory": "Nincs kategória", "label": "Címke",
"deleteCategoryQuestion": "Törli a kategóriát?", "language": "Nyelv",
"categoryDeleteWarning": "A(z) {} összes app kategorizálatlan állapotba kerül.", "copiedToClipboard": "Másolva a vágólapra",
"addCategory": "Új kategória", "storagePermissionDenied": "Tárhely engedély megtagadva",
"label": "Címke", "selectedCategorizeWarning": "Ez felváltja a kiválasztott alkalmazások meglévő kategória-beállításait.",
"language": "Nyelv", "filterAPKsByRegEx": "Az APK-k szűrése reguláris kifejezéssel",
"copiedToClipboard": "Másolva a vágólapra", "removeFromObtainium": "Eltávolítás az Obtainiumból",
"storagePermissionDenied": "Tárhely engedély megtagadva", "uninstallFromDevice": "Eltávolítás az eszközről",
"selectedCategorizeWarning": "Ez felváltja a kiválasztott alkalmazások meglévő kategória-beállításait.", "onlyWorksWithNonVersionDetectApps": "Csak azoknál az alkalmazásoknál működik, amelyeknél a verzió-érzékelés le van tiltva.",
"filterAPKsByRegEx": "Az APK-ok szűrése reguláris kifejezéssel", "releaseDateAsVersion": "Használja a kiadás dátumát verzió-karakterláncként",
"removeFromObtainium": "Eltávolítás az Obtainiumból", "releaseTitleAsVersion": "Használja a kiadás címét verzió-karakterláncként",
"uninstallFromDevice": "Eltávolítás a készülékről", "releaseDateAsVersionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzió-érzékelés nem működik megfelelően, de elérhető a kiadás dátuma.",
"onlyWorksWithNonVersionDetectApps": "Csak azoknál az alkalmazásoknál működik, amelyeknél a verzióérzékelés le van tiltva.", "changes": "Változáslista",
"releaseDateAsVersion": "Használja a Kiadás dátumát, mint verziót", "releaseDate": "Kiadás dátuma",
"releaseDateAsVersionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzió érzékelése nem működik megfelelően, de elérhető a kiadás dátuma.", "importFromURLsInFile": "Importálás fájlban található webcímből (pl. OPML)",
"changes": "Változtatások", "versionDetectionExplanation": "A verzió-karakterlánc egyeztetése az rendszer által érzékelt verzióval",
"releaseDate": "Kiadás dátuma", "versionDetection": "Verzió-érzékelés",
"importFromURLsInFile": "Importálás fájlban található URL-ből (mint pl. OPML)", "standardVersionDetection": "Alapértelmezett verzió-érzékelés",
"versionDetection": "Verzió érzékelés", "groupByCategory": "Csoportosítás kategória alapján",
"standardVersionDetection": "Alapért. verzió érzékelés", "autoApkFilterByArch": "Ha lehetséges, próbálja CPU architektúra szerint szűrni az APK-kat",
"groupByCategory": "Csoportosítás Kategória alapján", "overrideSource": "Forrás felülírása",
"autoApkFilterByArch": "Ha lehetséges, próbálja CPU architektúra szerint szűrni az APK-okat", "dontShowAgain": "Ne jelenítse meg ezt többé",
"overrideSource": "Forrás felülbírálása", "dontShowTrackOnlyWarnings": "Ne jelenítse meg a „Csak nyomon-követés” figyelmeztetést",
"dontShowAgain": "Ne mutassa ezt újra", "dontShowAPKOriginWarnings": "Ne jelenítse meg az APK eredetére vonatkozó figyelmeztetéseket",
"dontShowTrackOnlyWarnings": "Ne jelenítsen meg 'Csak nyomon követés' figyelmeztetést", "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített alkalmazásokat az alkalmazásnézet aljára",
"dontShowAPKOriginWarnings": "Ne jelenítsen meg az APK eredetére vonatkozó figyelmeztetéseket", "gitlabPATLabel": "GitLab személyes hozzáférési token",
"moveNonInstalledAppsToBottom": "Helyezze át a nem telepített appokat az App nézet aljára", "about": "Névjegy",
"gitlabPATLabel": "GitLab Personal Access Token\n(Engedélyezi a Keresést és jobb APK felfedezés)", "requiresCredentialsInSettings": "A(z) {} alkalmazásnak további hitelesítő adatokra van szüksége (a beállításokban)",
"about": "Rólunk", "checkOnStart": "Frissítések ellenőrzése az alkalmazás megnyitásakor",
"requiresCredentialsInSettings": "Ehhez további hitelesítő adatokra van szükség (a Beállításokban)", "tryInferAppIdFromCode": "Próbálja meg kikövetkeztetni az alkalmazás azonosítóját a forráskódból",
"checkOnStart": "Egyszer az alkalmazás indításakor is", "removeOnExternalUninstall": "A külsőleg eltávolított alkalmazások automatikus eltávolítása",
"tryInferAppIdFromCode": "Próbálja kikövetkeztetni az app azonosítót a forráskódból", "pickHighestVersionCode": "A legmagasabb verziószámú APK automatikus kiválasztása",
"removeOnExternalUninstall": "A külsőleg eltávolított appok auto. eltávolítása", "checkUpdateOnDetailPage": "Frissítések ellenőrzése az alkalmazás részleteit tartalmazó oldal megnyitásakor",
"pickHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", "disablePageTransitions": "Lap áttűnési animációk letiltása",
"checkUpdateOnDetailPage": "Frissítések keresése az app részleteit tartalmazó oldal megnyitásakor", "reversePageTransitions": "Fordított lap áttűnési animációk",
"disablePageTransitions": "Lap áttűnési animációk letiltása", "minStarCount": "Minimális csillagozási szám",
"reversePageTransitions": "Fordított lap áttűnési animációk", "addInfoBelow": "Adja hozzá ezt az információt alább.",
"minStarCount": "Minimális csillag szám", "addInfoInSettings": "Adja hozzá ezt az információt a beállításokban.",
"addInfoBelow": "Adja hozzá ezt az infót alább.", "githubSourceNote": "A GitHub/GitLab lekérdezés-korlátos elkerülhető egy API-kulcs használatával.",
"addInfoInSettings": "Adja hozzá ezt az infót a Beállításokban.", "sortByLastLinkSegment": "Rendezés csak a hivatkozás utolsó szakasza szerint",
"githubSourceNote": "A GitHub sebességkorlátozás elkerülhető API-kulcs használatával.", "filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel",
"gitlabSourceNote": "Előfordulhat, hogy a GitLab APK kibontása nem működik API-kulcs nélkül.", "customLinkFilterRegex": "Egyéni APK-hivatkozásszűrő reguláris kifejezéssel (Alapértelmezett „.apk$”)",
"sortByFileNamesNotLinks": "Fájlnevek szerinti elrendezés teljes linkek helyett", "appsPossiblyUpdated": "Megkísérelt alkalmazás-frissítések",
"filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel", "appsPossiblyUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése lehetséges a háttérben",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "xWasPossiblyUpdatedToY": "A(z) {} frissülhetett a következőre: {}.",
"removeAppQuestion": { "enableBackgroundUpdates": "Háttérfrissítések engedélyezése",
"one": "Eltávolítja az alkalmazást?", "backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden alkalmazásnál lehetséges a háttérbeli frissítés.",
"other": "Eltávolítja az alkalmazást?" "backgroundUpdateLimitsExplanation": "A háttérben történő telepítés sikeressége csak az Obtainium megnyitásakor állapítható meg.",
}, "verifyLatestTag": "Ellenőrizze a „legújabb” címkét",
"tooManyRequestsTryAgainInMinutes": { "intermediateLinkRegex": "Szűrő egy „köztes” hivatkozás felkereséséhez",
"one": "Túl sok kérés (korlátozott arány) próbálja újra {} perc múlva", "filterByLinkText": "Hivatkozások szűrése hivatkozásszöveg alapján",
"other": "Túl sok kérés (korlátozott arány) próbálja újra {} perc múlva" "intermediateLinkNotFound": "Köztes hivatkozás nem található",
}, "intermediateLink": "Köztes hivatkozás",
"bgUpdateGotErrorRetryInMinutes": { "exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)",
"one": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást", "bgUpdatesOnWiFiOnly": "Háttérfrissítések letiltása, amikor az eszköz nem csatlakozik a Wi-Fi-hez",
"other": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást" "bgUpdatesWhileChargingOnly": "Háttérfrissítések letiltása, amikor az eszköz nincs a töltőn",
}, "autoSelectHighestVersionCode": "A legmagasabb verziókódú APK automatikus kiválasztása",
"bgCheckFoundUpdatesWillNotifyIfNeeded": { "versionExtractionRegEx": "Verzió-karakterlánc kivonatolása reguláris kifejezéssel",
"one": "A háttérfrissítés ellenőrzése {} frissítést talált szükség esetén értesíti a felhasználót", "trimVersionString": "Verzió-karakterlánc levágása reguláris kifejezéssel",
"other": "A háttérfrissítés ellenőrzése {} frissítést talált szükség esetén értesíti a felhasználót" "matchGroupToUseForX": "A(z) „{}” esetén használandó csoport egyeztetése",
}, "matchGroupToUse": "A verzió-karakterlánc kivonatolásához használandó csoport reguláris kifejezéssel való egyeztetése",
"apps": { "highlightTouchTargets": "A kevésbé nyilvánvaló érintési pontok kiemelése",
"one": "{} app", "pickExportDir": "Válassza ki a könyvtárat, ahová exportálni szeretne",
"other": "{} app" "autoExportOnChanges": "Automatikus exportálás a változtatások után",
}, "includeSettings": "Tartalmazza a beállításokat",
"url": { "filterVersionsByRegEx": "Verziók szűrése reguláris kifejezéssel",
"one": "{} URL", "trySelectingSuggestedVersionCode": "Próbálja kiválasztani a „Javasolt” verziókódú APK-t",
"other": "{} URL" "dontSortReleasesList": "Az API-ból származó kiadási sorrend megőrzése",
}, "reverseSort": "Fordított rendezés",
"minute": { "takeFirstLink": "Vegye az első hivatkozást",
"one": "{} perc", "skipSort": "Rendezés kihagyása",
"other": "{} perc" "debugMenu": "Hibakereső menü",
}, "bgTaskStarted": "A háttérfeladat elindult ellenőrizze a naplókat.",
"hour": { "runBgCheckNow": "Frissítések ellenőrzése a háttérben most",
"one": "{} óra", "versionExtractWholePage": "„Verzió-karakterlánc kivonatolása reguláris kifejezéssel” alkalmazása az egész oldalra",
"other": "{} óra" "installing": "Telepítés",
}, "skipUpdateNotifications": "A frissítési értesítések kihagyása",
"day": { "updatesAvailableNotifChannel": "Frissítések érhetők el",
"one": "{} nap", "appsUpdatedNotifChannel": "Alkalmazások frissítve",
"other": "{} nap" "appsPossiblyUpdatedNotifChannel": "Megkísérelt alkalmazás-frissítések",
}, "errorCheckingUpdatesNotifChannel": "Hiba a frissítések ellenőrzésekor",
"clearedNLogsBeforeXAfterY": { "appsRemovedNotifChannel": "Eltávolított alkalmazások",
"one": "{n} napló törölve (előtte = {előtte}, utána = {utána})", "downloadingXNotifChannel": "A(z) {} letöltése",
"other": "{n} napló törölve (előtte = {előtte}, utána = {utána})" "completeAppInstallationNotifChannel": "Teljes alkalmazás telepítés",
}, "checkingForUpdatesNotifChannel": "Frissítések ellenőrzése",
"xAndNMoreUpdatesAvailable": { "onlyCheckInstalledOrTrackOnlyApps": "Csak a telepített és a csak nyomon-követhető alkalmazások frissítéseinek ellenőrzése",
"one": "A(z) {} és 1 további alkalmazás frissítéseket kapott.", "supportFixedAPKURL": "Támogatja a rögzített APK webcímeket",
"other": "{} és {} további alkalmazás frissítéseket kapott." "selectX": "{} kiválasztása",
}, "parallelDownloads": "Párhuzamos letöltések engedélyezése",
"xAndNMoreUpdatesInstalled": { "useShizuku": "Shizuku vagy Sui használata a telepítéshez",
"one": "A(z) {} és 1 további alkalmazás frissítve.", "shizukuBinderNotFound": "A Shizuku szolgáltatás nem fut",
"other": "{} és {} további alkalmazás frissítve." "shizukuOld": "Régi Shizuku verzió (<11) - frissítse",
} "shizukuOldAndroidWithADB": "A Shizuku csak Android < 8.1 ADB-vel fut - frissítse az Androidot vagy használja a Sui-t helyette",
} "shizukuPretendToBeGooglePlay": "Állítsa be a Google Playt telepítési forrásként (ha Shizukut használ)",
"useSystemFont": "A rendszer betűtípusának használata",
"useVersionCodeAsOSVersion": "Az alkalmazás verziókódjának használata a rendszer által érzékelt verzióként",
"requestHeader": "Kérelemfejléc",
"useLatestAssetDateAsReleaseDate": "A kiadás dátumaként használja a legutóbbi csomagfeltöltést",
"defaultPseudoVersioningMethod": "Alapértelmezett pszeudoverziós módszer",
"partialAPKHash": "Részleges APK hasító értéke",
"APKLinkHash": "APK hivatkozás hasító értéke",
"directAPKLink": "Közvetlen APK hivatkozás",
"pseudoVersionInUse": "Egy pszeudoverzió van használatban",
"installed": "Telepített",
"latest": "Legújabb",
"invertRegEx": "Reguláris kifejezés invertálása",
"note": "Megjegyzés",
"selfHostedNote": "A(z) „{}” legördülő menü segítségével elérhetővé válnak a bármilyen más forrásból származó saját üzemeltetésű vagy egyéni példányok.",
"badDownload": "Az APK-t nem lehetett elemezni (inkompatibilis vagy részleges letöltés)",
"beforeNewInstallsShareToAppVerifier": "Új alkalmazások megosztása az AppVerifierrel (ha elérhető)",
"appVerifierInstructionToast": "Ossza meg az AppVerifierrel, majd térjen vissza ide, ha kész.",
"wiki": "Súgó/Wiki",
"crowdsourcedConfigsLabel": "Crowdsource-ből származó alkalmazások beállítása (saját felelősségére használja)",
"crowdsourcedConfigsShort": "Crowdsourced App Configs",
"allowInsecure": "Nem biztonságos HTTP-kérések engedélyezése",
"stayOneVersionBehind": "Maradjon egy verzióval a legújabb mögött",
"refreshBeforeDownload": "Az alkalmazás adatainak frissítése a letöltés előtt",
"tencentAppStore": "Tencent Appstore",
"removeAppQuestion": {
"one": "Eltávolítja az alkalmazást?",
"other": "Eltávolítja az alkalmazásokat?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "Túl sok kérés (lekérdezés-korlátozás) próbálja újra {} perc múlva,\nvagy adjon meg egy GitHub/GitLab API-kulcsot",
"other": "Túl sok kérés (lekérdezés-korlátozás) próbálja újra {} perc múlva,\nvagy adjon meg egy GitHub/GitLab API-kulcsot"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Frissítések ellenőrzése a háttérben a következőt észlelte: {} - Újrapróbálkozás: {} perc múlva",
"other": "Frissítések ellenőrzése a háttérben a következőt észlelte: {} - Újrapróbálkozás: {} perc múlva"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Frissítések ellenőrzése a háttérben {} frissítést talált - szükség esetén értesíti a felhasználót",
"other": "Frissítések ellenőrzése a háttérben {} frissítést talált - szükség esetén értesíti a felhasználót"
},
"apps": {
"one": "{} alkalmazás",
"other": "{} alkalmazás"
},
"url": {
"one": "{} webcím",
"other": "{} webcím"
},
"minute": {
"one": "{} perc",
"other": "{} perc"
},
"hour": {
"one": "{} óra",
"other": "{} óra"
},
"day": {
"one": "{} nap",
"other": "{} nap"
},
"clearedNLogsBeforeXAfterY": {
"one": "{n} napló törölve lett ({after} után, és {before} előtt)",
"other": "{n} napló törölve lett ({after} után, és {before} előtt)"
},
"xAndNMoreUpdatesAvailable": {
"one": "A(z) {} és 1 további alkalmazás frissítést kapott.",
"other": "A(z) {} és {} további alkalmazás frissítést kapott."
},
"xAndNMoreUpdatesInstalled": {
"one": "A(z) {} és 1 további alkalmazás frissítve.",
"other": "A(z) {} és {} további alkalmazás frissítve."
},
"xAndNMoreUpdatesFailed": {
"one": "Nem sikerült frissíteni a következőt: {}, valamint 1 további alkalmazást.",
"other": "Nem sikerült frissíteni a következőt: {}, valamint {} további alkalmazást."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "A(z) {}, valamint 1 további alkalmazás sikeresen frissítve.",
"other": "A(z) {}, valamint {} további alkalmazás sikeresen frissítve."
},
"apk": {
"one": "{} APK",
"other": "{} APK"
}
}

382
assets/translations/id.json Normal file
View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "Bukan URL aplikasi {} yang valid",
"noReleaseFound": "Tidak dapat menemukan rilis yang sesuai",
"noVersionFound": "Tidak dapat memastikan versi rilis yang sesuai",
"urlMatchesNoSource": "URL tidak sesuai dengan sumber yang diketahui",
"cantInstallOlderVersion": "Tidak dapat memasang versi aplikasi yang lebih lama",
"appIdMismatch": "ID paket yang diunduh tidak sama dengan ID aplikasi yang ada",
"functionNotImplemented": "Kelas ini belum mengimplementasikan fungsi ini",
"placeholder": "Tempat penampung",
"someErrors": "Terjadi beberapa kesalahan",
"unexpectedError": "Kesalahan tidak terduga",
"ok": "Oke",
"and": "dan",
"githubPATLabel": "Token Akses Pribadi GitHub (tingkatkan batasan tarif)",
"includePrereleases": "Sertakan pra-rilis",
"fallbackToOlderReleases": "Alternatif kembali ke rilis lama",
"filterReleaseTitlesByRegEx": "Filter judul rilis dengan ekspresi reguler",
"invalidRegEx": "Ekspresi reguler tidak valid",
"noDescription": "Tidak ada deskripsi",
"cancel": "Batal",
"continue": "Lanjut",
"requiredInBrackets": "(Diperlukan)",
"dropdownNoOptsError": "KESALAHAN: DROPDOWN HARUS MEMILIKI SETIDAKNYA SATU OPSI",
"colour": "Warna",
"standard": "Standar",
"custom": "Kustom",
"useMaterialYou": "Gunakan Material You",
"githubStarredRepos": "Repositori berbintang GitHub",
"uname": "Nama pengguna",
"wrongArgNum": "Salah memberikan jumlah argumen",
"xIsTrackOnly": "{} adalah Pelacakan Saja",
"source": "Sumber",
"app": "Aplikasi",
"appsFromSourceAreTrackOnly": "Aplikasi dari sumber ini hanya untuk 'Pelacakan Saja'.",
"youPickedTrackOnly": "Anda telah memilih opsi Pelacakan Saja.",
"trackOnlyAppDescription": "Aplikasi akan dilacak untuk pembaruan, tetapi Obtainium tidak akan dapat mengunduh atau memasangnya.",
"cancelled": "Dibatalkan",
"appAlreadyAdded": "Aplikasi sudah ditambahkan",
"alreadyUpToDateQuestion": "Aplikasi sudah yang terbaru?",
"addApp": "Tambah aplikasi",
"appSourceURL": "Tambah sumber URL",
"error": "Kesalahan",
"add": "Tambah",
"searchSomeSourcesLabel": "Cari (beberapa sumber saja)",
"search": "Cari",
"additionalOptsFor": "Opsi tambahan untuk {}",
"supportedSources": "Sumber yang didukung",
"trackOnlyInBrackets": "(Pelacakan Saja)",
"searchableInBrackets": "(Dapat dicari)",
"appsString": "Aplikasi",
"noApps": "Tidak ada aplikasi",
"noAppsForFilter": "Tidak ada aplikasi untuk difilter",
"byX": "Oleh {}",
"percentProgress": "Perkembangan: {}%",
"pleaseWait": "Harap tunggu",
"updateAvailable": "Pembaruan tersedia",
"notInstalled": "Tidak terpasang",
"pseudoVersion": "versi semu",
"selectAll": "Pilih semua",
"deselectX": "Batal pilih {}",
"xWillBeRemovedButRemainInstalled": "{} akan dihapus dari Obtainium tetapi tetap terpasang di perangkat.",
"removeSelectedAppsQuestion": "Hapus aplikasi terpilih?",
"removeSelectedApps": "Hapus aplikasi terpilih",
"updateX": "Perbarui {}",
"installX": "Pasang {}",
"markXTrackOnlyAsUpdated": "Tandai {}\n(Pelacakan Saja)\nsudah diperbarui",
"changeX": "Ubah {}",
"installUpdateApps": "Pasang/perbarui aplikasi",
"installUpdateSelectedApps": "Pasang/perbarui aplikasi terpilih",
"markXSelectedAppsAsUpdated": "Tandai {} aplikasi terpilih sudah diperbarui?",
"no": "Tidak",
"yes": "Ya",
"markSelectedAppsUpdated": "Tandai aplikasi terpilih sudah diperbarui",
"pinToTop": "Sematkan ke atas",
"unpinFromTop": "Lepaskan semat dari atas",
"resetInstallStatusForSelectedAppsQuestion": "Atur ulang status pemasangan untuk aplikasi terpilih?",
"installStatusOfXWillBeResetExplanation": "Status pemasangan dari aplikasi terpilih akan diatur ulang.\n\nHal ini bisa membantu saat versi aplikasi yang ditampilkan di Obtainium salah akibat pembaruan yang gagal atau masalah lainnya.",
"customLinkMessage": "Tautan ini berfungsi pada perangkat yang terpasang Obtainium",
"shareAppConfigLinks": "Bagikan konfigurasi aplikasi sebagai tautan HTML",
"shareSelectedAppURLs": "Bagikan URL aplikasi terpilih",
"resetInstallStatus": "Atur ulang status pemasangan",
"more": "Lebih banyak",
"removeOutdatedFilter": "Hapus filter aplikasi yang usang",
"showOutdatedOnly": "Tampilkan aplikasi yang usang saja",
"filter": "Filter",
"filterApps": "Filter aplikasi",
"appName": "Nama aplikasi",
"author": "Pencipta",
"upToDateApps": "Aplikasi terbaru",
"nonInstalledApps": "Aplikasi tidak terpasang",
"importExport": "Impor/ekspor",
"settings": "Pengaturan",
"exportedTo": "Diekspor ke {}",
"obtainiumExport": "Ekspor Obtainium",
"invalidInput": "Masukan tidak valid",
"importedX": "{} diimpor",
"obtainiumImport": "Impor Obtainium",
"importFromURLList": "Impor dari daftar URL",
"searchQuery": "Cari Kueri",
"appURLList": "Daftar URL aplikasi",
"line": "Baris",
"searchX": "Cari {}",
"noResults": "Tidak ada hasil yang ditemukan",
"importX": "Impor {}",
"importedAppsIdDisclaimer": "Aplikasi yang diimpor mungkin secara salah ditampilkan sebagai \"Tidak terpasang\".\nUntuk memperbaikinya, lakukan pemasangan ulang melalui Obtainium.\nHal ini seharusnya tidak mempengaruhi data aplikasi.\n\nHanya mempengaruhi metode impor URL dan pihak ketiga.",
"importErrors": "Kesalahan impor",
"importedXOfYApps": "{} dari {} aplikasi diimpor.",
"followingURLsHadErrors": "URL berikut mengalami kesalahan:",
"selectURL": "Pilih URL",
"selectURLs": "Pilih URL",
"pick": "Pilih",
"theme": "Tema",
"dark": "Gelap",
"light": "Terang",
"followSystem": "Mengikuti sistem",
"followSystemThemeExplanation": "Tema mengikuti sistem hanya mungkin dengan menggunakan aplikasi pihak ketiga",
"useBlackTheme": "Gunakan tema hitam pekat",
"appSortBy": "Penyortiran aplikasi berdasarkan",
"authorName": "Pencipta/nama",
"nameAuthor": "Nama/pencipta",
"asAdded": "Tanggal ditambahkan",
"appSortOrder": "Urutan penyortiran aplikasi",
"ascending": "Menaik",
"descending": "Menurun",
"bgUpdateCheckInterval": "Interval pemeriksaan pembaruan di latar belakang",
"neverManualOnly": "Tidak pernah - manual saja",
"appearance": "Tampilan",
"showWebInAppView": "Tampilkan halaman web sumber dalam tampilan aplikasi",
"pinUpdates": "Sematkan pembaruan ke atas tampilan aplikasi",
"updates": "Pembaruan",
"sourceSpecific": "Sumber spesifik",
"appSource": "Sumber aplikasi",
"noLogs": "Tidak ada catatan",
"appLogs": "Catatan aplikasi",
"close": "Tutup",
"share": "Bagikan",
"appNotFound": "Aplikasi tidak ditemukan",
"obtainiumExportHyphenatedLowercase": "ekspor-obtainium",
"pickAnAPK": "Pilih APK",
"appHasMoreThanOnePackage": "{} memiliki lebih dari satu paket:",
"deviceSupportsXArch": "Perangkat Anda mendukung arsitektur CPU {}.",
"deviceSupportsFollowingArchs": "Perangkat anda mendukung arsitektur CPU berikut:",
"warning": "Peringatan",
"sourceIsXButPackageFromYPrompt": "Sumber aplikasinya adalah '{}' tetapi paket rilisnya berasal dari '{}'. Lanjutkan?",
"updatesAvailable": "Pembaruan tersedia",
"updatesAvailableNotifDescription": "Memberi tahu pengguna bahwa pembaruan tersedia untuk aplikasi yang dilacak oleh Obtainium",
"noNewUpdates": "Tidak ada pembaruan baru.",
"xHasAnUpdate": "{} memiliki pembaruan.",
"appsUpdated": "Aplikasi diperbarui",
"appsNotUpdated": "Gagal memperbarui aplikasi",
"appsUpdatedNotifDescription": "Memberi tahu pengguna bahwa pembaruan terhadap aplikasi diterapkan di latar belakang",
"xWasUpdatedToY": "{} telah diperbarui ke {}.",
"xWasNotUpdatedToY": "Gagal memperbarui {} ke {}.",
"errorCheckingUpdates": "Kesalahan dalam memeriksa pembaruan",
"errorCheckingUpdatesNotifDescription": "Notifikasi yang ditampilkan saat pemeriksaan pembaruan latar belakang gagal",
"appsRemoved": "Aplikasi dihapus",
"appsRemovedNotifDescription": "Memberi tahu pengguna bahwa aplikasi dihapus karena kesalahan saat memuatnya",
"xWasRemovedDueToErrorY": "{} dihapus karena kesalahan berikut: {}",
"completeAppInstallation": "Selesaikan pemasangan aplikasi",
"obtainiumMustBeOpenToInstallApps": "Obtainium harus terbuka untuk memasang aplikasi",
"completeAppInstallationNotifDescription": "Meminta pengguna kembali ke Obtainium untuk menyelesaikan pemasangan aplikasi",
"checkingForUpdates": "Memeriksa pembaruan",
"checkingForUpdatesNotifDescription": "Notifikasi sementara yang ditampilkan saat memeriksa pembaruan",
"pleaseAllowInstallPerm": "Harap izinkan Obtainium untuk memasang aplikasi",
"trackOnly": "Pelacakan Saja",
"errorWithHttpStatusCode": "Kesalahan {}",
"versionCorrectionDisabled": "Koreksi versi dinonaktifkan (sepertinya plugin tidak berfungsi)",
"unknown": "Tidak diketahui",
"none": "Tidak ada",
"never": "Tidak pernah",
"latestVersionX": "Terbaru: {}",
"installedVersionX": "Terpasang: {}",
"lastUpdateCheckX": "Terakhir memeriksa pembaruan: {}",
"remove": "Hapus",
"yesMarkUpdated": "Ya, tandai bahwa sudah diperbarui",
"fdroid": "F-Droid Resmi",
"appIdOrName": "ID atau nama aplikasi",
"appId": "ID aplikasi",
"appWithIdOrNameNotFound": "Tidak ada aplikasi yang ditemukan dengan ID atau nama tersebut",
"reposHaveMultipleApps": "Repositori dapat berisi beberapa aplikasi",
"fdroidThirdPartyRepo": "Repositori pihak ketiga F-Droid",
"install": "Pasang",
"markInstalled": "Tandai terpasang",
"update": "perbarui",
"markUpdated": "Tandai diperbarui",
"additionalOptions": "Opsi tambahan",
"disableVersionDetection": "Nonaktifkan pendeteksi versi",
"noVersionDetectionExplanation": "Opsi ini hanya boleh digunakan untuk aplikasi dengan pendeteksi versi yang tidak berfungsi dengan benar.",
"downloadingX": "Mengunduh {}",
"downloadX": "Unduh {}",
"downloadedX": "{} diunduh",
"releaseAsset": "Aset rilis",
"downloadNotifDescription": "Memberi tahu pengguna perkembangan dalam mengunduh aplikasi",
"noAPKFound": "Tidak ada APK ditemukan",
"noVersionDetection": "Tidak ada pendeteksi versi",
"categorize": "Kategorikan",
"categories": "Kategori",
"category": "Kategori",
"noCategory": "Tidak ada kategori",
"noCategories": "Tidak ada kategori",
"deleteCategoriesQuestion": "Hapus kategori?",
"categoryDeleteWarning": "Semua aplikasi dalam kategori yang dihapus akan diatur sebagai tidak terkategori.",
"addCategory": "Tambah kategori",
"label": "Label",
"language": "Bahasa",
"copiedToClipboard": "Disalin ke papan klip",
"storagePermissionDenied": "Izin penyimpanan ditolak",
"selectedCategorizeWarning": "Ini akan mengganti pengaturan kategori yang ada untuk aplikasi terpilih.",
"filterAPKsByRegEx": "Filter APK dengan ekspresi reguler",
"removeFromObtainium": "Hapus dari Obtainium",
"uninstallFromDevice": "Copot pemasangan dari perangkat",
"onlyWorksWithNonVersionDetectApps": "Hanya bekerja untuk aplikasi dengan pendeteksi versi yang nonaktif.",
"releaseDateAsVersion": "Gunakan tanggal rilis sebagai versi string",
"releaseTitleAsVersion": "Gunakan judul rilis sebagai string versi",
"releaseDateAsVersionExplanation": "Opsi ini hanya boleh digunakan untuk aplikasi dengan pendeteksi versi yang tidak berfungsi dengan benar, tetapi tanggal rilisnya tersedia.",
"changes": "Perubahan",
"releaseDate": "Tanggal rilis",
"importFromURLsInFile": "Impor dari URL dalam berkas (seperti OPML)",
"versionDetectionExplanation": "Sesuaikan string versi dengan versi yang terdeteksi dari OS",
"versionDetection": "Pendeteksi versi",
"standardVersionDetection": "Pendeteksi versi standar",
"groupByCategory": "Kelompokkan berdasarkan kategori",
"autoApkFilterByArch": "Coba filter APK berdasarkan arsitektur CPU jika memungkinkan",
"overrideSource": "Ganti sumber",
"dontShowAgain": "Jangan tampilkan lagi",
"dontShowTrackOnlyWarnings": "Jangan tampilkan peringatan 'Pelacakan Saja'",
"dontShowAPKOriginWarnings": "Jangan tampilkan peringatan asal APK",
"moveNonInstalledAppsToBottom": "Pindahkan aplikasi tidak terpasang ke bawah tampilan aplikasi",
"gitlabPATLabel": "Token Akses Pribadi GitLab",
"about": "Tentang",
"requiresCredentialsInSettings": "{} memerlukan kredensial tambahan (dalam pengaturan)",
"checkOnStart": "Periksa pembaruan saat proses memulai",
"tryInferAppIdFromCode": "Coba untuk menebak ID aplikasi dari kode sumber",
"removeOnExternalUninstall": "Hapus otomatis aplikasi yang dicopot pemasangannya dari luar",
"pickHighestVersionCode": "Pilih otomatis APK dengan versi kode tertinggi",
"checkUpdateOnDetailPage": "Periksa pembaruan saat membuka halaman detail aplikasi",
"disablePageTransitions": "Nonaktifkan animasi transisi halaman",
"reversePageTransitions": "Animasi transisi halaman secara terbalik",
"minStarCount": "Jumlah bintang minimum",
"addInfoBelow": "Tambahkan info ini di bawah.",
"addInfoInSettings": "Tambahkan info ini di pengaturan.",
"githubSourceNote": "Pembatasan tarif pada GitHub dapat dihindari dengan menggunakan kunci API.",
"sortByLastLinkSegment": "Urutkan hanya berdasarkan segmen terakhir tautan",
"filterReleaseNotesByRegEx": "Filter catatan perilisan dengan ekspresi reguler",
"customLinkFilterRegex": "Filter tautan APK kustom dengan ekspresi reguler (Standar '.apk$')",
"appsPossiblyUpdated": "Pembaruan aplikasi dicoba",
"appsPossiblyUpdatedNotifDescription": "Memberi tahu pengguna bahwa pembaruan terhadap aplikasi berpotensi diterapkan di latar belakang",
"xWasPossiblyUpdatedToY": "{} mungkin telah diperbarui ke {}.",
"enableBackgroundUpdates": "Aktifkan pembaruan latar belakang",
"backgroundUpdateReqsExplanation": "Pembaruan latar belakang mungkin tidak dapat dilakukan untuk semua aplikasi.",
"backgroundUpdateLimitsExplanation": "Keberhasilan pemasangan di latar belakang hanya dapat ditentukan ketika Obtainium terbuka.",
"verifyLatestTag": "Verifikasi label 'terbaru'",
"intermediateLinkRegex": "Filter tautan 'perantara' untuk dikunjungi",
"filterByLinkText": "Filter tautan berdasarkan teks tautan",
"intermediateLinkNotFound": "Tautan perantara tidak ditemukan",
"intermediateLink": "Tautan perantara",
"exemptFromBackgroundUpdates": "Dikecualikan dari pembaruan latar belakang (jika diaktifkan)",
"bgUpdatesOnWiFiOnly": "Nonaktifkan pembaruan latar belakang saat tidak menggunakan Wi-Fi",
"bgUpdatesWhileChargingOnly": "Menonaktifkan pembaruan latar belakang saat tidak mengisi daya",
"autoSelectHighestVersionCode": "Pilih otomatis APK dengan versi kode tertinggi",
"versionExtractionRegEx": "Reguler ekspresi terkait ekstraksi versi string",
"trimVersionString": "Potong versi string dengan reguler ekspresi",
"matchGroupToUseForX": "Cocokkan grup yang akan digunakan untuk \"{}\"",
"matchGroupToUse": "Cocokkan grup yang akan digunakan untuk reguler ekspresi terkait ekstraksi versi string",
"highlightTouchTargets": "Sorot target sentuh yang kurang jelas",
"pickExportDir": "Pilih direktori ekspor",
"autoExportOnChanges": "Otomatis ekspor terhadap perubahan",
"includeSettings": "Sertakan pengaturan",
"filterVersionsByRegEx": "Filter versi dengan ekspresi reguler",
"trySelectingSuggestedVersionCode": "Coba pilih APK dengan version kode yang disarankan",
"dontSortReleasesList": "Pertahankan urutan rilis dari API",
"reverseSort": "Penyortiran terbalik",
"takeFirstLink": "Ambil tautan pertama",
"skipSort": "Lewati penyortiran",
"debugMenu": "Menu debug",
"bgTaskStarted": "Tugas latar belakang dimulai - periksa catatan.",
"runBgCheckNow": "Jalankan pemeriksaan pembaruan latar belakang sekarang",
"versionExtractWholePage": "Terapkan reguler ekspresi terkait ekstraksi versi string ke seluruh halaman",
"installing": "Memasang",
"skipUpdateNotifications": "Lewati notifikasi pembaruan",
"updatesAvailableNotifChannel": "Pembaruan tersedia",
"appsUpdatedNotifChannel": "Aplikasi diperbarui",
"appsPossiblyUpdatedNotifChannel": "Pembaruan aplikasi dicoba",
"errorCheckingUpdatesNotifChannel": "Kesalahan dalam memeriksa pembaruan",
"appsRemovedNotifChannel": "Aplikasi dihapus",
"downloadingXNotifChannel": "Mengunduh {}",
"completeAppInstallationNotifChannel": "Selesaikan pemasangan aplikasi",
"checkingForUpdatesNotifChannel": "Memeriksa pembaruan",
"onlyCheckInstalledOrTrackOnlyApps": "Hanya periksa aplikasi yang dipasang dan ditandai 'Pelacakan Saja' untuk pembaruan",
"supportFixedAPKURL": "Mendukung URL APK tetap",
"selectX": "Pilih {}",
"parallelDownloads": "Izinkan mengunduh paralel",
"useShizuku": "Gunakan Shizuku atau Sui untuk memasang",
"shizukuBinderNotFound": "Layanan Shizuku tidak berjalan",
"shizukuOld": "Versi Shizuku lama (<11) - harap perbarui",
"shizukuOldAndroidWithADB": "Shizuku berjalan di Android < 8.1 dengan ADB - perbarui Android atau gunakan Sui sebagai gantinya",
"shizukuPretendToBeGooglePlay": "Atur Google Play sebagai sumber pemasangan (jika Shizuku digunakan)",
"useSystemFont": "Gunakan font sistem",
"useVersionCodeAsOSVersion": "Gunakan versi kode aplikasi sebagai versi yang terdeteksi OS",
"requestHeader": "Header permintaan",
"useLatestAssetDateAsReleaseDate": "Gunakan unggahan aset terbaru sebagai tanggal rilis",
"defaultPseudoVersioningMethod": "Metode versi semu standar",
"partialAPKHash": "Hash APK parsial",
"APKLinkHash": "Hash tautan APK",
"directAPKLink": "Tautan APK langsung",
"pseudoVersionInUse": "Versi semu sedang digunakan",
"installed": "Terpasang",
"latest": "Terbaru",
"invertRegEx": "Balikkan ekspresi reguler",
"note": "Catatan",
"selfHostedNote": "Dropdown \"{}\" bisa digunakan untuk menjangkau instansi yang dihosting sendiri/kustom dari sumber mana pun.",
"badDownload": "APK tidak dapat diurai (tidak kompatibel atau diunduh sebagian)",
"beforeNewInstallsShareToAppVerifier": "Bagikan aplikasi baru dengan AppVerifier (jika tersedia)",
"appVerifierInstructionToast": "Bagikan ke AppVerifier, lalu kembali ke sini jika sudah siap.",
"wiki": "Bantuan/Wiki",
"crowdsourcedConfigsLabel": "Konfigurasi aplikasi Crowdsourced (risiko penggunaan ditanggung sendiri)",
"crowdsourcedConfigsShort": "Konfigurasi Aplikasi Crowdsourced",
"allowInsecure": "Izinkan permintaan HTTP yang tidak aman",
"stayOneVersionBehind": "Tetap satu versi di belakang versi terbaru",
"refreshBeforeDownload": "Segarkan detail aplikasi sebelum mengunduh",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "Hapus aplikasi?",
"other": "Hapus aplikasi?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "Terlalu banyak permintaan (tarif dibatasi) - coba lagi dalam {} menit",
"other": "Terlalu banyak permintaan (tarif dibatasi) - coba lagi dalam {} menit"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Pemeriksaan pembaruan latar belakang menemui {}, akan menjadwalkan pemeriksaan ulang dalam {} menit",
"other": "Pemeriksaan pembaruan latar belakang menemui {}, akan menjadwalkan pemeriksaan ulang dalam {} menit"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Pemeriksaan pembaruan latar belakang menemukan {} pembaruan - akan memberi tahu pengguna jika diperlukan",
"other": "Pemeriksaan pembaruan latar belakang menemukan {} pembaruan - akan memberi tahu pengguna jika diperlukan"
},
"apps": {
"one": "{} aplikasi",
"other": "{} aplikasi"
},
"url": {
"one": "{} URL",
"other": "{} URL"
},
"minute": {
"one": "{} menit",
"other": "{} menit"
},
"hour": {
"one": "{} jam",
"other": "{} jam"
},
"day": {
"one": "{} hari",
"other": "{} hari"
},
"clearedNLogsBeforeXAfterY": {
"one": "Menghapus {n} catatan (sebelum = {before}, setelah = {after})",
"other": "Menghapus {n} catatan (sebelum = {before}, setelah = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} dan 1 aplikasi lainnya memiliki pembaruan.",
"other": "{} dan {} aplikasi lainnya memiliki pembaruan."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} dan 1 aplikasi lainnya telah diperbarui.",
"other": "{} dan {} aplikasi lainnya telah diperbarui."
},
"xAndNMoreUpdatesFailed": {
"one": "Gagal memperbarui {} dan 1 aplikasi lainnya.",
"other": "Gagal memperbarui {} dan {} aplikasi lainnya."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} dan 1 aplikasi lainnya mungkin telah diperbarui.",
"other": "{} dan {} aplikasi lainnya mungkin telah diperbarui."
},
"apk": {
"one": "{} APK",
"other": "{} APK"
}
}

View File

@ -11,15 +11,7 @@
"unexpectedError": "Errore imprevisto", "unexpectedError": "Errore imprevisto",
"ok": "Va bene", "ok": "Va bene",
"and": "e", "and": "e",
"startedBgUpdateTask": "Avviata l'attività di controllo degli aggiornamenti in secondo piano", "githubPATLabel": "GitHub Personal Access Token (aumenta limite di traffico)",
"bgUpdateIgnoreAfterIs": "Il parametro di agg. in secondo piano 'ignoreAfter' è {}",
"startedActualBGUpdateCheck": "Avviato il controllo effettivo degli aggiornamenti in secondo piano",
"bgUpdateTaskFinished": "Terminata l'attività di controllo degli aggiornamenti in secondo piano",
"firstRun": "Questo è il primo avvio di sempre di Obtainium",
"settingUpdateCheckIntervalTo": "Fissato intervallo di aggiornamento a {}",
"githubPATLabel": "GitHub Personal Access Token (diminuisce limite di traffico)",
"githubPATHint": "PAT deve seguire questo formato: nomeutente:token",
"githubPATFormat": "nomeutente:token",
"includePrereleases": "Includi prerelease", "includePrereleases": "Includi prerelease",
"fallbackToOlderReleases": "Ripiega su release precedenti", "fallbackToOlderReleases": "Ripiega su release precedenti",
"filterReleaseTitlesByRegEx": "Filtra release con espressioni regolari", "filterReleaseTitlesByRegEx": "Filtra release con espressioni regolari",
@ -30,6 +22,9 @@
"requiredInBrackets": "(richiesto)", "requiredInBrackets": "(richiesto)",
"dropdownNoOptsError": "ERRORE: LA TENDINA DEVE AVERE ALMENO UN'OPZIONE", "dropdownNoOptsError": "ERRORE: LA TENDINA DEVE AVERE ALMENO UN'OPZIONE",
"colour": "Colore", "colour": "Colore",
"standard": "Standard",
"custom": "Personalizzato",
"useMaterialYou": "Utilizzate il materiale che avete a disposizione",
"githubStarredRepos": "repository stellati da GitHub", "githubStarredRepos": "repository stellati da GitHub",
"uname": "Nome utente", "uname": "Nome utente",
"wrongArgNum": "Numero di argomenti forniti errato", "wrongArgNum": "Numero di argomenti forniti errato",
@ -49,7 +44,7 @@
"searchSomeSourcesLabel": "Cerca (solo per alcune fonti)", "searchSomeSourcesLabel": "Cerca (solo per alcune fonti)",
"search": "Cerca", "search": "Cerca",
"additionalOptsFor": "Opzioni aggiuntive per {}", "additionalOptsFor": "Opzioni aggiuntive per {}",
"supportedSourcesBelow": "Fonti supportate:", "supportedSources": "Fonti supportate",
"trackOnlyInBrackets": "(Solo-Monitoraggio)", "trackOnlyInBrackets": "(Solo-Monitoraggio)",
"searchableInBrackets": "(ricercabile)", "searchableInBrackets": "(ricercabile)",
"appsString": "App", "appsString": "App",
@ -59,35 +54,35 @@
"percentProgress": "Avanzamento: {}%", "percentProgress": "Avanzamento: {}%",
"pleaseWait": "In attesa", "pleaseWait": "In attesa",
"updateAvailable": "Aggiornamento disponibile", "updateAvailable": "Aggiornamento disponibile",
"estimateInBracketsShort": "(prev.)",
"notInstalled": "Non installato", "notInstalled": "Non installato",
"estimateInBrackets": "(previsto)", "pseudoVersion": "pseudo-versione",
"selectAll": "Seleziona tutto", "selectAll": "Seleziona tutto",
"deselectN": "Deseleziona {}", "deselectX": "Deseleziona {}",
"xWillBeRemovedButRemainInstalled": "Verà effettuata la rimozione di {}, ma non la disinstallazione.", "xWillBeRemovedButRemainInstalled": "Verà effettuata la rimozione di {}, ma non la disinstallazione.",
"removeSelectedAppsQuestion": "Rimuovere le app selezionate?", "removeSelectedAppsQuestion": "Rimuovere le app selezionate?",
"removeSelectedApps": "Rimuovi le app selezionate", "removeSelectedApps": "Rimuovi le app selezionate",
"updateX": "Aggiorna {}", "updateX": "Aggiorna {}",
"installX": "Installa {}", "installX": "Installa {}",
"markXTrackOnlyAsUpdated": "Contrassegna {}\n(Solo-Monitoraggio)\ncome aggiornato", "markXTrackOnlyAsUpdated": "Contrassegna {}\n(Solo-Monitoraggio)\ncome aggiornata",
"changeX": "Modifica {}", "changeX": "Modifica {}",
"installUpdateApps": "Installa/Aggiorna app", "installUpdateApps": "Installa/Aggiorna app",
"installUpdateSelectedApps": "Installa/Aggiorna le app selezionate", "installUpdateSelectedApps": "Installa/Aggiorna le app selezionate",
"markXSelectedAppsAsUpdated": "Contrassegnare le {} app selezionate come aggiornate?", "markXSelectedAppsAsUpdated": "Contrassegnare le {} app selezionate come aggiornate?",
"no": "No", "no": "NO",
"yes": "Sì", "yes": "Sì",
"markSelectedAppsUpdated": "Contrassegna le app selezionate come aggiornate", "markSelectedAppsUpdated": "Contrassegna le app selezionate come aggiornate",
"pinToTop": "Fissa in alto", "pinToTop": "Fissa in alto",
"unpinFromTop": "Rimuovi dall'alto", "unpinFromTop": "Rimuovi dall'alto",
"resetInstallStatusForSelectedAppsQuestion": "Ripristinare lo stato d'installazione delle app selezionate?", "resetInstallStatusForSelectedAppsQuestion": "Ripristinare lo stato d'installazione delle app selezionate?",
"installStatusOfXWillBeResetExplanation": "Lo stato d'installazione di ogni app selezionata sarà ripristinato.\n\nCiò può essere d'aiuto nel caso in cui la versione mostrata dell'app in Obtainium non sia corretta a causa di un aggiornamento fallito o di altri problemi.", "installStatusOfXWillBeResetExplanation": "Lo stato d'installazione di ogni app selezionata sarà ripristinato.\n\nCiò può essere d'aiuto nel caso in cui la versione mostrata dell'app in Obtainium non sia corretta a causa di un aggiornamento fallito o di altri problemi.",
"customLinkMessage": "Questi collegamenti funzionano sui dispositivi con Obtainium installato",
"shareAppConfigLinks": "Condividi la configurazione dell'app come collegamento HTML",
"shareSelectedAppURLs": "Condividi gli URL delle app selezionate", "shareSelectedAppURLs": "Condividi gli URL delle app selezionate",
"resetInstallStatus": "Ripristina lo stato d'installazione", "resetInstallStatus": "Ripristina lo stato d'installazione",
"more": "Altro", "more": "Altro",
"removeOutdatedFilter": "Rimuovi il filtro per le app non aggiornate", "removeOutdatedFilter": "Rimuovi il filtro per le app non aggiornate",
"showOutdatedOnly": "Mostra solo le app non aggiornate", "showOutdatedOnly": "Mostra solo le app non aggiornate",
"filter": "Filtri", "filter": "Filtri",
"filterActive": "Filtri *",
"filterApps": "Filtra app", "filterApps": "Filtra app",
"appName": "Nome dell'app", "appName": "Nome dell'app",
"author": "Autore", "author": "Autore",
@ -111,7 +106,6 @@
"importErrors": "Errori di importazione", "importErrors": "Errori di importazione",
"importedXOfYApps": "{} app di {} importate.", "importedXOfYApps": "{} app di {} importate.",
"followingURLsHadErrors": "I seguenti URL contengono errori:", "followingURLsHadErrors": "I seguenti URL contengono errori:",
"okay": "Va bene",
"selectURL": "Seleziona l'URL", "selectURL": "Seleziona l'URL",
"selectURLs": "Seleziona gli URL", "selectURLs": "Seleziona gli URL",
"pick": "Seleziona", "pick": "Seleziona",
@ -119,9 +113,8 @@
"dark": "Scuro", "dark": "Scuro",
"light": "Chiaro", "light": "Chiaro",
"followSystem": "Segui il sistema", "followSystem": "Segui il sistema",
"obtainium": "Obtainium", "followSystemThemeExplanation": "È possibile seguire il tema di sistema solo utilizzando applicazioni di terze parti.",
"materialYou": "Material You", "useBlackTheme": "Usa il tema nero puro",
"useBlackTheme": "Usa il tema Nero puro",
"appSortBy": "App ordinate per", "appSortBy": "App ordinate per",
"authorName": "Autore/Nome", "authorName": "Autore/Nome",
"nameAuthor": "Nome/Autore", "nameAuthor": "Nome/Autore",
@ -136,7 +129,7 @@
"pinUpdates": "Fissa aggiornamenti disponibili in alto", "pinUpdates": "Fissa aggiornamenti disponibili in alto",
"updates": "Aggiornamenti", "updates": "Aggiornamenti",
"sourceSpecific": "Specifiche per la fonte", "sourceSpecific": "Specifiche per la fonte",
"appSource": "Sorgente dell'app", "appSource": "Codice dell'app",
"noLogs": "Nessun log", "noLogs": "Nessun log",
"appLogs": "Log dell'app", "appLogs": "Log dell'app",
"close": "Chiudi", "close": "Chiudi",
@ -154,8 +147,10 @@
"noNewUpdates": "Nessun nuovo aggiornamento.", "noNewUpdates": "Nessun nuovo aggiornamento.",
"xHasAnUpdate": "Aggiornamento disponibile per {}", "xHasAnUpdate": "Aggiornamento disponibile per {}",
"appsUpdated": "App aggiornate", "appsUpdated": "App aggiornate",
"appsNotUpdated": "Impossibile aggiornare le applicazioni",
"appsUpdatedNotifDescription": "Notifica all'utente che una o più app sono state aggiornate in secondo piano", "appsUpdatedNotifDescription": "Notifica all'utente che una o più app sono state aggiornate in secondo piano",
"xWasUpdatedToY": "{} è stato aggiornato alla {}.", "xWasUpdatedToY": "{} è stato aggiornato alla {}.",
"xWasNotUpdatedToY": "Impossibile aggiornare {} a {}.",
"errorCheckingUpdates": "Controllo degli errori per gli aggiornamenti", "errorCheckingUpdates": "Controllo degli errori per gli aggiornamenti",
"errorCheckingUpdatesNotifDescription": "Una notifica che mostra quando il controllo degli aggiornamenti in secondo piano fallisce", "errorCheckingUpdatesNotifDescription": "Una notifica che mostra quando il controllo degli aggiornamenti in secondo piano fallisce",
"appsRemoved": "App rimosse", "appsRemoved": "App rimosse",
@ -177,24 +172,24 @@
"installedVersionX": "Versione installata: {}", "installedVersionX": "Versione installata: {}",
"lastUpdateCheckX": "Ultimo controllo degli aggiornamenti: {}", "lastUpdateCheckX": "Ultimo controllo degli aggiornamenti: {}",
"remove": "Rimuovi", "remove": "Rimuovi",
"yesMarkUpdated": "Sì, contrassegna come aggiornato", "yesMarkUpdated": "Sì, contrassegna come aggiornata",
"fdroid": "F-Droid ufficiale", "fdroid": "F-Droid ufficiale",
"appIdOrName": "ID o nome dell'app", "appIdOrName": "ID o nome dell'app",
"appId": "ID dell'app", "appId": "ID dell'app",
"appWithIdOrNameNotFound": "Non è stata trovata alcuna app con quell'ID o nome", "appWithIdOrNameNotFound": "Non è stata trovata alcuna app con quell'ID o nome",
"reposHaveMultipleApps": "I repository possono contenere più app", "reposHaveMultipleApps": "I repository possono contenere più app",
"fdroidThirdPartyRepo": "Repository F-Droid di terze parti", "fdroidThirdPartyRepo": "Repository F-Droid di terze parti",
"steam": "Steam",
"steamMobile": "Steam Mobile",
"steamChat": "Steam Chat",
"install": "Installa", "install": "Installa",
"markInstalled": "Contrassegna come installato", "markInstalled": "Contrassegna come installata",
"update": "Aggiorna", "update": "Aggiorna",
"markUpdated": "Contrassegna come aggiornato", "markUpdated": "Contrassegna come aggiornata",
"additionalOptions": "Opzioni aggiuntive", "additionalOptions": "Opzioni aggiuntive",
"disableVersionDetection": "Disattiva il rilevamento della versione", "disableVersionDetection": "Disattiva il rilevamento della versione",
"noVersionDetectionExplanation": "Questa opzione dovrebbe essere usata solo per le app la cui versione non viene rilevata correttamente.", "noVersionDetectionExplanation": "Questa opzione dovrebbe essere usata solo per le app la cui versione non viene rilevata correttamente.",
"downloadingX": "Scaricamento di {} in corso", "downloadingX": "Scaricamento di {} in corso",
"downloadX": "Scarica {}",
"downloadedX": "Scaricato {}",
"releaseAsset": "Rilascio Asset",
"downloadNotifDescription": "Notifica all'utente lo stato di avanzamento del download di un'app", "downloadNotifDescription": "Notifica all'utente lo stato di avanzamento del download di un'app",
"noAPKFound": "Nessun APK trovato", "noAPKFound": "Nessun APK trovato",
"noVersionDetection": "Disattiva rilevamento di versione", "noVersionDetection": "Disattiva rilevamento di versione",
@ -216,10 +211,12 @@
"uninstallFromDevice": "Disinstalla dal dispositivo", "uninstallFromDevice": "Disinstalla dal dispositivo",
"onlyWorksWithNonVersionDetectApps": "Funziona solo per le app con il rilevamento della versione disattivato.", "onlyWorksWithNonVersionDetectApps": "Funziona solo per le app con il rilevamento della versione disattivato.",
"releaseDateAsVersion": "Usa data di rilascio come versione", "releaseDateAsVersion": "Usa data di rilascio come versione",
"releaseTitleAsVersion": "Usa il titolo della versione come stringa di versione",
"releaseDateAsVersionExplanation": "Questa opzione dovrebbe essere usata solo per le app in cui il rilevamento della versione non funziona correttamente, ma è disponibile una data di rilascio.", "releaseDateAsVersionExplanation": "Questa opzione dovrebbe essere usata solo per le app in cui il rilevamento della versione non funziona correttamente, ma è disponibile una data di rilascio.",
"changes": "Novità", "changes": "Novità",
"releaseDate": "Data di rilascio", "releaseDate": "Data di rilascio",
"importFromURLsInFile": "Importa da URL in file (come OPML)", "importFromURLsInFile": "Importa da URL in file (come OPML)",
"versionDetectionExplanation": "Riconcilia la stringa della versione con la versione rilevata dal sistema operativo",
"versionDetection": "Rilevamento di versione", "versionDetection": "Rilevamento di versione",
"standardVersionDetection": "Rilevamento di versione standard", "standardVersionDetection": "Rilevamento di versione standard",
"groupByCategory": "Raggruppa per categoria", "groupByCategory": "Raggruppa per categoria",
@ -229,24 +226,99 @@
"dontShowTrackOnlyWarnings": "Non mostrare gli avvisi 'Solo-Monitoraggio'", "dontShowTrackOnlyWarnings": "Non mostrare gli avvisi 'Solo-Monitoraggio'",
"dontShowAPKOriginWarnings": "Non mostrare gli avvisi di origine dell'APK", "dontShowAPKOriginWarnings": "Non mostrare gli avvisi di origine dell'APK",
"moveNonInstalledAppsToBottom": "Sposta le app non installate in fondo alla lista", "moveNonInstalledAppsToBottom": "Sposta le app non installate in fondo alla lista",
"gitlabPATLabel": "GitLab Personal Access Token\n(attiva la ricerca and Better APK Discovery)", "gitlabPATLabel": "GitLab Token di accesso personale",
"about": "Informazioni", "about": "Informazioni",
"requiresCredentialsInSettings": "Servono credenziali aggiuntive (in Impostazioni)", "requiresCredentialsInSettings": "{}: Servono credenziali aggiuntive (in Impostazioni)",
"checkOnStart": "Controlla una volta all'avvio", "checkOnStart": "Controlla una volta all'avvio",
"tryInferAppIdFromCode": "Prova a dedurre l'ID dell'app dal codice sorgente", "tryInferAppIdFromCode": "Prova a dedurre l'ID dell'app dal codice sorgente",
"removeOnExternalUninstall": "Automatically remove externally uninstalled Apps", "removeOnExternalUninstall": "Rimuovi automaticamente app disinstallate esternamente",
"pickHighestVersionCode": "Auto-select highest version code APK", "pickHighestVersionCode": "Auto-seleziona APK con version code più alto",
"checkUpdateOnDetailPage": "Check for updates on opening an App detail page", "checkUpdateOnDetailPage": "Controlla aggiornamenti all'apertura dei dettagli dell'app",
"disablePageTransitions": "Disable page transition animations", "disablePageTransitions": "Disattiva animazioni di transizione pagina",
"reversePageTransitions": "Reverse page transition animations", "reversePageTransitions": "Inverti animazioni di transizione pagina",
"minStarCount": "Minimum Star Count", "minStarCount": "Numero minimo di stelle",
"addInfoBelow": "Add this info below.", "addInfoBelow": "Aggiungi questa info sotto.",
"addInfoInSettings": "Add this info in the Settings.", "addInfoInSettings": "Aggiungi questa info nelle impostazioni.",
"githubSourceNote": "GitHub rate limiting can be avoided using an API key.", "githubSourceNote": "Il limite di ricerca GitHub può essere evitato usando una chiave API.",
"gitlabSourceNote": "GitLab APK extraction may not work without an API key.", "sortByLastLinkSegment": "Ordina solo in base all'ultimo segmento del collegamento",
"sortByFileNamesNotLinks": "Sort by file names instead of full links", "filterReleaseNotesByRegEx": "Filtra le note di rilascio con espressione regolare",
"filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", "customLinkFilterRegex": "Filtra link APK personalizzato con espressione regolare (predefinito '.apk$')",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "appsPossiblyUpdated": "Aggiornamenti app tentati",
"appsPossiblyUpdatedNotifDescription": "Notifica all'utente che sono stati potenzialmente applicati in secondo piano aggiornamenti a una o più app",
"xWasPossiblyUpdatedToY": "{} potrebbe essere stata aggiornata alla {}.",
"enableBackgroundUpdates": "Attiva aggiornamenti in secondo piano",
"backgroundUpdateReqsExplanation": "Gli aggiornamenti in secondo piano potrebbero non essere possibili per tutte le app.",
"backgroundUpdateLimitsExplanation": "La riuscita di un'installazione in secondo piano può essere determinata solo quando viene aperto Obtainium.",
"verifyLatestTag": "Verifica l'etichetta 'Latest'",
"intermediateLinkRegex": "Filtro per un collegamento 'intermedio' da visitare",
"filterByLinkText": "Filtra i collegamenti in base al testo del collegamento",
"intermediateLinkNotFound": "Link intermedio non trovato",
"intermediateLink": "Collegamento intermedio",
"exemptFromBackgroundUpdates": "Esente da aggiornamenti in secondo piano (se attivo)",
"bgUpdatesOnWiFiOnly": "Disattiva aggiornamenti in secondo piano quando non si usa il Wi-Fi",
"bgUpdatesWhileChargingOnly": "Disabilita gli aggiornamenti in background quando non è in carica",
"autoSelectHighestVersionCode": "Auto-seleziona APK con versionCode più alto",
"versionExtractionRegEx": "RegEx di estrazione versione",
"trimVersionString": "Tagliare la stringa della versione con RegEx",
"matchGroupToUseForX": "Gruppo di corrispondenza da utilizzare per \"{}\"",
"matchGroupToUse": "Gruppo da usare",
"highlightTouchTargets": "Evidenzia elementi toccabili meno ovvi",
"pickExportDir": "Scegli cartella esp.",
"autoExportOnChanges": "Auto-esporta dopo modifiche",
"includeSettings": "Includi impostazioni",
"filterVersionsByRegEx": "Filtra versioni con espressione regolare",
"trySelectingSuggestedVersionCode": "Prova a selezionare APK con versionCode suggerito",
"dontSortReleasesList": "Conserva l'ordine di release da API",
"reverseSort": "Ordine inverso",
"takeFirstLink": "Prendi il primo link",
"skipSort": "Salta ordinamento",
"debugMenu": "Menu di debug",
"bgTaskStarted": "Attività in secondo piano iniziata - controllo log.",
"runBgCheckNow": "Inizia aggiornamento in secondo piano ora",
"versionExtractWholePage": "Applica regex di estrazione versione a tutta la pagina",
"installing": "Installazione",
"skipUpdateNotifications": "Salta notifiche di aggiornamento",
"updatesAvailableNotifChannel": "Aggiornamenti disponibili",
"appsUpdatedNotifChannel": "App aggiornate",
"appsPossiblyUpdatedNotifChannel": "Aggiornamenti app tentati",
"errorCheckingUpdatesNotifChannel": "Controllo degli errori per gli aggiornamenti",
"appsRemovedNotifChannel": "App rimosse",
"downloadingXNotifChannel": "Scaricamento di {} in corso",
"completeAppInstallationNotifChannel": "Completa l'installazione dell'app",
"checkingForUpdatesNotifChannel": "Controllo degli aggiornamenti in corso",
"onlyCheckInstalledOrTrackOnlyApps": "Cerca aggiornamenti solo per app installate e app in Solo-Monitoraggio",
"supportFixedAPKURL": "Supporta URL fissi di APK",
"selectX": "Seleziona {}",
"parallelDownloads": "Permetti download paralleli",
"useShizuku": "Utilizzare Shizuku o Sui per installare",
"shizukuBinderNotFound": "Shizuku non è in esecuzione",
"shizukuOld": "Vecchia versione di Shizuku (<11) - aggiornarla",
"shizukuOldAndroidWithADB": "Shizuku funziona su Android < 8.1 con ADB - aggiornare Android o utilizzare Sui al suo posto",
"shizukuPretendToBeGooglePlay": "Impostare Google Play come fonte di installazione (se si usa Shizuku)",
"useSystemFont": "Usa i caratteri di sistema",
"useVersionCodeAsOSVersion": "Usa il codice versione dell'app come versione rilevata dal sistema operativo",
"requestHeader": "Intestazione della richiesta",
"useLatestAssetDateAsReleaseDate": "Usa l'ultimo caricamento della risorsa come data di rilascio",
"defaultPseudoVersioningMethod": "Metodo di pseudoversione predefinito",
"partialAPKHash": "Hash APK parziale",
"APKLinkHash": "Hash collegamento APK",
"directAPKLink": "Collegamento APK diretto",
"pseudoVersionInUse": "È in uso una pseudo-versione",
"installed": "Installato",
"latest": "Ultimo",
"invertRegEx": "Inverti espressione regolare",
"note": "Nota",
"selfHostedNote": "Il menu a tendina \"{}\" può essere usato per raggiungere istanze autogestite/personali di qualsiasi fonte.",
"badDownload": "Non è stato possibile analizzare l'APK (download incompatibile o parziale).",
"beforeNewInstallsShareToAppVerifier": "Condividere le nuove applicazioni con AppVerifier (se disponibile)",
"appVerifierInstructionToast": "Condividete con AppVerifier, quindi tornate qui quando siete pronti.",
"wiki": "Aiuto/Wiki",
"crowdsourcedConfigsLabel": "Configurazioni di app in crowdsourcing (uso a proprio rischio)",
"crowdsourcedConfigsShort": "Configurazioni di app in crowdsourcing",
"allowInsecure": "Consentire le richieste HTTP non sicure",
"stayOneVersionBehind": "Rimanere una versione indietro rispetto alla più recente",
"refreshBeforeDownload": "Aggiornare i dettagli dell'app prima del download",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Rimuovere l'app?", "one": "Rimuovere l'app?",
"other": "Rimuovere le app?" "other": "Rimuovere le app?"
@ -294,5 +366,17 @@
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "{} e un'altra app sono state aggiornate.", "one": "{} e un'altra app sono state aggiornate.",
"other": "{} e altre {} app sono state aggiornate." "other": "{} e altre {} app sono state aggiornate."
},
"xAndNMoreUpdatesFailed": {
"one": "Non è riuscito ad aggiornare {} e altre 1 app.",
"other": "Non è riuscito ad aggiornare {} e {} altre applicazioni."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} e un'altra app potrebbero essere state aggiornate.",
"other": "{} e altre {} app potrebbero essere state aggiornate."
},
"apk": {
"one": "{} APK",
"other": "{} APK"
} }
} }

View File

@ -11,18 +11,10 @@
"unexpectedError": "予期せぬエラーが発生しました", "unexpectedError": "予期せぬエラーが発生しました",
"ok": "OK", "ok": "OK",
"and": "と", "and": "と",
"startedBgUpdateTask": "バックグラウンドのアップデート確認タスクを開始",
"bgUpdateIgnoreAfterIs": "Bg update ignoreAfter is {}",
"startedActualBGUpdateCheck": "実際のバックグラウンドのアップデート確認を開始",
"bgUpdateTaskFinished": "バックグラウンドのアップデート確認タスクを終了",
"firstRun": "これがObtainiumの最初の実行です",
"settingUpdateCheckIntervalTo": "確認間隔を{}に設定する",
"githubPATLabel": "GitHub パーソナルアクセストークン (レート制限の引き上げ)", "githubPATLabel": "GitHub パーソナルアクセストークン (レート制限の引き上げ)",
"githubPATHint": "PATは次の形式でなければなりません: ユーザー名:トークン",
"githubPATFormat": "ユーザー名:トークン",
"includePrereleases": "プレリリースを含む", "includePrereleases": "プレリリースを含む",
"fallbackToOlderReleases": "旧リリースへのフォールバック", "fallbackToOlderReleases": "旧リリースへのフォールバック",
"filterReleaseTitlesByRegEx": "正規表現でリリースタイトルを絞り込む", "filterReleaseTitlesByRegEx": "正規表現でリリースタイトルをフィルタリングする",
"invalidRegEx": "無効な正規表現", "invalidRegEx": "無効な正規表現",
"noDescription": "説明はありません", "noDescription": "説明はありません",
"cancel": "キャンセル", "cancel": "キャンセル",
@ -30,6 +22,9 @@
"requiredInBrackets": "(必須)", "requiredInBrackets": "(必須)",
"dropdownNoOptsError": "エラー: ドロップダウンには、少なくとも1つのオプションが必要です", "dropdownNoOptsError": "エラー: ドロップダウンには、少なくとも1つのオプションが必要です",
"colour": "カラー", "colour": "カラー",
"standard": "スタンダード",
"custom": "カスタム",
"useMaterialYou": "Material Youを使用する",
"githubStarredRepos": "Githubでスターしたリポジトリ", "githubStarredRepos": "Githubでスターしたリポジトリ",
"uname": "ユーザー名", "uname": "ユーザー名",
"wrongArgNum": "提供する引数の数が間違っています", "wrongArgNum": "提供する引数の数が間違っています",
@ -49,7 +44,7 @@
"searchSomeSourcesLabel": "検索 (一部ソースのみ)", "searchSomeSourcesLabel": "検索 (一部ソースのみ)",
"search": "検索", "search": "検索",
"additionalOptsFor": "{}の追加オプション", "additionalOptsFor": "{}の追加オプション",
"supportedSourcesBelow": "対応するソース:", "supportedSources": "対応するソース",
"trackOnlyInBrackets": "(追跡のみ)", "trackOnlyInBrackets": "(追跡のみ)",
"searchableInBrackets": "(検索可能)", "searchableInBrackets": "(検索可能)",
"appsString": "アプリ", "appsString": "アプリ",
@ -59,11 +54,10 @@
"percentProgress": "ダウンロード中: {}%", "percentProgress": "ダウンロード中: {}%",
"pleaseWait": "しばらくお待ちください", "pleaseWait": "しばらくお待ちください",
"updateAvailable": "アップデートが利用可能", "updateAvailable": "アップデートが利用可能",
"estimateInBracketsShort": "(推定)",
"notInstalled": "未インストール", "notInstalled": "未インストール",
"estimateInBrackets": "(推定)", "pseudoVersion": "疑似バージョン",
"selectAll": "すべて選択", "selectAll": "すべて選択",
"deselectN": "{}件の選択を解除", "deselectX": "{}件の選択を解除",
"xWillBeRemovedButRemainInstalled": "{} はObtainiumから削除されますが、デバイスにはインストールされたままです。", "xWillBeRemovedButRemainInstalled": "{} はObtainiumから削除されますが、デバイスにはインストールされたままです。",
"removeSelectedAppsQuestion": "選択したアプリを削除しますか?", "removeSelectedAppsQuestion": "選択したアプリを削除しますか?",
"removeSelectedApps": "選択したアプリを削除する", "removeSelectedApps": "選択したアプリを削除する",
@ -81,14 +75,15 @@
"unpinFromTop": "トップから固定解除", "unpinFromTop": "トップから固定解除",
"resetInstallStatusForSelectedAppsQuestion": "選択したアプリのインストール状態をリセットしますか?", "resetInstallStatusForSelectedAppsQuestion": "選択したアプリのインストール状態をリセットしますか?",
"installStatusOfXWillBeResetExplanation": "選択したアプリのインストール状態がリセットされます。\n\nアップデートに失敗した場合など、Obtainiumに表示されるアプリのバージョンが正しくない場合に有効です。", "installStatusOfXWillBeResetExplanation": "選択したアプリのインストール状態がリセットされます。\n\nアップデートに失敗した場合など、Obtainiumに表示されるアプリのバージョンが正しくない場合に有効です。",
"customLinkMessage": "これらのリンクはObtainiumがインストールされたデバイスで動作します",
"shareAppConfigLinks": "アプリの設定をHTMLリンクとして共有する",
"shareSelectedAppURLs": "選択したアプリのURLを共有する", "shareSelectedAppURLs": "選択したアプリのURLを共有する",
"resetInstallStatus": "インストール状態をリセットする", "resetInstallStatus": "インストール状態をリセットする",
"more": "もっと見る", "more": "もっと見る",
"removeOutdatedFilter": "アップデートが存在するアプリのフィルターを解除", "removeOutdatedFilter": "アップデートが存在するアプリのフィルターを解除",
"showOutdatedOnly": "アップデートが存在するアプリのみ表示する", "showOutdatedOnly": "アップデートが存在するアプリのみ表示する",
"filter": "フィルター", "filter": "フィルター",
"filterActive": "フィルター *", "filterApps": "アプリをフィルタリングする",
"filterApps": "アプリを絞り込む",
"appName": "アプリ名", "appName": "アプリ名",
"author": "作者", "author": "作者",
"upToDateApps": "最新のアプリ", "upToDateApps": "最新のアプリ",
@ -111,7 +106,6 @@
"importErrors": "インポートエラー", "importErrors": "インポートエラー",
"importedXOfYApps": "{} / {} アプリをインポートしました", "importedXOfYApps": "{} / {} アプリをインポートしました",
"followingURLsHadErrors": "以下のURLでエラーが発生しました:", "followingURLsHadErrors": "以下のURLでエラーが発生しました:",
"okay": "OK",
"selectURL": "URLを選択", "selectURL": "URLを選択",
"selectURLs": "URLを選択", "selectURLs": "URLを選択",
"pick": "選択", "pick": "選択",
@ -119,8 +113,7 @@
"dark": "ダーク", "dark": "ダーク",
"light": "ライト", "light": "ライト",
"followSystem": "システムに従う", "followSystem": "システムに従う",
"obtainium": "Obtainium", "followSystemThemeExplanation": "以下のシステムテーマは、サードパーティのアプリケーションを使用することによってのみ可能です。",
"materialYou": "Material You",
"useBlackTheme": "ピュアブラックダークテーマを使用する", "useBlackTheme": "ピュアブラックダークテーマを使用する",
"appSortBy": "アプリの並び方", "appSortBy": "アプリの並び方",
"authorName": "作者名/アプリ名", "authorName": "作者名/アプリ名",
@ -152,21 +145,23 @@
"updatesAvailable": "アップデートが利用可能", "updatesAvailable": "アップデートが利用可能",
"updatesAvailableNotifDescription": "Obtainiumが追跡している1つまたは複数のアプリのアップデートが利用可能であることをユーザーに通知する", "updatesAvailableNotifDescription": "Obtainiumが追跡している1つまたは複数のアプリのアップデートが利用可能であることをユーザーに通知する",
"noNewUpdates": "新しいアップデートはありません", "noNewUpdates": "新しいアップデートはありません",
"xHasAnUpdate": "{} のアップデートが利用可能です", "xHasAnUpdate": "{} のアップデートが利用可能です",
"appsUpdated": "アプリをアップデートしました", "appsUpdated": "アプリをアップデートしました",
"appsNotUpdated": "アプリのアップデートに失敗しました",
"appsUpdatedNotifDescription": "1つまたは複数のAppのアップデートがバックグラウンドで適用されたことをユーザーに通知する", "appsUpdatedNotifDescription": "1つまたは複数のAppのアップデートがバックグラウンドで適用されたことをユーザーに通知する",
"xWasUpdatedToY": "{} が {} にアップデートされました", "xWasUpdatedToY": "{} が {} にアップデートされました",
"xWasNotUpdatedToY": "{} の {} へのアップデートに失敗しました",
"errorCheckingUpdates": "アップデート確認中のエラー", "errorCheckingUpdates": "アップデート確認中のエラー",
"errorCheckingUpdatesNotifDescription": "バックグラウンドでのアップデート確認に失敗した際に表示される通知", "errorCheckingUpdatesNotifDescription": "バックグラウンドでのアップデート確認に失敗した際に表示される通知",
"appsRemoved": "削除されたアプリ", "appsRemoved": "削除されたアプリ",
"appsRemovedNotifDescription": "アプリの読み込み中にエラーが発生したため、1つまたは複数のアプリが削除されたことをユーザーに通知する", "appsRemovedNotifDescription": "アプリの読み込み中にエラーが発生したため、1つまたは複数のアプリが削除されたことをユーザーに通知する",
"xWasRemovedDueToErrorY": "このエラーのため、{} は削除されました: {}", "xWasRemovedDueToErrorY": "このエラーのため、{} は削除されました: {}",
"completeAppInstallation": "アプリのインストールを完了する", "completeAppInstallation": "アプリのインストールを完了する",
"obtainiumMustBeOpenToInstallApps": "アプリをインストールするにはObtainiumを開いている必要があります", "obtainiumMustBeOpenToInstallApps": "アプリをインストールするにはObtainiumを開必要があります",
"completeAppInstallationNotifDescription": "アプリのインストールを完了するために、Obtainiumに戻る必要があります", "completeAppInstallationNotifDescription": "アプリのインストールを完了するために、Obtainiumに戻る必要があります",
"checkingForUpdates": "アップデートを確認中", "checkingForUpdates": "アップデートを確認中",
"checkingForUpdatesNotifDescription": "アップデートを確認する際に表示される一時的な通知", "checkingForUpdatesNotifDescription": "アップデートを確認する際に表示される一時的な通知",
"pleaseAllowInstallPerm": "Obtainiumによるアプリのインストールを許可してください", "pleaseAllowInstallPerm": "Obtainiumによるアプリのインストールを許可してください",
"trackOnly": "追跡のみ", "trackOnly": "追跡のみ",
"errorWithHttpStatusCode": "エラー {}", "errorWithHttpStatusCode": "エラー {}",
"versionCorrectionDisabled": "バージョン補正無効 (プラグインが動作していません)", "versionCorrectionDisabled": "バージョン補正無効 (プラグインが動作していません)",
@ -178,15 +173,12 @@
"lastUpdateCheckX": "最終アップデート確認: {}", "lastUpdateCheckX": "最終アップデート確認: {}",
"remove": "削除", "remove": "削除",
"yesMarkUpdated": "はい、アップデート済みとしてマークします", "yesMarkUpdated": "はい、アップデート済みとしてマークします",
"fdroid": "F-Droid Official", "fdroid": "F-Droid公式",
"appIdOrName": "アプリのIDまたは名前", "appIdOrName": "アプリのIDまたは名前",
"appId": "App ID", "appId": "アプリID",
"appWithIdOrNameNotFound": "そのIDや名前を持つアプリは見つかりませんでした", "appWithIdOrNameNotFound": "そのIDや名前を持つアプリは見つかりませんでした",
"reposHaveMultipleApps": "リポジトリには複数のアプリが含まれることがあります", "reposHaveMultipleApps": "リポジトリには複数のアプリが含まれることがあります",
"fdroidThirdPartyRepo": "F-Droid サードパーティリポジトリ", "fdroidThirdPartyRepo": "F-Droid サードパーティリポジトリ",
"steam": "Steam",
"steamMobile": "Steam Mobile",
"steamChat": "Steam Chat",
"install": "インストール", "install": "インストール",
"markInstalled": "インストール済みとしてマークする", "markInstalled": "インストール済みとしてマークする",
"update": "アップデート", "update": "アップデート",
@ -195,6 +187,9 @@
"disableVersionDetection": "バージョン検出を無効にする", "disableVersionDetection": "バージョン検出を無効にする",
"noVersionDetectionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリにのみ使用する必要があります。", "noVersionDetectionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリにのみ使用する必要があります。",
"downloadingX": "{} をダウンロード中", "downloadingX": "{} をダウンロード中",
"downloadX": "ダウンロード",
"downloadedX": "ダウンロード",
"releaseAsset": "リリース資産",
"downloadNotifDescription": "アプリのダウンロード状況を通知する", "downloadNotifDescription": "アプリのダウンロード状況を通知する",
"noAPKFound": "APKが見つかりません", "noAPKFound": "APKが見つかりません",
"noVersionDetection": "バージョン検出を行わない", "noVersionDetection": "バージョン検出を行わない",
@ -211,27 +206,29 @@
"copiedToClipboard": "クリップボードにコピーしました", "copiedToClipboard": "クリップボードにコピーしました",
"storagePermissionDenied": "ストレージ権限が拒否されました", "storagePermissionDenied": "ストレージ権限が拒否されました",
"selectedCategorizeWarning": "これにより、選択したアプリの既存のカテゴリ設定がすべて置き換えられます。", "selectedCategorizeWarning": "これにより、選択したアプリの既存のカテゴリ設定がすべて置き換えられます。",
"filterAPKsByRegEx": "正規表現でAPKを絞り込む", "filterAPKsByRegEx": "正規表現でAPKをフィルタリングする",
"removeFromObtainium": "Obtainiumから削除する", "removeFromObtainium": "Obtainiumから削除する",
"uninstallFromDevice": "デバイスからアンインストールする", "uninstallFromDevice": "デバイスからアンインストールする",
"onlyWorksWithNonVersionDetectApps": "バージョン検出を無効にしているアプリにのみ動作します。", "onlyWorksWithNonVersionDetectApps": "バージョン検出を無効にしているアプリにのみ動作します。",
"releaseDateAsVersion": "リリース日をバージョンとして使用する", "releaseDateAsVersion": "リリース日をバージョンとして使用する",
"releaseTitleAsVersion": "リリースタイトルをバージョンとして使用する",
"releaseDateAsVersionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリで、リリース日が利用可能な場合にのみ使用する必要があります。", "releaseDateAsVersionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリで、リリース日が利用可能な場合にのみ使用する必要があります。",
"changes": "変更点", "changes": "変更点",
"releaseDate": "リリース日", "releaseDate": "リリース日",
"importFromURLsInFile": "ファイルOPMLなど内のURLからインポート", "importFromURLsInFile": "ファイルOPMLなど内のURLからインポート",
"versionDetectionExplanation": "バージョン文字列とOSから検出されたバージョンを照合する",
"versionDetection": "バージョン検出", "versionDetection": "バージョン検出",
"standardVersionDetection": "標準のバージョン検出", "standardVersionDetection": "標準のバージョン検出",
"groupByCategory": "カテゴリ別にグループ化する", "groupByCategory": "カテゴリ別にグループ化する",
"autoApkFilterByArch": "可能であればCPUアーキテクチャによるAPKのフィルタリングを試みる", "autoApkFilterByArch": "可能であればCPUアーキテクチャによるAPKのフィルタリングを試みる",
"overrideSource": "ソースの上書き", "overrideSource": "ソースの上書き",
"dontShowAgain": "二度と表示しない", "dontShowAgain": "二度と表示しない",
"dontShowTrackOnlyWarnings": "「追跡のみ」の警告を表示しない", "dontShowTrackOnlyWarnings": "「追跡のみ」の警告を表示しない",
"dontShowAPKOriginWarnings": "APKのダウンロード元の警告を表示しない", "dontShowAPKOriginWarnings": "APKのダウンロード元の警告を表示しない",
"moveNonInstalledAppsToBottom": "未インストールのアプリをアプリ一覧の下部に移動させる", "moveNonInstalledAppsToBottom": "未インストールのアプリをアプリ一覧の下部に移動させる",
"gitlabPATLabel": "GitLab パーソナルアクセストークン\n(検索とより良いAPK検出の有効化)", "gitlabPATLabel": "GitLab パーソナルアクセストークン",
"about": "概要", "about": "概要",
"requiresCredentialsInSettings": "これには追加の認証が必要です (設定にて)", "requiresCredentialsInSettings": "{}: これには追加の認証が必要です (設定にて)",
"checkOnStart": "起動時にアップデートを確認する", "checkOnStart": "起動時にアップデートを確認する",
"tryInferAppIdFromCode": "ソースコードからApp IDを推測する", "tryInferAppIdFromCode": "ソースコードからApp IDを推測する",
"removeOnExternalUninstall": "外部でアンインストールされたアプリを自動的に削除する", "removeOnExternalUninstall": "外部でアンインストールされたアプリを自動的に削除する",
@ -243,17 +240,92 @@
"addInfoBelow": "下部でこの情報を追加してください。", "addInfoBelow": "下部でこの情報を追加してください。",
"addInfoInSettings": "設定でこの情報を追加してください。", "addInfoInSettings": "設定でこの情報を追加してください。",
"githubSourceNote": "GitHubのレート制限はAPIキーを使うことで回避できます。", "githubSourceNote": "GitHubのレート制限はAPIキーを使うことで回避できます。",
"gitlabSourceNote": "GitLabのAPK抽出はAPIキーがないと動作しない場合があります。", "sortByLastLinkSegment": "リンクの最後のセグメントのみでソートする",
"sortByFileNamesNotLinks": "Sort by file names instead of full links", "filterReleaseNotesByRegEx": "正規表現でリリースノートをフィルタリングする",
"filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", "customLinkFilterRegex": "正規表現によるカスタムリンクフィルター (デフォルト '.apk$')",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "appsPossiblyUpdated": "アプリのアップデートを試行",
"appsPossiblyUpdatedNotifDescription": "1つまたは複数のアプリのアップデートがバックグラウンドで適用された可能性があることをユーザーに通知する",
"xWasPossiblyUpdatedToY": "{} が {} にアップデートされた可能性があります。",
"enableBackgroundUpdates": "バックグラウンドアップデートを有効化する",
"backgroundUpdateReqsExplanation": "バックグラウンドアップデートは、すべてのアプリで可能とは限りません。",
"backgroundUpdateLimitsExplanation": "バックグラウンドアップデートが成功したかどうかは、Obtainiumを起動したときにしか判断できません。",
"verifyLatestTag": "'latest'タグを確認する",
"intermediateLinkRegex": "訪問する「中間」リンクのフィルター",
"filterByLinkText": "テキストでリンクをフィルタリングする",
"intermediateLinkNotFound": "中間リンクが見つかりませんでした",
"intermediateLink": "中間リンク",
"exemptFromBackgroundUpdates": "バックグラウンドアップデートを行わない (有効な場合)",
"bgUpdatesOnWiFiOnly": "WiFiを使用していない場合、バックグラウンドアップデートを無効にする",
"bgUpdatesWhileChargingOnly": "非充電時にバックグラウンドアップデートを無効にする",
"autoSelectHighestVersionCode": "最も高いバージョンコードのAPKを自動で選択する",
"versionExtractionRegEx": "バージョン抽出の正規表現",
"trimVersionString": "正規表現でバージョン文字列をトリムする",
"matchGroupToUseForX": "\"{}\"に使用するマッチしたグループ",
"matchGroupToUse": "使用するマッチしたグループ",
"highlightTouchTargets": "目立たないタップ可能な対象をハイライトする",
"pickExportDir": "エクスポートディレクトリを選択",
"autoExportOnChanges": "変更があった際に自動でエクスポートする",
"includeSettings": "設定を含む",
"filterVersionsByRegEx": "正規表現でバージョンをフィルタリングする",
"trySelectingSuggestedVersionCode": "提案されたバージョンコードのAPKを選択する",
"dontSortReleasesList": "APIからのリリース順を保持する",
"reverseSort": "逆順ソート",
"takeFirstLink": "最初のリンクを取得する",
"skipSort": "ソートをスキップする",
"debugMenu": "デバッグメニュー",
"bgTaskStarted": "バックグラウンドタスクが開始されました - ログを確認してください。",
"runBgCheckNow": "今すぐバックグラウンドでのアップデート確認を開始する",
"versionExtractWholePage": "バージョン抽出の正規表現をページ全体に適用する",
"installing": "インストール中",
"skipUpdateNotifications": "アップデート通知を行わない",
"updatesAvailableNotifChannel": "アップデートが利用可能",
"appsUpdatedNotifChannel": "アプリをアップデートしました",
"appsPossiblyUpdatedNotifChannel": "アプリのアップデートを試行",
"errorCheckingUpdatesNotifChannel": "アップデート確認中のエラー",
"appsRemovedNotifChannel": "削除されたアプリ",
"downloadingXNotifChannel": "{} をダウンロード中",
"completeAppInstallationNotifChannel": "アプリのインストールを完了する",
"checkingForUpdatesNotifChannel": "アップデートを確認中",
"onlyCheckInstalledOrTrackOnlyApps": "インストール済みのアプリと「追跡のみ」のアプリのアップデートのみを確認する",
"supportFixedAPKURL": "固定されたAPKのURLをサポートする",
"selectX": "{} 選択",
"parallelDownloads": "並行ダウンロードを許可する",
"useShizuku": "ShizukuまたはSuiを使用してインストールする",
"shizukuBinderNotFound": "Shizukuが起動していません",
"shizukuOld": "古いShizukuのバージョン (<11) - アップデートしてください",
"shizukuOldAndroidWithADB": "ShizukuがAndroid 8.1未満でADBを使用して動作しています - Androidをアップデートするか、代わりにSuiを使用してください",
"shizukuPretendToBeGooglePlay": "Google Playをインストール元として設定するShizukuを使用する場合",
"useSystemFont": "システムフォントを使用する",
"useVersionCodeAsOSVersion": "アプリのバージョンコードをOSで検出されたバージョンとして使用する",
"requestHeader": "リクエストヘッダー",
"useLatestAssetDateAsReleaseDate": "最新のアセットアップロードをリリース日として使用する",
"defaultPseudoVersioningMethod": "デフォルトの疑似バージョン管理方法",
"partialAPKHash": "部分的なAPKのハッシュ",
"APKLinkHash": "APKリンクのハッシュ",
"directAPKLink": "APKのダイレクトリンク",
"pseudoVersionInUse": "疑似バージョンが使用されています",
"installed": "インストール済み",
"latest": "最新",
"invertRegEx": "正規表現を反転",
"note": "注",
"selfHostedNote": "ドロップダウン\"{}\"を使用すると、あらゆるソースのセルフホスト/カスタムインスタンスにアクセスできます。",
"badDownload": "APK を解析できませんでした(互換性がないか、部分的にダウンロードされています)。",
"beforeNewInstallsShareToAppVerifier": "AppVerifierで新しいアプリを共有する利用可能な場合",
"appVerifierInstructionToast": "AppVerifierに共有し、準備ができたらここに戻ってください。",
"wiki": "ヘルプ/ウィキ",
"crowdsourcedConfigsLabel": "クラウドソーシングによるアプリの設定(利用は自己責任で)",
"crowdsourcedConfigsShort": "クラウドソーシングによるアプリの設定",
"allowInsecure": "安全でないHTTPリクエストを許可する",
"stayOneVersionBehind": "最新のバージョンから1つ前のものを使用する",
"refreshBeforeDownload": "ダウンロード前にアプリの詳細を更新する",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": { "removeAppQuestion": {
"one": "アプリを削除しますか?", "one": "アプリを削除しますか?",
"other": "アプリを削除しますか?" "other": "アプリを削除しますか?"
}, },
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {
"one": "リクエストが多すぎます(レート制限)- {}分後に再試行してください", "one": "リクエストが多すぎます(レート制限)- {} 分後に再試行してください",
"other": "リクエストが多すぎます(レート制限)- {}分後に再試行してください" "other": "リクエストが多すぎます(レート制限)- {} 分後に再試行してください"
}, },
"bgUpdateGotErrorRetryInMinutes": { "bgUpdateGotErrorRetryInMinutes": {
"one": "バックグラウンドでのアップデート確認で {} の問題が発生, {} 分後に再試行します", "one": "バックグラウンドでのアップデート確認で {} の問題が発生, {} 分後に再試行します",
@ -264,35 +336,47 @@
"other": "バックグラウンドでのアップデート確認で {} 個のアップデートを発見 - 必要に応じてユーザーに通知します" "other": "バックグラウンドでのアップデート確認で {} 個のアップデートを発見 - 必要に応じてユーザーに通知します"
}, },
"apps": { "apps": {
"one": "{}個のアプリ", "one": "{} 個のアプリ",
"other": "{}個のアプリ" "other": "{} 個のアプリ"
}, },
"url": { "url": {
"one": "{}個のURL", "one": "{} 個のURL",
"other": "{}個のURL" "other": "{} 個のURL"
}, },
"minute": { "minute": {
"one": "{}分", "one": "{} 分",
"other": "{}分" "other": "{} 分"
}, },
"hour": { "hour": {
"one": "{}時間", "one": "{} 時間",
"other": "{}時間" "other": "{} 時間"
}, },
"day": { "day": {
"one": "{}日", "one": "{} 日",
"other": "{}日" "other": "{} 日"
}, },
"clearedNLogsBeforeXAfterY": { "clearedNLogsBeforeXAfterY": {
"one": "{n}個のログをクリアしました (前 = {before}, 後 = {after})", "one": "{n} 個のログをクリアしました (前 = {before}, 後 = {after})",
"other": "{n}個のログをクリアしました (前 = {before}, 後 = {after})" "other": "{n} 個のログをクリアしました (前 = {before}, 後 = {after})"
}, },
"xAndNMoreUpdatesAvailable": { "xAndNMoreUpdatesAvailable": {
"one": "{} とさらに {} 個のアプリのアップデートが利用可能です", "one": "{} とさらに 1 個のアプリのアップデートが利用可能です",
"other": "{} とさらに {} 個のアプリのアップデートが利用可能です" "other": "{} とさらに {} 個のアプリのアップデートが利用可能です"
}, },
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "{} とさらに {} 個のアプリがアップデートされました", "one": "{} とさらに 1 個のアプリがアップデートされました",
"other": "{} とさらに {} 個のアプリがアップデートされました" "other": "{} とさらに {} 個のアプリがアップデートされました"
},
"xAndNMoreUpdatesFailed": {
"one": "{} とさらに 1 個のアプリのアップデートに失敗しました。",
"other": "{} とさらに {} 個のアプリのアップデートに失敗しました。"
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。",
"other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。"
},
"apk": {
"one": "{} APK",
"other": "{} APK"
} }
} }

382
assets/translations/ko.json Normal file
View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "유효한 {} 앱 URL이 아닙니다",
"noReleaseFound": "적절한 릴리스를 찾을 수 없습니다",
"noVersionFound": "릴리스 버전을 결정할 수 없습니다",
"urlMatchesNoSource": "URL이 알려진 소스와 일치하지 않습니다",
"cantInstallOlderVersion": "앱의 이전 버전을 설치할 수 없습니다",
"appIdMismatch": "다운로드된 패키지 ID가 기존 앱 ID와 일치하지 않습니다",
"functionNotImplemented": "이 클래스는 이 기능을 구현하지 않았습니다",
"placeholder": "플레이스홀더",
"someErrors": "일부 오류가 발생했습니다",
"unexpectedError": "예기치 않은 오류",
"ok": "확인",
"and": "그리고",
"githubPATLabel": "GitHub 개인 액세스 토큰 (속도 제한 증가)",
"includePrereleases": "사전 릴리스 포함",
"fallbackToOlderReleases": "이전 릴리스로 대체",
"filterReleaseTitlesByRegEx": "정규 표현식으로 릴리스 제목 필터링",
"invalidRegEx": "잘못된 정규 표현식",
"noDescription": "설명 없음",
"cancel": "취소",
"continue": "계속",
"requiredInBrackets": "(필수)",
"dropdownNoOptsError": "오류: 드롭다운에는 최소 하나의 옵션이 있어야 합니다",
"colour": "색상",
"standard": "표준",
"custom": "사용자 정의",
"useMaterialYou": "Material You 사용",
"githubStarredRepos": "GitHub 즐겨찾기 저장소",
"uname": "사용자 이름",
"wrongArgNum": "잘못된 인수 수 제공",
"xIsTrackOnly": "{}는 추적 전용입니다",
"source": "소스",
"app": "앱",
"appsFromSourceAreTrackOnly": "이 소스의 앱은 '추적 전용'입니다.",
"youPickedTrackOnly": "당신은 '추적 전용' 옵션을 선택했습니다.",
"trackOnlyAppDescription": "앱은 업데이트를 위해 추적되지만 Obtainium은 다운로드하거나 설치할 수 없습니다.",
"cancelled": "취소됨",
"appAlreadyAdded": "앱이 이미 추가되었습니다",
"alreadyUpToDateQuestion": "앱이 이미 최신 상태입니까?",
"addApp": "앱 추가",
"appSourceURL": "앱 소스 URL",
"error": "오류",
"add": "추가",
"searchSomeSourcesLabel": "검색 (일부 소스만)",
"search": "검색",
"additionalOptsFor": "{}에 대한 추가 옵션",
"supportedSources": "지원되는 소스",
"trackOnlyInBrackets": "(추적 전용)",
"searchableInBrackets": "(검색 가능)",
"appsString": "앱",
"noApps": "앱 없음",
"noAppsForFilter": "필터에 대한 앱 없음",
"byX": "{}에 의해",
"percentProgress": "진행률: {}%",
"pleaseWait": "기다려 주세요",
"updateAvailable": "업데이트 가능",
"notInstalled": "설치되지 않음",
"pseudoVersion": "의사 버전",
"selectAll": "모두 선택",
"deselectX": "{} 선택 해제",
"xWillBeRemovedButRemainInstalled": "{}는 Obtainium에서 제거되지만 장치에 설치된 상태로 남아 있습니다.",
"removeSelectedAppsQuestion": "선택한 앱을 제거하시겠습니까?",
"removeSelectedApps": "선택한 앱 제거",
"updateX": "{} 업데이트",
"installX": "{} 설치",
"markXTrackOnlyAsUpdated": "{}\n(추적 전용)\n업데이트됨으로 표시",
"changeX": "{} 변경",
"installUpdateApps": "앱 설치/업데이트",
"installUpdateSelectedApps": "선택한 앱 설치/업데이트",
"markXSelectedAppsAsUpdated": "{} 선택한 앱을 업데이트됨으로 표시하시겠습니까?",
"no": "아니요",
"yes": "예",
"markSelectedAppsUpdated": "선택한 앱을 업데이트됨으로 표시",
"pinToTop": "상단에 고정",
"unpinFromTop": "상단에서 고정 해제",
"resetInstallStatusForSelectedAppsQuestion": "선택한 앱의 설치 상태를 재설정하시겠습니까?",
"installStatusOfXWillBeResetExplanation": "선택한 앱의 설치 상태가 재설정됩니다.\n\n이것은 실패한 업데이트나 기타 문제로 인해 Obtainium에 표시된 앱 버전이 잘못된 경우에 도움이 될 수 있습니다.",
"customLinkMessage": "이 링크는 Obtainium이 설치된 장치에서 작동합니다",
"shareAppConfigLinks": "앱 구성 HTML 링크로 공유",
"shareSelectedAppURLs": "선택한 앱 URL 공유",
"resetInstallStatus": "설치 상태 재설정",
"more": "더보기",
"removeOutdatedFilter": "구식 앱 필터 제거",
"showOutdatedOnly": "구식 앱만 표시",
"filter": "필터",
"filterApps": "앱 필터",
"appName": "앱 이름",
"author": "저자",
"upToDateApps": "최신 상태의 앱",
"nonInstalledApps": "설치되지 않은 앱",
"importExport": "가져오기/내보내기",
"settings": "설정",
"exportedTo": "{}로 내보내기 완료",
"obtainiumExport": "Obtainium 내보내기",
"invalidInput": "잘못된 입력",
"importedX": "{} 가져오기 완료",
"obtainiumImport": "Obtainium 가져오기",
"importFromURLList": "URL 목록에서 가져오기",
"searchQuery": "검색 쿼리",
"appURLList": "앱 URL 목록",
"line": "줄",
"searchX": "{} 검색",
"noResults": "결과가 없습니다",
"importX": "{} 가져오기",
"importedAppsIdDisclaimer": "가져온 앱은 \"설치되지 않음\"으로 잘못 표시될 수 있습니다.\n이를 수정하려면 Obtainium을 통해 다시 설치하십시오.\n앱 데이터에는 영향을 미치지 않습니다.\n\nURL 및 타사 가져오기 방법에만 영향을 미칩니다.",
"importErrors": "가져오기 오류",
"importedXOfYApps": "{}개의 앱 중 {}개 가져오기 완료.",
"followingURLsHadErrors": "다음 URL에 오류가 있었습니다:",
"selectURL": "URL 선택",
"selectURLs": "URL 선택",
"pick": "선택",
"theme": "테마",
"dark": "다크",
"light": "라이트",
"followSystem": "시스템 따르기",
"followSystemThemeExplanation": "시스템 테마를 따르려면 타사 애플리케이션을 사용해야 합니다",
"useBlackTheme": "순수한 검은색 다크 테마 사용",
"appSortBy": "앱 정렬 기준",
"authorName": "저자/이름",
"nameAuthor": "이름/저자",
"asAdded": "추가된 순서대로",
"appSortOrder": "앱 정렬 순서",
"ascending": "오름차순",
"descending": "내림차순",
"bgUpdateCheckInterval": "백그라운드 업데이트 확인 간격",
"neverManualOnly": "절대 - 수동만",
"appearance": "외관",
"showWebInAppView": "앱 보기에서 소스 웹페이지 표시",
"pinUpdates": "앱 보기 상단에 업데이트 고정",
"updates": "업데이트",
"sourceSpecific": "소스별",
"appSource": "앱 소스",
"noLogs": "로그 없음",
"appLogs": "앱 로그",
"close": "닫기",
"share": "공유",
"appNotFound": "앱을 찾을 수 없습니다",
"obtainiumExportHyphenatedLowercase": "obtainium-export",
"pickAnAPK": "APK 선택",
"appHasMoreThanOnePackage": "{}에는 둘 이상의 패키지가 있습니다:",
"deviceSupportsXArch": "장치는 {} CPU 아키텍처를 지원합니다.",
"deviceSupportsFollowingArchs": "장치는 다음 CPU 아키텍처를 지원합니다:",
"warning": "경고",
"sourceIsXButPackageFromYPrompt": "앱 소스는 '{}'이지만 릴리스 패키지는 '{}'에서 제공됩니다. 계속하시겠습니까?",
"updatesAvailable": "업데이트 가능",
"updatesAvailableNotifDescription": "Obtainium이 추적하는 하나 이상의 앱에 대한 업데이트가 있음을 사용자에게 알립니다",
"noNewUpdates": "새로운 업데이트가 없습니다.",
"xHasAnUpdate": "{}에 업데이트가 있습니다.",
"appsUpdated": "앱 업데이트됨",
"appsNotUpdated": "앱 업데이트 실패",
"appsUpdatedNotifDescription": "백그라운드에서 하나 이상의 앱에 대한 업데이트가 적용되었음을 사용자에게 알립니다",
"xWasUpdatedToY": "{}가 {}로 업데이트되었습니다.",
"xWasNotUpdatedToY": "{}를 {}로 업데이트하지 못했습니다.",
"errorCheckingUpdates": "업데이트 확인 오류",
"errorCheckingUpdatesNotifDescription": "백그라운드 업데이트 확인이 실패할 때 표시되는 알림",
"appsRemoved": "앱 제거됨",
"appsRemovedNotifDescription": "로드 중 오류로 인해 하나 이상의 앱이 제거되었음을 사용자에게 알립니다",
"xWasRemovedDueToErrorY": "{}가 다음 오류로 인해 제거되었습니다: {}",
"completeAppInstallation": "앱 설치 완료",
"obtainiumMustBeOpenToInstallApps": "앱을 설치하려면 Obtainium이 열려 있어야 합니다",
"completeAppInstallationNotifDescription": "앱 설치를 완료하려면 Obtainium으로 돌아가도록 사용자에게 요청합니다",
"checkingForUpdates": "업데이트 확인 중",
"checkingForUpdatesNotifDescription": "업데이트 확인 시 나타나는 일시적인 알림",
"pleaseAllowInstallPerm": "Obtainium이 앱을 설치할 수 있도록 허용해 주세요",
"trackOnly": "추적 전용",
"errorWithHttpStatusCode": "오류 {}",
"versionCorrectionDisabled": "버전 수정 비활성화됨 (플러그인이 작동하지 않는 것 같습니다)",
"unknown": "알 수 없음",
"none": "없음",
"never": "절대",
"latestVersionX": "최신: {}",
"installedVersionX": "설치됨: {}",
"lastUpdateCheckX": "마지막 업데이트 확인: {}",
"remove": "제거",
"yesMarkUpdated": "예, 업데이트됨으로 표시",
"fdroid": "F-Droid 공식",
"appIdOrName": "앱 ID 또는 이름",
"appId": "앱 ID",
"appWithIdOrNameNotFound": "해당 ID 또는 이름의 앱을 찾을 수 없습니다",
"reposHaveMultipleApps": "저장소에는 여러 앱이 포함될 수 있습니다",
"fdroidThirdPartyRepo": "F-Droid 타사 저장소",
"install": "설치",
"markInstalled": "설치됨으로 표시",
"update": "업데이트",
"markUpdated": "업데이트됨으로 표시",
"additionalOptions": "추가 옵션",
"disableVersionDetection": "버전 감지 비활성화",
"noVersionDetectionExplanation": "이 옵션은 버전 감지가 올바르게 작동하지 않는 앱에만 사용해야 합니다.",
"downloadingX": "{} 다운로드 중",
"downloadX": "{} 다운로드",
"downloadedX": "{} 다운로드 완료",
"releaseAsset": "릴리스 자산",
"downloadNotifDescription": "앱 다운로드 진행 상황을 사용자에게 알립니다",
"noAPKFound": "APK를 찾을 수 없습니다",
"noVersionDetection": "버전 감지 없음",
"categorize": "분류",
"categories": "카테고리",
"category": "카테고리",
"noCategory": "카테고리 없음",
"noCategories": "카테고리 없음",
"deleteCategoriesQuestion": "카테고리를 삭제하시겠습니까?",
"categoryDeleteWarning": "삭제된 카테고리의 모든 앱은 미분류로 설정됩니다.",
"addCategory": "카테고리 추가",
"label": "레이블",
"language": "언어",
"copiedToClipboard": "클립보드에 복사됨",
"storagePermissionDenied": "저장소 권한 거부됨",
"selectedCategorizeWarning": "이 작업은 선택한 앱의 기존 카테고리 설정을 대체합니다.",
"filterAPKsByRegEx": "정규 표현식으로 APK 필터링",
"removeFromObtainium": "Obtainium에서 제거",
"uninstallFromDevice": "장치에서 제거",
"onlyWorksWithNonVersionDetectApps": "버전 감지가 비활성화된 앱에만 작동합니다.",
"releaseDateAsVersion": "릴리스 날짜를 버전 문자열로 사용",
"releaseTitleAsVersion": "릴리스 제목을 버전 문자열로 사용",
"releaseDateAsVersionExplanation": "이 옵션은 버전 감지가 올바르게 작동하지 않지만 릴리스 날짜가 있는 앱에만 사용해야 합니다.",
"changes": "변경 사항",
"releaseDate": "릴리스 날짜",
"importFromURLsInFile": "파일의 URL에서 가져오기 (OPML과 같은)",
"versionDetectionExplanation": "OS에서 감지된 버전과 버전 문자열 조정",
"versionDetection": "버전 감지",
"standardVersionDetection": "표준 버전 감지",
"groupByCategory": "카테고리별 그룹화",
"autoApkFilterByArch": "가능한 경우 CPU 아키텍처별로 APK 필터링 시도",
"overrideSource": "소스 재정의",
"dontShowAgain": "다시 표시하지 않기",
"dontShowTrackOnlyWarnings": "'추적 전용' 경고 표시 안 함",
"dontShowAPKOriginWarnings": "APK 출처 경고 표시 안 함",
"moveNonInstalledAppsToBottom": "설치되지 않은 앱을 앱 보기 하단으로 이동",
"gitlabPATLabel": "GitLab 개인 액세스 토큰",
"about": "정보",
"requiresCredentialsInSettings": "{}는 추가 자격 증명이 필요합니다 (설정에서)",
"checkOnStart": "시작 시 업데이트 확인",
"tryInferAppIdFromCode": "소스 코드에서 앱 ID 추론 시도",
"removeOnExternalUninstall": "외부에서 제거된 앱 자동 제거",
"pickHighestVersionCode": "가장 높은 버전 코드 APK 자동 선택",
"checkUpdateOnDetailPage": "앱 세부 정보 페이지 열 때 업데이트 확인",
"disablePageTransitions": "페이지 전환 애니메이션 비활성화",
"reversePageTransitions": "페이지 전환 애니메이션 반전",
"minStarCount": "최소 별 개수",
"addInfoBelow": "아래에 이 정보를 추가하십시오.",
"addInfoInSettings": "설정에 이 정보를 추가하십시오.",
"githubSourceNote": "GitHub 속도 제한은 API 키를 사용하여 피할 수 있습니다.",
"sortByLastLinkSegment": "링크의 마지막 세그먼트로만 정렬",
"filterReleaseNotesByRegEx": "정규 표현식으로 릴리스 노트 필터링",
"customLinkFilterRegex": "정규 표현식으로 사용자 정의 APK 링크 필터링 (기본값 '.apk$')",
"appsPossiblyUpdated": "앱 업데이트 시도됨",
"appsPossiblyUpdatedNotifDescription": "백그라운드에서 하나 이상의 앱에 대한 업데이트가 잠재적으로 적용되었음을 사용자에게 알립니다",
"xWasPossiblyUpdatedToY": "{}가 {}로 업데이트되었을 수 있습니다.",
"enableBackgroundUpdates": "백그라운드 업데이트 활성화",
"backgroundUpdateReqsExplanation": "모든 앱에 대해 백그라운드 업데이트가 가능하지 않을 수 있습니다.",
"backgroundUpdateLimitsExplanation": "백그라운드 설치의 성공 여부는 Obtainium이 열릴 때만 확인할 수 있습니다.",
"verifyLatestTag": "'최신' 태그 확인",
"intermediateLinkRegex": "'중간' 링크 방문 필터",
"filterByLinkText": "링크 텍스트로 링크 필터링",
"intermediateLinkNotFound": "중간 링크를 찾을 수 없습니다",
"intermediateLink": "중간 링크",
"exemptFromBackgroundUpdates": "백그라운드 업데이트에서 제외 (활성화된 경우)",
"bgUpdatesOnWiFiOnly": "WiFi가 아닐 때 백그라운드 업데이트 비활성화",
"bgUpdatesWhileChargingOnly": "충전 중이 아닐 때 백그라운드 업데이트 비활성화",
"autoSelectHighestVersionCode": "가장 높은 versionCode APK 자동 선택",
"versionExtractionRegEx": "버전 문자열 추출 정규 표현식",
"trimVersionString": "정규 표현식으로 버전 문자열 자르기",
"matchGroupToUseForX": "\"{}\"에 사용할 일치 그룹",
"matchGroupToUse": "버전 문자열 추출 정규 표현식에 사용할 일치 그룹",
"highlightTouchTargets": "덜 명확한 터치 대상 강조",
"pickExportDir": "내보내기 디렉토리 선택",
"autoExportOnChanges": "변경 시 자동 내보내기",
"includeSettings": "설정 포함",
"filterVersionsByRegEx": "정규 표현식으로 버전 필터링",
"trySelectingSuggestedVersionCode": "제안된 versionCode APK 선택 시도",
"dontSortReleasesList": "API에서 릴리스 순서 유지",
"reverseSort": "정렬 반전",
"takeFirstLink": "첫 번째 링크 선택",
"skipSort": "정렬 건너뛰기",
"debugMenu": "디버그 메뉴",
"bgTaskStarted": "백그라운드 작업 시작됨 - 로그를 확인하세요.",
"runBgCheckNow": "지금 백그라운드 업데이트 확인 실행",
"versionExtractWholePage": "전체 페이지에 버전 문자열 추출 정규 표현식 적용",
"installing": "설치 중",
"skipUpdateNotifications": "업데이트 알림 건너뛰기",
"updatesAvailableNotifChannel": "업데이트 가능",
"appsUpdatedNotifChannel": "앱 업데이트됨",
"appsPossiblyUpdatedNotifChannel": "앱 업데이트 시도됨",
"errorCheckingUpdatesNotifChannel": "업데이트 확인 오류",
"appsRemovedNotifChannel": "앱 제거됨",
"downloadingXNotifChannel": "{} 다운로드 중",
"completeAppInstallationNotifChannel": "앱 설치 완료",
"checkingForUpdatesNotifChannel": "업데이트 확인 중",
"onlyCheckInstalledOrTrackOnlyApps": "설치된 앱과 추적 전용 앱만 업데이트 확인",
"supportFixedAPKURL": "고정 APK URL 지원",
"selectX": "{} 선택",
"parallelDownloads": "병렬 다운로드 허용",
"useShizuku": "Shizuku 또는 Sui를 사용하여 설치",
"shizukuBinderNotFound": "Shizuku 서비스가 실행 중이 아닙니다",
"shizukuOld": "오래된 Shizuku 버전 (<11) - 업데이트 필요",
"shizukuOldAndroidWithADB": "ADB로 Android < 8.1에서 실행 중인 Shizuku - Android를 업데이트하거나 대신 Sui를 사용하세요",
"shizukuPretendToBeGooglePlay": "설치 소스로 Google Play 설정 (Shizuku 사용 시)",
"useSystemFont": "시스템 글꼴 사용",
"useVersionCodeAsOSVersion": "앱 versionCode를 OS에서 감지된 버전으로 사용",
"requestHeader": "요청 헤더",
"useLatestAssetDateAsReleaseDate": "최신 자산 업로드를 릴리스 날짜로 사용",
"defaultPseudoVersioningMethod": "기본 의사 버전 관리 방법",
"partialAPKHash": "부분 APK 해시",
"APKLinkHash": "APK 링크 해시",
"directAPKLink": "직접 APK 링크",
"pseudoVersionInUse": "의사 버전 사용 중",
"installed": "설치됨",
"latest": "최신",
"invertRegEx": "정규 표현식 반전",
"note": "노트",
"selfHostedNote": "\"{}\" 드롭다운을 사용하여 소스의 자체 호스팅/사용자 정의 인스턴스에 도달할 수 있습니다.",
"badDownload": "APK를 구문 분석할 수 없습니다 (호환되지 않거나 부분 다운로드)",
"beforeNewInstallsShareToAppVerifier": "새 앱을 AppVerifier와 공유 (가능한 경우)",
"appVerifierInstructionToast": "AppVerifier에 공유한 후 준비가 되면 여기로 돌아오세요.",
"wiki": "도움말/위키",
"crowdsourcedConfigsLabel": "크라우드소싱 앱 구성 (자신의 책임 하에 사용)",
"crowdsourcedConfigsShort": "크라우드소싱 앱 구성",
"allowInsecure": "안전하지 않은 HTTP 요청 허용",
"stayOneVersionBehind": "최신 버전보다 한 버전 뒤에 머무르기",
"refreshBeforeDownload": "다운로드 전에 앱 세부 정보 새로 고침",
"tencentAppStore": "텐센트 앱 스토어",
"removeAppQuestion": {
"one": "앱을 제거하시겠습니까?",
"other": "앱을 제거하시겠습니까?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "요청이 너무 많습니다 (속도 제한) - {}분 후에 다시 시도하세요",
"other": "요청이 너무 많습니다 (속도 제한) - {}분 후에 다시 시도하세요"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "BG 업데이트 확인 중 {} 오류가 발생했습니다. {}분 후에 다시 확인을 예약합니다",
"other": "BG 업데이트 확인 중 {} 오류가 발생했습니다. {}분 후에 다시 확인을 예약합니다"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "BG 업데이트 확인에서 {}개의 업데이트를 발견했습니다 - 필요 시 사용자에게 알립니다",
"other": "BG 업데이트 확인에서 {}개의 업데이트를 발견했습니다 - 필요 시 사용자에게 알립니다"
},
"apps": {
"one": "{} 앱",
"other": "{} 앱"
},
"url": {
"one": "{} URL",
"other": "{} URL"
},
"minute": {
"one": "{} 분",
"other": "{} 분"
},
"hour": {
"one": "{} 시간",
"other": "{} 시간"
},
"day": {
"one": "{} 일",
"other": "{} 일"
},
"clearedNLogsBeforeXAfterY": {
"one": "{n}개의 로그가 지워졌습니다 (이전 = {before}, 이후 = {after})",
"other": "{n}개의 로그가 지워졌습니다 (이전 = {before}, 이후 = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} 및 1개의 앱에 업데이트가 있습니다.",
"other": "{} 및 {}개의 앱에 업데이트가 있습니다."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} 및 1개의 앱이 업데이트되었습니다.",
"other": "{} 및 {}개의 앱이 업데이트되었습니다."
},
"xAndNMoreUpdatesFailed": {
"one": "{} 및 1개의 앱 업데이트에 실패했습니다.",
"other": "{} 및 {}개의 앱 업데이트에 실패했습니다."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} 및 1개의 앱이 업데이트되었을 수 있습니다.",
"other": "{} 및 {}개의 앱이 업데이트되었을 수 있습니다."
},
"apk": {
"one": "{} APK",
"other": "{} APK"
}
}

382
assets/translations/nl.json Normal file
View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "Ongeldige app-URL voor {}",
"noReleaseFound": "Geen geschikte release gevonden",
"noVersionFound": "Geen versie kunnen bepalen",
"urlMatchesNoSource": "URL komt niet overeen met bekende bron",
"cantInstallOlderVersion": "Kan geen oudere versie van de app installeren",
"appIdMismatch": "Gedownload pakket-ID komt niet overeen met de bestaande app-ID",
"functionNotImplemented": "Deze klasse heeft deze functie niet geïmplementeerd.",
"placeholder": "Dummy",
"someErrors": "Er zijn enkele fouten opgetreden",
"unexpectedError": "Onverwachte fout",
"ok": "Oké",
"and": "en",
"githubPATLabel": "GitHub Personal Access Token\n(Verhoogt limiet aantal verzoeken)",
"includePrereleases": "Inclusief pre-releases",
"fallbackToOlderReleases": "Terugvallen op oudere releases",
"filterReleaseTitlesByRegEx": "Release-titels filteren met reguliere expressies.",
"invalidRegEx": "Ongeldige reguliere expressie",
"noDescription": "Geen omschrijving",
"cancel": "Annuleren",
"continue": "Doorgaan",
"requiredInBrackets": "(Verplicht)",
"dropdownNoOptsError": "FOUTMELDING: UITKLAPMENU MOET TENMINSTE EEN OPT HEBBEN",
"colour": "Kleur",
"standard": "Standaard",
"custom": "Aangepast",
"useMaterialYou": "Material You gebruiken",
"githubStarredRepos": "GitHub-repo's met ster",
"uname": "Gebruikersnaam",
"wrongArgNum": "Incorrect aantal argumenten.",
"xIsTrackOnly": "{} is 'Alleen volgen'",
"source": "Bron",
"app": "App",
"appsFromSourceAreTrackOnly": "Apps van deze bron zijn 'Alleen volgen'.",
"youPickedTrackOnly": "De optie 'Alleen volgen' is geselecteerd.",
"trackOnlyAppDescription": "De app zal worden gevolgd voor updates, maar Obtainium zal niet in staat zijn om deze te downloaden of te installeren.",
"cancelled": "Geannuleerd",
"appAlreadyAdded": "App reeds toegevoegd",
"alreadyUpToDateQuestion": "App al bijgewerkt?",
"addApp": "App toevoegen",
"appSourceURL": "App-bron URL",
"error": "Foutmelding",
"add": "Toevoegen",
"searchSomeSourcesLabel": "Zoeken (sommige bronnen)",
"search": "Zoeken",
"additionalOptsFor": "Aanvullende opties voor {}",
"supportedSources": "Ondersteunde bronnen",
"trackOnlyInBrackets": "(Alleen volgen)",
"searchableInBrackets": "(Doorzoekbaar)",
"appsString": "Apps",
"noApps": "Geen Apps",
"noAppsForFilter": "Geen Apps voor filter",
"byX": "Door {}",
"percentProgress": "Voortgang: {}%",
"pleaseWait": "Even geduld",
"updateAvailable": "Update beschikbaar",
"notInstalled": "Niet geinstalleerd",
"pseudoVersion": "pseudo-versie",
"selectAll": "Alles selecteren",
"deselectX": "Selectie opheffen {}",
"xWillBeRemovedButRemainInstalled": "{} zal worden gewist uit Obtainium, maar blijft geïnstalleerd op het apparaat.",
"removeSelectedAppsQuestion": "Geselecteerde apps verwijderen?",
"removeSelectedApps": "Geselecteerde apps verwijderen",
"updateX": "{} bijwerken",
"installX": "{} installeren",
"markXTrackOnlyAsUpdated": "{}\n(Alleen volgen)\nmarkeren als bijgewerkt",
"changeX": "{} wijzigen",
"installUpdateApps": "Apps installeren/bijwerken",
"installUpdateSelectedApps": "Geselecteerde apps installeren/bijwerken",
"markXSelectedAppsAsUpdated": "{} geselecteerde apps markeren als bijgewerkt?",
"no": "Nee",
"yes": "Ja",
"markSelectedAppsUpdated": "Geselecteerde apps markeren als bijgewerkt",
"pinToTop": "Bovenaan plaatsen",
"unpinFromTop": "Bovenaan wegnemen",
"resetInstallStatusForSelectedAppsQuestion": "Installatiestatus herstellen voor geselecteerde apps?",
"installStatusOfXWillBeResetExplanation": "De installatiestatus van alle geselecteerde apps zal worden hersteld.\n\nDit kan helpen wanneer de versie van de app die in Obtainium wordt weergegeven onjuist is vanwege mislukte updates of andere problemen.",
"customLinkMessage": "Deze koppelingen werken op apparaten waarop Obtainium is geïnstalleerd",
"shareAppConfigLinks": "App-configuratie delen als HTML-link",
"shareSelectedAppURLs": "Geselecteerde app-URL's delen",
"resetInstallStatus": "Installatiestatus herstellen",
"more": "Meer",
"removeOutdatedFilter": "Verouderde apps-filter verwijderen",
"showOutdatedOnly": "Alleen verouderde apps weergeven",
"filter": "Filteren",
"filterApps": "Apps filteren",
"appName": "App-naam",
"author": "Auteur",
"upToDateApps": "Bijgewerkte apps",
"nonInstalledApps": "Niet-geïnstalleerde apps",
"importExport": "Importeren/exporteren",
"settings": "Instellingen",
"exportedTo": "Geëxporteerd naar {}",
"obtainiumExport": "Obtainium export",
"invalidInput": "Ongeldige invoer",
"importedX": "{} geïmporteerd",
"obtainiumImport": "Obtainium import",
"importFromURLList": "Importeren van URL-lijsten",
"searchQuery": "Zoekopdracht",
"appURLList": "App URL-lijst",
"line": "Regel",
"searchX": "{} zoeken",
"noResults": "Geen resultaten gevonden",
"importX": "{} importeren",
"importedAppsIdDisclaimer": "Geïmporteerde apps kunnen mogelijk onjuist worden weergegeven als \"Niet geïnstalleerd\".\nOm dit op te lossen, installeer deze opnieuw via Obtainium.\nDit zou geen invloed moeten hebben op app-gegevens.\n\nDit heeft alleen invloed op URL- en importmethoden van derden.",
"importErrors": "Fouten bij het importeren",
"importedXOfYApps": "{} van {} apps geïmporteerd.",
"followingURLsHadErrors": "De volgende URL's bevatten fouten:",
"selectURL": "URL selecteren",
"selectURLs": "URL's selecteren",
"pick": "Kiezen",
"theme": "Thema",
"dark": "Donker",
"light": "Licht",
"followSystem": "Systeem volgen",
"followSystemThemeExplanation": "Het volgen van het systeemthema is alleen mogelijk met applicaties van derden",
"useBlackTheme": "Zwart thema gebruiken",
"appSortBy": "Sortering",
"authorName": "Auteur/Naam",
"nameAuthor": "Naam/Auteur",
"asAdded": "Datum toegevoegd",
"appSortOrder": "Volgorde",
"ascending": "Oplopend",
"descending": "Aflopend",
"bgUpdateCheckInterval": "Frequentie voor achtergrond-updatecontrole",
"neverManualOnly": "Nooit - Alleen handmatig",
"appearance": "Weergave",
"showWebInAppView": "Bron-webpagina weergeven in app-weergave",
"pinUpdates": "Updates bovenaan plaatsen in de apps-weergave",
"updates": "Updates",
"sourceSpecific": "Bron-specifiek",
"appSource": "App-bron",
"noLogs": "Geen logs",
"appLogs": "App logs",
"close": "Sluiten",
"share": "Delen",
"appNotFound": "App niet gevonden",
"obtainiumExportHyphenatedLowercase": "obtainium-export",
"pickAnAPK": "Kies een APK",
"appHasMoreThanOnePackage": "{} biedt verschillende pakketten:",
"deviceSupportsXArch": "Dit apparaat ondersteunt de {} CPU-architectuur.",
"deviceSupportsFollowingArchs": "Dit apparaat ondersteunt de volgende CPU-architecturen:",
"warning": "Waarschuwing",
"sourceIsXButPackageFromYPrompt": "De app-bron is '{}' maar het release-pakket komt van '{}'. Doorgaan?",
"updatesAvailable": "Updates beschikbaar",
"updatesAvailableNotifDescription": "Stelt de gebruiker op de hoogte dat er updates beschikbaar zijn voor een of meer apps die worden bijgehouden door Obtainium.",
"noNewUpdates": "Geen nieuwe updates.",
"xHasAnUpdate": "{} heeft een update.",
"appsUpdated": "Apps bijgewerkt",
"appsNotUpdated": "Applicaties konden niet worden bijgewerkt",
"appsUpdatedNotifDescription": "Stelt de gebruiker op de hoogte dat updates voor één of meer apps in de achtergrond zijn toegepast.",
"xWasUpdatedToY": "{} is bijgewerkt naar {}.",
"xWasNotUpdatedToY": "Het bijwerken van {} naar {} is mislukt.",
"errorCheckingUpdates": "Fout bij het controleren op updates",
"errorCheckingUpdatesNotifDescription": "Een melding die verschijnt wanneer de achtergrondcontrole op updates mislukt",
"appsRemoved": "Apps verwijderd",
"appsRemovedNotifDescription": "Stelt de gebruiker op de hoogte dat een of meer apps zijn verwijderd vanwege fouten tijdens het laden",
"xWasRemovedDueToErrorY": "{} is verwijderd vanwege de fout: {}",
"completeAppInstallation": "App-installatie voltooien",
"obtainiumMustBeOpenToInstallApps": "Obtainium moet geopend zijn om apps te installeren",
"completeAppInstallationNotifDescription": "Vraagt de gebruiker om terug te keren naar Obtainium om de installatie van een app af te ronden",
"checkingForUpdates": "Controleren op updates",
"checkingForUpdatesNotifDescription": "Tijdelijke melding die verschijnt tijdens het controleren op updates",
"pleaseAllowInstallPerm": "Toestaan dat Obtainium apps installeert",
"trackOnly": "'Alleen volgen'",
"errorWithHttpStatusCode": "Foutmelding {}",
"versionCorrectionDisabled": "Versiecorrectie uitgeschakeld (de plug-in lijkt niet te werken)",
"unknown": "Onbekend",
"none": "Geen",
"never": "Nooit",
"latestVersionX": "Laatste versie: {}",
"installedVersionX": "Geïnstalleerde versie: {}",
"lastUpdateCheckX": "Laatste updatecontrole: {}",
"remove": "Verwijderen",
"yesMarkUpdated": "Ja, markeren als bijgewerkt",
"fdroid": "F-Droid (Officieel)",
"appIdOrName": "App-ID of naam",
"appId": "App-ID",
"appWithIdOrNameNotFound": "Er is geen app gevonden met dat ID of die naam",
"reposHaveMultipleApps": "Repositories kunnen meerdere apps bevatten",
"fdroidThirdPartyRepo": "F-Droid Repository voor derden",
"install": "Installeren",
"markInstalled": "Als geïnstalleerd markeren",
"update": "Bijwerken",
"markUpdated": "Als bijgewerkt markeren",
"additionalOptions": "Aanvullende opties",
"disableVersionDetection": "Versieherkenning uitschakelen",
"noVersionDetectionExplanation": "Deze optie moet alleen worden gebruikt voor apps waar versieherkenning niet correct werkt.",
"downloadingX": "{} downloaden",
"downloadX": "Downloaden",
"downloadedX": "{} gedownload",
"releaseAsset": "Release Activa",
"downloadNotifDescription": "Stelt de gebruiker op de hoogte van de voortgang bij het downloaden van een app",
"noAPKFound": "Geen APK gevonden",
"noVersionDetection": "Geen versieherkenning",
"categorize": "Categoriseren",
"categories": "Categorieën",
"category": "Categorie",
"noCategory": "Geen categorie",
"noCategories": "Geen categorieën",
"deleteCategoriesQuestion": "Categorieën verwijderen?",
"categoryDeleteWarning": "Alle apps in verwijderde categorieën worden teruggezet naar 'ongecategoriseerd'.",
"addCategory": "Categorie toevoegen",
"label": "Label",
"language": "Taal",
"copiedToClipboard": "Gekopieerd naar klembord",
"storagePermissionDenied": "Toegang tot opslag geweigerd",
"selectedCategorizeWarning": "Dit zal eventuele bestaande categorie-instellingen voor de geselecteerde apps vervangen.",
"filterAPKsByRegEx": "APK's flteren met reguliere expressie",
"removeFromObtainium": "Uit Obtainium verwijderen",
"uninstallFromDevice": "Van apparaat verwijderen",
"onlyWorksWithNonVersionDetectApps": "Werkt alleen voor apps waarbij versieherkenning is uitgeschakeld.",
"releaseDateAsVersion": "Releasedatum als versie gebruiken",
"releaseTitleAsVersion": "Gebruik releasetitel als versiestring",
"releaseDateAsVersionExplanation": "Deze optie moet alleen worden gebruikt voor apps waar versieherkenning niet correct werkt, maar waar wel een releasedatum beschikbaar is.",
"changes": "Aanpassingen",
"releaseDate": "Releasedatum",
"importFromURLsInFile": "Importeren vanaf URL's in een bestand (zoals OPML)",
"versionDetectionExplanation": "Versiereeks afstemmen met versie gedetecteerd door besturingssysteem",
"versionDetection": "Versieherkenning",
"standardVersionDetection": "Standaard versieherkenning",
"groupByCategory": "Groeperen op categorie",
"autoApkFilterByArch": "Probeer APK's te filteren op CPU-architectuur, indien mogelijk",
"overrideSource": "Bron overschrijven",
"dontShowAgain": "Laat dit niet meer zien",
"dontShowTrackOnlyWarnings": "Geen waarschuwingen weergeven voor 'Alleen volgen'",
"dontShowAPKOriginWarnings": "Geen waarschuwingen weergeven voor APK-herkomst",
"moveNonInstalledAppsToBottom": "Niet-geïnstalleerde apps onderaan de apps-lijst plaatsen",
"gitlabPATLabel": "GitLab persoonlijk toegangskenmerk",
"about": "Over",
"requiresCredentialsInSettings": "{} vereist aanvullende referenties (in Instellingen)",
"checkOnStart": "Bij opstarten op updates controleren",
"tryInferAppIdFromCode": "Probeer de app-ID af te leiden uit de broncode",
"removeOnExternalUninstall": "Extern verwijderde apps automatisch verwijderen",
"pickHighestVersionCode": "De APK met de hoogste versiecode automatisch selecteren",
"checkUpdateOnDetailPage": "Controleren op updates bij het openen van een app-detailpagina",
"disablePageTransitions": "Overgangsanimaties tussen pagina's uitschakelen",
"reversePageTransitions": "Overgangsanimaties tussen pagina's herstellen",
"minStarCount": "Minimum Github Stars",
"addInfoBelow": "Deze informatie hieronder toevoegen.",
"addInfoInSettings": "Deze informatie toevoegen in de instellingen.",
"githubSourceNote": "Beperkingen van GitHub kunnen worden vermeden door het gebruik van een API-sleutel.",
"sortByLastLinkSegment": "Alleen sorteren op het laatste segment van de link",
"filterReleaseNotesByRegEx": "Release-opmerkingen fiteren met een reguliere expressie.",
"customLinkFilterRegex": "Aangepaste APK-links filteren met een reguliere expressie (Standaard '.apk$').",
"appsPossiblyUpdated": "Pogingen tot app-updates",
"appsPossiblyUpdatedNotifDescription": "Stelt de gebruiker op de hoogte dat updates voor één of meer apps mogelijk in de achtergrond zijn toegepast",
"xWasPossiblyUpdatedToY": "{} kan bijgewerkt zijn naar {}.",
"enableBackgroundUpdates": "Achtergrond-updates inschakelen",
"backgroundUpdateReqsExplanation": "Achtergrond-updates zijn niet voor alle apps mogelijk.",
"backgroundUpdateLimitsExplanation": "Het succes van een installatie in de achtergrond kan alleen worden bepaald wanneer Obtainium is geopend.",
"verifyLatestTag": "Het label 'Laatste' verifiëren",
"intermediateLinkRegex": "Filteren op een 'Intermediaire' link om te bezoeken",
"filterByLinkText": "Links filteren op linktekst",
"intermediateLinkNotFound": "Intermediaire link niet gevonden",
"intermediateLink": "Intermediaire link",
"exemptFromBackgroundUpdates": "Vrijgesteld van achtergrond-updates (indien ingeschakeld)",
"bgUpdatesOnWiFiOnly": "Achtergrond-updates uitschakelen wanneer niet verbonden met Wi-Fi",
"bgUpdatesWhileChargingOnly": "Achtergrondupdates uitschakelen als er niet wordt opgeladen",
"autoSelectHighestVersionCode": "De APK met de hoogste versiecode automatisch selecteren",
"versionExtractionRegEx": "Reguliere expressie voor versie-extractie",
"trimVersionString": "Versie string trimmen met RegEx",
"matchGroupToUseForX": "Overeenkomende groep te gebruiken voor \"{}\"",
"matchGroupToUse": "Overeenkomende groep om te gebruiken voor de reguliere expressie voor versie-extractie",
"highlightTouchTargets": "Minder voor de hand liggende aanraakdoelen markeren.",
"pickExportDir": "Kies de exportmap",
"autoExportOnChanges": "Bij wijzigingen automatisch exporteren",
"includeSettings": "Instellingen opnemen",
"filterVersionsByRegEx": "Versies met een reguliere expressie filteren",
"trySelectingSuggestedVersionCode": "Probeer de voorgestelde versiecode APK te selecteren",
"dontSortReleasesList": "Volgorde van releases behouden vanuit de API",
"reverseSort": "Omgekeerde sortering",
"takeFirstLink": "Neem de eerste link",
"skipSort": "Sortering overslaan",
"debugMenu": "Debug-menu",
"bgTaskStarted": "Achtergrondtaak gestart - controleer de logs.",
"runBgCheckNow": "Nu een achtergrond-updatecontrole uitvoeren",
"versionExtractWholePage": "De reguliere expressie voor versie-extractie toepassen op de hele pagina",
"installing": "Installeren",
"skipUpdateNotifications": "Updatemeldingen overslaan",
"updatesAvailableNotifChannel": "Updates beschikbaar",
"appsUpdatedNotifChannel": "Apps bijgewerkt",
"appsPossiblyUpdatedNotifChannel": "Pogingen tot app-updates",
"errorCheckingUpdatesNotifChannel": "Foutcontrole bij het zoeken naar updates",
"appsRemovedNotifChannel": "Apps verwijderd",
"downloadingXNotifChannel": "{} downloaden",
"completeAppInstallationNotifChannel": "App-installatie voltooien",
"checkingForUpdatesNotifChannel": "Controleren op updates",
"onlyCheckInstalledOrTrackOnlyApps": "Alleen geïnstalleerde apps en 'Alleen volgen' controleren op updates",
"supportFixedAPKURL": "Vaste APK-URL's ondersteunen",
"selectX": "{} selecteren",
"parallelDownloads": "Parallelle downloads toestaan",
"useShizuku": "Shizuku of Sui gebruiken om te installeren",
"shizukuBinderNotFound": "Shizuku is niet actief",
"shizukuOld": "Verouderde Shizuku-versie (<11) - bijwerken",
"shizukuOldAndroidWithADB": "Shizuku draait op Android < 8.1 met ADB - update Android of gebruik in plaats daarvan Sui",
"shizukuPretendToBeGooglePlay": "Google Play instellen als installatiebron (bij Shizuku)",
"useSystemFont": "Systeemlettertype gebruiken",
"useVersionCodeAsOSVersion": "App versiecode gebruiken als door OS gedetecteerde versie",
"requestHeader": "Verzoekkoptekst",
"useLatestAssetDateAsReleaseDate": "Laatste upload als releasedatum gebruiken",
"defaultPseudoVersioningMethod": "Standaard pseudo-versiebeheermethode",
"partialAPKHash": "Gedeeltelijke APK-hash",
"APKLinkHash": "APK-link-hash",
"directAPKLink": "Directe APK-link",
"pseudoVersionInUse": "Er is een pseudo-versie in gebruik",
"installed": "Geïnstalleerd",
"latest": "Laatste",
"invertRegEx": "Reguliere expressie omkeren",
"note": "Opmerking",
"selfHostedNote": "De \"{}\" dropdown kan gebruikt worden om zelf gehoste/aangepaste instanties van elke bron te bereiken.",
"badDownload": "De APK kon niet worden verwerkt (incompatibele of gedeeltelijke download)",
"beforeNewInstallsShareToAppVerifier": "Nieuwe Apps delen met AppVerifier (indien beschikbaar)",
"appVerifierInstructionToast": "Deel het met AppVerifier en keer daarna hier terug.",
"wiki": "Help/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App-configuraties (gebruik op eigen risico)",
"crowdsourcedConfigsShort": "App-configuraties door menigte",
"allowInsecure": "Onveilige HTTP-verzoeken toestaan",
"stayOneVersionBehind": "Blijf een versie achter op de nieuwste",
"refreshBeforeDownload": "Vernieuw app details voor download",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "App verwijderen?",
"other": "Apps verwijderen?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "Te veel verzoeken (aantal beperkt) - opnieuw proberen over {} minuut",
"other": "Te veel verzoeken (aantal beperkt) - opnieuw proberen over {} minuten"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Achtergrond-updatecontrole heeft een {}, zal een nieuwe controle plannen over {} minuut",
"other": "Achtergrond-updatecontrole heeft een {}, zal een nieuwe controle plannen over {} minuten"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Achtergrond-updatecontrole heeft {} update gevonden - zal de gebruiker op de hoogte stellen indien nodig",
"other": "Achtergrond-updatecontrole heeft {} updates gevonden - zal de gebruiker op de hoogte stellen indien nodig"
},
"apps": {
"one": "{} app",
"other": "{} apps"
},
"url": {
"one": "{} URL",
"other": "{} URL's"
},
"minute": {
"one": "{} minuut",
"other": "{} minuten"
},
"hour": {
"one": "{} uur",
"other": "{} uur"
},
"day": {
"one": "{} dag",
"other": "{} dagen"
},
"clearedNLogsBeforeXAfterY": {
"one": "{n} logboekitem gewist (voor = {before}, na = {after})",
"other": "{n} logboekitems gewist (voor = {before}, na = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} en nog 1 app hebben updates.",
"other": "{} en nog {} apps hebben updates."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} en nog 1 app is bijgewerkt.",
"other": "{} en nog {} apps zijn bijgewerkt."
},
"xAndNMoreUpdatesFailed": {
"one": "Bijwerken mislukt voor {} en nog 1 app.",
"other": "Bijwerken mislukt voor {} en nog {} apps."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} en nog 1 app zijn mogelijk bijgewerkt.",
"other": "{} en nog {} apps zijn mogelijk bijgwerkt."
},
"apk": {
"one": "{} APK",
"other": "{} APK's"
}
}

View File

@ -1,12 +1,4 @@
{ {
"noDescription": "Brak opisu",
"no": "Nie",
"okay": "Okej",
"appId": "ID aplikacji",
"bgUpdateGotErrorRetryInMinutes": {
"one": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} min.",
"other": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} min."
},
"invalidURLForSource": "Nieprawidłowy adres URL aplikacji {}", "invalidURLForSource": "Nieprawidłowy adres URL aplikacji {}",
"noReleaseFound": "Nie można znaleźć odpowiedniego wydania", "noReleaseFound": "Nie można znaleźć odpowiedniego wydania",
"noVersionFound": "Nie można określić wersji wydania", "noVersionFound": "Nie można określić wersji wydania",
@ -19,32 +11,28 @@
"unexpectedError": "Nieoczekiwany błąd", "unexpectedError": "Nieoczekiwany błąd",
"ok": "Okej", "ok": "Okej",
"and": "i", "and": "i",
"startedBgUpdateTask": "Rozpoczęto zadanie sprawdzania aktualizacji w tle",
"bgUpdateIgnoreAfterIs": "Parametr ignoreAfter aktualizacji w tle to {}",
"startedActualBGUpdateCheck": "Rozpoczęto sprawdzanie aktualizacji w tle",
"bgUpdateTaskFinished": "Zakończono zadanie sprawdzania aktualizacji w tle",
"firstRun": "Jest to pierwsze uruchomienie Obtainium",
"settingUpdateCheckIntervalTo": "Ustawianie interwału aktualizacji na {}",
"githubPATLabel": "Osobisty token dostępu GitHub (zwiększa limit zapytań)", "githubPATLabel": "Osobisty token dostępu GitHub (zwiększa limit zapytań)",
"githubPATHint": "Wymagany format: użytkownik:token",
"githubPATFormat": "użytkownik:token",
"includePrereleases": "Uwzględnij wersje wstępne", "includePrereleases": "Uwzględnij wersje wstępne",
"fallbackToOlderReleases": "Powracaj do starszych wersji", "fallbackToOlderReleases": "Powracaj do starszych wersji",
"filterReleaseTitlesByRegEx": "Filtruj tytuły wydań wg. wyrażeń regularnych", "filterReleaseTitlesByRegEx": "Filtruj tytuły wydań wg. wyrażeń regularnych",
"invalidRegEx": "Nieprawidłowe wyrażenie regularne", "invalidRegEx": "Nieprawidłowe wyrażenie regularne",
"noDescription": "Brak opisu",
"cancel": "Anuluj", "cancel": "Anuluj",
"continue": "Kontynuuj", "continue": "Kontynuuj",
"requiredInBrackets": "(Wymagane)", "requiredInBrackets": "(Wymagane)",
"dropdownNoOptsError": "BŁĄD: LISTA ROZWIJANA MUSI MIEĆ CO NAJMNIEJ JEDNĄ OPCJĘ", "dropdownNoOptsError": "BŁĄD: LISTA ROZWIJANA MUSI MIEĆ CO NAJMNIEJ JEDNĄ OPCJĘ",
"colour": "Kolor", "colour": "Kolor",
"standard": "Domyślny",
"custom": "Własny",
"useMaterialYou": "Material You",
"githubStarredRepos": "Repozytoria GitHub oznaczone gwiazdką", "githubStarredRepos": "Repozytoria GitHub oznaczone gwiazdką",
"uname": "Nazwa użytkownika", "uname": "Nazwa użytkownika",
"wrongArgNum": "Nieprawidłowa liczba podanych argumentów", "wrongArgNum": "Nieprawidłowa liczba podanych argumentów",
"xIsTrackOnly": "{} jest tylko obserwowana", "xIsTrackOnly": "{} jest tylko obserwowane",
"source": "Źródło", "source": "Źródło",
"app": "Aplikacja", "app": "Aplikacja",
"appsFromSourceAreTrackOnly": "Aplikacje z tego źródła są „Obserwowane.", "appsFromSourceAreTrackOnly": "Aplikacje z tego źródła są tylko obserwowane.",
"youPickedTrackOnly": "Wybrano opcję Tylko obserwuj.", "youPickedTrackOnly": "Wybrano opcję \"Tylko obserwuj\".",
"trackOnlyAppDescription": "Aplikacja będzie obserwowana pod kątem aktualizacji, ale Obtainium nie będzie w stanie jej pobrać ani zainstalować.", "trackOnlyAppDescription": "Aplikacja będzie obserwowana pod kątem aktualizacji, ale Obtainium nie będzie w stanie jej pobrać ani zainstalować.",
"cancelled": "Anulowano", "cancelled": "Anulowano",
"appAlreadyAdded": "Aplikacja już została dodana", "appAlreadyAdded": "Aplikacja już została dodana",
@ -56,9 +44,9 @@
"searchSomeSourcesLabel": "Szukaj (tylko niektóre źródła)", "searchSomeSourcesLabel": "Szukaj (tylko niektóre źródła)",
"search": "Szukaj", "search": "Szukaj",
"additionalOptsFor": "Dodatkowe opcje dla {}", "additionalOptsFor": "Dodatkowe opcje dla {}",
"supportedSourcesBelow": "Obsługiwane źródła:", "supportedSources": "Obsługiwane źródła",
"trackOnlyInBrackets": "(tylko obserwowane)", "trackOnlyInBrackets": "(tylko obserwowane)",
"searchableInBrackets": "(Wyszukiwalne)", "searchableInBrackets": "(wyszukiwalne)",
"appsString": "Aplikacje", "appsString": "Aplikacje",
"noApps": "Brak aplikacji", "noApps": "Brak aplikacji",
"noAppsForFilter": "Brak aplikacji dla filtra", "noAppsForFilter": "Brak aplikacji dla filtra",
@ -66,34 +54,35 @@
"percentProgress": "Postęp: {}%", "percentProgress": "Postęp: {}%",
"pleaseWait": "Proszę czekać", "pleaseWait": "Proszę czekać",
"updateAvailable": "Dostępna aktualizacja", "updateAvailable": "Dostępna aktualizacja",
"estimateInBracketsShort": "(Szac.)",
"notInstalled": "Nie zainstalowano", "notInstalled": "Nie zainstalowano",
"estimateInBrackets": "(Szacunkowo)", "pseudoVersion": "pseudo-wersja",
"selectAll": "Zaznacz wszystkie", "selectAll": "Zaznacz wszystkie",
"deselectN": "Odznacz {}", "deselectX": "Odznacz {}",
"xWillBeRemovedButRemainInstalled": "{} zostanie usunięty z Obtainium, ale pozostanie zainstalowany na urządzeniu.", "xWillBeRemovedButRemainInstalled": "{} zostanie usunięty z Obtainium, ale pozostanie zainstalowany na urządzeniu.",
"removeSelectedAppsQuestion": "Usunąć wybrane aplikacje?", "removeSelectedAppsQuestion": "Usunąć wybrane aplikacje?",
"removeSelectedApps": "Usuń wybrane aplikacje", "removeSelectedApps": "Usuń wybrane aplikacje",
"updateX": "Zaktualizuj {}", "updateX": "Zaktualizuj {}",
"installX": "Zainstaluj {}", "installX": "Zainstaluj {}",
"markXTrackOnlyAsUpdated": "Oznacz {}\n(Tylko obserwowana)\njako zaktualizowaną", "markXTrackOnlyAsUpdated": "Oznacz {}\n(tylko obserwowana)\njako zaktualizowaną",
"changeX": "Zmień {}", "changeX": "Zmień {}",
"installUpdateApps": "Instaluj/aktualizuj aplikacje", "installUpdateApps": "Instaluj/aktualizuj aplikacje",
"installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje", "installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje",
"markXSelectedAppsAsUpdated": "Oznaczyć {} wybranych aplikacji jako zaktualizowane?", "markXSelectedAppsAsUpdated": "Oznaczyć {} wybranych aplikacji jako zaktualizowane?",
"no": "Nie",
"yes": "Tak", "yes": "Tak",
"markSelectedAppsUpdated": "Oznacz wybrane aplikacje jako zaktualizowane", "markSelectedAppsUpdated": "Oznacz wybrane aplikacje jako zaktualizowane",
"pinToTop": "Przypnij", "pinToTop": "Przypnij",
"unpinFromTop": "Odepnij", "unpinFromTop": "Odepnij",
"resetInstallStatusForSelectedAppsQuestion": "Zresetować status instalacji dla wybranych aplikacji?", "resetInstallStatusForSelectedAppsQuestion": "Zresetować status instalacji dla wybranych aplikacji?",
"installStatusOfXWillBeResetExplanation": "Stan instalacji wybranych aplikacji zostanie zresetowany.\n\nMoże być to pomocne, gdy wersja aplikacji wyświetlana w Obtainium jest nieprawidłowa z powodu nieudanych aktualizacji lub innych problemów.", "installStatusOfXWillBeResetExplanation": "Stan instalacji wybranych aplikacji zostanie zresetowany.\n\nMoże być to pomocne, gdy wersja aplikacji wyświetlana w Obtainium jest nieprawidłowa z powodu nieudanych aktualizacji lub innych problemów.",
"customLinkMessage": "Te linki działają na urządzeniach z zainstalowanym Obtainium",
"shareAppConfigLinks": "Udostępnij konfigurację aplikacji w formie linku",
"shareSelectedAppURLs": "Udostępnij wybrane adresy URL aplikacji", "shareSelectedAppURLs": "Udostępnij wybrane adresy URL aplikacji",
"resetInstallStatus": "Zresetuj stan instalacji", "resetInstallStatus": "Zresetuj stan instalacji",
"more": "Więcej", "more": "Więcej",
"removeOutdatedFilter": "Usuń filtr nieaktualnych aplikacji", "removeOutdatedFilter": "Usuń filtr nieaktualnych aplikacji",
"showOutdatedOnly": "Pokaż tylko nieaktualne aplikacje", "showOutdatedOnly": "Pokaż tylko nieaktualne aplikacje",
"filter": "FIltr", "filter": "FIltr",
"filterActive": "Filtruj *",
"filterApps": "Filtruj aplikacje", "filterApps": "Filtruj aplikacje",
"appName": "Nazwa aplikacji", "appName": "Nazwa aplikacji",
"author": "Autor", "author": "Autor",
@ -113,7 +102,7 @@
"searchX": "Przeszukaj {}", "searchX": "Przeszukaj {}",
"noResults": "Nie znaleziono wyników", "noResults": "Nie znaleziono wyników",
"importX": "Importuj {}", "importX": "Importuj {}",
"importedAppsIdDisclaimer": "Zaimportowane aplikacje mogą być wyświetlane jako „Niezainstalowane.\nAby to naprawić, zainstaluj je ponownie za pomocą Obtainium.\nNie powinno to mieć wpływu na dane aplikacji.\n\nDotyczy tylko adresów URL i metod importu innych aplikacji.", "importedAppsIdDisclaimer": "Zaimportowane aplikacje mogą być wyświetlane jako niezainstalowane.\nAby to naprawić, przeinstaluj je za pomocą Obtainium.\nNie powinno to mieć wpływu na dane aplikacji.\n\nDotyczy tylko adresu URL i innych metod importu.",
"importErrors": "Błędy importowania", "importErrors": "Błędy importowania",
"importedXOfYApps": "Zaimportowano {} z {} aplikacji.", "importedXOfYApps": "Zaimportowano {} z {} aplikacji.",
"followingURLsHadErrors": "Następujące adresy URL zawierały błędy:", "followingURLsHadErrors": "Następujące adresy URL zawierały błędy:",
@ -124,8 +113,7 @@
"dark": "Ciemny", "dark": "Ciemny",
"light": "Jasny", "light": "Jasny",
"followSystem": "Zgodny z systemem", "followSystem": "Zgodny z systemem",
"obtainium": "Obtainium", "followSystemThemeExplanation": "Podążanie za motywem systemowym jest możliwe tylko przy użyciu aplikacji firm trzecich",
"materialYou": "Material You",
"useBlackTheme": "Użyj czarnego motywu", "useBlackTheme": "Użyj czarnego motywu",
"appSortBy": "Sortuj aplikacje według", "appSortBy": "Sortuj aplikacje według",
"authorName": "Autor/Nazwa", "authorName": "Autor/Nazwa",
@ -155,20 +143,22 @@
"warning": "Uwaga", "warning": "Uwaga",
"sourceIsXButPackageFromYPrompt": "Źródłem aplikacji jest '{}', ale pakiet wydania pochodzi z '{}'. Kontynuować?", "sourceIsXButPackageFromYPrompt": "Źródłem aplikacji jest '{}', ale pakiet wydania pochodzi z '{}'. Kontynuować?",
"updatesAvailable": "Dostępne aktualizacje", "updatesAvailable": "Dostępne aktualizacje",
"updatesAvailableNotifDescription": "Powiadamia użytkownika o dostępności aktualizacji dla jednej lub więcej aplikacji obserwowanych przez Obtainium", "updatesAvailableNotifDescription": "Informuje o dostępności aktualizacji dla jednej lub więcej aplikacji obserwowanych przez Obtainium",
"noNewUpdates": "Brak nowych aktualizacji.", "noNewUpdates": "Brak nowych aktualizacji.",
"xHasAnUpdate": "{} ma aktualizację.", "xHasAnUpdate": "{} ma aktualizację.",
"appsUpdated": "Zaktualizowane aplikacje", "appsUpdated": "Zaktualizowano aplikacje",
"appsUpdatedNotifDescription": "Powiadamia użytkownika, gdy jedna lub więcej aplikacji zostało zaktualizowanych w tle", "appsNotUpdated": "Nie udało się zaktualizować aplikacji",
"appsUpdatedNotifDescription": "Informuje, gdy co najmniej jedna aplikacja została zaktualizowana w tle",
"xWasUpdatedToY": "{} zaktualizowano do {}.", "xWasUpdatedToY": "{} zaktualizowano do {}.",
"errorCheckingUpdates": "Sprawdzanie błędów aktualizacji", "xWasNotUpdatedToY": "Błąd aktualizacji {} do {}.",
"errorCheckingUpdatesNotifDescription": "Powiadomienie wyświetlane, gdy sprawdzanie aktualizacji w tle nie powiedzie się", "errorCheckingUpdates": "Błąd sprawdzania aktualizacji",
"errorCheckingUpdatesNotifDescription": "Jest wyświetlane, gdy sprawdzanie aktualizacji w tle nie powiedzie się",
"appsRemoved": "Usunięte aplikacje", "appsRemoved": "Usunięte aplikacje",
"appsRemovedNotifDescription": "Powiadamia użytkownika, gdy jedna lub więcej aplikacji zostało usuniętych z powodu błędów wczytywania", "appsRemovedNotifDescription": "Informuje, gdy co najmniej jedna aplikacja została usunięta z powodu błędów podczas wczytywania",
"xWasRemovedDueToErrorY": "Usunięto {} z powodu błędu: {}", "xWasRemovedDueToErrorY": "Usunięto {} z powodu błędu: {}",
"completeAppInstallation": "Ukończenie instalacji aplikacji", "completeAppInstallation": "Ukończenie instalacji aplikacji",
"obtainiumMustBeOpenToInstallApps": "Aby zainstalować aplikacje, Obtainium musi być otwarte", "obtainiumMustBeOpenToInstallApps": "Aby zainstalować aplikacje, Obtainium musi być otwarte",
"completeAppInstallationNotifDescription": "Prosi użytkownika o powrót do Obtainium w celu dokończenia instalacji aplikacji", "completeAppInstallationNotifDescription": "Informuje o możliwości powrotu do Obtainium w celu dokończenia instalacji aplikacji",
"checkingForUpdates": "Sprawdzanie aktualizacji", "checkingForUpdates": "Sprawdzanie aktualizacji",
"checkingForUpdatesNotifDescription": "Tymczasowe powiadomienie pojawiające się podczas sprawdzania aktualizacji", "checkingForUpdatesNotifDescription": "Tymczasowe powiadomienie pojawiające się podczas sprawdzania aktualizacji",
"pleaseAllowInstallPerm": "Pozwól Obtainium instalować aplikacje", "pleaseAllowInstallPerm": "Pozwól Obtainium instalować aplikacje",
@ -185,12 +175,10 @@
"yesMarkUpdated": "Tak, oznacz jako zaktualizowane", "yesMarkUpdated": "Tak, oznacz jako zaktualizowane",
"fdroid": "Oficjalny F-Droid", "fdroid": "Oficjalny F-Droid",
"appIdOrName": "ID aplikacji lub nazwa", "appIdOrName": "ID aplikacji lub nazwa",
"appId": "ID aplikacji",
"appWithIdOrNameNotFound": "Nie znaleziono aplikacji o tym identyfikatorze lub nazwie", "appWithIdOrNameNotFound": "Nie znaleziono aplikacji o tym identyfikatorze lub nazwie",
"reposHaveMultipleApps": "Repozytoria mogą zawierać wiele aplikacji", "reposHaveMultipleApps": "Repozytoria mogą zawierać wiele aplikacji",
"fdroidThirdPartyRepo": "Zewnętrzne repo F-Droid", "fdroidThirdPartyRepo": "Zewnętrzne repo F-Droid",
"steam": "Steam",
"steamMobile": "Mobilny Steam",
"steamChat": "Steam Chat",
"install": "Instaluj", "install": "Instaluj",
"markInstalled": "Oznacz jako zainstalowane", "markInstalled": "Oznacz jako zainstalowane",
"update": "Zaktualizuj", "update": "Zaktualizuj",
@ -199,7 +187,10 @@
"disableVersionDetection": "Wyłącz wykrywanie wersji", "disableVersionDetection": "Wyłącz wykrywanie wersji",
"noVersionDetectionExplanation": "Opcja ta powinna być używana tylko w przypadku aplikacji, w których wykrywanie wersji nie działa poprawnie.", "noVersionDetectionExplanation": "Opcja ta powinna być używana tylko w przypadku aplikacji, w których wykrywanie wersji nie działa poprawnie.",
"downloadingX": "Pobieranie {}", "downloadingX": "Pobieranie {}",
"downloadNotifDescription": "Powiadamia użytkownika o postępach w pobieraniu aplikacji", "downloadX": "Pobierz {}",
"downloadedX": "Pobrano {}",
"releaseAsset": "Wydany pakiet",
"downloadNotifDescription": "Informuje o postępach w pobieraniu aplikacji",
"noAPKFound": "Nie znaleziono pakietu APK", "noAPKFound": "Nie znaleziono pakietu APK",
"noVersionDetection": "Bez wykrywania wersji", "noVersionDetection": "Bez wykrywania wersji",
"categorize": "Kategoryzuj", "categorize": "Kategoryzuj",
@ -220,22 +211,24 @@
"uninstallFromDevice": "Odinstaluj z urządzenia", "uninstallFromDevice": "Odinstaluj z urządzenia",
"onlyWorksWithNonVersionDetectApps": "Działa tylko w przypadku aplikacji z wyłączonym wykrywaniem wersji.", "onlyWorksWithNonVersionDetectApps": "Działa tylko w przypadku aplikacji z wyłączonym wykrywaniem wersji.",
"releaseDateAsVersion": "Użyj daty wydania jako wersji", "releaseDateAsVersion": "Użyj daty wydania jako wersji",
"releaseTitleAsVersion": "Używaj nazwy wydania jako ciągu wersji",
"releaseDateAsVersionExplanation": "Opcja ta powinna być używana tylko w przypadku aplikacji, w których wykrywanie wersji nie działa poprawnie, ale dostępna jest data wydania.", "releaseDateAsVersionExplanation": "Opcja ta powinna być używana tylko w przypadku aplikacji, w których wykrywanie wersji nie działa poprawnie, ale dostępna jest data wydania.",
"changes": "Zmiany", "changes": "Zmiany",
"releaseDate": "Data wydania", "releaseDate": "Data wydania",
"importFromURLsInFile": "Importuj z adresów URL w pliku (typu OPML)", "importFromURLsInFile": "Importuj z adresów URL w pliku (typu OPML)",
"versionDetectionExplanation": "Uzgodnij ciąg wersji z wersją wykrytą przez system operacyjny",
"versionDetection": "Wykrywanie wersji", "versionDetection": "Wykrywanie wersji",
"standardVersionDetection": "Standardowe wykrywanie wersji", "standardVersionDetection": "Standardowe wykrywanie wersji",
"groupByCategory": "Grupuj według kategorii", "groupByCategory": "Grupuj według kategorii",
"autoApkFilterByArch": "Spróbuj filtrować pliki APK według architektury procesora, jeśli to możliwe", "autoApkFilterByArch": "Spróbuj filtrować pliki APK według architektury procesora, jeśli to możliwe",
"overrideSource": "Nadpisz źródło", "overrideSource": "Nadpisz źródło",
"dontShowAgain": "Nie pokazuj tego ponownie", "dontShowAgain": "Nie pokazuj tego ponownie",
"dontShowTrackOnlyWarnings": "Nie pokazuj ostrzeżeń Tylko obserwowana", "dontShowTrackOnlyWarnings": "Nie pokazuj ostrzeżeń \"Tylko obserwowana\"",
"dontShowAPKOriginWarnings": "Nie pokazuj ostrzeżeń o pochodzeniu APK", "dontShowAPKOriginWarnings": "Nie pokazuj ostrzeżeń o pochodzeniu APK",
"moveNonInstalledAppsToBottom": "Przenieś niezainstalowane aplikacje na dół widoku aplikacji", "moveNonInstalledAppsToBottom": "Przenieś niezainstalowane aplikacje na dół widoku aplikacji",
"gitlabPATLabel": "Osobisty token dostępu GitLab\n(Umożliwia wyszukiwanie i lepsze wykrywanie APK)", "gitlabPATLabel": "Osobisty token dostępu GitLab",
"about": "Więcej informacji", "about": "Więcej informacji",
"requiresCredentialsInSettings": "Wymaga to dodatkowych poświadczeń (w Ustawieniach)", "requiresCredentialsInSettings": "{}: Wymaga to dodatkowych poświadczeń (w Ustawieniach)",
"checkOnStart": "Sprawdź aktualizacje przy uruchomieniu", "checkOnStart": "Sprawdź aktualizacje przy uruchomieniu",
"tryInferAppIdFromCode": "Spróbuj wywnioskować identyfikator aplikacji z kodu źródłowego", "tryInferAppIdFromCode": "Spróbuj wywnioskować identyfikator aplikacji z kodu źródłowego",
"removeOnExternalUninstall": "Automatyczne usuń odinstalowane zewnętrznie aplikacje", "removeOnExternalUninstall": "Automatyczne usuń odinstalowane zewnętrznie aplikacje",
@ -247,52 +240,173 @@
"addInfoBelow": "Dodaj tę informację poniżej.", "addInfoBelow": "Dodaj tę informację poniżej.",
"addInfoInSettings": "Dodaj tę informację w Ustawieniach.", "addInfoInSettings": "Dodaj tę informację w Ustawieniach.",
"githubSourceNote": "Limit żądań GitHub można ominąć za pomocą klucza API.", "githubSourceNote": "Limit żądań GitHub można ominąć za pomocą klucza API.",
"gitlabSourceNote": "Pozyskiwanie pliku APK z GitLab może nie działać bez klucza API.", "sortByLastLinkSegment": "Sortuj tylko według ostatniego segmentu łącza",
"sortByFileNamesNotLinks": "Sortuj wg nazw plików zamiast pełnych linków",
"filterReleaseNotesByRegEx": "Filtruj informacje o wersji według wyrażenia regularnego", "filterReleaseNotesByRegEx": "Filtruj informacje o wersji według wyrażenia regularnego",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "customLinkFilterRegex": "Filtruj linki APK według wyrażenia regularnego (domyślnie \".apk$\")",
"appsPossiblyUpdated": "Aplikacje mogły zostać zaktualizowane",
"appsPossiblyUpdatedNotifDescription": "Powiadamia, gdy co najmniej jedna aktualizacja aplikacji została potencjalnie zastosowana w tle",
"xWasPossiblyUpdatedToY": "{} być może zaktualizowano do {}.",
"enableBackgroundUpdates": "Włącz aktualizacje w tle",
"backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.",
"backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.",
"verifyLatestTag": "Zweryfikuj najnowszy tag",
"intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności",
"filterByLinkText": "Filtruj linki według tekstu linku",
"intermediateLinkNotFound": "Nie znaleziono linku pośredniego",
"intermediateLink": "Link pośredni",
"exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)",
"bgUpdatesOnWiFiOnly": "Wyłącz aktualizacje w tle, gdy nie ma połączenia z Wi-Fi",
"bgUpdatesWhileChargingOnly": "Wyłącz aktualizacje w tle, gdy urządzenie nie jest ładowane",
"autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK",
"versionExtractionRegEx": "Wyrażenie regularne wyodrębniające wersję",
"trimVersionString": "Przytnij ciąg wersji za pomocą RegEx",
"matchGroupToUseForX": "Dopasuj grupę do użycia dla \"{}\"",
"matchGroupToUse": "Dopasuj grupę do użycia dla wyrażenia regularnego wyodrębniania wersji",
"highlightTouchTargets": "Wyróżnij mniej oczywiste elementy dotykowe",
"pickExportDir": "Wybierz katalog eksportu",
"autoExportOnChanges": "Automatyczny eksport po wprowadzeniu zmian",
"includeSettings": "Dołącz ustawienia",
"filterVersionsByRegEx": "Filtruj wersje według wyrażenia regularnego",
"trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK",
"dontSortReleasesList": "Utrzymaj kolejność wydań z interfejsu API",
"reverseSort": "Odwrotne sortowanie",
"takeFirstLink": "Wykorzystaj pierwszy link",
"skipSort": "Pomiń sortowanie",
"debugMenu": "Menu debugowania",
"bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.",
"runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle",
"versionExtractWholePage": "Zastosuj wyrażenie regularne wyodrębniania wersji dla całej strony",
"installing": "Instalacja",
"skipUpdateNotifications": "Pomiń powiadomienia o aktualizacjach",
"updatesAvailableNotifChannel": "Dostępne aktualizacje aplikacji",
"appsUpdatedNotifChannel": "Zaktualizowane aplikacje",
"appsPossiblyUpdatedNotifChannel": "Informuj o próbach aktualizacji",
"errorCheckingUpdatesNotifChannel": "Błędy sprawdzania aktualizacji",
"appsRemovedNotifChannel": "Usunięte aplikacje",
"downloadingXNotifChannel": "Pobieranie {}",
"completeAppInstallationNotifChannel": "Ukończenie instalacji aplikacji",
"checkingForUpdatesNotifChannel": "Sprawdzanie dostępności aktualizacji",
"onlyCheckInstalledOrTrackOnlyApps": "Sprawdzaj tylko zainstalowane i obserwowane aplikacje pod kątem aktualizacji",
"supportFixedAPKURL": "Obsługuj stałe adresy URL APK",
"selectX": "Wybierz {}",
"parallelDownloads": "Zezwalaj na równoległe pobierania",
"useShizuku": "Użyj Shizuku lub Sui, aby zainstalować",
"shizukuBinderNotFound": "Usługa Shizuku nie działa",
"shizukuOld": "Stara wersja Shizuku (<11) - zaktualizuj ją",
"shizukuOldAndroidWithADB": "Shizuku przez ADB działa na Androidzie 8.1+. Zaktualizuj Androida lub użyj zamiast tego Sui",
"shizukuPretendToBeGooglePlay": "Ustaw Google Play jako źródło instalacji (jeśli używana jest aplikacja Shizuku)",
"useSystemFont": "Czcionka systemowa",
"useVersionCodeAsOSVersion": "Użyj versionCode aplikacji jako wersji wykrytej przez system operacyjny",
"requestHeader": "Nagłówek żądania",
"useLatestAssetDateAsReleaseDate": "Użyj najnowszego przesłanego zasobu jako daty wydania",
"defaultPseudoVersioningMethod": "Domyślna metoda pseudo-wersji",
"partialAPKHash": "Częściowy Hash pliku apk",
"APKLinkHash": "Link Hash pliku apk",
"directAPKLink": "Bezpośredni link do pliku apk",
"pseudoVersionInUse": "Pseudo-wersja jest w użyciu",
"installed": "Zainstalowano",
"latest": "Najnowsza",
"invertRegEx": "Odwróć wyrażenie regularne",
"note": "Uwaga",
"selfHostedNote": "Wybierz \"{}\", aby uzyskać dostęp do samodzielnie hostowanych lub niestandardowych instancji dowolnego źródła.",
"badDownload": "Nie można przeanalizować pliku apk (jest niekompatybilny lub częściowo pobrany)",
"beforeNewInstallsShareToAppVerifier": "Udostępnij nowe aplikacje za pomocą weryfikatora aplikacji (jeśli jest dostępny)",
"appVerifierInstructionToast": "Udostępnij do weryfikatora aplikacji, a następnie wróć tutaj.",
"wiki": "Pomoc/Wiki",
"crowdsourcedConfigsLabel": "Baza konfiguracji",
"crowdsourcedConfigsShort": "Baza konfiguracji",
"allowInsecure": "Zezwalaj na niezabezpieczone żądania HTTP",
"stayOneVersionBehind": "Pozostań jedną wersję w tyle za najnowszą",
"refreshBeforeDownload": "Odśwież szczegóły aplikacji przed pobraniem",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Usunąć aplikację?", "one": "Usunąć aplikację?",
"few": "Usunąć aplikacje?",
"many": "Usunąć aplikacje?",
"other": "Usunąć aplikacje?" "other": "Usunąć aplikacje?"
}, },
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {
"one": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} min.", "one": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minutę",
"other": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} min." "few": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty",
"many": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minut",
"other": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minutę",
"few": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty",
"many": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minut",
"other": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty"
}, },
"bgCheckFoundUpdatesWillNotifyIfNeeded": { "bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Podczas sprawdzania aktualizacji w tle znaleziono {} aktualizację - w razie potrzeby użytkownik zostanie o tym powiadomiony", "one": "W tle znaleziono {} aktualizację - w razie potrzeby użytkownik zostanie o tym powiadomiony",
"other": "Podczas sprawdzania aktualizacji w tle znaleziono {} akt. - w razie potrzeby użytkownik zostanie o tym powiadomiony" "few": "W tle znaleziono {} aktualizacje - w razie potrzeby użytkownik zostanie o tym powiadomiony",
"many": "W tle znaleziono {} aktualizacji - w razie potrzeby użytkownik zostanie o tym powiadomiony",
"other": "W tle znaleziono {} aktualizacje - w razie potrzeby użytkownik zostanie o tym powiadomiony"
}, },
"apps": { "apps": {
"one": "{} aplik.", "one": "{} ap",
"other": "{} aplik." "few": "{} apki",
"many": "{} apek",
"other": "{} apki"
}, },
"url": { "url": {
"one": "{} adres URL", "one": "{} adres URL",
"other": "{} adr. URL" "few": "{} adresy URL",
"many": "{} adresów URL",
"other": "{} adresy URL"
}, },
"minute": { "minute": {
"one": "{} min.", "one": "{} minuta",
"other": "{} min." "few": "{} minuty",
"many": "{} minut",
"other": "{} minuty"
}, },
"hour": { "hour": {
"one": "{} godz.", "one": "{} godzina",
"other": "{} godz." "few": "{} godziny",
"many": "{} godzin",
"other": "{} godziny"
}, },
"day": { "day": {
"one": "{} dzień", "one": "{} dzień",
"few": "{} dni",
"many": "{} dni",
"other": "{} dni" "other": "{} dni"
}, },
"clearedNLogsBeforeXAfterY": { "clearedNLogsBeforeXAfterY": {
"one": "Wyczyszczono {n} log (przed = {before}, po = {after})", "one": "Wyczyszczono {n} log (przed = {before}, po = {after})",
"other": "Wyczyszczono logi: {n} (przed = {before}, po = {after})" "few": "Wyczyszczono {n} logi (przed = {before}, po = {after})",
"many": "Wyczyszczono {n} logów (przed = {before}, po = {after})",
"other": "Wyczyszczono {n} logi (przed = {before}, po = {after})"
}, },
"xAndNMoreUpdatesAvailable": { "xAndNMoreUpdatesAvailable": {
"one": "{} i jeszcze 1 aplikacja mają aktualizacje.", "one": "{} i 1 inna apka mają aktualizacje.",
"other": "{} i {} aplik. otrzymało aktualizacje." "few": "{} i {} inne apki mają aktualizacje.",
"many": "{} i {} innych apek ma aktualizacje.",
"other": "{} i {} inne apki mają aktualizacje."
}, },
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "Zaktualizowano {} i jeszcze 1 aplikację.", "one": "Zaktualizowano {} i 1 inną apkę.",
"other": "Zaktualizowano {} i {} aplik." "few": "{} i {} inne apki zostały zaktualizowane.",
"many": "{} i {} innych apek zostało zaktualizowanych.",
"other": "{} i {} inne apki zostały zaktualizowane."
},
"xAndNMoreUpdatesFailed": {
"one": "Błąd aktualizacji {} i 1 innej apki.",
"few": "Błąd aktualizacji {} i {} innych apek.",
"many": "Błąd aktualizacji {} i {} innych apek.",
"other": "Błąd aktualizacji {} i {} innych apek."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} i 1 inna apka mogły zostać zaktualizowane.",
"few": "{} i {} inne apki mogły zostać zaktualizowane.",
"many": "{} i {} innych apek mogło zostać zaktualizowanych.",
"other": "{} i {} inne apki mogły zostać zaktualizowane."
},
"apk": {
"one": "{} apk",
"few": "{} apki",
"many": "{} apek",
"other": "{} apki"
} }
} }

382
assets/translations/pt.json Normal file
View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "URL {} inválida",
"noReleaseFound": "Não foi possível encontrar uma versão adequada",
"noVersionFound": "Não foi possível encontrar uma versão",
"urlMatchesNoSource": "A URL não corresponde a uma fonte conhecida",
"cantInstallOlderVersion": "Não é permitido instalar uma versão anterior de um aplicativo",
"appIdMismatch": "ID do pacote baixado não é igual ao ID do aplicativo instalado",
"functionNotImplemented": "Esta classe não implementou essa função",
"placeholder": "Espaço reservado",
"someErrors": "Alguns erros ocorreram",
"unexpectedError": "Erro inesperado",
"ok": "OK",
"and": "e",
"githubPATLabel": "Token de acesso pessoal do GitHub\n(Reduz tempos de espera)",
"includePrereleases": "Incluir pré-lançamentos",
"fallbackToOlderReleases": "Retornar para versões anteriores",
"filterReleaseTitlesByRegEx": "Filtrar títulos de versões usando expressão regular",
"invalidRegEx": "Expressão regular inválida",
"noDescription": "Sem descrição",
"cancel": "Cancelar",
"continue": "Continuar",
"requiredInBrackets": "(Necessário)",
"dropdownNoOptsError": "ERRO: O DROPDOWN DEVE TER PELO MENOS UMA OPÇÃO",
"colour": "Cor",
"standard": "Padrão",
"custom": "Personalizado",
"useMaterialYou": "Utilizar o material que",
"githubStarredRepos": "repositórios favoritos no GitHub",
"uname": "Nome de usuário",
"wrongArgNum": "Número de argumentos errado",
"xIsTrackOnly": "{} é 'Apenas monitorar'",
"source": "Fonte",
"app": "Aplicativo",
"appsFromSourceAreTrackOnly": "Os aplicativos desta fonte são 'Apenas monitorar'.",
"youPickedTrackOnly": "Você selecionou a opção 'Apenas monitorar'.",
"trackOnlyAppDescription": "As atualizações desse aplicativo serão monitoradas, mas o Obtainium não poderá baixá-lo ou instalá-lo.",
"cancelled": "Cancelado",
"appAlreadyAdded": "Aplicativo já adicionado",
"alreadyUpToDateQuestion": "Aplicativo já foi atualizado?",
"addApp": "Adicionar aplicativo",
"appSourceURL": "URL de origem do aplicativo",
"error": "Erro",
"add": "Adicionar",
"searchSomeSourcesLabel": "Procurar (apenas algumas fontes)",
"search": "Procurar",
"additionalOptsFor": "Opções adicionais para {}",
"supportedSources": "Fontes compatíveis",
"trackOnlyInBrackets": "(apenas monitorar)",
"searchableInBrackets": "(pesquisável)",
"appsString": "Aplicativos",
"noApps": "Não há aplicativos",
"noAppsForFilter": "Sem aplicativos para filtrar",
"byX": "Por {}",
"percentProgress": "Progresso: {}%",
"pleaseWait": "Por favor, espere",
"updateAvailable": "Atualização disponível",
"notInstalled": "Não instalado",
"pseudoVersion": "pseudo-versão",
"selectAll": "Selecionar todos",
"deselectX": "Deselecionar {}",
"xWillBeRemovedButRemainInstalled": "{} será removido do Obtainium mais permanecerá instalado no dispositivo.",
"removeSelectedAppsQuestion": "Remover aplicativos selecionados?",
"removeSelectedApps": "Remover aplicativos selecionados",
"updateX": "Atualizar {}",
"installX": "Instalar {}",
"markXTrackOnlyAsUpdated": "Marcar {}\n(Apenas monitorar)\ncomo Atualizado",
"changeX": "Mudar {}",
"installUpdateApps": "Instalar/Atualizar aplicativos",
"installUpdateSelectedApps": "Instalar/Atualizar aplicativos selecionados",
"markXSelectedAppsAsUpdated": "Marcar {} aplicativos selecionados como atualizados?",
"no": "Não",
"yes": "Sim",
"markSelectedAppsUpdated": "Marcar aplicativos selecionados como Atualizados",
"pinToTop": "Fixar no topo",
"unpinFromTop": "Desafixar do topo",
"resetInstallStatusForSelectedAppsQuestion": "Reiniciar status de instalação nos aplicativos selecionados?",
"installStatusOfXWillBeResetExplanation": "O status de instalação de todos os aplicativos selecionados será reiniciado.\n\nIsso pode ajudar quando uma versão de um aplicativo mostrada no Obtainium é incorreta devido a falhas ao atualizar ou outros problemas.",
"customLinkMessage": "Esses links funcionam em dispositivos com o Obtainium instalado",
"shareAppConfigLinks": "Compartilhar configuração do aplicativo como link HTML",
"shareSelectedAppURLs": "Compartilhar URLs de aplicativos selecionados",
"resetInstallStatus": "Reiniciar status de instalação",
"more": "Mais",
"removeOutdatedFilter": "Remover filtro de aplicativos desatualizados",
"showOutdatedOnly": "Mostrar apenas aplicativos desatualizados",
"filter": "Filtro",
"filterApps": "Filtrar aplicativos",
"appName": "Nome do aplicativo",
"author": "Autor",
"upToDateApps": "Aplicativos atualizados",
"nonInstalledApps": "Aplicativos não instalados",
"importExport": "Importar/Exportar",
"settings": "Configurações",
"exportedTo": "Exportado para {}",
"obtainiumExport": "Exportar dados do Obtainium",
"invalidInput": "Entrada inválida",
"importedX": "Importado {}",
"obtainiumImport": "Importar dados do Obtainium",
"importFromURLList": "Importar de lista de URLs",
"searchQuery": "Pesquisa",
"appURLList": "Lista de URLs de aplicativos",
"line": "Linha",
"searchX": "Pesquisar na/o {}",
"noResults": "Nenhum resultado encontrado",
"importX": "Importar {}",
"importedAppsIdDisclaimer": "Aplicativos Importados podem ser mostrados incorretamente como \"Não Instalado\".\nPara consertar, reinstale-os usando o Obtainium.\nIsso não deve afetar dados do aplicativo.\n\nAfeta apenas métodos de importação de URL e de terceiros.",
"importErrors": "Erros de importação",
"importedXOfYApps": "{} de {} aplicativos importados.",
"followingURLsHadErrors": "As seguintes URLs apresentaram erros:",
"selectURL": "Selecionar URL",
"selectURLs": "Selecionar URLs",
"pick": "Escolher",
"theme": "Tema",
"dark": "Escuro",
"light": "Claro",
"followSystem": "Padrão do sistema",
"followSystemThemeExplanation": "O tema do sistema seguinte só é possível através da utilização de aplicações de terceiros",
"useBlackTheme": "Usar tema preto AMOLED",
"appSortBy": "Classificar aplicativo por",
"authorName": "Autor/Nome",
"nameAuthor": "Nome/Autor",
"asAdded": "Como adicionado",
"appSortOrder": "Ordem de classificação de aplicativos",
"ascending": "Ascendente",
"descending": "Descendente",
"bgUpdateCheckInterval": "Intervalo de verificação de atualizações em segundo-plano",
"neverManualOnly": "Nunca - apenas manual",
"appearance": "Aparência",
"showWebInAppView": "Mostrar página web do aplicativo em informações do aplicativo",
"pinUpdates": "Fixar atualizações no topo da janela de aplicativos",
"updates": "Atualizações",
"sourceSpecific": "Token de acesso",
"appSource": "Fonte do aplicativo",
"noLogs": "Sem logs",
"appLogs": "Logs do aplicativo",
"close": "Fechar",
"share": "Compartilhar",
"appNotFound": "Aplicativo não encontrado",
"obtainiumExportHyphenatedLowercase": "exportação de obtainium",
"pickAnAPK": "Selecionar um APK",
"appHasMoreThanOnePackage": "{} tem mais de um pacote:",
"deviceSupportsXArch": "Seu dispositivo suporta a arquitetura de CPU {}.",
"deviceSupportsFollowingArchs": "Seu dispositivo suporta as seguintes arquiteturas de CPU:",
"warning": "Aviso",
"sourceIsXButPackageFromYPrompt": "A fonte do aplicativo é '{}' mas a origem do pacote é '{}'. Continuar?",
"updatesAvailable": "Atualizações disponíveis",
"updatesAvailableNotifDescription": "Notifica o usuário quando atualizações de um ou mais aplicativos monitorados pelo Obtainium estão disponíveis",
"noNewUpdates": "Sem novas atualizações.",
"xHasAnUpdate": "{} tem uma atualização.",
"appsUpdated": "Aplicativos atualizados",
"appsNotUpdated": "Falha na atualização das aplicações",
"appsUpdatedNotifDescription": "Notifica o usuário quando atualizações foram aplicadas em segundo-plano para um ou mais aplicativos ",
"xWasUpdatedToY": "{} foi atualizado para {}.",
"xWasNotUpdatedToY": "Falha ao atualizar {} para {}.",
"errorCheckingUpdates": "Erro ao procurar por atualizações",
"errorCheckingUpdatesNotifDescription": "Uma notificação que mostra quando a checagem por atualizações em segundo-plano falha",
"appsRemoved": "Aplicativos removidos",
"appsRemovedNotifDescription": "Notifica o usuário quando um ou mais aplicativos foram removidos devido a erros de carregamento",
"xWasRemovedDueToErrorY": "{} foi removido devido a este erro: {}",
"completeAppInstallation": "Instalação do aplicativo concluída",
"obtainiumMustBeOpenToInstallApps": "Obtainium deve estar aberto para instalar os aplicativos",
"completeAppInstallationNotifDescription": "Pede ao usuário que retorne ao Obtainium para finalizar a instalação de um aplicativo",
"checkingForUpdates": "Verificando atualizações",
"checkingForUpdatesNotifDescription": "Notificação transiente que aparece quando o Obtainium está verificando se há atualizações",
"pleaseAllowInstallPerm": "Por favor, permita que o Obtainium possa instalar aplicativos",
"trackOnly": "Apenas monitorar",
"errorWithHttpStatusCode": "Erro {}",
"versionCorrectionDisabled": "Correção de versão desativada (plugin parece não funcionar)",
"unknown": "Desconhecido",
"none": "Nenhum",
"never": "Nunca",
"latestVersionX": "Última versão: {}",
"installedVersionX": "Versão instalada: {}",
"lastUpdateCheckX": "Última verificação de atualizações: {}",
"remove": "Remover",
"yesMarkUpdated": "Sim, marcar como atualizado",
"fdroid": "Oficial F-Droid",
"appIdOrName": "ID do aplicativo ou nome",
"appId": "ID do aplicativo",
"appWithIdOrNameNotFound": "Nenhum aplicativo foi encontrado com esse ID ou nome",
"reposHaveMultipleApps": "Repositórios podem conter múltiplos aplicativos",
"fdroidThirdPartyRepo": "Repositórios de terceiros F-Droid",
"install": "Instalar",
"markInstalled": "Marcar instalado",
"update": "Atualizar",
"markUpdated": "Marcar como atualizado",
"additionalOptions": "Opções adicionais",
"disableVersionDetection": "Desativar detecção de versão",
"noVersionDetectionExplanation": "Essa opção deve apenas ser usada por aplicativos onde a detecção de versão não funciona corretamente.",
"downloadingX": "Baixando {}",
"downloadX": "Descarregar {}",
"downloadedX": "Descarregado {}",
"releaseAsset": "Libertação de activos",
"downloadNotifDescription": "Notifica o usuário o progresso do download de um aplicativo",
"noAPKFound": "APK não encontrado",
"noVersionDetection": "Sem detecção de versão",
"categorize": "Categorizar",
"categories": "Categorias",
"category": "Categoria",
"noCategory": "Sem categoria",
"noCategories": "Sem categorias",
"deleteCategoriesQuestion": "Deletar categorias?",
"categoryDeleteWarning": "Todos os aplicativos em categorias removidas serão descategorizados.",
"addCategory": "Adicionar categoria",
"label": "Etiqueta",
"language": "Linguagem",
"copiedToClipboard": "Copiado para a área de transferência",
"storagePermissionDenied": "Permissão de armazenamento negada",
"selectedCategorizeWarning": "Isso vai substituir qualquer configuração de categoria para os aplicativos selecionados.",
"filterAPKsByRegEx": "Filtrar APKs usando expressão regular",
"removeFromObtainium": "Remover do Obtainium",
"uninstallFromDevice": "Desinstalar do dispositivo",
"onlyWorksWithNonVersionDetectApps": "Apenas funciona para aplicativos com detecção de versão desativada.",
"releaseDateAsVersion": "Usar data de lançamento como versão",
"releaseTitleAsVersion": "Utilizar o título da versão como cadeia de versões",
"releaseDateAsVersionExplanation": "Esta opção só deve ser usada para aplicativos onde a detecção de versão não funciona corretamente, mas há uma data de lançamento disponível.",
"changes": "Alterações",
"releaseDate": "Data de lançamento",
"importFromURLsInFile": "Importar de URLs em arquivo (formato OPML)",
"versionDetectionExplanation": "Reconciliar string de versão com versão detectada no sistema operacional",
"versionDetection": "Detecção de versão",
"standardVersionDetection": "Detecção de versão padrão",
"groupByCategory": "Agroupar por categoria",
"autoApkFilterByArch": "Tente filtrar APKs por arquitetura de CPU, se possível",
"overrideSource": "Substituir fonte",
"dontShowAgain": "Não mostrar isso novamente",
"dontShowTrackOnlyWarnings": "Não mostrar avisos 'Apenas monitorar'",
"dontShowAPKOriginWarnings": "Não mostrar avisos de origem da APK",
"moveNonInstalledAppsToBottom": "Mover aplicativos não instalados para o fundo da lista de aplicativos",
"gitlabPATLabel": "Token de acesso pessoal do Gitlab",
"about": "Sobre",
"requiresCredentialsInSettings": "{}: Isso requer credenciais adicionais (em Configurações)",
"checkOnStart": "Verificar se há atualizações ao iniciar",
"tryInferAppIdFromCode": "Tente inferir o ID do aplicativo pelo código-fonte",
"removeOnExternalUninstall": "Remover automaticamente aplicativos desinstalados externamente",
"pickHighestVersionCode": "Auto-selecionar o maior número de versão do APK",
"checkUpdateOnDetailPage": "Checar por atualizações ao abrir a página de detalhes de um aplicativo",
"disablePageTransitions": "Desativar animações de transição de página",
"reversePageTransitions": "Animações de transição de página invertidas",
"minStarCount": "Contagem mínima de estrelas",
"addInfoBelow": "Adicionar essa informação abaixo.",
"addInfoInSettings": "Adicionar essa informação nas configurações.",
"githubSourceNote": "A limitação de taxa do GitHub pode ser evitada usando uma chave de API.",
"sortByLastLinkSegment": "Ordenar apenas usando o último segmento do link",
"filterReleaseNotesByRegEx": "Filtrar notas de versão usando Regex",
"customLinkFilterRegex": "Filtro de link personalizado usando expressão regular (Padrão '.apk$')",
"appsPossiblyUpdated": "Tentativas de atualização de aplicativos",
"appsPossiblyUpdatedNotifDescription": "Notifica o usuário de que atualizações de um ou mais aplicativos foram potencialmente aplicadas em segundo-plano",
"xWasPossiblyUpdatedToY": "{} pode ter sido atualizado para {}.",
"enableBackgroundUpdates": "Ativar atualizações em segundo-plano",
"backgroundUpdateReqsExplanation": "Atualizações em segundo-plano podem não ser possíveis para todos os aplicativos.",
"backgroundUpdateLimitsExplanation": "O sucesso de uma instalação em segundo-plano só pode ser determinado quando o Obtainium é aberto.",
"verifyLatestTag": "Verifique a 'última' etiqueta",
"intermediateLinkRegex": "Filtrar um link 'intermediário' para visitar",
"filterByLinkText": "Filtrar links pelo texto do link",
"intermediateLinkNotFound": "Link intermediário não encontrado",
"intermediateLink": "Link intermediário",
"exemptFromBackgroundUpdates": "Isento de atualizações em segundo-plano (se ativadas)",
"bgUpdatesOnWiFiOnly": "Desative as atualizações em segundo-plano quando não estiver conectado no Wi-Fi",
"bgUpdatesWhileChargingOnly": "Desativar actualizações em segundo plano quando não estiver a carregar",
"autoSelectHighestVersionCode": "Auto-selecionar a versão mais recente",
"versionExtractionRegEx": "Regex de extração de versão",
"trimVersionString": "Cortar a cadeia de caracteres da versão com RegEx",
"matchGroupToUseForX": "Grupo de correspondência a utilizar para \"{}\"",
"matchGroupToUse": "Grupo correspondente a ser usado no Regex de extração de versão",
"highlightTouchTargets": "Realçar áreas sensíveis ao toque que são menos óbvias",
"pickExportDir": "Escolher diretório para exportação",
"autoExportOnChanges": "Auto-exportar em mudanças",
"includeSettings": "Incluir configurações",
"filterVersionsByRegEx": "Filtrar versões por expressão regular",
"trySelectingSuggestedVersionCode": "Tente selecionar a versão sugerida",
"dontSortReleasesList": "Reter a ordem de lançamento da API",
"reverseSort": "Ordenação reversa",
"takeFirstLink": "Obter primeiro link",
"skipSort": "Ignorar ordenação",
"debugMenu": "Menu debug",
"bgTaskStarted": "Tarefa em segundo-plano iniciada - verifique os logs.",
"runBgCheckNow": "Execute agora em segundo-plano a verificação de atualizações",
"versionExtractWholePage": "Aplicar regex de extração de versão à página inteira",
"installing": "Instalando",
"skipUpdateNotifications": "Pular notificações de update",
"updatesAvailableNotifChannel": "Atualizações disponíveis",
"appsUpdatedNotifChannel": "Aplicativos atualizados",
"appsPossiblyUpdatedNotifChannel": "Tentativas de atualização de aplicativos",
"errorCheckingUpdatesNotifChannel": "Erro ao procurar por atualizações",
"appsRemovedNotifChannel": "Aplicativos removidos",
"downloadingXNotifChannel": "Baixando {}",
"completeAppInstallationNotifChannel": "Instalação completa do aplicativo",
"checkingForUpdatesNotifChannel": "Checando por atualizações",
"onlyCheckInstalledOrTrackOnlyApps": "Apenas verificar atualizações de aplicativos instalados e 'Apenas monitorar'",
"supportFixedAPKURL": "Suporte a APK com URLs fixas",
"selectX": "Selecionar {}",
"parallelDownloads": "Permitir downloads paralelos",
"useShizuku": "Utilizar Shizuku ou Sui para instalar",
"shizukuBinderNotFound": "O Shizuku não está rodando",
"shizukuOld": "Versão antiga do Shizuku (<11) - atualizar",
"shizukuOldAndroidWithADB": "Shizuku a funcionar no Android < 8.1 com ADB - atualizar o Android ou utilizar o Sui",
"shizukuPretendToBeGooglePlay": "Definir o Google Play como fonte de instalação (se for utilizado o Shizuku)",
"useSystemFont": "Usar fonte padrão do sistema",
"useVersionCodeAsOSVersion": "Usar versionCode do aplicativo como versão detectada pelo sistema operacional",
"requestHeader": "Requisitar cabeçalho",
"useLatestAssetDateAsReleaseDate": "Use o último upload de recursos como data de lançamento",
"defaultPseudoVersioningMethod": "Método de pseudo-versionamento padrão",
"partialAPKHash": "Hash APK parcial",
"APKLinkHash": "Hash de links APK",
"directAPKLink": "Link direto do APK",
"pseudoVersionInUse": "Uma pseudo-versão está em uso",
"installed": "Instalado",
"latest": "Mais recente",
"invertRegEx": "Inverter expressão regular",
"note": "Nota",
"selfHostedNote": "O menu suspenso \"{}\" pode ser usado para acessar instâncias auto-hospedadas/personalizadas de qualquer fonte.",
"badDownload": "Não foi possível analisar o APK (transferência incompatível ou parcial)",
"beforeNewInstallsShareToAppVerifier": "Partilhar novas aplicações com o AppVerifier (se disponível)",
"appVerifierInstructionToast": "Partilhe com o AppVerifier e, em seguida, regresse aqui quando estiver pronto.",
"wiki": "Ajuda/Wiki",
"crowdsourcedConfigsLabel": "Configurações de aplicações de crowdsourcing (utilização por sua conta e risco)",
"crowdsourcedConfigsShort": "Configurações de aplicações com base em crowdsourcing",
"allowInsecure": "Permitir pedidos HTTP inseguros",
"stayOneVersionBehind": "Manter-se uma versão atrás da mais recente",
"refreshBeforeDownload": "Atualizar os detalhes da aplicação antes da transferência",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "Remover aplicativo?",
"other": "Remover aplicativos?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "Muitas solicitações (taxa de solicitações limitada) - tente novamente em {} minuto",
"other": "Muitas solicitações (taxa limitada) - tente novamente em {} minutos"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "A verificação de atualizações em segundo-plano encontrou um {}, agendada uma nova verificação em {} minuto",
"other": "A verificação de atualizações em segundo-plano encontrou um {}, agendada uma nova verificação em {} minutos"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "A verificação de atualizações em segundo-plano encontrou {} atualização, o usuário sera notificado caso necessário",
"other": "A verificação de atualizações em segundo-plano encontrou {} atualizações, o usuário sera notificado caso necessário"
},
"apps": {
"one": "{} Aplicativo",
"other": "{} Aplicativos"
},
"url": {
"one": "{} URL",
"other": "{} URLs"
},
"minute": {
"one": "{} Minuto",
"other": "{} Minutos"
},
"hour": {
"one": "{} Hora",
"other": "{} Horas"
},
"day": {
"one": "{} Dia",
"other": "{} Dias"
},
"clearedNLogsBeforeXAfterY": {
"one": "Foi limpo {n} log (antes = {antes}, depois = {depois})",
"other": "Foram limpos {n} logs (antes = {antes}, depois = {depois})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} e um outro aplicativo possui atualizações.",
"other": "{} e {} outros aplicativo possuem atualizações."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} e um outro aplicativo foram atualizado.",
"other": "{} e {} outros aplicativos foram atualizados."
},
"xAndNMoreUpdatesFailed": {
"one": "Falha ao atualizar {} e mais 1 aplicação.",
"other": "Falha ao atualizar {} e {} mais aplicações."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} e um outro aplicativo podem ter sido atualizados.",
"other": "{} e {} outros aplicativos podem ter sido atualizados."
},
"apk": {
"one": "{} APK",
"other": "{} APKs"
}
}

View File

@ -1,5 +1,5 @@
{ {
"invalidURLForSource": "Неверный URL-адрес {} приложения", "invalidURLForSource": "Неверный URL-адрес приложения: {}",
"noReleaseFound": "Не удалось найти подходящий релиз", "noReleaseFound": "Не удалось найти подходящий релиз",
"noVersionFound": "Не удалось определить версию релиза", "noVersionFound": "Не удалось определить версию релиза",
"urlMatchesNoSource": "URL-адрес не соответствует известному источнику", "urlMatchesNoSource": "URL-адрес не соответствует известному источнику",
@ -9,49 +9,44 @@
"placeholder": "Заполнитель", "placeholder": "Заполнитель",
"someErrors": "Возникли некоторые ошибки", "someErrors": "Возникли некоторые ошибки",
"unexpectedError": "Неожиданная ошибка", "unexpectedError": "Неожиданная ошибка",
"ok": "Окей", "ok": "Ок",
"and": "и", "and": "и",
"startedBgUpdateTask": "Запущена задача фоновой проверки обновлений", "githubPATLabel": "Персональный токен доступа GitHub\n(увеличивает лимит запросов)",
"bgUpdateIgnoreAfterIs": "Параметр игнорирования фоновых обновлений: {}",
"startedActualBGUpdateCheck": "Запущена фактическая проверка фоновых обновлений",
"bgUpdateTaskFinished": "Завершена задача фоновой проверки обновлений",
"firstRun": "Это первый запуск Obtainium",
"settingUpdateCheckIntervalTo": "Установка интервала проверки обновлений: {}",
"githubPATLabel": "Персональный токен доступа GitHub (увеличивает лимит запросов)",
"githubPATHint": "Токен доступа должен быть в формате: имя_пользователя:токен",
"githubPATFormat": "имя_пользователя:токен",
"includePrereleases": "Включить предварительные релизы", "includePrereleases": "Включить предварительные релизы",
"fallbackToOlderReleases": "Откатиться к более старым версиям", "fallbackToOlderReleases": "Откатываться к предыдущей версии",
"filterReleaseTitlesByRegEx": "Фильтровать заголовки релизов\nс помощью регулярного выражения", "filterReleaseTitlesByRegEx": "Фильтровать заголовки релизов\n(регулярное выражение)",
"invalidRegEx": "Неверное регулярное выражение", "invalidRegEx": "Неверное регулярное выражение",
"noDescription": "Нет описания", "noDescription": "Нет описания",
"cancel": "Отмена", "cancel": "Отмена",
"continue": "Продолжить", "continue": "Продолжить",
"requiredInBrackets": "(Обязательно)", "requiredInBrackets": "(обязательно)",
"dropdownNoOptsError": "Ошибка: Выпадающий список должен содержать хотя бы одну опцию", "dropdownNoOptsError": "Ошибка: в выпадающем списке должна быть выбрана хотя бы одна настройка",
"colour": "Цвет", "colour": "Цвет",
"githubStarredRepos": "Помеченные звездочкой репозитории на GitHub", "standard": "Стандартный",
"custom": "Индивидуальный",
"useMaterialYou": "Использовать Material You",
"githubStarredRepos": "Избранные репозитории GitHub",
"uname": "Имя пользователя", "uname": "Имя пользователя",
"wrongArgNum": "Неправильное количество предоставленных аргументов", "wrongArgNum": "Неправильное количество предоставленных аргументов",
"xIsTrackOnly": "{} только для отслеживания", "xIsTrackOnly": "{} только для отслеживания",
"source": "Источник", "source": "Источник",
"app": "Приложение", "app": "Приложение",
"appsFromSourceAreTrackOnly": "Приложения из этого источника являются 'только для отслеживания'.", "appsFromSourceAreTrackOnly": "Приложения из этого источника настроены только для отслеживания",
"youPickedTrackOnly": "Вы выбрали опцию 'Только для отслеживания'.", "youPickedTrackOnly": "Вы выбрали опцию 'Только для отслеживания'",
"trackOnlyAppDescription": "Приложение будет отслеживаться на предмет обновлений, но Obtainium не сможет загрузить или установить его.", "trackOnlyAppDescription": "Приложение будет отслеживаться на предмет обновлений, но Obtainium не сможет загрузить или установить его",
"cancelled": "Отменено", "cancelled": "Отменено",
"appAlreadyAdded": "Приложение уже добавлено", "appAlreadyAdded": "Приложение уже добавлено",
"alreadyUpToDateQuestion": "Приложение уже обновлено?", "alreadyUpToDateQuestion": "Приложение уже обновлено?",
"addApp": "Добавить приложение", "addApp": "Добавить",
"appSourceURL": "URL-источник приложения", "appSourceURL": "URL-источник приложения",
"error": "Ошибка", "error": "Ошибка",
"add": "Добавить", "add": "Добавить",
"searchSomeSourcesLabel": "Поиск (только в некоторых источниках)", "searchSomeSourcesLabel": "Поиск (в некоторых источниках)",
"search": "Поиск", "search": "Поиск",
"additionalOptsFor": "Дополнительные опции для {}", "additionalOptsFor": "Дополнительные настройки для {}",
"supportedSourcesBelow": "Поддерживаемые источники:", "supportedSources": "Поддерживаемые источники",
"trackOnlyInBrackets": "(Только для отслеживания)", "trackOnlyInBrackets": "(только отслеживание)",
"searchableInBrackets": "(Поиск)", "searchableInBrackets": "(поиск)",
"appsString": "Приложения", "appsString": "Приложения",
"noApps": "Нет приложений", "noApps": "Нет приложений",
"noAppsForFilter": "Нет приложений для фильтра", "noAppsForFilter": "Нет приложений для фильтра",
@ -59,12 +54,11 @@
"percentProgress": "Прогресс: {}%", "percentProgress": "Прогресс: {}%",
"pleaseWait": "Пожалуйста, подождите", "pleaseWait": "Пожалуйста, подождите",
"updateAvailable": "Доступно обновление", "updateAvailable": "Доступно обновление",
"estimateInBracketsShort": "(Оценка)",
"notInstalled": "Не установлено", "notInstalled": "Не установлено",
"estimateInBrackets": "(Оценка)", "pseudoVersion": "псевдоверсия",
"selectAll": "Выбрать все", "selectAll": "Выбрать всё",
"deselectN": "Отменить выбор {}", "deselectX": "Отменить выбор {}",
"xWillBeRemovedButRemainInstalled": "{} будет удалено из Obtainium, но останется установленным на устройстве.", "xWillBeRemovedButRemainInstalled": "{} будет удалено из Obtainium, но останется на устройстве",
"removeSelectedAppsQuestion": "Удалить выбранные приложения?", "removeSelectedAppsQuestion": "Удалить выбранные приложения?",
"removeSelectedApps": "Удалить выбранные приложения", "removeSelectedApps": "Удалить выбранные приложения",
"updateX": "Обновить {}", "updateX": "Обновить {}",
@ -73,27 +67,28 @@
"changeX": "Изменить {}", "changeX": "Изменить {}",
"installUpdateApps": "Установить/Обновить приложения", "installUpdateApps": "Установить/Обновить приложения",
"installUpdateSelectedApps": "Установить/Обновить выбранные приложения", "installUpdateSelectedApps": "Установить/Обновить выбранные приложения",
"markXSelectedAppsAsUpdated": "Отметить {} выбранные приложения как обновленные?", "markXSelectedAppsAsUpdated": "Выбрано приложений: {}. Отметить как обновлённые?",
"no": "Нет", "no": "Нет",
"yes": "Да", "yes": "Да",
"markSelectedAppsUpdated": "Отметить выбранные приложения как обновленные", "markSelectedAppsUpdated": "Отметить выбранные приложения как обновлённые",
"pinToTop": "Закрепить сверху", "pinToTop": "Закрепить сверху",
"unpinFromTop": "Открепить", "unpinFromTop": "Открепить",
"resetInstallStatusForSelectedAppsQuestion": "Сбросить статус установки для выбранных приложений?", "resetInstallStatusForSelectedAppsQuestion": "Сбросить статус установки для выбранных приложений?",
"installStatusOfXWillBeResetExplanation": "Статус установки для выбранных приложений будет сброшен.\n\nЭто может помочь, если версия приложения, отображаемая в Obtainium, неправильная из-за неудачных обновлений или других проблем.", "installStatusOfXWillBeResetExplanation": "Статус установки для выбранных приложений будет сброшен.\n\nЭто может помочь, если версия приложения, отображаемая в Obtainium, некорректная из-за неудачных обновлений или других проблем",
"customLinkMessage": "Эти ссылки работают на устройствах с установленным Obtainium",
"shareAppConfigLinks": "Поделиться конфигурацией приложения в виде HTML-ссылки",
"shareSelectedAppURLs": "Поделиться выбранными URL-адресами приложений", "shareSelectedAppURLs": "Поделиться выбранными URL-адресами приложений",
"resetInstallStatus": "Сбросить статус установки", "resetInstallStatus": "Сбросить статус установки",
"more": "Еще", "more": "Ещё",
"removeOutdatedFilter": "Удалить фильтр для устаревших приложений", "removeOutdatedFilter": "Удалить фильтр для устаревших приложений",
"showOutdatedOnly": "Показывать только устаревшие приложения", "showOutdatedOnly": "Показывать только устаревшие приложения",
"filter": "Фильтр", "filter": "Фильтр",
"filterActive": "Фильтр *",
"filterApps": "Фильтровать приложения", "filterApps": "Фильтровать приложения",
"appName": "Название приложения", "appName": "Название приложения",
"author": "Автор", "author": "Автор",
"upToDateApps": "Приложения со свежими обновлениями", "upToDateApps": "Приложения со свежими обновлениями",
"nonInstalledApps": "Неустановленные приложения", "nonInstalledApps": "Неустановленные приложения",
"importExport": "Импорт/экспорт", "importExport": "Данные",
"settings": "Настройки", "settings": "Настройки",
"exportedTo": "Экспортировано в {}", "exportedTo": "Экспортировано в {}",
"obtainiumExport": "Экспорт из Obtainium", "obtainiumExport": "Экспорт из Obtainium",
@ -107,63 +102,63 @@
"searchX": "Поиск {}", "searchX": "Поиск {}",
"noResults": "Результатов не найдено", "noResults": "Результатов не найдено",
"importX": "Импорт {}", "importX": "Импорт {}",
"importedAppsIdDisclaimer": "Импортированные приложения могут неверно отображаться как 'Не установлены'.\nДля исправления этой проблемы повторно установите их через Obtainium.\nЭто не должно повлиять на данные приложения.\n\nПроблемы возникают только при импорте из URL-адреса и сторонних источников.", "importedAppsIdDisclaimer": "Импортированные приложения могут неверно отображаться как неустановленные.\nДля исправления этой проблемы повторно установите их через Obtainium.\nЭто не должно повлиять на данные приложения.\n\nПроблемы возникают только при импорте из URL-адреса и сторонних источников",
"importErrors": "Ошибка импорта", "importErrors": "Ошибка импорта",
"importedXOfYApps": "Импортировано {} из {} приложений.", "importedXOfYApps": "Импортировано приложений: {} из {}",
"followingURLsHadErrors": "При импорте следующие URL-адреса содержали ошибки:", "followingURLsHadErrors": "При импорте следующие URL-адреса содержали ошибки:",
"okay": "Окей",
"selectURL": "Выбрать URL-адрес", "selectURL": "Выбрать URL-адрес",
"selectURLs": "Выбрать URL-адреса", "selectURLs": "Выбрать URL-адреса",
"pick": "Выбрать", "pick": "Выбрать",
"theme": "Тема", "theme": "Тема",
"dark": "Темная", "dark": "Тёмная",
"light": "Светлая", "light": "Светлая",
"followSystem": "Как в системе", "followSystem": "Системная",
"obtainium": "Obtainium", "followSystemThemeExplanation": "Следование системной теме возможно только при использовании сторонних приложений",
"materialYou": "Material You",
"useBlackTheme": "Использовать чёрную тему", "useBlackTheme": "Использовать чёрную тему",
"appSortBy": "Сортировка приложений по", "appSortBy": "Сортировка приложений",
"authorName": "Автор/Название", "authorName": "Автор/Название",
"nameAuthor": "Название/Автор", "nameAuthor": "Название/Автор",
"asAdded": "В порядке добавления", "asAdded": "В порядке добавления",
"appSortOrder": "Порядок сортировки приложений", "appSortOrder": "Порядок",
"ascending": "По возрастанию", "ascending": "По возрастанию",
"descending": "По убыванию", "descending": "По убыванию",
"bgUpdateCheckInterval": "Интервал проверки обновлений в фоновом режиме", "bgUpdateCheckInterval": "Интервал проверки обновлений в фоновом режиме",
"neverManualOnly": "Никогда - Только вручную", "neverManualOnly": "Никогда — только вручную",
"appearance": "Внешний вид", "appearance": "Внешний вид",
"showWebInAppView": "Показывать исходную веб-страницу в представлении приложения", "showWebInAppView": "Показывать исходную веб-страницу на странице приложения",
"pinUpdates": "Закрепить обновления сверху списка приложений", "pinUpdates": "Отображать обновления приложений сверху списка",
"updates": "Обновления", "updates": "Обновления",
"sourceSpecific": "Специфика источника", "sourceSpecific": "Настройки источников",
"appSource": "Источник приложения", "appSource": "Источник",
"noLogs": "Нет журналов", "noLogs": "Нет журналов",
"appLogs": "Журналы приложений", "appLogs": "Логи",
"close": "Закрыть", "close": "Закрыть",
"share": "Поделиться", "share": "Поделиться",
"appNotFound": "Приложение не найдено", "appNotFound": "Приложение не найдено",
"obtainiumExportHyphenatedLowercase": "obtainium-export", "obtainiumExportHyphenatedLowercase": "экспорт-obtainium",
"pickAnAPK": "Выберите APK-файл", "pickAnAPK": "Выберите APK-файл",
"appHasMoreThanOnePackage": "{} имеет более одного пакета:", "appHasMoreThanOnePackage": "{} имеет более одного пакета:",
"deviceSupportsXArch": "Ваше устройство поддерживает архитектуру процессора {}.", "deviceSupportsXArch": "Ваше устройство поддерживает архитектуру процессора {}",
"deviceSupportsFollowingArchs": "Ваше устройство поддерживает следующие архитектуры процессора:", "deviceSupportsFollowingArchs": "Ваше устройство поддерживает следующие архитектуры процессора:",
"warning": "Предупреждение", "warning": "Предупреждение",
"sourceIsXButPackageFromYPrompt": "Источник приложения - '{}', но пакет для установки получен из '{}'. Продолжить?", "sourceIsXButPackageFromYPrompt": "Источник приложения '{}', но пакет для установки получен из '{}'. Продолжить?",
"updatesAvailable": "Доступны обновления", "updatesAvailable": "Доступны обновления",
"updatesAvailableNotifDescription": "Уведомляет пользователя о наличии обновлений для одного или нескольких приложений, отслеживаемых Obtainium", "updatesAvailableNotifDescription": "Уведомляет о наличии обновлений для одного или нескольких приложений в Obtainium",
"noNewUpdates": "Нет новых обновлений.", "noNewUpdates": "Нет новых обновлений",
"xHasAnUpdate": "{} есть обновление.", "xHasAnUpdate": "{} есть обновление",
"appsUpdated": "Приложения обновлены", "appsUpdated": "Приложения обновлены",
"appsUpdatedNotifDescription": "Уведомляет пользователя о том, что обновления для одного или нескольких приложений были применены в фоновом режиме", "appsNotUpdated": "Не удалось обновить приложения",
"xWasUpdatedToY": "{} была обновлена до версии {}.", "appsUpdatedNotifDescription": "Уведомляет об обновлении одного или нескольких приложений в фоновом режиме",
"xWasUpdatedToY": "{} была обновлена до версии {}",
"xWasNotUpdatedToY": "Не удалось обновить {} до версии {}",
"errorCheckingUpdates": "Ошибка при проверке обновлений", "errorCheckingUpdates": "Ошибка при проверке обновлений",
"errorCheckingUpdatesNotifDescription": "Уведомление, которое появляется, когда проверка обновлений в фоновом режиме завершилась с ошибкой", "errorCheckingUpdatesNotifDescription": "Уведомление о завершении проверки обновлений в фоновом режиме с ошибкой",
"appsRemoved": "Приложение удалено", "appsRemoved": "Приложение удалено",
"appsRemovedNotifDescription": "Уведомляет пользователя о том, что одно или несколько приложений было удалено из-за ошибок при их загрузке", "appsRemovedNotifDescription": "Уведомление об удалении одного или несколько приложений из-за ошибок при их загрузке",
"xWasRemovedDueToErrorY": "{} был удален из-за ошибки: {}", "xWasRemovedDueToErrorY": "{} был удален из-за ошибки: {}",
"completeAppInstallation": "Завершение установки приложения", "completeAppInstallation": "Завершение установки приложения",
"obtainiumMustBeOpenToInstallApps": "Для установки приложений Obtainium должен быть открыт", "obtainiumMustBeOpenToInstallApps": "Obtainium должен быть открыт для установки приложений",
"completeAppInstallationNotifDescription": "Просит пользователя вернуться в Obtainium, чтобы завершить установку приложения", "completeAppInstallationNotifDescription": "Уведомление о необходимости открыть Obtainium для завершения установки приложения",
"checkingForUpdates": "Проверка обновлений", "checkingForUpdates": "Проверка обновлений",
"checkingForUpdatesNotifDescription": "Временное уведомление, которое появляется при проверке обновлений", "checkingForUpdatesNotifDescription": "Временное уведомление, которое появляется при проверке обновлений",
"pleaseAllowInstallPerm": "Пожалуйста, разрешите Obtainium устанавливать приложения", "pleaseAllowInstallPerm": "Пожалуйста, разрешите Obtainium устанавливать приложения",
@ -175,124 +170,213 @@
"never": "Никогда", "never": "Никогда",
"latestVersionX": "Последняя версия: {}", "latestVersionX": "Последняя версия: {}",
"installedVersionX": "Установленная версия: {}", "installedVersionX": "Установленная версия: {}",
"lastUpdateCheckX": "Последняя проверка обновлений: {}", "lastUpdateCheckX": "Последняя проверка: {}",
"remove": "Удалить", "remove": "Удалить",
"yesMarkUpdated": "Да, отметить как обновленное", "yesMarkUpdated": "Да, отметить как обновленное",
"fdroid": "Официальный F-Droid", "fdroid": "Официальные репозитории F-Droid",
"appIdOrName": "ID или название приложения", "appIdOrName": "ID или название приложения",
"appId": "ID приложения", "appId": "ID приложения",
"appWithIdOrNameNotFound": "Приложение с таким ID или названием не было найдено", "appWithIdOrNameNotFound": "Приложение с таким ID или названием не было найдено",
"reposHaveMultipleApps": "В хранилище может быть несколько приложений", "reposHaveMultipleApps": "В хранилище несколько приложений",
"fdroidThirdPartyRepo": "Сторонние репозитории F-Droid", "fdroidThirdPartyRepo": "Сторонние репозитории F-Droid",
"steam": "Steam",
"steamMobile": "Steam Mobile",
"steamChat": "Steam Chat",
"install": "Установить", "install": "Установить",
"markInstalled": "Пометить как установленное", "markInstalled": "Пометить как установленное",
"update": "Обновить", "update": "Обновить",
"markUpdated": "Отметить обновленным", "markUpdated": "Отметить обновлённым",
"additionalOptions": "Дополнительные опции", "additionalOptions": "Дополнительные настройки",
"disableVersionDetection": "Отключить обнаружение версии", "disableVersionDetection": "Отключить обнаружение версии",
"noVersionDetectionExplanation": "Эта опция должна использоваться только для приложений, где обнаружение версии не работает корректно.", "noVersionDetectionExplanation": "Эта настройка должна использоваться только для приложений, где обнаружение версии не работает корректно",
"downloadingX": "Загрузка {}", "downloadingX": "Загрузка {}",
"downloadX": "Скачать {}",
"downloadedX": "Загружено {}",
"releaseAsset": "Релизный объект",
"downloadNotifDescription": "Уведомляет пользователя о прогрессе загрузки приложения", "downloadNotifDescription": "Уведомляет пользователя о прогрессе загрузки приложения",
"noAPKFound": "APK не найден", "noAPKFound": "APK не найден",
"noVersionDetection": "Версий не обнаружено", "noVersionDetection": "Обнаружение версий отключено",
"categorize": "Категоризировать", "categorize": "Категоризировать",
"categories": "Категории", "categories": "Категории",
"category": "Категория", "category": "Категория",
"noCategory": "Без категории", "noCategory": "Без категории",
"noCategories": "Без категорий", "noCategories": "Без категорий",
"deleteCategoriesQuestion": "Удалить категории?", "deleteCategoriesQuestion": "Удалить категории?",
"categoryDeleteWarning": "Все приложения в удаленных категориях будут помечены как без категории.", "categoryDeleteWarning": "Все приложения в удаленных категориях будут помечены как без категории",
"addCategory": "Добавить категорию", "addCategory": "Добавить категорию",
"label": "Метка", "label": "Метка",
"language": "Язык", "language": "Язык",
"copiedToClipboard": "Скопировано в буфер обмена", "copiedToClipboard": "Скопировано в буфер обмена",
"storagePermissionDenied": "Отказано в доступе к хранилищу", "storagePermissionDenied": "Отказано в доступе к хранилищу",
"selectedCategorizeWarning": "Это заменит все текущие настройки категорий для выбранных приложений.", "selectedCategorizeWarning": "Это заменит все текущие настройки категорий для выбранных приложений",
"filterAPKsByRegEx": "Фильтровать APK-файлы с помощью\nрегулярного выражения", "filterAPKsByRegEx": "Отфильтровать APK-файлы\n(регулярное выражение)",
"removeFromObtainium": "Удалить из Obtainium", "removeFromObtainium": "Удалить из Obtainium",
"uninstallFromDevice": "Удалить с устройства", "uninstallFromDevice": "Удалить с устройства",
"onlyWorksWithNonVersionDetectApps": "Работает только для приложений с отключенным определением версии.", "onlyWorksWithNonVersionDetectApps": "Работает только для приложений с отключенным определением версии",
"releaseDateAsVersion": "Использовать дату выпуска в качестве версии", "releaseDateAsVersion": "Дата выпуска вместо версии",
"releaseDateAsVersionExplanation": "Этот параметр следует использовать только для приложений, в которых определение версии не работает правильно, но имеется дата выпуска.", "releaseTitleAsVersion": "Используйте название релиза в качестве строки версии",
"releaseDateAsVersionExplanation": "Этот параметр следует использовать только для приложений, в которых определение версии не работает правильно, но имеется дата выпуска",
"changes": "Изменения", "changes": "Изменения",
"releaseDate": "Дата выпуска", "releaseDate": "Дата выпуска",
"importFromURLsInFile": "Импорт URL-адресов из файла (например, OPML)", "importFromURLsInFile": "Импорт из файла URL-адресов (например: OPML)",
"versionDetectionExplanation": "Согласовать строку версии с версией, обнаруженной в ОС",
"versionDetection": "Определение версии", "versionDetection": "Определение версии",
"standardVersionDetection": "Стандартное определение версии", "standardVersionDetection": "Стандартное",
"groupByCategory": "Группировать по категориям", "groupByCategory": "Группировать по категориям",
"autoApkFilterByArch": "Попытка фильтрации APK-файлов по архитектуре процессора, если это возможно", "autoApkFilterByArch": "Попытаться отфильтровать APK-файлы по архитектуре процессора",
"overrideSource": "Переопределить источник", "overrideSource": "Переопределить источник",
"dontShowAgain": "Не показывать снова", "dontShowAgain": "Не показывать снова",
"dontShowTrackOnlyWarnings": "Не показывать предупреждения о только отслеживаемых приложениях", "dontShowTrackOnlyWarnings": "Не показывать предупреждения о только отслеживаемых приложениях",
"dontShowAPKOriginWarnings": "Не показывать предупреждения об источнике APK-файлов", "dontShowAPKOriginWarnings": "Не показывать предупреждения об отличающемся источнике APK-файлов",
"moveNonInstalledAppsToBottom": "Переместить неустановленные приложения вниз списка", "moveNonInstalledAppsToBottom": "Отображать неустановленные приложения внизу списка",
"gitlabPATLabel": "Персональный токен доступа GitLab\n(Включает поиск и улучшает обнаружение APK)", "gitlabPATLabel": "Персональный токен доступа GitLab",
"about": "О приложении", "about": "Описание",
"requiresCredentialsInSettings": "Для этого требуются дополнительные учетные данные (в настройках)", "requiresCredentialsInSettings": "{}: Для этого требуются дополнительные учетные данные (в настройках)",
"checkOnStart": "Проверять наличие обновлений при запуске", "checkOnStart": "Проверять наличие обновлений при запуске",
"tryInferAppIdFromCode": "Попытаться определить ID приложения из исходного кода", "tryInferAppIdFromCode": "Попытаться определить ID приложения из исходного кода",
"removeOnExternalUninstall": "Автоматически убирать из списка удаленные извне приложения", "removeOnExternalUninstall": "Автоматически убирать из списка удаленные извне приложения",
"pickHighestVersionCode": "Автовыбор кода наивысшей версии APK", "pickHighestVersionCode": "Автовыбор актуальной версии кода APK",
"checkUpdateOnDetailPage": "Проверять наличие обновлений при открытии страницы представления приложения", "checkUpdateOnDetailPage": "Проверять наличие обновлений при открытии страницы приложения",
"disablePageTransitions": "Отключить анимацию перехода между страницами", "disablePageTransitions": "Отключить анимацию перехода между страницами",
"reversePageTransitions": "Реверс анимации перехода между страницами", "reversePageTransitions": "Реверс анимации перехода между страницами",
"minStarCount": "Минимальное количество звёзд", "minStarCount": "Минимальное количество звёзд",
"addInfoBelow": "Добавьте эту информацию ниже.", "addInfoBelow": "Добавьте эту информацию ниже",
"addInfoInSettings": "Добавьте эту информацию в Настройки.", "addInfoInSettings": "Добавьте эту информацию в Настройки",
"githubSourceNote": "Лимит запросов GitHub можно обойти, используя ключ API.", "githubSourceNote": "Используя ключ API можно обойти лимит запросов GitHub",
"gitlabSourceNote": "Извлечение APK из GitLab может не работать без ключа API.", "sortByLastLinkSegment": "Сортировать только по последнему сегменту ссылки",
"sortByFileNamesNotLinks": "Sort by file names instead of full links", "filterReleaseNotesByRegEx": "Фильтровать примечания к выпуску\n(регулярное выражение)",
"filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", "customLinkFilterRegex": "Пользовательский фильтр ссылок APK\n(регулярное выражение, по умолчанию: '.apk$')",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "appsPossiblyUpdated": "Попытки обновления приложений",
"appsPossiblyUpdatedNotifDescription": "Уведомление о возможных обновлениях одного или нескольких приложений в фоновом режиме",
"xWasPossiblyUpdatedToY": "{} возможно был обновлен до {}",
"enableBackgroundUpdates": "Включить обновления в фоне",
"backgroundUpdateReqsExplanation": "Фоновые обновления могут быть возможны не для всех приложений",
"backgroundUpdateLimitsExplanation": "Успешность фоновой установки можно определить только после открытия Obtainium",
"verifyLatestTag": "Проверять тег 'latest'",
"intermediateLinkRegex": "Фильтр для \"промежуточной\" ссылки для посещения",
"filterByLinkText": "Фильтрация ссылок по тексту ссылки",
"intermediateLinkNotFound": "Промежуточная ссылка не найдена",
"intermediateLink": "Промежуточная ссылка",
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",
"bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi",
"bgUpdatesWhileChargingOnly": "Отключение фоновых обновлений при отсутствии зарядки",
"autoSelectHighestVersionCode": "Автоматически выбирать APK с актуальной версией кода",
"versionExtractionRegEx": "Регулярное выражение для извлечения версии",
"trimVersionString": "Обрезка строки версии с помощью RegEx",
"matchGroupToUseForX": "Группа соответствия, которую следует использовать для \"{}\"",
"matchGroupToUse": "Выберите группу для использования",
"highlightTouchTargets": "Выделить менее очевидные элементы управления касанием",
"pickExportDir": "Выбрать каталог для экспорта",
"autoExportOnChanges": "Автоэкспорт при изменениях",
"includeSettings": "Включить настройки",
"filterVersionsByRegEx": "Фильтровать версии по регулярному выражению",
"trySelectingSuggestedVersionCode": "Попробуйте выбрать предложенный код версии APK",
"dontSortReleasesList": "Сохранить порядок релизов от API",
"reverseSort": "Обратная сортировка",
"takeFirstLink": "Взять первую ссылку",
"skipSort": "Пропустить сортировку",
"debugMenu": "Меню отладки",
"bgTaskStarted": "Фоновая задача начата — проверьте журналы",
"runBgCheckNow": "Запустить проверку фонового обновления сейчас",
"versionExtractWholePage": "Применить регулярное выражение версии ко всей странице",
"installing": "Устанавливается",
"skipUpdateNotifications": "Не оповещать об обновлениях",
"updatesAvailableNotifChannel": "Доступны обновления",
"appsUpdatedNotifChannel": "Приложения обновлены",
"appsPossiblyUpdatedNotifChannel": "Попытки обновления приложений",
"errorCheckingUpdatesNotifChannel": "Ошибка при проверке обновлений",
"appsRemovedNotifChannel": "Приложение удалено",
"downloadingXNotifChannel": "Загрузка {}",
"completeAppInstallationNotifChannel": "Завершение установки приложения",
"checkingForUpdatesNotifChannel": "Проверка обновлений",
"onlyCheckInstalledOrTrackOnlyApps": "Проверять обновления только у установленных или отслеживаемых приложений",
"supportFixedAPKURL": "Поддержка фиксированных URL-адресов APK",
"selectX": "Выбрать {}",
"parallelDownloads": "Разрешить параллельные загрузки",
"useShizuku": "Использовать Shizuku или Sui для установки",
"shizukuBinderNotFound": "Совместимый сервис Shizuku не найден, возможно он не запущен",
"shizukuOld": "Устаревшая версия Shizuku (<11), обновите",
"shizukuOldAndroidWithADB": "Shizuku работает на Android < 8.1 с ADB, обновите Android или используйте Sui",
"shizukuPretendToBeGooglePlay": "Указать Google Play как источник установки (если используется Shizuku)",
"useSystemFont": "Использовать системный шрифт",
"useVersionCodeAsOSVersion": "Использовать код версии приложения как версию, обнаруженную ОС",
"requestHeader": "Заголовок запроса",
"useLatestAssetDateAsReleaseDate": "Использовать последнюю загрузку ресурса в качестве даты выпуска",
"defaultPseudoVersioningMethod": "Метод псевдоверсионирования по умолчанию",
"partialAPKHash": "Частичный хэш APK",
"APKLinkHash": "Хеш ссылки APK",
"directAPKLink": "Прямая ссылка на APK",
"pseudoVersionInUse": "Используется псевдоверсия",
"installed": "Установлен",
"latest": "Последний",
"invertRegEx": "Инвертировать регулярное выражение",
"note": "Примечание",
"selfHostedNote": "Выпадающий список \"{}\" можно использовать для доступа к самостоятельно размещенным/настроенным экземплярам любого источника.",
"badDownload": "APK не удалось разобрать (несовместимая или неполная загрузка)",
"beforeNewInstallsShareToAppVerifier": "Поделитесь новыми приложениями с AppVerifier (если доступно)",
"appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.",
"wiki": "Помощь/Вики",
"crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)",
"crowdsourcedConfigsShort": "Конфиги приложений с помощью краудсорсинга",
"allowInsecure": "Разрешить небезопасные HTTP-запросы",
"stayOneVersionBehind": "Не отставайте от последней версии",
"refreshBeforeDownload": "Обновляйте информацию о приложении перед загрузкой",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Удалить приложение?", "one": "Удалить приложение?",
"other": "Удалить приложения?" "other": "Удалить приложения?"
}, },
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {
"one": "Слишком много запросов (ограничение скорости) - попробуйте снова через {} минуту", "one": "Слишком много запросов (ограничение скорости) попробуйте снова через {} минуту",
"other": "Слишком много запросов (ограничение скорости) - попробуйте снова через {} минуты" "other": "Слишком много запросов (ограничение скорости) попробуйте снова через {} минуты"
}, },
"bgUpdateGotErrorRetryInMinutes": { "bgUpdateGotErrorRetryInMinutes": {
"one": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет запланирована через {} минуту", "one": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет запланирована через {} минуту",
"other": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет запланирована через {} минуты" "other": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет запланирована через {} минуты"
}, },
"bgCheckFoundUpdatesWillNotifyIfNeeded": { "bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "В ходе проверки обновления в фоновом режиме было обнаружено {} обновление - Пользователю будет отправлено уведомление, если это необходимо", "one": "В ходе проверки обновления в фоновом режиме было обнаружено {} обновление Пользователю будет отправлено уведомление, если это необходимо",
"other": "В ходе проверки обновления в фоновом режиме было обнаружено {} обновлений - Пользователю будет отправлено уведомление, если это необходимо" "other": "В ходе проверки обновления в фоновом режиме было обнаружено {} обновлений Пользователю будет отправлено уведомление, если это необходимо"
}, },
"apps": { "apps": {
"one": "{} Приложение", "one": "{} приложение",
"other": "{} Приложений" "other": "{} приложений"
}, },
"url": { "url": {
"one": "{} URL-адрес", "one": "{} URL-адрес",
"other": "{} URL-адреса" "other": "{} URL-адреса"
}, },
"minute": { "minute": {
"one": "{} Минута", "one": "{} минута",
"other": "{} Минуты" "other": "{} минуты"
}, },
"hour": { "hour": {
"one": "{} Час", "one": "{} час",
"other": "{} Часов" "other": "{} часов"
}, },
"day": { "day": {
"one": "{} День", "one": "{} день",
"other": "{} Дней" "other": "{} дней"
}, },
"clearedNLogsBeforeXAfterY": { "clearedNLogsBeforeXAfterY": {
"one": "Очищен {n} журнал (до = {before}, после = {after})", "one": "Очищен {n} журнал (до = {before}, после = {after})",
"other": "Очищено {n} журналов (до = {before}, после = {after})" "other": "Очищено {n} журналов (до = {before}, после = {after})"
}, },
"xAndNMoreUpdatesAvailable": { "xAndNMoreUpdatesAvailable": {
"one": "У {} и еще 1 приложения есть обновление.", "one": "У {} и еще 1 приложения есть обновление",
"other": "У {} и ещё {} приложений есть обновления." "other": "У {} и ещё {} приложений есть обновления"
}, },
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "{} и еще 1 приложение были обновлены.", "one": "{} и ещё 1 приложение были обновлены",
"other": "{} и еще {} приложений были обновлены." "other": "{} и ещё {} приложений были обновлены"
},
"xAndNMoreUpdatesFailed": {
"one": "Не удалось обновить {} и ещё 1 приложение",
"other": "Не удалось обновить {} и ещё {} приложений"
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} и ещё 1 приложение могли быть обновлены",
"other": "{} и ещё {} приложений могли быть обновлены"
},
"apk": {
"one": "{} APK",
"other": "{} APKи"
} }
} }

View File

@ -0,0 +1,119 @@
// Take one (hardcoded) translation file and ensure that all other translation files have the same keys in the same order
// Then report which other translation files have identical items (or auto-translate them if a DeepL API key is provided)
const fs = require('fs')
const https = require('https')
const deeplAPIKey = process.argv[2]
const neverAutoTranslate = {
steamMobile: ['*'],
steamChat: ['*'],
root: ['*'],
obtainiumExportHyphenatedLowercase: ['*'],
theme: ['de'],
appId: ['de'],
placeholder: ['pl']
}
const translateText = async (text, targetLang, authKey) => {
return new Promise((resolve, reject) => {
const postData = `text=${encodeURIComponent(text)}&target_lang=${encodeURIComponent(targetLang)}&source_lang=EN`
const options = {
hostname: 'api-free.deepl.com',
port: 443,
path: '/v2/translate',
method: 'POST',
headers: {
'Authorization': `DeepL-Auth-Key ${authKey}`,
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
}
const req = https.request(options, (res) => {
let responseData = ''
res.on('data', (chunk) => {
responseData += chunk
})
res.on('end', () => {
try {
const jsonResponse = JSON.parse(responseData)
resolve(jsonResponse)
} catch (error) {
reject(error)
}
})
})
req.on('error', (error) => {
reject(error)
})
req.write(postData)
req.end()
})
}
const main = async () => {
const translationsDir = __dirname
const templateFile = `${translationsDir}/en.json`
const otherFiles = fs.readdirSync(translationsDir).map(f => {
return `${translationsDir}/${f}`
}).filter(f => f.endsWith('.json') && f != templateFile)
const templateTranslation = JSON.parse(fs.readFileSync(templateFile).toString())
otherFiles.forEach(file => {
const thisTranslationOriginal = JSON.parse(fs.readFileSync((file).toString()))
const thisTranslationNew = {}
Object.keys(templateTranslation).forEach(k => {
thisTranslationNew[k] = thisTranslationOriginal[k] || templateTranslation[k]
})
fs.writeFileSync(file, `${JSON.stringify(thisTranslationNew, null, ' ')}\n`)
})
for (let i in otherFiles) {
const file = otherFiles[i]
const thisTranslation = JSON.parse(fs.readFileSync((file).toString()))
const translationKeys = Object.keys(templateTranslation)
for (let j in translationKeys) {
const k = translationKeys[j]
if (JSON.stringify(thisTranslation[k]) == JSON.stringify(templateTranslation[k])) {
const lang = file.split('/').pop().split('.')[0]
if (!neverAutoTranslate[k] || (neverAutoTranslate[k].indexOf('*') < 0 && neverAutoTranslate[k].indexOf(lang) < 0)) {
const reportLine = `${file} :::: ${k} :::: ${JSON.stringify(thisTranslation[k])}`
if (deeplAPIKey) {
const translateFunc = async (str) => {
const response = await translateText(str, lang, deeplAPIKey)
if (response.translations) {
return response.translations[0].text
} else {
throw JSON.stringify(response)
}
}
try {
if (typeof templateTranslation[k] == 'string') {
thisTranslation[k] = await translateFunc(thisTranslation[k])
} else {
const subKeys = Object.keys(templateTranslation[k])
for (let n in subKeys) {
const kk = subKeys[n]
thisTranslation[k][kk] = await translateFunc(thisTranslation[k][kk])
}
}
} catch (e) {
if (typeof e == 'string') {
console.log(`${reportLine} :::: ${e}`)
} else {
throw e
}
}
} else {
console.log(reportLine)
}
}
}
}
fs.writeFileSync(file, `${JSON.stringify(thisTranslation, null, ' ')}\n`)
}
}
main().catch(e => console.error)

382
assets/translations/sv.json Normal file
View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "Inte giltig {} App-URL",
"noReleaseFound": "Kunde inte hitta en lämplig releaseversion",
"noVersionFound": "Kunde inte bestämma releaseversion",
"urlMatchesNoSource": "URL matchar inte känd källa",
"cantInstallOlderVersion": "Kan inte installera en äldre version av en app",
"appIdMismatch": "Nerladdat paket-ID matchar inte nuvarande App-ID",
"functionNotImplemented": "Den här klassen har inte implementerat den här funktionen",
"placeholder": "Platshållare",
"someErrors": "Några fel uppstod",
"unexpectedError": "Oväntat fel",
"ok": "Okej",
"and": "och",
"githubPATLabel": "GitHub Personal Access Token (ökar hastighetsgräns)",
"includePrereleases": "Inkludera förreleaser",
"fallbackToOlderReleases": "Fall tillbaka till äldre releaser",
"filterReleaseTitlesByRegEx": "Filtrera utgivningstitlar efter reguljärt uttryck",
"invalidRegEx": "Ogiltigt reguljärt uttryck",
"noDescription": "Ingen beskrivning",
"cancel": "Avbryt",
"continue": "Fortsätt",
"requiredInBrackets": "(Kräver)",
"dropdownNoOptsError": "FEL: DROPDOWN MÅSTE HA MINST ETT OPT",
"colour": "Färg",
"standard": "Standard",
"custom": "Anpassad",
"useMaterialYou": "Använd material Du",
"githubStarredRepos": "GitHub Stjärnmärkta Förråd",
"uname": "Användarnamn",
"wrongArgNum": "Fel antal argument har angetts",
"xIsTrackOnly": "{} är 'Följ-Endast'",
"source": "Källa",
"app": "App",
"appsFromSourceAreTrackOnly": "Apparna från denna källa är 'Följ-Endast'.",
"youPickedTrackOnly": "Du har markerat 'Följ-Endast'-alternativet",
"trackOnlyAppDescription": "Appen kommer följas för uppdateringar men Obtainium kommer inte ladda ner eller installera den.",
"cancelled": "Avbruten",
"appAlreadyAdded": "App redan tillagd",
"alreadyUpToDateQuestion": "App redan uppdaterad?",
"addApp": "Lägg till App",
"appSourceURL": "URL till Appkälla",
"error": "Fel",
"add": "Lägg till",
"searchSomeSourcesLabel": "Sök (Bara några källor)",
"search": "Sök",
"additionalOptsFor": "Ytterligare Alternativ för {}",
"supportedSources": "Stödda Källor",
"trackOnlyInBrackets": "(Följ-Endast)",
"searchableInBrackets": "(Sökbar)",
"appsString": "Appar",
"noApps": "Inga Appar",
"noAppsForFilter": "Inga Appar för Filter",
"byX": "Av {}",
"percentProgress": "Framsteg: {}%",
"pleaseWait": "Vänta",
"updateAvailable": "Uppdatering Tillgänglig",
"notInstalled": "Inte Installerad",
"pseudoVersion": "pseudoversion",
"selectAll": "Välj Alla",
"deselectX": "Avmarkera {}",
"xWillBeRemovedButRemainInstalled": "{} kommer tas bort från Obtainium men kommer vara fortsatt installerad på enheten.",
"removeSelectedAppsQuestion": "Ta bort markerade Appar?",
"removeSelectedApps": "Ta bort markerade Appar",
"updateX": "Uppdatera {}",
"installX": "Installera {}",
"markXTrackOnlyAsUpdated": "Märk {}\n(Följ-Endast)\nsom Uppdaterad",
"changeX": "Byt {}",
"installUpdateApps": "Installera/Uppdatera Appar",
"installUpdateSelectedApps": "Installera/Uppdatera Markerade Appar",
"markXSelectedAppsAsUpdated": "Märk {} markerade Appar som Uppdaterade?",
"no": "Nej",
"yes": "Ja",
"markSelectedAppsUpdated": "Märk Valda Appar som Uppdaterade",
"pinToTop": "Nåla fast högst upp",
"unpinFromTop": "Avnåla",
"resetInstallStatusForSelectedAppsQuestion": "Återställ Installationsstatus för valda Appar?",
"installStatusOfXWillBeResetExplanation": "Installationsstatusen för de markerade apparna kommer återställas.\n\n Detta kan hjälpa när appversionen visad i Obtanium är fel på grund av misslyckade uppdateringar eller andra orsaker.",
"customLinkMessage": "Dessa länkar fungerar på enheter med Obtainium installerat",
"shareAppConfigLinks": "Dela appkonfiguration som HTML-länk",
"shareSelectedAppURLs": "Dela Valda Appars URL:er",
"resetInstallStatus": "Återställ Installationstatus",
"more": "Mer",
"removeOutdatedFilter": "Ta bort Utgånga App-filtret",
"showOutdatedOnly": "Visa Endast Utgånga Appar",
"filter": "Filtrera",
"filterApps": "Filtrera Appar",
"appName": "Appnamn",
"author": "Utvecklare",
"upToDateApps": "Uppdaterade Appar",
"nonInstalledApps": "Icke-Installerade Appar",
"importExport": "Importera/Exportera",
"settings": "Inställningar",
"exportedTo": "Exporterad till {}",
"obtainiumExport": "Obtainiumexport",
"invalidInput": "Ogiltig inmatning",
"importedX": "Importerad {}",
"obtainiumImport": "Obtainium Import",
"importFromURLList": "Importera från URL-lista",
"searchQuery": "Sökförfrågan",
"appURLList": "App URL-lista",
"line": "Linje",
"searchX": "Sök {}",
"noResults": "Inga resultat",
"importX": "Importera {}",
"importedAppsIdDisclaimer": "Importerade Appar kan felaktigt visas som \"Inte Installerad\".\nFör att fixa detta återinstallera dem genom Obtainium.\nDetta skall inte påverka appdata.\n\n Påverkar endast URL:en och tredjepartsimportermetoder.",
"importErrors": "Importfel",
"importedXOfYApps": "{} av {} Appar importerade.",
"followingURLsHadErrors": "Följande URL:er hade fel:",
"selectURL": "Välj URL",
"selectURLs": "Välj URL:er",
"pick": "Välj",
"theme": "Tema",
"dark": "Mörkt",
"light": "Ljust",
"followSystem": "Följ System",
"followSystemThemeExplanation": "Följande systemtema är endast möjligt med hjälp av tredjepartsapplikationer",
"useBlackTheme": "Använd svart tema",
"appSortBy": "Sortera Appar via",
"authorName": "Utvecklare/Namn",
"nameAuthor": "Namn/Utvecklare",
"asAdded": "Som tillagd",
"appSortOrder": "Appsorteringsordning",
"ascending": "Stigande",
"descending": "Fallande",
"bgUpdateCheckInterval": "Bakgrundsuppdateringskollfrekvens",
"neverManualOnly": "Aldrig - Endast manuell",
"appearance": "Utseende",
"showWebInAppView": "Visa källans hemsida i appvyn",
"pinUpdates": "Fäst uppdateringar högst upp i appvyn",
"updates": "Uppdateringar",
"sourceSpecific": "Källspecifik",
"appSource": "Appkälla",
"noLogs": "Inga Loggar",
"appLogs": "Apploggar",
"close": "Stäng",
"share": "Dela",
"appNotFound": "App ej funnen",
"obtainiumExportHyphenatedLowercase": "obtainium-export",
"pickAnAPK": "Välj en APK",
"appHasMoreThanOnePackage": "{} har fler än ett paket:",
"deviceSupportsXArch": "Din enhet stödjer {} CPU-arkiktektur.",
"deviceSupportsFollowingArchs": "YDin enhet stödjer följande CPU-arkitekturer:",
"warning": "Varning",
"sourceIsXButPackageFromYPrompt": "Appens källa är '{}' men releasepaketet kommer från '{}'. Vill du fortsätta?",
"updatesAvailable": "Uppdateringar Tillgängliga",
"updatesAvailableNotifDescription": "Aviserar användaren att det finns uppdateringar tillgängaliga för en eller fler Appar som följs av Obtainium",
"noNewUpdates": "Inga nya uppdateringar.",
"xHasAnUpdate": "{} har en uppdatering.",
"appsUpdated": "Appar Uppdaterade",
"appsNotUpdated": "Misslyckades med att uppdatera applikationer",
"appsUpdatedNotifDescription": "Meddelar användaren att uppdateringar av en eller flera appar har tillämpats i bakgrunden",
"xWasUpdatedToY": "{} uppdaterades till {}.",
"xWasNotUpdatedToY": "Det gick inte att uppdatera {} till {}.",
"errorCheckingUpdates": "Fel vid uppdateringskoll",
"errorCheckingUpdatesNotifDescription": "En aviserings som visar när bakgrundsuppdateringarkollar misslyckas",
"appsRemoved": "Appar borttagna",
"appsRemovedNotifDescription": "Aviserar användaren när en eller fler Appar togs bort på grund av fel när de laddades",
"xWasRemovedDueToErrorY": "{} togs bort på grund av detta felet: {}",
"completeAppInstallation": "Gör klar appinstallation",
"obtainiumMustBeOpenToInstallApps": "Obtainium måste vara öppet för att installera Appar",
"completeAppInstallationNotifDescription": "Frågar användaren att återvända till Obtaiunium när appinstallation är klar",
"checkingForUpdates": "Kollar efter Uppdateringar",
"checkingForUpdatesNotifDescription": "Övergående meddelande som visas när du söker efter uppdateringar",
"pleaseAllowInstallPerm": "Tillåt Obtanium att installera Appar",
"trackOnly": "Följ-Endast",
"errorWithHttpStatusCode": "Fel {}",
"versionCorrectionDisabled": "Versionskorrigering inaktiverat (plugin verkar inte fungera)",
"unknown": "Okänd",
"none": "Ingen",
"never": "Aldrig",
"latestVersionX": "Senaste Version: {}",
"installedVersionX": "Installerad Version: {}",
"lastUpdateCheckX": "Senaste uppdateringskoll: {}",
"remove": "Ta bort",
"yesMarkUpdated": "Ja, Märk som Uppdaterad",
"fdroid": "F-Droid Officiell",
"appIdOrName": "App-ID eller Namn",
"appId": "App-ID",
"appWithIdOrNameNotFound": "Ingen App funnen med det namnet eller ID",
"reposHaveMultipleApps": "Förråd kan innehålla flera ApparR",
"fdroidThirdPartyRepo": "F-Droid Tredjeparts Förråd",
"install": "Installera",
"markInstalled": "Märk Installerad",
"update": "Uppdatera",
"markUpdated": "Märk Uppdaterad",
"additionalOptions": "Ytterligare Alternativ",
"disableVersionDetection": "Inaktivera versionsdetektering",
"noVersionDetectionExplanation": "Det här alternativet bör endast användas för appar där versionsidentifiering inte fungerar korrekt.",
"downloadingX": "Laddar ner {}",
"downloadX": "Ladda ner {}",
"downloadedX": "Nedladdad {}",
"releaseAsset": "Frigör tillgång",
"downloadNotifDescription": "Meddelar användaren om framstegen med att ladda ner en app",
"noAPKFound": "Ingen APK funnen",
"noVersionDetection": "Ingen versiondetektering",
"categorize": "Kategorisera",
"categories": "Kategorier",
"category": "Kategori",
"noCategory": "Ingen Kategori",
"noCategories": "Inga Kategorier",
"deleteCategoriesQuestion": "Ta Bort Kategorier?",
"categoryDeleteWarning": "Alla Appar i de borttagna kategorierna kommer att märkas som okategoriserade.",
"addCategory": "Lägg till Kategori",
"label": "Märka",
"language": "Språk",
"copiedToClipboard": "Kopierat till Urklipp",
"storagePermissionDenied": "Lagringsbehörighet nekad",
"selectedCategorizeWarning": "Detta kommer att ersätta alla befintliga kategoriinställningar för de valda apparna.",
"filterAPKsByRegEx": "Filtrera APK-filer efter reguljärt uttryck",
"removeFromObtainium": "Ta bort från Obtainium",
"uninstallFromDevice": "Avinstallera från Enheten",
"onlyWorksWithNonVersionDetectApps": "Fungerar bara för Appar med versionsdetektering inaktiverat..",
"releaseDateAsVersion": "Använd releasedatum som version",
"releaseTitleAsVersion": "Använd release-titel som versionssträng",
"releaseDateAsVersionExplanation": "Det här alternativet bör endast användas för appar där versionsidentifiering inte fungerar korrekt, men ett releasedatum är tillgängligt.",
"changes": "Ändringar",
"releaseDate": "Releasedatum",
"importFromURLsInFile": "Importera från URL:er i fil (som OPML)",
"versionDetectionExplanation": "Sammanställ versionssträng med version upptäckt från OS",
"versionDetection": "Versionsdetektering",
"standardVersionDetection": "Standardversionsdetektering",
"groupByCategory": "Gruppera via Kategori",
"autoApkFilterByArch": "Försök att filtrera APK-filer efter CPU-arkitektur om möjligt",
"overrideSource": "Överskrid Källa",
"dontShowAgain": "Visa inte detta igen",
"dontShowTrackOnlyWarnings": "Visa inte 'Följ-Endast' varningar",
"dontShowAPKOriginWarnings": "Visa inte APK-ursprung varningar",
"moveNonInstalledAppsToBottom": "Flytta icke-installerade appar till botten av appvyn",
"gitlabPATLabel": "Personligt åtkomsttoken för GitLab",
"about": "Om",
"requiresCredentialsInSettings": "{}: This needs additional credentials (in Settings)",
"checkOnStart": "Kolla efter uppdateringar vid start",
"tryInferAppIdFromCode": "Försök härleda app-id från källkoden",
"removeOnExternalUninstall": "Ta bort externt avinstallerade appar automatiskt",
"pickHighestVersionCode": "Välj automatiskt högsta versionskod APK",
"checkUpdateOnDetailPage": "Sök efter uppdateringar om att öppna en app-detaljsida",
"disablePageTransitions": "Inaktivera sidövergångsanimationer",
"reversePageTransitions": "Animeringar för omvänd sidövergång",
"minStarCount": "Minsta antal stjärnmarkeringar",
"addInfoBelow": "Lägg till denna information nedanför.",
"addInfoInSettings": "Lägg till denna information i Inställningar.",
"githubSourceNote": "GitHub-hastighetsbegränsning kan undvikas med en API-nyckel.",
"sortByLastLinkSegment": "Sortera endast efter det sista segmentet av länken",
"filterReleaseNotesByRegEx": "Filtrera versionskommentarer efter reguljärt uttryck",
"customLinkFilterRegex": "Anpassad APK-länkfiltrera efter reguljärt uttryck (standard '.apk$')",
"appsPossiblyUpdated": "Appuppdateringar försökte",
"appsPossiblyUpdatedNotifDescription": "Meddelar användaren om att uppdateringar av en eller flera appar potentiellt har tillämpats i bakgrunden",
"xWasPossiblyUpdatedToY": "{} kan ha uppdaterats till {}.",
"enableBackgroundUpdates": "Aktivera Bakgrundsuppdateringar",
"backgroundUpdateReqsExplanation": "Bakgrundsuppdateringar är inte möjligt för alla appar.",
"backgroundUpdateLimitsExplanation": "Framgången för en bakgrundsinstallation kan bara avgöras när Obtainium öppnas.",
"verifyLatestTag": "Verifiera 'senaste'-taggen",
"intermediateLinkRegex": "Filtrera för en \"mellanliggande\" länk att besöka",
"filterByLinkText": "Filtrera länkar efter länktext",
"intermediateLinkNotFound": "Mellanlänk hittades inte",
"intermediateLink": "Mellanlänk",
"exemptFromBackgroundUpdates": "Undta från bakgrundsuppdateringar (om aktiverad)",
"bgUpdatesOnWiFiOnly": "Inaktivera Bakgrundsuppdateringar utan Wi-Fi",
"bgUpdatesWhileChargingOnly": "Inaktivera bakgrundsuppdateringar när du inte laddar",
"autoSelectHighestVersionCode": "Välj automatiskt högsta versionskod APK",
"versionExtractionRegEx": "Version Extraction RegEx",
"trimVersionString": "Trimma versionssträng med RegEx",
"matchGroupToUseForX": "Matchningsgrupp att använda för \"{}\"",
"matchGroupToUse": "Match Group to Use",
"highlightTouchTargets": "Markera mindre uppenbara beröringsobjekt",
"pickExportDir": "Välj Exportsökväg",
"autoExportOnChanges": "Automatisk export vid ändringar",
"includeSettings": "Inkludera inställningar",
"filterVersionsByRegEx": "Filtrera versioner efter reguljärt uttryck",
"trySelectingSuggestedVersionCode": "Försök att välja föreslagen versionCode APK",
"dontSortReleasesList": "Behåll släpporder från API",
"reverseSort": "Omvänd sortering",
"takeFirstLink": "Ta första länken",
"skipSort": "Hoppa över sortering",
"debugMenu": "Felsökningsmeny",
"bgTaskStarted": "Bakgrundsuppgift startat - kontrollera loggar.",
"runBgCheckNow": "Kör Bakgrundsuppdateringskoll Nu",
"versionExtractWholePage": "Tillämpa Regex för versionssträngextraktion på hela sidan",
"installing": "Installerar",
"skipUpdateNotifications": "Hoppa över uppdateringsmeddelanden",
"updatesAvailableNotifChannel": "Uppdateringar tillgängliga",
"appsUpdatedNotifChannel": "Appar uppdaterade",
"appsPossiblyUpdatedNotifChannel": "Appuppdateringar försökte",
"errorCheckingUpdatesNotifChannel": "Fel vid sökning efter uppdateringar",
"appsRemovedNotifChannel": "Appar borttagna",
"downloadingXNotifChannel": "Laddar ner {}",
"completeAppInstallationNotifChannel": "Fullständig appinstallation",
"checkingForUpdatesNotifChannel": "Kollar efter uppdateringar",
"onlyCheckInstalledOrTrackOnlyApps": "Kontrollera bara installerade appar och endast spårbara appar för uppdateringar",
"supportFixedAPKURL": "Stöd fasta APK-webbadresser",
"selectX": "Välj {}",
"parallelDownloads": "Tillåt parallella nedladdningar",
"useShizuku": "Använd Shizuku eller Sui för att installera",
"shizukuBinderNotFound": "Shizuku is not running",
"shizukuOld": "Gammal Shizuku-version (<11) - uppdatera den",
"shizukuOldAndroidWithADB": "Shizuku körs på Android < 8.1 med ADB - uppdatera Android eller använd Sui istället",
"shizukuPretendToBeGooglePlay": "Ange Google Play som installationskälla (om Shizuku används)",
"useSystemFont": "Använd systemteckensnittet",
"useVersionCodeAsOSVersion": "Använd appversionskoden som OS-upptäckt version",
"requestHeader": "Rubrik för begäran",
"useLatestAssetDateAsReleaseDate": "Använd senaste tillgångsuppladdning som releasedatum",
"defaultPseudoVersioningMethod": "Standard pseudoversionsmetod",
"partialAPKHash": "Delvis APK-hash",
"APKLinkHash": "APK-länk Hash",
"directAPKLink": "Direkt APK-länk",
"pseudoVersionInUse": "En pseudoversion används",
"installed": "Installerad",
"latest": "Senast",
"invertRegEx": "Invertera reguljärt uttryck",
"note": "Anmärkning",
"selfHostedNote": "Rullgardinsmenyn \"{}\" kan användas för att nå självhostade/anpassade instanser av valfri källa.",
"badDownload": "APK kunde inte analyseras (inkompatibel eller partiell nedladdning)",
"beforeNewInstallsShareToAppVerifier": "Dela nya appar med AppVerifier (om tillgängligt)",
"appVerifierInstructionToast": "Dela till AppVerifier och återvänd sedan hit när du är klar.",
"wiki": "Hjälp/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourcade appkonfigurationer (använd på egen risk)",
"crowdsourcedConfigsShort": "Appkonfigurationer med hjälp av crowdsourcing",
"allowInsecure": "Tillåt osäkra HTTP-förfrågningar",
"stayOneVersionBehind": "Håll dig en version bakom den senaste",
"refreshBeforeDownload": "Uppdatera appdetaljerna före nedladdning",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "Ta Bort App?",
"other": "Ta Bort Appar?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "För många förfrågningar (begränsat pris) - försök igen om {} minut",
"other": "För många förfrågningar (begränsat pris) - försök igen om {} minuter"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "BG-uppdateringskontroll påträffade en {}, kommer att schemalägga ett nytt försök om {} minut",
"other": "BG-uppdateringskontroll påträffade en {}, kommer att schemalägga ett nytt försök om {} minuter"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "BG-uppdateringskontroll hittades {} uppdatering - kommer att meddela användaren om det behövs",
"other": "BG-uppdateringskontroll hittades {} uppdateringar - kommer att meddela användaren om det behövs"
},
"apps": {
"one": "{} App",
"other": "{} Appar"
},
"url": {
"one": "{} URL",
"other": "{} URL:er"
},
"minute": {
"one": "{} Minut",
"other": "{} Minuter"
},
"hour": {
"one": "{} Timme",
"other": "{} Timmar"
},
"day": {
"one": "{} Dag",
"other": "{} Dagar"
},
"clearedNLogsBeforeXAfterY": {
"one": "Rensade {n} logg (före = {before}, efter = {after})",
"other": "Rensade {n} loggar (före = {before}, efter = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} och 1 app till har tillgängliga uppdateringar.",
"other": "{} och {} appar till har tillgängliga uppdateringar."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} och 1 till app uppdaterades.",
"other": "{} och {} appar till uppdaterades."
},
"xAndNMoreUpdatesFailed": {
"one": "Misslyckades med att uppdatera {} och ytterligare 1 app.",
"other": "Det gick inte att uppdatera {} och {} fler appar."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} och 1 till app kan ha uppdaterats.",
"other": "{} och {} appar till kan ha uppdaterats."
},
"apk": {
"one": "{} APK",
"other": "{} APK:er"
}
}

382
assets/translations/tr.json Normal file
View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "Geçerli bir {} Uygulama URL'si değil",
"noReleaseFound": "Uygun bir sürüm bulunamadı",
"noVersionFound": "Sürüm bulunamadı",
"urlMatchesNoSource": "URL, bilinen bir kaynağa uymuyor",
"cantInstallOlderVersion": "Eski bir sürüm yüklenemez",
"appIdMismatch": "İndirilen paket kimliği mevcut Uygulama kimliği ile eşleşmiyor",
"functionNotImplemented": "Bu sınıf bu işlevi uygulamamıştır",
"placeholder": "Yer Tutucu",
"someErrors": "Bazı Hatalar Oluştu",
"unexpectedError": "Beklenmeyen Hata",
"ok": "Tamam",
"and": "ve",
"githubPATLabel": "GitHub Kişisel Erişim Anahtarı (Sınırlamayı Artırır)",
"includePrereleases": "Ön sürümleri dahil et",
"fallbackToOlderReleases": "Daha eski sürümleri alternatif olarak tut",
"filterReleaseTitlesByRegEx": "Düzenli İfadelerle Sürüm Başlıklarını Filtrele",
"invalidRegEx": "Geçersiz düzenli ifade",
"noDescription": "Açıklama yok",
"cancel": "İptal",
"continue": "Devam Et",
"requiredInBrackets": "(Gerekli)",
"dropdownNoOptsError": "HATA: AÇILIR MENÜDE EN AZ BİR SEÇENEK OLMALI",
"colour": "Renk",
"standard": "Standart",
"custom": "Özel",
"useMaterialYou": "MaterialYou Kullanın",
"githubStarredRepos": "GitHub Yıldızlı Depolar",
"uname": "Kullanıcı Adı",
"wrongArgNum": "Hatalı sayıda argüman sağlandı",
"xIsTrackOnly": "{} yalnızca Takip Ediliyor",
"source": "Kaynak",
"app": "Uygulama",
"appsFromSourceAreTrackOnly": "Bu kaynaktan gelen uygulamalar 'Yalnızca Takip Edilen'dir.",
"youPickedTrackOnly": "'Yalnızca Takip Edilen' seçeneğini seçtiniz.",
"trackOnlyAppDescription": "Uygulama güncellemeleri için takip edilecek, ancak Obtainium onu indiremeyecek veya kuramayacaktır.",
"cancelled": "İptal Edildi",
"appAlreadyAdded": "Uygulama zaten eklenmiş",
"alreadyUpToDateQuestion": "Uygulama Zaten Güncel mi?",
"addApp": "Uygulama Ekle",
"appSourceURL": "Uygulama Kaynak URL'si",
"error": "Hata",
"add": "Ekle",
"searchSomeSourcesLabel": "Ara (Yalnızca Bazı Kaynaklar)",
"search": "Ara",
"additionalOptsFor": "{} için Ek Seçenekler",
"supportedSources": "Desteklenen Kaynaklar",
"trackOnlyInBrackets": "(Yalnızca Takip)",
"searchableInBrackets": "(Aranabilir)",
"appsString": "Uygulamalar",
"noApps": "Uygulama Yok",
"noAppsForFilter": "Filtre İçin Uygulama Yok",
"byX": "{} Tarafından",
"percentProgress": "İlerleme: {}%",
"pleaseWait": "Lütfen Bekleyin",
"updateAvailable": "Güncelleme Var",
"notInstalled": "Yüklenmedi",
"pseudoVersion": "sözde versiyon",
"selectAll": "Hepsini Seç",
"deselectX": "{}'yi Seçimden Kaldır",
"xWillBeRemovedButRemainInstalled": "{} Obtainium'dan kaldırılacak ancak cihazınızda yüklü kalacaktır.",
"removeSelectedAppsQuestion": "Seçilen Uygulamaları Kaldırmak İstiyor musunuz?",
"removeSelectedApps": "Seçilen Uygulamaları Kaldır",
"updateX": "{}'yi Güncelle",
"installX": "{}'yi Yükle",
"markXTrackOnlyAsUpdated": "{}(Takip Edilen) olarak Güncellendi olarak İşaretle",
"changeX": "{}'yi Değiştir",
"installUpdateApps": "Uygulamaları Yükle/Güncelle",
"installUpdateSelectedApps": "Seçilen Uygulamaları Yükle/Güncelle",
"markXSelectedAppsAsUpdated": "Seçilen Uygulamaları {} olarak Güncellendi olarak İşaretle?",
"no": "Hayır",
"yes": "Evet",
"markSelectedAppsUpdated": "Seçilen Uygulamaları Güncellendi olarak İşaretle",
"pinToTop": "Üstte Tut",
"unpinFromTop": "Üstten Kaldır",
"resetInstallStatusForSelectedAppsQuestion": "Seçilen Uygulamaların Yükleme Durumunu Sıfırlamak İstiyor musunuz?",
"installStatusOfXWillBeResetExplanation": "Seçilen Uygulamaların yükleme durumu sıfırlanacak.\n\nBu, Obtainium'da gösterilen uygulama sürümünün başarısız güncellemeler veya diğer sorunlar nedeniyle yanlış olması durumunda yardımcı olabilir.",
"customLinkMessage": "Bu bağlantılar Obtainium'un kurulu olduğu cihazlarda çalışır",
"shareAppConfigLinks": "Uygulama yapılandırmasını HTML bağlantısı olarak paylaş",
"shareSelectedAppURLs": "Seçilen Uygulama URL'larını Paylaş",
"resetInstallStatus": "Yükleme Durumunu Sıfırla",
"more": "Daha Fazla",
"removeOutdatedFilter": "Güncel Olmayan Uygulama Filtresini Kaldır",
"showOutdatedOnly": "Yalnızca Güncel Olmayan Uygulamaları Göster",
"filter": "Filtre",
"filterApps": "Uygulamaları Filtrele",
"appName": "Uygulama Adı",
"author": "Yazar",
"upToDateApps": "Güncel Uygulamalar",
"nonInstalledApps": "Yüklenmemiş Uygulamalar",
"importExport": "İçe/Dışa Aktar",
"settings": "Ayarlar",
"exportedTo": "{}'e Dışa Aktarıldı",
"obtainiumExport": "Obtainium Dışa Aktar",
"invalidInput": "Geçersiz Giriş",
"importedX": "{} İçe Aktarıldı",
"obtainiumImport": "Obtainium İçe Aktar",
"importFromURLList": "URL Listesinden İçe Aktar (Örneğin OPML)",
"searchQuery": "Arama Sorgusu",
"appURLList": "Uygulama URL Listesi",
"line": "Satır",
"searchX": "{}'yi Ara",
"noResults": "Sonuç Bulunamadı",
"importX": "{} İçe Aktar",
"importedAppsIdDisclaimer": "İçe Aktarılan Uygulamalar yanlışlıkla \"Yüklenmedi\" olarak gösterilebilir.\nBunu düzeltmek için bunları Obtainium üzerinden yeniden yükleyin.\nBu, yalnızca URL ve üçüncü taraf içe aktarma yöntemlerini etkiler.\n\nYalnızca URL ve üçüncü taraf içe aktarma yöntemlerini etkiler.",
"importErrors": "İçe Aktarma Hataları",
"importedXOfYApps": "{}'den {} Uygulama İçe Aktarıldı.",
"followingURLsHadErrors": "Aşağıdaki URL'lerde hatalar oluştu:",
"selectURL": "URL Seç",
"selectURLs": "URL'leri Seç",
"pick": "Seç",
"theme": "Tema",
"dark": "Koyu",
"light": "Aydınlık",
"followSystem": "Sistemi Takip Et",
"followSystemThemeExplanation": "Sistem temasını takip etmek yalnızca üçüncü taraf uygulamaları kullanarak mümkündür",
"useBlackTheme": "Saf siyah koyu temasını kullan",
"appSortBy": "Uygulama Sıralama Ölçütü",
"authorName": "Yazar/Ad",
"nameAuthor": "Ad/Yazar",
"asAdded": "Eklendiği Gibi",
"appSortOrder": "Uygulama Sıralama Sırası",
"ascending": "Artan",
"descending": "Azalan",
"bgUpdateCheckInterval": "Arka Planda Güncelleme Kontrol Aralığı",
"neverManualOnly": "Asla - Yalnızca El ile",
"appearance": "Görünüm",
"showWebInAppView": "Kaynağı Uygulama Görünümünde Göster",
"pinUpdates": "Güncellemeleri Uygulamalar Görünümünün Üstüne Sabitle",
"updates": "Güncellemeler",
"sourceSpecific": "Kaynak Özel",
"appSource": "Uygulama Kaynağı",
"noLogs": "Günlük Yok",
"appLogs": "Uygulama Günlükleri",
"close": "Kapat",
"share": "Paylaş",
"appNotFound": "Uygulama Bulunamadı",
"obtainiumExportHyphenatedLowercase": "obtainium-ihracat",
"pickAnAPK": "APK Seç",
"appHasMoreThanOnePackage": "{}'nin birden fazla paketi var:",
"deviceSupportsXArch": "Cihazınız {} CPU mimarisini destekliyor.",
"deviceSupportsFollowingArchs": "Cihazınız aşağıdaki CPU mimarilerini destekliyor:",
"warning": "Uyarı",
"sourceIsXButPackageFromYPrompt": "Uygulama kaynağı '{}', ancak dağıtım paketi '{}'. Devam etmek istiyor musunuz?",
"updatesAvailable": "Güncellemeler Var",
"updatesAvailableNotifDescription": "Kullanıcıya Obtainium tarafından takip edilen bir veya daha fazla uygulama için güncelleme bulunduğuna dair bilgi verir",
"noNewUpdates": "Yeni güncelleme yok.",
"xHasAnUpdate": "{} güncelleme alıyor.",
"appsUpdated": "Uygulamalar Güncellendi",
"appsNotUpdated": "Uygulamalar güncellenemedi",
"appsUpdatedNotifDescription": "Kullanıcıya bir veya daha fazla uygulamanın arka planda güncellendiğine dair bilgi verir",
"xWasUpdatedToY": "{} şu sürüme güncellendi: {}.",
"xWasNotUpdatedToY": "{} öğesi {} olarak güncellenemedi.",
"errorCheckingUpdates": "Güncellemeler Kontrol Edilirken Hata Oluştu",
"errorCheckingUpdatesNotifDescription": "Arka planda güncelleme kontrolü sırasında hata oluştuğunda görünen bir bildirim",
"appsRemoved": "Uygulamalar Kaldırıldı",
"appsRemovedNotifDescription": "Bir veya daha fazla uygulamanın yüklenirken hata nedeniyle kaldırıldığını bildiren bir bildirim",
"xWasRemovedDueToErrorY": "{} şu hatadan dolayı kaldırıldı: {}",
"completeAppInstallation": "Uygulama Yüklemeyi Tamamla",
"obtainiumMustBeOpenToInstallApps": "Uygulamaları yüklemek için Obtainium'un açık olması gerekiyor",
"completeAppInstallationNotifDescription": "Kullanıcıdan Obtainium'a geri dönüp bir uygulama yüklemeyi tamamlamasını isteyen bir bildirim",
"checkingForUpdates": "Güncellemeler Kontrol Ediliyor",
"checkingForUpdatesNotifDescription": "Güncellemeler kontrol edildiğinde görünen geçici bir bildirim",
"pleaseAllowInstallPerm": "Lütfen Obtainium'un uygulama yüklemesine izin verin",
"trackOnly": "Sadece Takip Et",
"errorWithHttpStatusCode": "Hata {}",
"versionCorrectionDisabled": "Sürüm düzeltme devre dışı bırakıldı (eklenti çalışmıyor gibi görünüyor)",
"unknown": "Bilinmiyor",
"none": "Hiçbiri",
"never": "Asla",
"latestVersionX": "En Son Sürüm: {}",
"installedVersionX": "Yüklenen Sürüm: {}",
"lastUpdateCheckX": "Son Güncelleme Kontrolü: {}",
"remove": "Kaldır",
"yesMarkUpdated": "Evet, Güncellendi olarak İşaretle",
"fdroid": "Resmi F-Droid",
"appIdOrName": "Uygulama Kimliği veya Adı",
"appId": "Uygulama Kimliği",
"appWithIdOrNameNotFound": "Bu kimlik veya ada sahip bir uygulama bulunamadı",
"reposHaveMultipleApps": "Depolar birden fazla uygulama içerebilir",
"fdroidThirdPartyRepo": "F-Droid Üçüncü Parti Depo",
"install": "Yükle",
"markInstalled": "Yüklendi olarak İşaretle",
"update": "Güncelle",
"markUpdated": "Güncellendi olarak İşaretle",
"additionalOptions": "Ek Seçenekler",
"disableVersionDetection": "Sürüm Algılama Devre Dışı",
"noVersionDetectionExplanation": "Bu seçenek, sürüm algılamanın doğru çalışmadığı uygulamalar için kullanılmalıdır.",
"downloadingX": "{} İndiriliyor",
"downloadX": "İndir {}",
"downloadedX": "İndirildi {}",
"releaseAsset": "Varlık Serbest Bırakma",
"downloadNotifDescription": "Bir uygulamanın indirme sürecinde ilerlemeyi bildiren bir bildirim",
"noAPKFound": "APK bulunamadı",
"noVersionDetection": "Sürüm Algılanamıyor",
"categorize": "Kategorize Et",
"categories": "Kategoriler",
"category": "Kategori",
"noCategory": "Kategori Yok",
"noCategories": "Kategoriler Yok",
"deleteCategoriesQuestion": "Kategorileri Silmek İstiyor musunuz?",
"categoryDeleteWarning": "Silinen kategorilerdeki tüm uygulamalar kategorisiz olarak ayarlanacaktır.",
"addCategory": "Kategori Ekle",
"label": "Etiket",
"language": "Dil",
"copiedToClipboard": "Panoya Kopyalandı",
"storagePermissionDenied": "Depolama izni reddedildi",
"selectedCategorizeWarning": "Bu, seçilen uygulamalar için mevcut kategori ayarlarını değiştirecektir.",
"filterAPKsByRegEx": "APK'leri Düzenli İfade ile Filtrele",
"removeFromObtainium": "Obtainium'dan Kaldır",
"uninstallFromDevice": "Cihazdan Kaldır",
"onlyWorksWithNonVersionDetectApps": "Yalnızca Sürüm Algılaması Devre Dışı Uygulamalar İçin Çalışır.",
"releaseDateAsVersion": "Sürüm Olarak Yayın Tarihi Kullan",
"releaseTitleAsVersion": "Sürüm dizesi olarak sürüm başlığını kullan",
"releaseDateAsVersionExplanation": "Bu seçenek, sürüm algılamanın doğru çalışmadığı ancak bir sürüm tarihinin mevcut olduğu uygulamalar için kullanılmalıdır.",
"changes": "Değişiklikler",
"releaseDate": "Yayın Tarihi",
"importFromURLsInFile": "Dosyadaki URL'lerden İçe Aktar",
"versionDetectionExplanation": "Sürüm dizesini işletim sistemi tarafından algılanan sürümle uzlaştır",
"versionDetection": "Sürüm Tespiti",
"standardVersionDetection": "Standart sürüm tespiti",
"groupByCategory": "Kategoriye Göre Grupla",
"autoApkFilterByArch": "Mümkünse APK'leri CPU mimarisi ile filtreleme girişimi",
"overrideSource": "Öncelenecek Kaynak",
"dontShowAgain": "Bunu tekrar gösterme",
"dontShowTrackOnlyWarnings": "'Yalnızca Takip Edilen' uyarılarını gösterme",
"dontShowAPKOriginWarnings": "APK kaynağı uyarılarını gösterme",
"moveNonInstalledAppsToBottom": "Yüklenmemiş Uygulamaları Uygulamalar Görünümünün Altına Taşı",
"gitlabPATLabel": "GitLab Kişisel Erişim Belirteci",
"about": "Hakkında",
"requiresCredentialsInSettings": "{}: Bu, ek kimlik bilgilerine ihtiyaç duyar (Ayarlar'da)",
"checkOnStart": "Başlangıçta güncellemeleri kontrol et",
"tryInferAppIdFromCode": "Uygulama kimliğini kaynak kodundan çıkarma girişimi",
"removeOnExternalUninstall": "Harici kaldırmada otomatik olarak kaldırılan uygulamalar",
"pickHighestVersionCode": "Otomatik olarak en yüksek sürüm kodlu APK'yi seç",
"checkUpdateOnDetailPage": "Uygulama detay sayfasını açarken güncellemeleri kontrol et",
"disablePageTransitions": "Sayfa geçiş animasyonlarını devre dışı bırak",
"reversePageTransitions": "Sayfa geçiş animasyonlarını tersine çevir",
"minStarCount": "Minimum Yıldız Sayısı",
"addInfoBelow": "Bu bilgiyi aşağıya ekle.",
"addInfoInSettings": "Bu bilgiyi Ayarlar'da ekleyin.",
"githubSourceNote": "GitHub hız sınırlaması bir API anahtarı kullanılarak atlanabilir.",
"sortByLastLinkSegment": "Bağlantının yalnızca son bölümüne göre sırala",
"filterReleaseNotesByRegEx": "Sürüm Notlarını Düzenli İfade ile Filtrele",
"customLinkFilterRegex": "Özel APK Bağlantı Filtresi Düzenli İfade ile (Varsayılan '.apk$')",
"appsPossiblyUpdated": "Uygulama Güncellemeleri Denendi",
"appsPossiblyUpdatedNotifDescription": "Kullanıcıya bir veya daha fazla uygulamanın arka planda potansiyel olarak güncellendiğini bildiren bildirim",
"xWasPossiblyUpdatedToY": "{} muhtemelen {} sürümüne güncellendi.",
"enableBackgroundUpdates": "Arka plan güncellemelerini etkinleştir",
"backgroundUpdateReqsExplanation": "Arka plan güncellemeleri tüm uygulamalar için mümkün olmayabilir.",
"backgroundUpdateLimitsExplanation": "Arka plan kurulumunun başarısı, Obtainium'un açıldığında ancak belirlenebilir.",
"verifyLatestTag": "'latest' etiketini doğrula",
"intermediateLinkRegex": "Ziyaret Edilecek 'Orta Düzey' Bağlantıyı Filtrele",
"filterByLinkText": "Bağlantıları bağlantı metnine göre filtrele",
"intermediateLinkNotFound": "Ara bağlantı bulunamadı",
"intermediateLink": "Ara bağlantı",
"exemptFromBackgroundUpdates": "Arka plan güncellemelerinden muaf tut (etkinse)",
"bgUpdatesOnWiFiOnly": "WiFi olmadığında arka plan güncellemelerini devre dışı bırak",
"bgUpdatesWhileChargingOnly": "Şarj olmadığında arka plan güncellemelerini devre dışı bırakma",
"autoSelectHighestVersionCode": "Otomatik olarak en yüksek sürüm kodunu seç",
"versionExtractionRegEx": "Sürüm Çıkarma Düzenli İfade",
"trimVersionString": "RegEx ile Sürüm Dizesini Kırpma",
"matchGroupToUseForX": "\"{}\" için Kullanılacak Grubu Eşleştirin",
"matchGroupToUse": "Sürüm Çıkarma Regex için Kullanılacak Eşleşme Grubu",
"highlightTouchTargets": "Daha az belirgin dokunma hedeflerini vurgula",
"pickExportDir": "Dışa Aktarılacak Klasörü Seç",
"autoExportOnChanges": "Değişikliklerde otomatik olarak dışa aktar",
"includeSettings": "Ayarları dahil et",
"filterVersionsByRegEx": "Sürümleri Düzenli İfade ile Filtrele",
"trySelectingSuggestedVersionCode": "Önerilen sürüm kodunu seçmeyi dene",
"dontSortReleasesList": "API'den sıralama düzenini koru",
"reverseSort": "Ters sıralama",
"takeFirstLink": "İlk bağlantıyı al",
"skipSort": "Sıralamayı atla",
"debugMenu": "Hata Ayıklama Menüsü",
"bgTaskStarted": "Arka plan görevi başladı - günlükleri kontrol et.",
"runBgCheckNow": "Arka Plan Güncelleme Kontrolünü Şimdi Çalıştır",
"versionExtractWholePage": "Tüm Sayfaya Sürüm Çıkarma Regex'i Uygula",
"installing": "Yükleniyor",
"skipUpdateNotifications": "Güncelleme bildirimlerini atla",
"updatesAvailableNotifChannel": "Güncellemeler Mevcut",
"appsUpdatedNotifChannel": "Güncellenen Uygulamalar",
"appsPossiblyUpdatedNotifChannel": "Uygulama Güncellemeleri Denendi",
"errorCheckingUpdatesNotifChannel": "Güncellemeler Kontrol Edilirken Hata",
"appsRemovedNotifChannel": "Kaldırılan Uygulamalar",
"downloadingXNotifChannel": "{} İndiriliyor",
"completeAppInstallationNotifChannel": "Uygulama Kurulumu Tamamlandı",
"checkingForUpdatesNotifChannel": "Güncellemeler Kontrol Ediliyor",
"onlyCheckInstalledOrTrackOnlyApps": "Yalnızca yüklü ve Yalnızca İzleme Uygulamalarını güncelleme",
"supportFixedAPKURL": "Sabit APK URL'lerini destekleyin",
"selectX": "{} Tanesini Seç",
"parallelDownloads": "Paralel indirmelere izin ver",
"useShizuku": "Yüklemek için Shizuku veya Sui'yi kullanın",
"shizukuBinderNotFound": "Shizuku servisi çalışmıyor",
"shizukuOld": "Eski Shizuku sürümü (<11) - güncelleyin",
"shizukuOldAndroidWithADB": "Shizuku ADB ile Android < 8.1 üzerinde çalışıyor - Android'i güncelleyin veya bunun yerine Sui kullanın",
"shizukuPretendToBeGooglePlay": "Google Play'i yükleme kaynağı olarak ayarlayın (Shizuku kullanılıyorsa)",
"useSystemFont": "Sistem yazı tipini kullan",
"useVersionCodeAsOSVersion": "Uygulama versionCode'unu işletim sistemi tarafından algılanan sürüm olarak kullan",
"requestHeader": "Başlık talep et",
"useLatestAssetDateAsReleaseDate": "Yayın tarihi olarak en son öğe yüklemesini kullan",
"defaultPseudoVersioningMethod": "Varsayılan Sözde Sürüm Oluşturma Yöntemi",
"partialAPKHash": "Kısmi APK Karması",
"APKLinkHash": "APK Bağlantı Karması",
"directAPKLink": "Doğrudan APK Bağlantısı",
"pseudoVersionInUse": "Sözde Versiyon Kullanımda",
"installed": "Kurulmuş",
"latest": "En sonuncu",
"invertRegEx": "Normal ifadeyi ters çevir",
"note": "Not",
"selfHostedNote": "\"{}\" açılır menüsü, herhangi bir kaynağın kendi kendine barındırılan/özel örneklerine ulaşmak için kullanılabilir.",
"badDownload": "APK ayrıştırılamadı (uyumsuz veya kısmi indirme)",
"beforeNewInstallsShareToAppVerifier": "Yeni Uygulamaları AppVerifier ile paylaşın (varsa)",
"appVerifierInstructionToast": "AppVerifier ile paylaşın, hazır olduğunuzda buraya dönün.",
"wiki": "Yardım/Wiki",
"crowdsourcedConfigsLabel": "Kitle Kaynaklı Uygulama Yapılandırmaları (riski size ait olmak üzere kullanın)",
"crowdsourcedConfigsShort": "Kitle Kaynaklı Uygulama Yapılandırmaları",
"allowInsecure": "Güvensiz HTTP isteklerine izin ver",
"stayOneVersionBehind": "En son sürümün bir sürüm gerisinde kalın",
"refreshBeforeDownload": "İndirmeden önce uygulama ayrıntılarını yenileyin",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "Uygulamayı Kaldır?",
"other": "Uygulamaları Kaldır?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "Çok fazla istek (hız sınırlı) - {} dakika sonra tekrar deneyin",
"other": "Çok fazla istek (hız sınırlı) - {} dakika sonra tekrar deneyin"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Arka plan güncelleme kontrolü bir hatayla karşılaştı, {} dakika sonra tekrar kontrol edilecek",
"other": "Arka plan güncelleme kontrolü bir hatayla karşılaştı, {} dakika sonra tekrar kontrol edilecek"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Arka plan güncelleme kontrolü {} güncelleme buldu - gerektiğinde kullanıcıyı bilgilendirecek",
"other": "Arka plan güncelleme kontrolü {} güncelleme buldu - gerektiğinde kullanıcıyı bilgilendirecek"
},
"apps": {
"one": "{} Uygulama",
"other": "{} Uygulamalar"
},
"url": {
"one": "{} URL",
"other": "{} URL"
},
"minute": {
"one": "{} Dakika",
"other": "{} Dakika"
},
"hour": {
"one": "{} Saat",
"other": "{} Saat"
},
"day": {
"one": "{} Gün",
"other": "{} Gün"
},
"clearedNLogsBeforeXAfterY": {
"one": "{n} log temizlendi (önce = {before}, sonra = {after})",
"other": "{n} log temizlendi (önce = {before}, sonra = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} ve 1 diğer uygulama güncellemeye sahip.",
"other": "{} ve {} daha fazla uygulama güncellemeye sahip."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} ve 1 diğer uygulama güncellendi.",
"other": "{} ve {} daha fazla uygulama güncellendi."
},
"xAndNMoreUpdatesFailed": {
"one": "{} ve 1 uygulama daha güncellenemedi.",
"other": "{} ve {} daha fazla uygulama güncellenemedi."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} ve 1 diğer uygulama muhtemelen güncellendi.",
"other": "{} ve {} daha fazla uygulama muhtemelen güncellendi."
},
"apk": {
"one": "{} APK",
"other": "{} APK"
}
}

382
assets/translations/uk.json Normal file
View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "Неправильна URL-адреса для джерела застосунку {}",
"noReleaseFound": "Не вдалося знайти відповідне видання",
"noVersionFound": "Не вдалося визначити версію видання",
"urlMatchesNoSource": "URL не відповідає відомому джерелу",
"cantInstallOlderVersion": "Не можна встановити старішу версію застосунку",
"appIdMismatch": "Ідентифікатор пакета, завантажений, не відповідає ідентифікатору існуючого застосунку",
"functionNotImplemented": "Цей клас не реалізував цю функцію",
"placeholder": "Заповнювач",
"someErrors": "Виникла деяка помилка",
"unexpectedError": "Неочікувана помилка",
"ok": "Добре",
"and": "та",
"githubPATLabel": "Персональний ключ доступу GitHub (збільшує обмеження на швидкість)",
"includePrereleases": "Включити попередні видання",
"fallbackToOlderReleases": "Повернутися до старіших видань",
"filterReleaseTitlesByRegEx": "Фільтрувати заголовки видань за допомогою регулярного виразу",
"invalidRegEx": "Неприпустимий регулярний вираз",
"noDescription": "Немає опису",
"cancel": "Скасувати",
"continue": "Продовжити",
"requiredInBrackets": "(Обов'язково)",
"dropdownNoOptsError": "ПОМИЛКА: В ВИПАДАЮЧОМУ СПИСКУ МАЄ БУТИ ХОЧА Б ОДИН ЕЛЕМЕНТ",
"colour": "Колір",
"standard": "Стандартний",
"custom": "Нестандартний",
"useMaterialYou": "Використовуйте матеріал, який ви",
"githubStarredRepos": "Відзначені репозиторії GitHub",
"uname": "Ім'я користувача",
"wrongArgNum": "Надано неправильну кількість аргументів",
"xIsTrackOnly": "{} - тільки відстежування",
"source": "Джерело",
"app": "застосунок",
"appsFromSourceAreTrackOnly": "Застосунки з цього джерела є лише для відстежування.",
"youPickedTrackOnly": "Ви вибрали опцію лише для відстежування.",
"trackOnlyAppDescription": "Застосунок буде відстежуватися для оновлень, але Obtainium не зможе його завантажити або встановити.",
"cancelled": "Скасовано",
"appAlreadyAdded": "Застосунок вже додано",
"alreadyUpToDateQuestion": "Застосунок вже оновлено?",
"addApp": "Додати",
"appSourceURL": "URL-адреса джерела застосунку",
"error": "Помилка",
"add": "Додати",
"searchSomeSourcesLabel": "Пошук (Лише деякі джерела)",
"search": "Пошук",
"additionalOptsFor": "Додаткові опції для {}",
"supportedSources": "Підтримувані джерела",
"trackOnlyInBrackets": "(Тільки для відстеження)",
"searchableInBrackets": "(Можливий пошук)",
"appsString": "Застосунки",
"noApps": "Застосунків немає",
"noAppsForFilter": "Застосунків для фільтрації немає",
"byX": "Від {}",
"percentProgress": "Прогрес: {}%",
"pleaseWait": "Будь ласка, зачекайте",
"updateAvailable": "Доступно оновлення",
"notInstalled": "Не встановлено",
"pseudoVersion": "псевдо-версія",
"selectAll": "Вибрати все",
"deselectX": "Скасувати вибір {}",
"xWillBeRemovedButRemainInstalled": "{} буде видалено з Obtainium, але залишиться встановленим на пристрої.",
"removeSelectedAppsQuestion": "Видалити вибрані застосунки?",
"removeSelectedApps": "Видалити вибрані застосунки",
"updateX": "Оновити {}",
"installX": "Встановити {}",
"markXTrackOnlyAsUpdated": "Позначити {}\n(Тільки відстежування)\nяк оновлено",
"changeX": "Змінити {}",
"installUpdateApps": "Встановити/Оновити застосунки",
"installUpdateSelectedApps": "Встановити/Оновити вибрані застосунки",
"markXSelectedAppsAsUpdated": "Позначити {} вибрані застосунки як оновлені?",
"no": "Ні",
"yes": "Так",
"markSelectedAppsUpdated": "Позначити вибрані застосунки як оновлені",
"pinToTop": "Закріпити угорі",
"unpinFromTop": "Відкріпити зверху",
"resetInstallStatusForSelectedAppsQuestion": "Скинути статус встановлення для вибраних застосунків?",
"installStatusOfXWillBeResetExplanation": "Статус встановлення будь-яких вибраних застосунків буде скинутий.\n\nЦе може допомогти, коли версія застосунку, відображена в Obtainium, є неправильною через невдалі оновлення або інші проблеми.",
"customLinkMessage": "Ці посилання працюють на пристроях з встановленим Obtainium",
"shareAppConfigLinks": "Поділитися посиланнями на конфігурацію Застосунку як HTML",
"shareSelectedAppURLs": "Поділитися вибраними URL-адресами застосунків",
"resetInstallStatus": "Скинути статус встановлення",
"more": "Більше",
"removeOutdatedFilter": "Видалити фільтр застарілих застосунків",
"showOutdatedOnly": "Показати лише застарілі застосунки",
"filter": "Фільтр",
"filterApps": "Фільтрувати застосунки",
"appName": "Назва застосунку",
"author": "Автор",
"upToDateApps": "Актуальні застосунки",
"nonInstalledApps": "Невстановлені застосунки",
"importExport": "Імпорт/Експорт",
"settings": "Налаштування",
"exportedTo": "Експортовано в {}",
"obtainiumExport": "Експорт з Obtainium",
"invalidInput": "Недійсний ввід",
"importedX": "Імпортовано {}",
"obtainiumImport": "Імпорт в Obtainium",
"importFromURLList": "Імпорт зі списку URL-адрес",
"searchQuery": "Пошуковий запит",
"appURLList": "Список URL-адрес застосунків",
"line": "Лінія",
"searchX": "Пошук {}",
"noResults": "Результати відсутні",
"importX": "Імпорт {}",
"importedAppsIdDisclaimer": "Імпортовані застосунки можуть неправильно відображатися як \"Не встановлені\".\nДля виправлення цього перевстановіть їх через Obtainium.\nЦе не повинно вплинути на дані застосунків.\n\nПов'язано лише з URL-адресами та імпортом від третіх сторін.",
"importErrors": "Помилки імпорту",
"importedXOfYApps": "Імпортовано {} з {} застосунків.",
"followingURLsHadErrors": "Помилки в наступних URL-адресах:",
"selectURL": "Вибрати URL",
"selectURLs": "Вибрати URL-адреси",
"pick": "Вибрати",
"theme": "Тема",
"dark": "Темна",
"light": "Світла",
"followSystem": "Дотримуватися системи",
"followSystemThemeExplanation": "Зміна теми системи можлива лише за допомогою сторонніх додатків",
"useBlackTheme": "Використовувати чорну тему (Amoled)",
"appSortBy": "Сортувати застосунки за",
"authorName": "Автор/Назва",
"nameAuthor": "Назва/Автор",
"asAdded": "За додаванням",
"appSortOrder": "Порядок сортування застосунків",
"ascending": "За зростанням",
"descending": "За спаданням",
"bgUpdateCheckInterval": "Інтервал перевірки оновлень у фоновому режимі",
"neverManualOnly": "Ніколи - Тільки вручну",
"appearance": "Вигляд",
"showWebInAppView": "Показати джерело застосунку у вигляді веб-сторінки",
"pinUpdates": "Закріпити оновлення у верхній частині вигляду застосунків",
"updates": "Оновлення",
"sourceSpecific": "Певне джерело",
"appSource": "Джерело застосунку",
"noLogs": "Немає логів",
"appLogs": "Лог застосунку",
"close": "Закрити",
"share": "Поділитися",
"appNotFound": "Застосунок не знайдено",
"obtainiumExportHyphenatedLowercase": "експорт з Obtainium",
"pickAnAPK": "Вибрати APK",
"appHasMoreThanOnePackage": "{} має більше одного пакету:",
"deviceSupportsXArch": "Ваш пристрій підтримує архітектуру процесора {}.",
"deviceSupportsFollowingArchs": "Ваш пристрій підтримує наступні архітектури процесора:",
"warning": "Попередження",
"sourceIsXButPackageFromYPrompt": "Джерело застосунку - '{}' але пакет випуску походить з '{}'. Продовжити?",
"updatesAvailable": "Доступні оновлення",
"updatesAvailableNotifDescription": "Повідомляє користувача, що доступні оновлення для одного чи декількох застосунків, які відстежує Obtainium",
"noNewUpdates": "Немає нових оновлень.",
"xHasAnUpdate": "{} має оновлення.",
"appsUpdated": "Застосунки оновлено",
"appsNotUpdated": "Не вдалося оновити програми",
"appsUpdatedNotifDescription": "Повідомляє користувача, що оновлення одного чи декількох застосунків було застосовано в фоновому режимі",
"xWasUpdatedToY": "{} було оновлено до {}.",
"xWasNotUpdatedToY": "Не вдалося оновити {} на {}.",
"errorCheckingUpdates": "Помилка перевірки оновлень",
"errorCheckingUpdatesNotifDescription": "Повідомлення, яке з'являється, коли перевірка оновлень в фоновому режимі завершується невдачею",
"appsRemoved": "Застосунки видалено",
"appsRemovedNotifDescription": "Повідомляє користувача, що один чи декілька застосунків були видалені через помилки при завантаженні",
"xWasRemovedDueToErrorY": "{} було видалено через цю помилку: {}",
"completeAppInstallation": "Завершення установки застосунку",
"obtainiumMustBeOpenToInstallApps": "Для встановлення застосунків Obtainium має бути відкритий",
"completeAppInstallationNotifDescription": "Прохання користувача повернутися до Obtainium для завершення установки застосунку",
"checkingForUpdates": "Перевірка оновлень",
"checkingForUpdatesNotifDescription": "Тимчасове повідомлення, яке з'являється при перевірці оновлень",
"pleaseAllowInstallPerm": "Будь ласка, дозвольте Obtainium встановлювати застосунки",
"trackOnly": "Тільки відстеження",
"errorWithHttpStatusCode": "Помилка {} HTTP-коду",
"versionCorrectionDisabled": "Виправлення версії вимкнено (здається, плагін не працює)",
"unknown": "Невідомо",
"none": "Нічого",
"never": "Ніколи",
"latestVersionX": "Остання версія: {}",
"installedVersionX": "Встановлено: {}",
"lastUpdateCheckX": "Остання перевірка оновлень: {}",
"remove": "Видалити",
"yesMarkUpdated": "Так, позначити як оновлене",
"fdroid": "F-Droid Офіційний",
"appIdOrName": "Ідентифікатор або назва застосунку",
"appId": "Ідентифікатор застосунку",
"appWithIdOrNameNotFound": "Застосунок з таким ідентифікатором або назвою не знайдено",
"reposHaveMultipleApps": "Сховища можуть містити кілька застосунків",
"fdroidThirdPartyRepo": "F-Droid Стороннє сховище",
"install": "Встановити",
"markInstalled": "Позначити як встановлене",
"update": "Оновити",
"markUpdated": "Позначити як оновлене",
"additionalOptions": "Додаткові опції",
"disableVersionDetection": "Вимкнути визначення версії",
"noVersionDetectionExplanation": "Цю опцію слід використовувати лише для застосунків, де визначення версії працює неправильно.",
"downloadingX": "Завантаження {}",
"downloadX": "Завантажити {}",
"downloadedX": "Завантажено {}",
"releaseAsset": "Звільнити актив",
"downloadNotifDescription": "Повідомляє користувача про прогрес завантаження застосунку",
"noAPKFound": "APK не знайдено",
"noVersionDetection": "Визначення версії відключено",
"categorize": "Категоризувати",
"categories": "Категорії",
"category": "Категорія",
"noCategory": "Без категорії",
"noCategories": "Немає категорій",
"deleteCategoriesQuestion": "Видалити категорії?",
"categoryDeleteWarning": "Усі застосунки у видалених категоріях будуть переведені у некатегоризовані.",
"addCategory": "Додати категорію",
"label": "Мітка",
"language": "Мова",
"copiedToClipboard": "Скопійовано в буфер обміну",
"storagePermissionDenied": "Відмовлено у дозволі на доступ до сховища",
"selectedCategorizeWarning": "Це замінить будь-які існуючі налаштування категорій для вибраних застосунків.",
"filterAPKsByRegEx": "Фільтрувати APK за регулярним виразом",
"removeFromObtainium": "Видалити з Obtainium",
"uninstallFromDevice": "Видалити з пристрою",
"onlyWorksWithNonVersionDetectApps": "Працює лише з застосунками з вимкненим визначенням версії.",
"releaseDateAsVersion": "Використовувати дату випуску як рядок версії",
"releaseTitleAsVersion": "Використовувати назву випуску як рядок версії",
"releaseDateAsVersionExplanation": "Цю опцію слід використовувати лише для застосунків, де визначення версії працює неправильно, але є дата випуску.",
"changes": "Зміни",
"releaseDate": "Дата випуску",
"importFromURLsInFile": "Імпорт з URL-адрес у файлі (наприклад, OPML)",
"versionDetectionExplanation": "Порівняти рядок версії з версією, визначеною операційною системою",
"versionDetection": "Визначення версії",
"standardVersionDetection": "Стандартне визначення версії",
"groupByCategory": "Групувати за категоріями",
"autoApkFilterByArch": "Спробувати фільтрувати APK за архітектурою ЦП, якщо можливо",
"overrideSource": "Перевизначити джерело",
"dontShowAgain": "Не показувати це знову",
"dontShowTrackOnlyWarnings": "Не показувати попередження про 'Тільки відстеження'",
"dontShowAPKOriginWarnings": "Не показувати попередження про походження APK",
"moveNonInstalledAppsToBottom": "Перемістити невстановлені застосунки вниз у перегляді застосунків",
"gitlabPATLabel": "Особистий токен GitLab (Увімкнення пошуку та краще виявлення APK)",
"about": "Про програму",
"requiresCredentialsInSettings": "{} потребує додаткових облікових даних (у налаштуваннях)",
"checkOnStart": "Перевірити наявність оновлень при запуску",
"tryInferAppIdFromCode": "Спробувати вивести ідентифікатор застосунку з вихідного коду",
"removeOnExternalUninstall": "Автоматично видаляти застосунки, які було видалено зовнішнім чином",
"pickHighestVersionCode": "Автоматично вибрати APK з найвищим кодом версії",
"checkUpdateOnDetailPage": "Перевіряти наявність оновлень при відкритті сторінки деталей застосунку",
"disablePageTransitions": "Вимкнути анімації переходів між сторінками",
"reversePageTransitions": "Зворотні анімації переходів між сторінками",
"minStarCount": "Мінімальна кількість зірок",
"addInfoBelow": "Додати цю інформацію нижче.",
"addInfoInSettings": "Додати цю інформацію у налаштуваннях.",
"githubSourceNote": "Лімітування швидкості GitHub можна уникнути, використовуючи ключ API.",
"sortByLastLinkSegment": "Сортувати лише за останнім сегментом посилання",
"filterReleaseNotesByRegEx": "Фільтрувати примітки до релізу за регулярним виразом",
"customLinkFilterRegex": "Фільтр кастомного посилання на APK за регулярним виразом (за замовчуванням '.apk$')",
"appsPossiblyUpdated": "Спроб оновлення застосунків",
"appsPossiblyUpdatedNotifDescription": "Повідомляє користувача, що оновлення одного або декількох застосунків можливо були застосовані в фоновому режимі",
"xWasPossiblyUpdatedToY": "{} можливо було оновлено до {}.",
"enableBackgroundUpdates": "Увімкнути оновлення в фоновому режимі",
"backgroundUpdateReqsExplanation": "Оновлення в фоновому режимі може бути неможливим для всіх застосунків.",
"backgroundUpdateLimitsExplanation": "Успіх фонової установки може бути визначений лише після відкриття Obtainium.",
"verifyLatestTag": "Перевірити тег 'latest'",
"intermediateLinkRegex": "Фільтр для 'Проміжного' Посилання для Відвідування",
"filterByLinkText": "Фільтрувати посилання за текстом посилання",
"intermediateLinkNotFound": "Проміжне посилання не знайдено",
"intermediateLink": "Проміжне посилання",
"exemptFromBackgroundUpdates": "Виключено з фонових оновлень (якщо ввімкнено)",
"bgUpdatesOnWiFiOnly": "Вимкнути фонові оновлення поза Wi-Fi",
"bgUpdatesWhileChargingOnly": "Вимкнути фонові оновлення, коли не заряджається",
"autoSelectHighestVersionCode": "Автоматичний вибір APK з найвищим кодом версії",
"versionExtractionRegEx": "Регулярний вираз для вилучення рядка версії",
"trimVersionString": "Обрізати рядок версії за допомогою RegEx",
"matchGroupToUseForX": "Група збігів для \"{}\"",
"matchGroupToUse": "Група співпадінь для використання в регулярному виразі вилучення версії",
"highlightTouchTargets": "Підсвічувати менш очевидні області дотику",
"pickExportDir": "Вибрати каталог експорту",
"autoExportOnChanges": "Автоматичний експорт при змінах",
"includeSettings": "Включити налаштування",
"filterVersionsByRegEx": "Фільтрувати версії за регулярним виразом",
"trySelectingSuggestedVersionCode": "Спробуйте вибрати запропонований код версії APK",
"dontSortReleasesList": "Зберігати порядок випуску з API",
"reverseSort": "Зворотне сортування",
"takeFirstLink": "Вибрати перше посилання",
"skipSort": "Пропустити сортування",
"debugMenu": "Меню налагодження",
"bgTaskStarted": "Запущено фонове завдання - перевірте журнали.",
"runBgCheckNow": "Запустити перевірку оновлень в фоновому режимі зараз",
"versionExtractWholePage": "Застосувати регулярний вираз вилучення версії до всієї сторінки",
"installing": "Встановлення",
"skipUpdateNotifications": "Пропустити сповіщення про оновлення",
"updatesAvailableNotifChannel": "Доступні оновлення",
"appsUpdatedNotifChannel": "Застосунки оновлені",
"appsPossiblyUpdatedNotifChannel": "Спроба оновлення застосунків",
"errorCheckingUpdatesNotifChannel": "Помилка перевірки оновлень",
"appsRemovedNotifChannel": "Застосунки видалені",
"downloadingXNotifChannel": "Завантаження {}",
"completeAppInstallationNotifChannel": "Завершення встановлення застосунку",
"checkingForUpdatesNotifChannel": "Перевірка оновлень",
"onlyCheckInstalledOrTrackOnlyApps": "Перевіряти лише встановлені та застосунки, які відстежуються для оновлень",
"supportFixedAPKURL": "Підтримка фіксованих посилань на APK",
"selectX": "Вибрати {}",
"parallelDownloads": "Дозволити паралельні завантаження",
"useShizuku": "Використовуйте Shizuku або Sui для встановлення",
"shizukuBinderNotFound": "Сумісний сервіс Shizuku не було знайдено",
"shizukuOld": "Стара версія Shizuku (<11) - оновіть її",
"shizukuOldAndroidWithADB": "Shizuku працює на Android < 8.1 з ADB - оновіть Android або використовуйте Sui замість нього",
"shizukuPretendToBeGooglePlay": "Виберіть Google Play як джерело встановлення (якщо використовується Shizuku)",
"useSystemFont": "Використовувати системний шрифт",
"useVersionCodeAsOSVersion": "Використовувати код версії застосунку як версію, визначену операційною системою",
"requestHeader": "Заголовок запиту",
"useLatestAssetDateAsReleaseDate": "Використовувати останню дату завантаження ресурсу як дату випуску",
"defaultPseudoVersioningMethod": "Метод за замовчуванням псевдо-версіонування",
"partialAPKHash": "Хеш часткового APK",
"APKLinkHash": "Хеш посилання на APK",
"directAPKLink": "Пряме посилання на APK",
"pseudoVersionInUse": "Використовується псевдо-версія",
"installed": "Встановлено",
"latest": "Остання",
"invertRegEx": "Інвертувати регулярний вираз",
"note": "Примітка",
"selfHostedNote": "Випадаючий список \"{}\" може використовуватися для доступу до власних/призначених для самостійного використання екземплярів будь-якого джерела.",
"badDownload": "APK не вдалося розпарсити (несумісний або часткове завантаження)",
"beforeNewInstallsShareToAppVerifier": "Діліться новими додатками з AppVerifier (якщо доступно)",
"appVerifierInstructionToast": "Надішліть на AppVerifier, а потім поверніться сюди, коли будете готові.",
"wiki": "Довідка/Вікі",
"crowdsourcedConfigsLabel": "Краудсорсингові конфігурації додатків (використовуйте на свій страх і ризик)",
"crowdsourcedConfigsShort": "Налаштування краудсорсингових додатків",
"allowInsecure": "Дозволити незахищені HTTP-запити",
"stayOneVersionBehind": "Залишайтеся на одну версію актуальнішою",
"refreshBeforeDownload": "Оновіть інформацію про програму перед завантаженням",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "Видалити застосунок?",
"other": "Видалити застосунки?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "Забагато запитів (обмеження швидкості) - повторіть спробу через {} хвилину",
"other": "Забагато запитів (обмеження швидкості) - повторіть спробу через {} хвилин"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Помилка перевірки оновлень у фоновому режимі - спробую знову через {} хвилину",
"other": "Помилка перевірки оновлень у фоновому режимі - спробую знову через {} хвилин"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Фонова перевірка оновлень знайшла {} оновлення - сповістити користувача, якщо це необхідно",
"other": "Фонова перевірка оновлень знайшла {} оновлень - сповістити користувача, якщо це необхідно"
},
"apps": {
"one": "{} застосунок",
"other": "{} застосунки"
},
"url": {
"one": "{} URL-адреса",
"other": "{} URL-адреси"
},
"minute": {
"one": "{} хвилина",
"other": "{} хвилин"
},
"hour": {
"one": "{} година",
"other": "{} годин"
},
"day": {
"one": "{} день",
"other": "{} днів"
},
"clearedNLogsBeforeXAfterY": {
"one": "Очищено {n} журнал (до = {before}, після = {after})",
"other": "Очищено {n} журналів (до = {before}, після = {after})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} та ще 1 застосунок мають оновлення.",
"other": "{} та ще {} застосунки мають оновлення."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} та ще 1 застосунок було оновлено.",
"other": "{} та ще {} застосунків було оновлено."
},
"xAndNMoreUpdatesFailed": {
"one": "Не вдалося оновити {} та ще 1 програму.",
"other": "Не вдалося оновити {} і {} та інші програми."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} та ще 1 застосунок можливо було оновлено.",
"other": "{} та ще {} застосунків можливо було оновлено."
},
"apk": {
"one": "{} APK",
"other": "{} APK-файли"
}
}

382
assets/translations/vi.json Normal file
View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "URL ứng dụng {} không hợp lệ",
"noReleaseFound": "Không thể tìm thấy bản phát hành phù hợp",
"noVersionFound": "Không thể xác định phiên bản phát hành",
"urlMatchesNoSource": "URL không khớp với nguồn đã biết",
"cantInstallOlderVersion": "Không thể cài đặt phiên bản cũ hơn của Ứng dụng",
"appIdMismatch": "ID gói đã tải xuống không khớp với ID ứng dụng hiện tại",
"functionNotImplemented": "Lớp này chưa triển khai chức năng này",
"placeholder": "Giữ chỗ",
"someErrors": "Đã xảy ra một số lỗi",
"unexpectedError": "Lỗi không mong đợi",
"ok": "OK",
"and": "và",
"githubPATLabel": "Token truy cập cá nhân GitHub (Cải thiện tốc độ giới hạn)",
"includePrereleases": "Bao gồm các bản phát hành trước",
"fallbackToOlderReleases": "Dự phòng về bản phát hành cũ hơn",
"filterReleaseTitlesByRegEx": "Lọc tiêu đề bản phát hành theo biểu thức chính quy",
"invalidRegEx": "Biểu thức chính quy không hợp lệ",
"noDescription": "Không có mô tả",
"cancel": "Hủy",
"continue": "Tiếp tục",
"requiredInBrackets": "(Yêu cầu)",
"dropdownNoOptsError": "LỖI: TẢI XUỐNG PHẢI CÓ ÍT NHẤT MỘT LỰA CHỌN",
"colour": "Màu sắc",
"standard": "Mặc định",
"custom": "Tùy chỉnh",
"useMaterialYou": "Sử dụng Material You",
"githubStarredRepos": "Kho lưu trữ có gắn dấu sao GitHub",
"uname": "Tên người dùng",
"wrongArgNum": "Số lượng đối số được cung cấp sai",
"xIsTrackOnly": "{} là Chỉ theo dõi",
"source": "Nguồn",
"app": "Ứng dụng",
"appsFromSourceAreTrackOnly": "Các ứng dụng từ nguồn này là 'Chỉ theo dõi'.",
"youPickedTrackOnly": "Bạn đã chọn tùy chọn 'Chỉ theo dõi'.",
"trackOnlyAppDescription": "Ứng dụng sẽ được theo dõi để cập nhật, nhưng Obtainium sẽ không thể tải xuống hoặc cài đặt nó.",
"cancelled": "Đã hủy",
"appAlreadyAdded": "Ứng dụng được thêm rồi",
"alreadyUpToDateQuestion": "Ứng dụng đã được cập nhật?",
"addApp": "Thêm",
"appSourceURL": "URL nguồn ứng dụng",
"error": "Lỗi",
"add": "Thêm",
"searchSomeSourcesLabel": "Tìm kiếm (Chỉ một số nguồn)",
"search": "Tìm kiếm",
"additionalOptsFor": "Tùy chọn bổ sung cho {}",
"supportedSources": "Nguồn được hỗ trợ",
"trackOnlyInBrackets": "(Chỉ theo dõi)",
"searchableInBrackets": "(Có thể tìm kiếm)",
"appsString": "Ứng dụng",
"noApps": "Không có ứng dụng",
"noAppsForFilter": "Không có ứng dụng cho bộ lọc",
"byX": "Bởi {}",
"percentProgress": "Đang tải {}%",
"pleaseWait": "Vui lòng chờ",
"updateAvailable": "Có sẵn bản cập nhật",
"notInstalled": "Chưa cài đặt",
"pseudoVersion": "phiên bản giả",
"selectAll": "Chọn tất cả",
"deselectX": "Bỏ chọn {}",
"xWillBeRemovedButRemainInstalled": "{} sẽ bị xóa khỏi Obtainium nhưng vẫn còn cài đặt trên thiết bị.",
"removeSelectedAppsQuestion": "Xóa ứng dụng đã chọn?",
"removeSelectedApps": "Xóa ứng dụng đã chọn",
"updateX": "Cập nhật {}",
"installX": "Cài đặt {}",
"markXTrackOnlyAsUpdated": "Đánh dấu {}\n(Chỉ theo dõi)\nnhư là đã cập nhật",
"changeX": "Thay đổi {}",
"installUpdateApps": "Cài đặt/Cập nhật ứng dụng",
"installUpdateSelectedApps": "Cài đặt/Cập nhật ứng dụng đã chọn",
"markXSelectedAppsAsUpdated": "Đánh dấu {} ứng dụng đã chọn là đã cập nhật?",
"no": "Không",
"yes": "Đúng",
"markSelectedAppsUpdated": "Đánh dấu các ứng dụng đã chọn là đã cập nhật",
"pinToTop": "Ghim đầu trang",
"unpinFromTop": "Bỏ ghim khỏi đầu trang",
"resetInstallStatusForSelectedAppsQuestion": "Đặt lại trạng thái cài đặt cho ứng dụng đã chọn?",
"installStatusOfXWillBeResetExplanation": "Trạng thái cài đặt của mọi Ứng dụng đã chọn sẽ được đặt lại.\n\nĐiều này có thể hữu ích khi phiên bản Ứng dụng hiển thị trong Obtainium không chính xác do cập nhật không thành công hoặc các sự cố khác.",
"customLinkMessage": "Các liên kết này hoạt động trên các thiết bị có cài đặt Obtainium",
"shareAppConfigLinks": "Chia sẻ cấu hình ứng dụng dưới dạng liên kết HTML",
"shareSelectedAppURLs": "Chia sẻ URL ứng dụng đã chọn",
"resetInstallStatus": "Đặt lại trạng thái cài đặt",
"more": "Nhiều hơn",
"removeOutdatedFilter": "Xóa bộ lọc ứng dụng lỗi thời",
"showOutdatedOnly": "Chỉ hiển thị các ứng dụng lỗi thời",
"filter": "Lọc",
"filterApps": "Lọc ứng dụng",
"appName": "Tên ứng dụng",
"author": "Tác giả",
"upToDateApps": "Ứng dụng cập nhật",
"nonInstalledApps": "Ứng dụng chưa được cài đặt",
"importExport": "Nhập/Xuất",
"settings": "Thiết đặt",
"exportedTo": "Đã xuất sang {}",
"obtainiumExport": "Xuất",
"invalidInput": "Đầu vào không hợp lệ",
"importedX": "Đã nhập {}",
"obtainiumImport": "Nhập",
"importFromURLList": "Nhập từ danh sách URL",
"searchQuery": "Truy vấn tìm kiếm",
"appURLList": "Danh sách URL ứng dụng",
"line": "Hàng",
"searchX": "Tìm kiếm {}",
"noResults": "Không có kết quả nào được tìm thấy",
"importX": "Nhập {}",
"importedAppsIdDisclaimer": "Ứng dụng đã nhập có thể hiển thị không chính xác là \"Chưa được cài đặt\".\nĐể khắc phục sự cố này, hãy cài đặt lại chúng thông qua Obtainium.\nĐiều này sẽ không ảnh hưởng đến dữ liệu Ứng dụng.\n\nChỉ ảnh hưởng đến URL và phương thức nhập của bên thứ ba.",
"importErrors": "Lỗi nhập",
"importedXOfYApps": "{} trong số {} Ứng dụng đã được nhập.",
"followingURLsHadErrors": "Các URL sau có lỗi:",
"selectURL": "Chọn URL",
"selectURLs": "Chọn URL",
"pick": "Chọn",
"theme": "Chủ đề",
"dark": "Tối",
"light": "Sáng",
"followSystem": "Theo hệ thống",
"followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
"useBlackTheme": "Nền đen",
"appSortBy": "Sắp xếp ứng dụng",
"authorName": "Tác giả",
"nameAuthor": "Tên",
"asAdded": "Như đã thêm",
"appSortOrder": "Thứ tự sắp xếp",
"ascending": "Tăng dần",
"descending": "Giảm dần",
"bgUpdateCheckInterval": "Thời gian tự động kiểm tra cập nhật",
"neverManualOnly": "Không bao giờ",
"appearance": "Hiển thị",
"showWebInAppView": "Hiển thị trang web Nguồn trong chế độ xem chi tiết Ứng dụng",
"pinUpdates": "Chuyển ứng dụng có phiên bản mới lên đầu danh sách",
"updates": "Cập nhật",
"sourceSpecific": "Cài đặt Nguồn",
"appSource": "Nguồn ứng dụng",
"noLogs": "Không có nhật ký",
"appLogs": "Nhật ký ứng dụng",
"close": "Đóng",
"share": "Chia sẻ",
"appNotFound": "Không tìm thấy ứng dụng",
"obtainiumExportHyphenatedLowercase": "obtainium-export",
"pickAnAPK": "Chọn một APK",
"appHasMoreThanOnePackage": "{} có nhiều gói:",
"deviceSupportsXArch": "Thiết bị của bạn hỗ trợ kiến trúc CPU {}.",
"deviceSupportsFollowingArchs": "Thiết bị của bạn hỗ trợ các kiến trúc CPU sau:",
"warning": "Cảnh báo",
"sourceIsXButPackageFromYPrompt": "Nguồn ứng dụng là '{}' nhưng gói phát hành đến từ '{}'. Tiếp tục?",
"updatesAvailable": "Cập nhật có sẵn",
"updatesAvailableNotifDescription": "Thông báo cho người dùng rằng có bản cập nhật cho một hoặc nhiều Ứng dụng được theo dõi bởi Obtainium",
"noNewUpdates": "Không có bản cập nhật mới.",
"xHasAnUpdate": "{} có bản cập nhật.",
"appsUpdated": "Ứng dụng đã cập nhật ",
"appsNotUpdated": "Ứng dụng đã cập nhật không thành công",
"appsUpdatedNotifDescription": "Thông báo cho người dùng rằng các bản cập nhật cho một hoặc nhiều Ứng dụng đã được áp dụng trong nền",
"xWasUpdatedToY": "{} đã được cập nhật thành {}.",
"xWasNotUpdatedToY": "{} đã cập nhật thành {} không thành công.",
"errorCheckingUpdates": "Lỗi kiểm tra bản cập nhật",
"errorCheckingUpdatesNotifDescription": "Thông báo hiển thị khi kiểm tra cập nhật nền không thành công",
"appsRemoved": "Ứng dụng đã loại bỏ",
"appsRemovedNotifDescription": "Thông báo cho người dùng rằng một hoặc nhiều Ứng dụng đã bị loại bỏ do lỗi khi tải chúng",
"xWasRemovedDueToErrorY": "{} đã bị loại bỏ do lỗi này: {}",
"completeAppInstallation": "Hoàn tất cài đặt ứng dụng",
"obtainiumMustBeOpenToInstallApps": "Obtainium phải được mở để cài đặt Ứng dụng",
"completeAppInstallationNotifDescription": "Yêu cầu người dùng quay lại Obtainium để hoàn tất cài đặt Ứng dụng",
"checkingForUpdates": "Đang kiểm tra cập nhật",
"checkingForUpdatesNotifDescription": "Thông báo tạm thời xuất hiện khi kiểm tra bản cập nhật",
"pleaseAllowInstallPerm": "Vui lòng cho phép Obtainium cài đặt Ứng dụng",
"trackOnly": "Chỉ theo dõi",
"errorWithHttpStatusCode": "Lỗi {}",
"versionCorrectionDisabled": "Tính năng sửa phiên bản bị vô hiệu hóa (plugin dường như không hoạt động)",
"unknown": "Không xác định",
"none": "Không",
"never": "Không bao giờ",
"latestVersionX": "Phiên bản mới nhất: {}",
"installedVersionX": "Phiên bản đã cài đặt: {}",
"lastUpdateCheckX": "Kiểm tra cập nhật lần cuối: {}",
"remove": "Loại bỏ",
"yesMarkUpdated": "Có, Đánh dấu là đã cập nhật",
"fdroid": "F-Droid Chính thức",
"appIdOrName": "ID hoặc tên ứng dụng",
"appId": "ID ứng dụng",
"appWithIdOrNameNotFound": "Không tìm thấy ứng dụng nào có ID hoặc tên đó",
"reposHaveMultipleApps": "Kho có thể chứa nhiều Ứng dụng",
"fdroidThirdPartyRepo": "Kho lưu trữ bên thứ ba F-Droid",
"install": "Cài đặt",
"markInstalled": "Đánh dấu là đã cài đặt",
"update": "Cập nhật",
"markUpdated": "Đánh dấu đã cập nhật",
"additionalOptions": "Tùy chọn bổ sung",
"disableVersionDetection": "Tắt tính năng phát hiện phiên bản",
"noVersionDetectionExplanation": "Chỉ nên sử dụng tùy chọn này cho Ứng dụng mà tính năng phát hiện phiên bản không hoạt động chính xác.",
"downloadingX": "Đang tải xuống {}",
"downloadX": "Tải xuống {}",
"downloadedX": "Đã tải xuống {}",
"releaseAsset": "Release Asset",
"downloadNotifDescription": "Thông báo cho người dùng về tiến trình tải xuống Ứng dụng",
"noAPKFound": "Không tìm thấy APK",
"noVersionDetection": "Không phát hiện phiên bản",
"categorize": "Phân loại",
"categories": "Danh mục",
"category": "Danh mục",
"noCategory": "Không danh mục",
"noCategories": "Không danh mục",
"deleteCategoriesQuestion": "Xóa danh mục?",
"categoryDeleteWarning": "Tất cả ứng dụng trong danh mục đã xóa sẽ được đặt thành chưa được phân loại.",
"addCategory": "Thêm thể loại",
"label": "Nhãn",
"language": "Ngôn ngữ",
"copiedToClipboard": "Sao chép vào clipboard",
"storagePermissionDenied": "Quyền lưu trữ bị từ chối",
"selectedCategorizeWarning": "Điều này sẽ thay thế mọi thiết đặt danh mục hiện có cho Ứng dụng đã chọn.",
"filterAPKsByRegEx": "Lọc APK theo biểu thức chính quy",
"removeFromObtainium": "Loại khỏi Obtainium",
"uninstallFromDevice": "Gỡ cài đặt khỏi thiết bị",
"onlyWorksWithNonVersionDetectApps": "Chỉ hoạt động với Ứng dụng đã tắt tính năng phát hiện phiên bản.",
"releaseDateAsVersion": "Sử dụng ngày phát hành làm phiên bản",
"releaseTitleAsVersion": "Use release title as version string",
"releaseDateAsVersionExplanation": "Chỉ nên sử dụng tùy chọn này cho Ứng dụng trong đó tính năng phát hiện phiên bản không hoạt động chính xác nhưng đã có ngày phát hành.",
"changes": "Thay đổi",
"releaseDate": "Ngày phát hành",
"importFromURLsInFile": "Nhập từ URL trong Tệp (như OPML)",
"versionDetectionExplanation": "Đối chiếu chuỗi phiên bản với phiên bản được phát hiện từ hệ điều hành",
"versionDetection": "Phát hiện phiên bản",
"standardVersionDetection": "Phát hiện phiên bản tiêu chuẩn",
"groupByCategory": "Nhóm theo danh mục",
"autoApkFilterByArch": "Cố gắng lọc APK theo kiến trúc CPU nếu có thể",
"overrideSource": "Ghi đè nguồn",
"dontShowAgain": "Đừng hiển thị thông tin này nữa",
"dontShowTrackOnlyWarnings": "Không hiển thị cảnh báo 'Chỉ theo dõi'",
"dontShowAPKOriginWarnings": "Không hiển thị cảnh báo nguồn gốc APK",
"moveNonInstalledAppsToBottom": "Chuyển Ứng dụng chưa được cài đặt xuống cuối danh sách",
"gitlabPATLabel": "Token truy cập cá nhân GitLab",
"about": "Giới thiệu",
"requiresCredentialsInSettings": "{}: Điều này cần thông tin xác thực bổ sung (trong Thiết đặt)",
"checkOnStart": "Kiểm tra các bản cập nhật khi khởi động",
"tryInferAppIdFromCode": "Thử suy ra ID ứng dụng từ mã nguồn",
"removeOnExternalUninstall": "Tự động xóa ứng dụng đã gỡ cài đặt bên ngoài",
"pickHighestVersionCode": "Tự động chọn APK mã phiên bản cao nhất",
"checkUpdateOnDetailPage": "Kiểm tra các bản cập nhật khi mở trang chi tiết Ứng dụng",
"disablePageTransitions": "Tắt hiệu ứng chuyển trang",
"reversePageTransitions": "Hoạt ảnh chuyển đổi trang đảo ngược",
"minStarCount": "Số lượng sao tối thiểu",
"addInfoBelow": "Thêm thông tin này vào bên dưới.",
"addInfoInSettings": "Thêm thông tin này vào Thiết đặt.",
"githubSourceNote": "Có thể tránh được việc giới hạn tốc độ GitHub bằng cách sử dụng khóa API.",
"sortByLastLinkSegment": "Chỉ sắp xếp theo đoạn cuối của liên kết",
"filterReleaseNotesByRegEx": "Lọc ghi chú phát hành theo biểu thức chính quy",
"customLinkFilterRegex": "Bộ lọc liên kết APK tùy chỉnh theo biểu thức chính quy (Mặc định '.apk$')",
"appsPossiblyUpdated": "Đã cố gắng cập nhật ứng dụng",
"appsPossiblyUpdatedNotifDescription": "Thông báo cho người dùng rằng các bản cập nhật cho một hoặc nhiều Ứng dụng có khả năng được áp dụng trong nền",
"xWasPossiblyUpdatedToY": "{} có thể đã được cập nhật thành {}.",
"enableBackgroundUpdates": "Tự động cập nhật trong nền",
"backgroundUpdateReqsExplanation": "Có thể không thực hiện được cập nhật trong nền cho tất cả ứng dụng.",
"backgroundUpdateLimitsExplanation": "Sự thành công của cài đặt trong nền chỉ có thể được xác định khi mở Obtainium.",
"verifyLatestTag": "Xác minh thẻ 'mới nhất'",
"intermediateLinkRegex": "Lọc tìm liên kết 'Trung cấp' để truy cập",
"filterByLinkText": "Lọc liên kết theo văn bản liên kết",
"intermediateLinkNotFound": "Không tìm thấy liên kết trung gian",
"intermediateLink": "Liên kết trung gian",
"exemptFromBackgroundUpdates": "Miễn cập nhật nền (nếu được bật)",
"bgUpdatesOnWiFiOnly": "Tắt cập nhật nền khi không có Wi-Fi",
"bgUpdatesWhileChargingOnly": "Disable background updates when not charging",
"autoSelectHighestVersionCode": "Tự động chọn APK mã phiên bản cao nhất",
"versionExtractionRegEx": "Trích xuất phiên bản RegEx",
"trimVersionString": "Trim Version String With RegEx",
"matchGroupToUseForX": "Match Group to Use for \"{}\"",
"matchGroupToUse": "Nhóm đối sánh để sử dụng cho Regex trích xuất phiên bản",
"highlightTouchTargets": "Đánh dấu các mục tiêu cảm ứng ít rõ ràng hơn",
"pickExportDir": "Chọn thư mục xuất",
"autoExportOnChanges": "Tự động xuất",
"includeSettings": "Bao gồm thiết đặt",
"filterVersionsByRegEx": "Lọc phiên bản theo biểu thức chính quy",
"trySelectingSuggestedVersionCode": "Thử chọn APK Mã phiên bản được đề xuất",
"dontSortReleasesList": "Giữ lại thứ tự phát hành từ API",
"reverseSort": "Sắp xếp ngược",
"takeFirstLink": "Lấy liên kết đầu tiên",
"skipSort": "Bỏ qua việc sắp xếp",
"debugMenu": "Danh sách gỡ lỗi",
"bgTaskStarted": "Tác vụ nền đã bắt đầu - kiểm tra nhật ký.",
"runBgCheckNow": "Chạy kiểm tra cập nhật nền ngay bây giờ",
"versionExtractWholePage": "Áp dụng Regex trích xuất phiên bản cho toàn bộ trang",
"installing": "Đang cài đặt",
"skipUpdateNotifications": "Bỏ qua thông báo cập nhật",
"updatesAvailableNotifChannel": "Cập nhật có sẵn",
"appsUpdatedNotifChannel": "Đã cập nhật ứng dụng",
"appsPossiblyUpdatedNotifChannel": "Đã cố gắng cập nhật ứng dụng",
"errorCheckingUpdatesNotifChannel": "Lỗi kiểm tra bản cập nhật",
"appsRemovedNotifChannel": "Ứng dụng đã bị loại bỏ",
"downloadingXNotifChannel": "Đang tải xuống {}",
"completeAppInstallationNotifChannel": "Hoàn tất cài đặt ứng dụng",
"checkingForUpdatesNotifChannel": "Đang kiểm tra cập nhật",
"onlyCheckInstalledOrTrackOnlyApps": "Chỉ kiểm tra cập nhật các ứng dụng đã cài đặt và Chỉ theo dõi",
"supportFixedAPKURL": "Hỗ trợ URL APK cố định",
"selectX": "Lựa chọn {}",
"parallelDownloads": "Cho phép tải đa luồng",
"useShizuku": "Sử dụng Shizuku hoặc Sui để cài đặt",
"shizukuBinderNotFound": "Shizuku chưa khởi động",
"shizukuOld": "Phiên bản Shizuku lỗi thời (<11) - hãy cập nhật nó",
"shizukuOldAndroidWithADB": "Shizuku chạy trên Android < 8.1 với ADB - hãy cập nhật Android hoặc thay bằng Sui",
"shizukuPretendToBeGooglePlay": "Set Google Play as the installation source (if Shizuku is used)",
"useSystemFont": "Sử dụng phông chữ hệ thống",
"useVersionCodeAsOSVersion": "Sử dụng Mã phiên bản ứng dụng làm phiên bản do hệ điều hành phát hiện",
"requestHeader": "Tiêu đề yêu cầu",
"useLatestAssetDateAsReleaseDate": "Sử dụng nội dung tải lên mới nhất làm ngày phát hành",
"defaultPseudoVersioningMethod": "Phương pháp tạo phiên bản giả mặc định",
"partialAPKHash": "Băm APK một phần",
"APKLinkHash": "Băm liên kết APK",
"directAPKLink": "Liên kết APK trực tiếp",
"pseudoVersionInUse": "Phiên bản giả đang được sử dụng",
"installed": "Đã cài đặt",
"latest": "Mới nhất",
"invertRegEx": "Đảo ngược biểu thức chính quy",
"note": "Ghi chú",
"selfHostedNote": "Trình đơn thả xuống \"{}\" có thể được dùng để tiếp cận các phiên bản tự lưu trữ/tùy chỉnh của bất kỳ nguồn nào.",
"badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)",
"beforeNewInstallsShareToAppVerifier": "Chia sẻ ứng dụng mới với AppVerifier (nếu có)",
"appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.",
"wiki": "Trợ giúp/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
"crowdsourcedConfigsShort": "Crowdsourced App Configs",
"allowInsecure": "Allow insecure HTTP requests",
"stayOneVersionBehind": "Stay one version behind latest",
"refreshBeforeDownload": "Refresh app details before download",
"tencentAppStore": "Tencent App Store",
"removeAppQuestion": {
"one": "Gỡ ứng dụng?",
"other": "Gỡ ứng dụng?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "Quá nhiều yêu cầu (tốc độ giới hạn) - hãy thử lại sau {} phút",
"other": "Quá nhiều yêu cầu (tốc độ giới hạn) - hãy thử lại sau {} phút"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "Việc kiểm tra bản cập nhật BG gặp phải {}, sẽ lên lịch kiểm tra lại sau {} phút",
"other": "Việc kiểm tra bản cập nhật BG gặp phải {}, sẽ lên lịch kiểm tra lại sau {} phút"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "Đang kiểm tra bản cập nhật BG tìm thấy {} bản cập nhật - sẽ thông báo cho người dùng nếu cần",
"other": "Đang kiểm tra bản cập nhật BG tìm thấy {} bản cập nhật - sẽ thông báo cho người dùng nếu cần"
},
"apps": {
"one": "{} Ứng dụng",
"other": "{} Ứng dụng"
},
"url": {
"one": "{} URL",
"other": "{} URL"
},
"minute": {
"one": "{} Phút",
"other": "{} Phút"
},
"hour": {
"one": "{} Giờ",
"other": "{} Giờ"
},
"day": {
"one": "{} Ngày",
"other": "{} ngày"
},
"clearedNLogsBeforeXAfterY": {
"one": "Đã xóa {n} nhật ký (trước = {trước}, sau = {sau})",
"other": "Đã xóa {n} nhật ký (trước = {trước}, sau = {sau})"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} và 1 ứng dụng khác có bản cập nhật.",
"other": "{} và {} ứng dụng khác có bản cập nhật."
},
"xAndNMoreUpdatesInstalled": {
"one": "{} và 1 ứng dụng khác đã được cập nhật.",
"other": "{} và {} ứng dụng khác đã được cập nhật."
},
"xAndNMoreUpdatesFailed": {
"one": "{} và 1 ứng dụng khác đã cập nhật không thành công.",
"other": "{} và {} ứng dụng khác đã cập nhật không thảnh công."
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} và 1 ứng dụng khác có thể đã được cập nhật.",
"other": "{} và {} ứng dụng khác có thể đã được cập nhật."
},
"apk": {
"one": "{} APK",
"other": "{} APKs"
}
}

View File

@ -0,0 +1,382 @@
{
"invalidURLForSource": "不是有效的 {} 應用程式 URL",
"noReleaseFound": "找不到合適的版本",
"noVersionFound": "無法確定版本",
"urlMatchesNoSource": "URL 不符合已知來源",
"cantInstallOlderVersion": "無法安裝舊版本的應用程式",
"appIdMismatch": "下載的套件 ID 與現有的應用程式 ID 不相符",
"functionNotImplemented": "此類別尚未實作此功能",
"placeholder": "佔位字串",
"someErrors": "發生了一些錯誤",
"unexpectedError": "意外錯誤",
"ok": "確定",
"and": "和",
"githubPATLabel": "GitHub 個人存取權杖(放寬速率限制)",
"includePrereleases": "包含預先釋出版本",
"fallbackToOlderReleases": "回退到舊版本",
"filterReleaseTitlesByRegEx": "用正則表達式過濾版本發佈標題",
"invalidRegEx": "無效的正則表達式",
"noDescription": "沒有描述",
"cancel": "取消",
"continue": "繼續",
"requiredInBrackets": "(必填)",
"dropdownNoOptsError": "錯誤:下拉選單必須至少有一個選項",
"colour": "顏色",
"standard": "標準",
"custom": "自訂",
"useMaterialYou": "使用 Material You",
"githubStarredRepos": "GitHub 打星星的專案",
"uname": "使用者名稱",
"wrongArgNum": "提供的參數數量錯誤",
"xIsTrackOnly": "{} 是僅追蹤",
"source": "來源",
"app": "應用程式",
"appsFromSourceAreTrackOnly": "來自此來源的應用程式是「僅追蹤」。",
"youPickedTrackOnly": "您已選擇「僅追蹤」選項。",
"trackOnlyAppDescription": "該應用程式將被追蹤更新,但 Obtainium 將無法下載或安裝它。",
"cancelled": "已取消",
"appAlreadyAdded": "應用程式已新增",
"alreadyUpToDateQuestion": "應用程式已經是最新的?",
"addApp": "新增應用程式",
"appSourceURL": "應用程式來源 URL",
"error": "錯誤",
"add": "新增",
"searchSomeSourcesLabel": "搜尋(僅限部分來源)",
"search": "搜尋",
"additionalOptsFor": "{} 的其他選項",
"supportedSources": "支援的來源",
"trackOnlyInBrackets": "(僅追蹤)",
"searchableInBrackets": "(可搜尋)",
"appsString": "應用程式",
"noApps": "無應用程式",
"noAppsForFilter": "無符合過濾條件的應用程式",
"byX": "由 {}",
"percentProgress": "進度:{}%",
"pleaseWait": "請稍候",
"updateAvailable": "有可用的更新",
"notInstalled": "未安裝",
"pseudoVersion": "偽版本",
"selectAll": "全選",
"deselectX": "取消選取 {}",
"xWillBeRemovedButRemainInstalled": "{} 將從 Obtainium 中移除,但仍然安裝在裝置上。",
"removeSelectedAppsQuestion": "移除選取的應用程式?",
"removeSelectedApps": "移除選取的應用程式",
"updateX": "更新 {}",
"installX": "安裝 {}",
"markXTrackOnlyAsUpdated": "標記 {}\n僅追蹤\n為已更新",
"changeX": "更改 {}",
"installUpdateApps": "安裝/更新應用程式",
"installUpdateSelectedApps": "安裝/更新選取的應用程式",
"markXSelectedAppsAsUpdated": "標記 {} 個選取的應用程式為已更新?",
"no": "否",
"yes": "是",
"markSelectedAppsUpdated": "標記選取的應用程式為已更新",
"pinToTop": "釘選到頂端",
"unpinFromTop": "取消釘選",
"resetInstallStatusForSelectedAppsQuestion": "重設選取應用程式的安裝狀態?",
"installStatusOfXWillBeResetExplanation": "任何選取應用程式的安裝狀態將被重設。\n\n這可以在由於更新失敗或其他問題導致 Obtainium 顯示的應用程式版本不正確時有所幫助。",
"customLinkMessage": "這些連結適用於已安裝 Obtainium 的裝置",
"shareAppConfigLinks": "分享應用程式設定為 HTML 連結",
"shareSelectedAppURLs": "分享選取的應用程式 URL",
"resetInstallStatus": "重設安裝狀態",
"more": "更多",
"removeOutdatedFilter": "移除過時應用程式過濾",
"showOutdatedOnly": "僅顯示過時的應用程式",
"filter": "過濾",
"filterApps": "過濾應用程式",
"appName": "應用程式名稱",
"author": "作者",
"upToDateApps": "最新的應用程式",
"nonInstalledApps": "未安裝的應用程式",
"importExport": "匯入/匯出",
"settings": "設定",
"exportedTo": "匯出到 {}",
"obtainiumExport": "Obtainium 匯出",
"invalidInput": "無效的輸入",
"importedX": "已匯入 {}",
"obtainiumImport": "Obtainium 匯入",
"importFromURLList": "從 URL 清單匯入",
"searchQuery": "搜尋查詢",
"appURLList": "應用程式 URL 清單",
"line": "行",
"searchX": "搜尋 {}",
"noResults": "沒有找到結果",
"importX": "匯入 {}",
"importedAppsIdDisclaimer": "匯入的應用程式可能會錯誤地顯示為「未安裝」。\n要修正此問題請透過 Obtainium 重新安裝它們。\n這不應該影響應用程式資料。\n\n僅影響 URL 和第三方匯入方法。",
"importErrors": "匯入錯誤",
"importedXOfYApps": "已匯入 {} 個中的 {} 個應用程式。",
"followingURLsHadErrors": "以下 URL 有錯誤:",
"selectURL": "選擇 URL",
"selectURLs": "選擇多個 URL",
"pick": "選取",
"theme": "主題",
"dark": "深色",
"light": "淺色",
"followSystem": "跟隨系統",
"followSystemThemeExplanation": "僅使用第三方應用程式時才可跟隨系統主題",
"useBlackTheme": "使用純黑色深色主題",
"appSortBy": "應用程式排序依據",
"authorName": "作者/名稱",
"nameAuthor": "名稱/作者",
"asAdded": "新增順序",
"appSortOrder": "應用程式排序順序",
"ascending": "升序",
"descending": "降序",
"bgUpdateCheckInterval": "背景更新檢查間隔",
"neverManualOnly": "從不 - 僅手動",
"appearance": "外觀",
"showWebInAppView": "在應用程式檢視中顯示來源網頁",
"pinUpdates": "將更新釘選至應用程式檢視的頂端",
"updates": "更新",
"sourceSpecific": "特定來源",
"appSource": "應用程式來源",
"noLogs": "無日誌",
"appLogs": "應用程式日誌",
"close": "關閉",
"share": "分享",
"appNotFound": "沒有找到應用程式",
"obtainiumExportHyphenatedLowercase": "obtainium-export",
"pickAnAPK": "選擇一個 APK",
"appHasMoreThanOnePackage": "{} 有多個套件:",
"deviceSupportsXArch": "您的裝置支援 {} CPU 架構。",
"deviceSupportsFollowingArchs": "您的裝置支援以下 CPU 架構:",
"warning": "警告",
"sourceIsXButPackageFromYPrompt": "應用程式來源是 「{}」,但發佈套件來自 「{}」。要繼續嗎?",
"updatesAvailable": "有可用的更新",
"updatesAvailableNotifDescription": "通知使用者有一個或多個由 Obtainium 追蹤的應用程式有更新",
"noNewUpdates": "沒有新更新。",
"xHasAnUpdate": "{} 有一個更新。",
"appsUpdated": "應用程式已更新",
"appsNotUpdated": "未能更新應用程式",
"appsUpdatedNotifDescription": "通知使用者一個或多個應用程式的更新已在背景中套用",
"xWasUpdatedToY": "{} 已更新到 {}。",
"xWasNotUpdatedToY": "未能將 {} 更新到 {}。",
"errorCheckingUpdates": "檢查更新時出錯",
"errorCheckingUpdatesNotifDescription": "背景檢查更新失敗時顯示的通知",
"appsRemoved": "應用程式已移除",
"appsRemovedNotifDescription": "通知使用者由於載入時出錯,一個或多個應用程式已被移除",
"xWasRemovedDueToErrorY": "{} 已因以下錯誤被移除:{}",
"completeAppInstallation": "完成應用程式安裝",
"obtainiumMustBeOpenToInstallApps": "Obtainium 必須開啟才能安裝應用程式",
"completeAppInstallationNotifDescription": "請使用者回到 Obtainium 以完成應用程式安裝",
"checkingForUpdates": "正在檢查更新",
"checkingForUpdatesNotifDescription": "檢查更新時顯示的暫時性通知",
"pleaseAllowInstallPerm": "請允許 Obtainium 安裝應用程式",
"trackOnly": "僅追蹤",
"errorWithHttpStatusCode": "錯誤 {}",
"versionCorrectionDisabled": "版本校正已停用(外掛程式似乎無法正常工作)",
"unknown": "未知",
"none": "無",
"never": "從不",
"latestVersionX": "最新版本:{}",
"installedVersionX": "已安裝版本:{}",
"lastUpdateCheckX": "上次檢查更新時間:{}",
"remove": "移除",
"yesMarkUpdated": "是,標記為已更新",
"fdroid": "F-Droid 官方",
"appIdOrName": "應用程式 ID 或名稱",
"appId": "應用程式 ID",
"appWithIdOrNameNotFound": "找不到具有該 ID 或名稱的應用程式",
"reposHaveMultipleApps": "倉庫可能包含多個應用程式",
"fdroidThirdPartyRepo": "F-Droid 第三方倉庫",
"install": "安裝",
"markInstalled": "標記為已安裝",
"update": "更新",
"markUpdated": "標記為已更新",
"additionalOptions": "額外選項",
"disableVersionDetection": "停用版本偵測",
"noVersionDetectionExplanation": "此選項僅應用於版本偵測無法正確工作的應用程式。",
"downloadingX": "正在下載 {}",
"downloadX": "下載 {}",
"downloadedX": "已下載 {}",
"releaseAsset": "發佈資源",
"downloadNotifDescription": "通知使用者應用程式下載進度",
"noAPKFound": "沒有找到 APK",
"noVersionDetection": "無版本偵測",
"categorize": "分類",
"categories": "類別",
"category": "類別",
"noCategory": "無類別",
"noCategories": "無類別",
"deleteCategoriesQuestion": "刪除類別?",
"categoryDeleteWarning": "所有在已刪除類別中的應用程式將被設定為未分類。",
"addCategory": "新增類別",
"label": "標籤",
"language": "語言",
"copiedToClipboard": "已複製到剪貼簿",
"storagePermissionDenied": "存取權限被拒絕",
"selectedCategorizeWarning": "這將替換選取應用程式的任何現有類別設定。",
"filterAPKsByRegEx": "用正則表達式過濾 APK",
"removeFromObtainium": "從 Obtainium 移除",
"uninstallFromDevice": "從裝置解除安裝",
"onlyWorksWithNonVersionDetectApps": "僅適用於停用版本偵測的應用程式。",
"releaseDateAsVersion": "使用發佈日期作為版本字串",
"releaseTitleAsVersion": "Use release title as version string",
"releaseDateAsVersionExplanation": "此選項僅應用於版本偵測無法正確工作但有發佈日期的應用程式。",
"changes": "變更",
"releaseDate": "發佈日期",
"importFromURLsInFile": "從檔案中的 URL 匯入(如 OPML",
"versionDetectionExplanation": "將版本字串與作業系統偵測到的版本對比",
"versionDetection": "版本偵測",
"standardVersionDetection": "標準版本偵測",
"groupByCategory": "按類別分組",
"autoApkFilterByArch": "如果可能,嘗試按 CPU 架構過濾 APK",
"overrideSource": "覆蓋來源",
"dontShowAgain": "不要再顯示",
"dontShowTrackOnlyWarnings": "不要顯示「僅追蹤」警告",
"dontShowAPKOriginWarnings": "不要顯示 APK 來源警告",
"moveNonInstalledAppsToBottom": "將未安裝的應用程式移到應用程式檢視的末端",
"gitlabPATLabel": "GitLab 個人存取權杖",
"about": "關於",
"requiresCredentialsInSettings": "{} 需要額外的憑證(在設定中)",
"checkOnStart": "啟動時檢查更新",
"tryInferAppIdFromCode": "嘗試從原始碼推斷應用程式 ID",
"removeOnExternalUninstall": "自動移除外部解除安裝的應用程式",
"pickHighestVersionCode": "自動選取最高版本號的 APK",
"checkUpdateOnDetailPage": "在開啟應用程式詳細頁面時檢查更新",
"disablePageTransitions": "停用頁面過渡動畫",
"reversePageTransitions": "反轉頁面過渡動畫",
"minStarCount": "最少星星數",
"addInfoBelow": "在下方新增此資訊。",
"addInfoInSettings": "在設定中增加此資訊。",
"githubSourceNote": "使用 API 金鑰可以避免 GitHub 的速率限制。",
"sortByLastLinkSegment": "僅按連結的最後一段排序",
"filterReleaseNotesByRegEx": "用正則表達式過濾發佈說明",
"customLinkFilterRegex": "自定 APK 連結過濾正則表達式(預設為 '.apk$'",
"appsPossiblyUpdated": "嘗試更新應用程式",
"appsPossiblyUpdatedNotifDescription": "通知使用者一個或多個應用程式的更新可能已在背景中套用",
"xWasPossiblyUpdatedToY": "{} 可能已更新到 {}。",
"enableBackgroundUpdates": "啟用背景更新",
"backgroundUpdateReqsExplanation": "並非所有應用程式都能進行背景更新。",
"backgroundUpdateLimitsExplanation": "背景安裝的成功與否只能在開啟 Obtainium 時確定。",
"verifyLatestTag": "驗證「最新」標籤",
"intermediateLinkRegex": "過濾要存取的「中間」連結",
"filterByLinkText": "按連結文字過濾連結",
"intermediateLinkNotFound": "沒有找到中間連結",
"intermediateLink": "中間連結",
"exemptFromBackgroundUpdates": "免除背景更新(若已啟用)",
"bgUpdatesOnWiFiOnly": "停用非 Wi-Fi 的背景更新",
"bgUpdatesWhileChargingOnly": "Disable background updates when not charging",
"autoSelectHighestVersionCode": "自動選擇最高 versionCode 的 APK",
"versionExtractionRegEx": "版本字串提取正則表達式",
"trimVersionString": "用正則表達式修剪版本字串",
"matchGroupToUseForX": "用於「{}」的對應群組",
"matchGroupToUse": "要用於版本字串提取的對應群組",
"highlightTouchTargets": "突出顯示不明顯的觸控目標",
"pickExportDir": "選擇匯出目錄",
"autoExportOnChanges": "更改時自動匯出",
"includeSettings": "包含設定",
"filterVersionsByRegEx": "用正則表達式過濾版本",
"trySelectingSuggestedVersionCode": "嘗試選擇建議的 versionCode APK",
"dontSortReleasesList": "保留 API 的發佈順序",
"reverseSort": "反向排序",
"takeFirstLink": "使用第一個連結",
"skipSort": "跳過排序",
"debugMenu": "除錯選單",
"bgTaskStarted": "背景任務已啟動 - 檢查日誌。",
"runBgCheckNow": "立即執行背景更新檢查",
"versionExtractWholePage": "將版本字串提取正則表達式套用於整個頁面",
"installing": "正在安裝",
"skipUpdateNotifications": "跳過更新通知",
"updatesAvailableNotifChannel": "有可用的更新",
"appsUpdatedNotifChannel": "應用程式已更新",
"appsPossiblyUpdatedNotifChannel": "嘗試更新應用程式",
"errorCheckingUpdatesNotifChannel": "檢查更新錯誤",
"appsRemovedNotifChannel": "應用程式已移除",
"downloadingXNotifChannel": "正在下載 {}",
"completeAppInstallationNotifChannel": "完成應用程式安裝",
"checkingForUpdatesNotifChannel": "正在檢查更新",
"onlyCheckInstalledOrTrackOnlyApps": "僅檢查已安裝和僅追蹤的應用程式更新",
"supportFixedAPKURL": "支援固定的 APK 網址",
"selectX": "選擇 {}",
"parallelDownloads": "允許平行下載",
"useShizuku": "使用 Shizuku 或 Sui 來安裝",
"shizukuBinderNotFound": "Shizuku 服務未運作",
"shizukuOld": "舊版 Shizuku (<11) - 請更新",
"shizukuOldAndroidWithADB": "Shizuku 在 Android 8.1 以下版本使用 ADB 執行 - 請更新 Android 或改用 Sui",
"shizukuPretendToBeGooglePlay": "設定 Google Play 為安裝來源(如果使用 Shizuku",
"useSystemFont": "使用系統字型",
"useVersionCodeAsOSVersion": "使用應用程式 versionCode 作為作業系統偵測的版本",
"requestHeader": "請求標頭",
"useLatestAssetDateAsReleaseDate": "使用最新資源上傳日期作為發佈日期",
"defaultPseudoVersioningMethod": "預設偽版本管理方法",
"partialAPKHash": "部分 APK Hash",
"APKLinkHash": "APK 連結 Hash",
"directAPKLink": "直接 APK 連結",
"pseudoVersionInUse": "正在使用偽版本",
"installed": "已安裝",
"latest": "最新",
"invertRegEx": "反轉正則表達式",
"note": "備註",
"selfHostedNote": "可使用「{}」下拉選單來存取任何來源的自行託管/自訂執行個體。",
"badDownload": "無法解析 APK不相容或下載不完整",
"beforeNewInstallsShareToAppVerifier": "將新應用程式分享到 AppVerifier如果可用",
"appVerifierInstructionToast": "分享至 AppVerifier然後準備好時回到此處。",
"wiki": "幫助/維基",
"crowdsourcedConfigsLabel": "群眾外包的應用程式設定(使用風險自負)",
"crowdsourcedConfigsShort": "Crowdsourced App Configs",
"allowInsecure": "Allow insecure HTTP requests",
"stayOneVersionBehind": "Stay one version behind latest",
"refreshBeforeDownload": "Refresh app details before download",
"tencentAppStore": "騰訊應用寶",
"removeAppQuestion": {
"one": "移除應用程式?",
"other": "移除應用程式?"
},
"tooManyRequestsTryAgainInMinutes": {
"one": "請求過多(速率限制)- {} 分鐘後重試",
"other": "請求過多(速率限制)- {} 分鐘後重試"
},
"bgUpdateGotErrorRetryInMinutes": {
"one": "背景更新檢查遇到 {},將在 {} 分鐘後重新檢查",
"other": "背景更新檢查遇到 {},將在 {} 分鐘後重新檢查"
},
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "背景更新檢查發現 {} 個更新 - 如果需要將通知使用者",
"other": "背景更新檢查發現 {} 個更新 - 如果需要將通知使用者"
},
"apps": {
"one": "{} 個應用程式",
"other": "{} 個應用程式"
},
"url": {
"one": "{} 個 URL",
"other": "{} 個 URL"
},
"minute": {
"one": "{} 分鐘",
"other": "{} 分鐘"
},
"hour": {
"one": "{} 小時",
"other": "{} 小時"
},
"day": {
"one": "{} 天",
"other": "{} 天"
},
"clearedNLogsBeforeXAfterY": {
"one": "清除 {n} 個日誌(之前 = {before},之後 = {after}",
"other": "清除 {n} 個日誌(之前 = {before},之後 = {after}"
},
"xAndNMoreUpdatesAvailable": {
"one": "{} 和另外 1 個應用程式有更新。",
"other": "{} 和另外 {} 個應用程式有更新。"
},
"xAndNMoreUpdatesInstalled": {
"one": "{} 和另外 1 個應用程式已更新。",
"other": "{} 和另外 {} 個應用程式已更新。"
},
"xAndNMoreUpdatesFailed": {
"one": "更新 {} 和另外 1 個應用程式失敗。",
"other": "更新 {} 和另外 {} 個應用程式失敗。"
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} 和另外 1 個應用程式可能已更新。",
"other": "{} 和另外 {} 個應用程式可能已更新。"
},
"apk": {
"one": "{} 個 APK",
"other": "{} 個 APK"
}
}

View File

@ -11,18 +11,10 @@
"unexpectedError": "意外错误", "unexpectedError": "意外错误",
"ok": "好的", "ok": "好的",
"and": "和", "and": "和",
"startedBgUpdateTask": "后台更新检查任务已启动",
"bgUpdateIgnoreAfterIs": "后台更新检查间隔为 {}",
"startedActualBGUpdateCheck": "开始后台更新检查",
"bgUpdateTaskFinished": "后台更新检查任务已完成",
"firstRun": "这是 Obtainium 首次启动",
"settingUpdateCheckIntervalTo": "更新检查间隔设置为 {}",
"githubPATLabel": "GitHub 个人访问令牌(提升 API 请求限额)", "githubPATLabel": "GitHub 个人访问令牌(提升 API 请求限额)",
"githubPATHint": "个人访问令牌必须为“username:token”的格式",
"githubPATFormat": "username:token",
"includePrereleases": "包含预发行版", "includePrereleases": "包含预发行版",
"fallbackToOlderReleases": "将发行版作为备选", "fallbackToOlderReleases": "将过往的发行版作为备选",
"filterReleaseTitlesByRegEx": "使用正则表达式筛选发行标题", "filterReleaseTitlesByRegEx": "筛选发行标题的正则表达式",
"invalidRegEx": "无效的正则表达式", "invalidRegEx": "无效的正则表达式",
"noDescription": "无描述", "noDescription": "无描述",
"cancel": "取消", "cancel": "取消",
@ -30,11 +22,14 @@
"requiredInBrackets": "(必填)", "requiredInBrackets": "(必填)",
"dropdownNoOptsError": "错误:下拉菜单必须包含至少一个选项", "dropdownNoOptsError": "错误:下拉菜单必须包含至少一个选项",
"colour": "配色", "colour": "配色",
"githubStarredRepos": "GitHub 已星标仓库", "standard": "标准",
"custom": "定制",
"useMaterialYou": "使用 Material You",
"githubStarredRepos": "已星标的 GitHub 仓库",
"uname": "用户名", "uname": "用户名",
"wrongArgNum": "参数数量错误", "wrongArgNum": "参数数量错误",
"xIsTrackOnly": "{}为“仅追踪”模式", "xIsTrackOnly": "{}为“仅追踪”模式",
"source": "源代码", "source": "源",
"app": "应用", "app": "应用",
"appsFromSourceAreTrackOnly": "此来源的应用为“仅追踪”模式。", "appsFromSourceAreTrackOnly": "此来源的应用为“仅追踪”模式。",
"youPickedTrackOnly": "您选择了“仅追踪”。", "youPickedTrackOnly": "您选择了“仅追踪”。",
@ -46,12 +41,12 @@
"appSourceURL": "来源 URL", "appSourceURL": "来源 URL",
"error": "错误", "error": "错误",
"add": "添加", "add": "添加",
"searchSomeSourcesLabel": "搜索(仅部分来源)", "searchSomeSourcesLabel": "搜索(仅支持部分来源)",
"search": "搜索", "search": "搜索",
"additionalOptsFor": "{} 的更多选项", "additionalOptsFor": "{} 的更多选项",
"supportedSourcesBelow": "支持的来源", "supportedSources": "支持的来源",
"trackOnlyInBrackets": "(仅追踪)", "trackOnlyInBrackets": "仅追踪",
"searchableInBrackets": "(可搜索)", "searchableInBrackets": "可搜索",
"appsString": "应用列表", "appsString": "应用列表",
"noApps": "无应用", "noApps": "无应用",
"noAppsForFilter": "没有符合条件的应用", "noAppsForFilter": "没有符合条件的应用",
@ -59,17 +54,16 @@
"percentProgress": "进度:{}%", "percentProgress": "进度:{}%",
"pleaseWait": "请稍候", "pleaseWait": "请稍候",
"updateAvailable": "更新可用", "updateAvailable": "更新可用",
"estimateInBracketsShort": "(推测)",
"notInstalled": "未安装", "notInstalled": "未安装",
"estimateInBrackets": "(推测)", "pseudoVersion": "虚拟版本号",
"selectAll": "全选", "selectAll": "全选",
"deselectN": "取消选择 {}", "deselectX": "取消选择 {}",
"xWillBeRemovedButRemainInstalled": "{} 将从 Obtainium 中删除,但仍安装在您的设备中。", "xWillBeRemovedButRemainInstalled": "{}将从 Obtainium 中删除,但仍安装在您的设备中。",
"removeSelectedAppsQuestion": "是否删除选中的应用?", "removeSelectedAppsQuestion": "是否删除选中的应用?",
"removeSelectedApps": "删除选中的应用", "removeSelectedApps": "删除选中的应用",
"updateX": "更新 {}", "updateX": "更新 {}",
"installX": "安装 {}", "installX": "安装 {}",
"markXTrackOnlyAsUpdated": "将 {}\n仅追踪\n标记为已更新", "markXTrackOnlyAsUpdated": "将{}\n仅追踪\n标记为已更新",
"changeX": "更改 {}", "changeX": "更改 {}",
"installUpdateApps": "安装/更新应用", "installUpdateApps": "安装/更新应用",
"installUpdateSelectedApps": "安装/更新选中的应用", "installUpdateSelectedApps": "安装/更新选中的应用",
@ -81,13 +75,14 @@
"unpinFromTop": "取消置顶", "unpinFromTop": "取消置顶",
"resetInstallStatusForSelectedAppsQuestion": "是否重置选中应用的安装状态?", "resetInstallStatusForSelectedAppsQuestion": "是否重置选中应用的安装状态?",
"installStatusOfXWillBeResetExplanation": "选中应用的安装状态将会被重置。\n\n当更新安装失败或其他问题导致 Obtainium 中的应用版本显示错误时,可以尝试通过此方法解决。", "installStatusOfXWillBeResetExplanation": "选中应用的安装状态将会被重置。\n\n当更新安装失败或其他问题导致 Obtainium 中的应用版本显示错误时,可以尝试通过此方法解决。",
"customLinkMessage": "分享链接仅适用于已安装 Obtainium 的设备",
"shareAppConfigLinks": "通过链接分享应用配置",
"shareSelectedAppURLs": "分享选中应用的 URL", "shareSelectedAppURLs": "分享选中应用的 URL",
"resetInstallStatus": "重置安装状态", "resetInstallStatus": "重置安装状态",
"more": "更多", "more": "更多",
"removeOutdatedFilter": "删除失效的应用筛选", "removeOutdatedFilter": "删除失效的应用筛选",
"showOutdatedOnly": "只显示待更新应用", "showOutdatedOnly": "只显示待更新应用",
"filter": "筛选", "filter": "筛选",
"filterActive": "筛选 *",
"filterApps": "筛选应用", "filterApps": "筛选应用",
"appName": "应用名称", "appName": "应用名称",
"author": "作者", "author": "作者",
@ -96,22 +91,21 @@
"importExport": "导入/导出", "importExport": "导入/导出",
"settings": "设置", "settings": "设置",
"exportedTo": "已导出至 {}", "exportedTo": "已导出至 {}",
"obtainiumExport": "Obtainium 导出", "obtainiumExport": "导出 Obtainium",
"invalidInput": "无效的输入", "invalidInput": "无效的输入",
"importedX": "已导入 {}", "importedX": "已导入 {}",
"obtainiumImport": "Obtainium 导入", "obtainiumImport": "导入 Obtainium",
"importFromURLList": "从 URL 列表导入", "importFromURLList": "从 URL 列表导入",
"searchQuery": "搜索查询", "searchQuery": "搜索查询",
"appURLList": "应用 URL 列表", "appURLList": "应用 URL 列表",
"line": "行", "line": "行",
"searchX": "搜索 {}", "searchX": "搜索{}",
"noResults": "无结果", "noResults": "无结果",
"importX": "导入 {}", "importX": "导入{}",
"importedAppsIdDisclaimer": "导入的应用可能会错误地显示为“未安装”状态。\n请通过 Obtainium 重新安装这些应用来解决此问题。", "importedAppsIdDisclaimer": "导入的应用可能会错误地显示为“未安装”状态。\n请通过 Obtainium 重新安装这些应用来解决此问题。",
"importErrors": "导入错误", "importErrors": "导入错误",
"importedXOfYApps": "已导入 {} 中的 {} 个应用。", "importedXOfYApps": "已导入 {} 中的 {} 个应用。",
"followingURLsHadErrors": "下列 URL 存在错误:", "followingURLsHadErrors": "下列 URL 存在错误:",
"okay": "好的",
"selectURL": "选择 URL", "selectURL": "选择 URL",
"selectURLs": "选择 URL", "selectURLs": "选择 URL",
"pick": "选择", "pick": "选择",
@ -119,8 +113,7 @@
"dark": "深色", "dark": "深色",
"light": "浅色", "light": "浅色",
"followSystem": "跟随系统", "followSystem": "跟随系统",
"obtainium": "Obtainium", "followSystemThemeExplanation": "跟随系统主题仅在使用第三方应用时有效",
"materialYou": "Material You",
"useBlackTheme": "使用纯黑深色主题", "useBlackTheme": "使用纯黑深色主题",
"appSortBy": "排序依据", "appSortBy": "排序依据",
"authorName": "作者 / 应用名称", "authorName": "作者 / 应用名称",
@ -132,7 +125,7 @@
"bgUpdateCheckInterval": "后台更新检查间隔", "bgUpdateCheckInterval": "后台更新检查间隔",
"neverManualOnly": "手动", "neverManualOnly": "手动",
"appearance": "外观", "appearance": "外观",
"showWebInAppView": "应用详情页显示来源网", "showWebInAppView": "应用详情页显示来源网站内容",
"pinUpdates": "将待更新应用置顶", "pinUpdates": "将待更新应用置顶",
"updates": "更新", "updates": "更新",
"sourceSpecific": "来源", "sourceSpecific": "来源",
@ -144,23 +137,25 @@
"appNotFound": "未找到应用", "appNotFound": "未找到应用",
"obtainiumExportHyphenatedLowercase": "obtainium-export", "obtainiumExportHyphenatedLowercase": "obtainium-export",
"pickAnAPK": "选择一个 APK 文件", "pickAnAPK": "选择一个 APK 文件",
"appHasMoreThanOnePackage": "{} 有多个架构可用:", "appHasMoreThanOnePackage": "{}有多个架构可用:",
"deviceSupportsXArch": "您的设备支持 {} 架构。", "deviceSupportsXArch": "您的设备支持 {} 架构。",
"deviceSupportsFollowingArchs": "您的设备支持下列架构:", "deviceSupportsFollowingArchs": "您的设备支持下列架构:",
"warning": "警告", "warning": "警告",
"sourceIsXButPackageFromYPrompt": "此应用的来源是“{}”,但 APK 文件来自“{}”。是否继续?", "sourceIsXButPackageFromYPrompt": "此应用的来源是“{}”,但 APK 文件来自“{}”。是否继续?",
"updatesAvailable": "更新可用", "updatesAvailable": "更新可用",
"updatesAvailableNotifDescription": "Obtainium 追踪的应用有更新时发通知", "updatesAvailableNotifDescription": "Obtainium 追踪的应用有更新时发通知",
"noNewUpdates": "全部应用已是最新。", "noNewUpdates": "全部应用已是最新。",
"xHasAnUpdate": "{} 可以更新了。", "xHasAnUpdate": "{}可以更新了。",
"appsUpdated": "应用已更新", "appsUpdated": "应用已更新",
"appsUpdatedNotifDescription": "当应用在后台安装更新时发出通知", "appsNotUpdated": "更新应用失败",
"xWasUpdatedToY": "{} 已更新至 {}。", "appsUpdatedNotifDescription": "当应用在后台安装更新时发送通知",
"xWasUpdatedToY": "“{}”已更新至 {}。",
"xWasNotUpdatedToY": "未能将 {} 更新为 {}。",
"errorCheckingUpdates": "检查更新出错", "errorCheckingUpdates": "检查更新出错",
"errorCheckingUpdatesNotifDescription": "当后台检查更新失败时显示的通知", "errorCheckingUpdatesNotifDescription": "当后台检查更新失败时显示的通知",
"appsRemoved": "应用已删除", "appsRemoved": "应用已删除",
"appsRemovedNotifDescription": "当应用因加载出错而被删除时发通知", "appsRemovedNotifDescription": "当应用因加载出错而被删除时发通知",
"xWasRemovedDueToErrorY": "{} 由于以下错误被删除:{}", "xWasRemovedDueToErrorY": "{}由于以下错误被删除:{}",
"completeAppInstallation": "完成应用安装", "completeAppInstallation": "完成应用安装",
"obtainiumMustBeOpenToInstallApps": "必须启动 Obtainium 才能安装应用", "obtainiumMustBeOpenToInstallApps": "必须启动 Obtainium 才能安装应用",
"completeAppInstallationNotifDescription": "提示返回 Obtainium 以完成应用的安装", "completeAppInstallationNotifDescription": "提示返回 Obtainium 以完成应用的安装",
@ -168,7 +163,7 @@
"checkingForUpdatesNotifDescription": "检查更新时短暂显示的通知", "checkingForUpdatesNotifDescription": "检查更新时短暂显示的通知",
"pleaseAllowInstallPerm": "请授予 Obtainium 安装应用的权限", "pleaseAllowInstallPerm": "请授予 Obtainium 安装应用的权限",
"trackOnly": "仅追踪", "trackOnly": "仅追踪",
"errorWithHttpStatusCode": "错误 {}", "errorWithHttpStatusCode": "{} 错误",
"versionCorrectionDisabled": "禁用版本号更正(插件似乎未起作用)", "versionCorrectionDisabled": "禁用版本号更正(插件似乎未起作用)",
"unknown": "未知", "unknown": "未知",
"none": "无", "none": "无",
@ -180,13 +175,10 @@
"yesMarkUpdated": "是,标记为已更新", "yesMarkUpdated": "是,标记为已更新",
"fdroid": "F-Droid 官方存储库", "fdroid": "F-Droid 官方存储库",
"appIdOrName": "应用 ID 或名称", "appIdOrName": "应用 ID 或名称",
"appId": "App ID", "appId": "应用 ID",
"appWithIdOrNameNotFound": "未找到符合此 ID 或名称的应用", "appWithIdOrNameNotFound": "未找到符合此 ID 或名称的应用",
"reposHaveMultipleApps": "存储库中可能包含多个应用", "reposHaveMultipleApps": "存储库中可能包含多个应用",
"fdroidThirdPartyRepo": "F-Droid 第三方存储库", "fdroidThirdPartyRepo": "F-Droid 第三方存储库",
"steam": "Steam",
"steamMobile": "Steam Mobile",
"steamChat": "Steam Chat",
"install": "安装", "install": "安装",
"markInstalled": "标记为已安装", "markInstalled": "标记为已安装",
"update": "更新", "update": "更新",
@ -194,74 +186,154 @@
"additionalOptions": "附加选项", "additionalOptions": "附加选项",
"disableVersionDetection": "禁用版本检测", "disableVersionDetection": "禁用版本检测",
"noVersionDetectionExplanation": "此选项应该仅用于无法进行版本检测的应用。", "noVersionDetectionExplanation": "此选项应该仅用于无法进行版本检测的应用。",
"downloadingX": "正在下载{}", "downloadingX": "正在下载 {}",
"downloadX": "下载 {}",
"downloadedX": "已下载 {}",
"releaseAsset": "发行文件",
"downloadNotifDescription": "提示应用的下载进度", "downloadNotifDescription": "提示应用的下载进度",
"noAPKFound": "未找到 APK 文件", "noAPKFound": "未找到 APK 文件",
"noVersionDetection": "禁用版本检测", "noVersionDetection": "禁用版本检测",
"categorize": "类", "categorize": "类",
"categories": "类别", "categories": "类别",
"category": "类别", "category": "类别",
"noCategory": "无类别", "noCategory": "无类别",
"noCategories": "无类别", "noCategories": "无类别",
"deleteCategoriesQuestion": "是否删除选中的类别?", "deleteCategoriesQuestion": "是否删除选中的类别?",
"categoryDeleteWarning": "被删除类别的应用将恢复为未分类状态。", "categoryDeleteWarning": "被删除类别的应用将恢复为未分类状态。",
"addCategory": "添加类别", "addCategory": "添加类别",
"label": "标签", "label": "标签",
"language": "语言", "language": "语言",
"copiedToClipboard": "已复制至剪贴板", "copiedToClipboard": "已复制至剪贴板",
"storagePermissionDenied": "已拒绝授予存储权限", "storagePermissionDenied": "已拒绝授予存储权限",
"selectedCategorizeWarning": "这将覆盖选中应用当前的类别设置。", "selectedCategorizeWarning": "这将覆盖选中应用当前的类别设置。",
"filterAPKsByRegEx": "使用正则表达式筛选 APK 文件", "filterAPKsByRegEx": "筛选 APK 文件的正则表达式",
"removeFromObtainium": "从 Obtainium 中删除", "removeFromObtainium": "从 Obtainium 中删除",
"uninstallFromDevice": "从设备中卸载", "uninstallFromDevice": "从设备中卸载",
"onlyWorksWithNonVersionDetectApps": "仅适用于禁用版本检测的应用。", "onlyWorksWithNonVersionDetectApps": "仅适用于禁用版本检测的应用。",
"releaseDateAsVersion": "将发行日期作为版本号", "releaseDateAsVersion": "将发行日期作为版本号",
"releaseTitleAsVersion": "使用版本标题作为版本字符串",
"releaseDateAsVersionExplanation": "此选项应该仅用于无法进行版本检测但能够获取发行日期的应用。", "releaseDateAsVersionExplanation": "此选项应该仅用于无法进行版本检测但能够获取发行日期的应用。",
"changes": "更新日志", "changes": "更新日志",
"releaseDate": "发行日期", "releaseDate": "发行日期",
"importFromURLsInFile": "从文件中的 URL 导入(如 OPML", "importFromURLsInFile": "从文件中的 URL 导入(如 OPML",
"versionDetectionExplanation": "使发行版本号与应用定义的版本号一致",
"versionDetection": "版本检测", "versionDetection": "版本检测",
"standardVersionDetection": "常规版本检测", "standardVersionDetection": "常规版本检测",
"groupByCategory": "按类别分组显示", "groupByCategory": "按类别分组显示",
"autoApkFilterByArch": "如果可能,尝试按设备支持的 CPU 架构筛选 APK 文件", "autoApkFilterByArch": "如果可能,尝试按设备支持的 CPU 架构筛选 APK 文件",
"overrideSource": "覆盖来源", "overrideSource": "覆盖来源",
"dontShowAgain": "不再显示", "dontShowAgain": "不再显示",
"dontShowTrackOnlyWarnings": "不显示“仅追踪”模式警告", "dontShowTrackOnlyWarnings": "忽略“仅追踪”模式警告",
"dontShowAPKOriginWarnings": "不显示 APK 文件来源警告", "dontShowAPKOriginWarnings": "忽略 APK 文件来源警告",
"moveNonInstalledAppsToBottom": "将未安装应用置底", "moveNonInstalledAppsToBottom": "将未安装应用置底",
"gitlabPATLabel": "GitLab 个人访问令牌\n启用搜索功能并增强 APK 发现)", "gitlabPATLabel": "GitLab 个人访问令牌",
"about": "相关文档", "about": "相关文档",
"requiresCredentialsInSettings": "此功能需要额外的凭据(在“设置”中添加)", "requiresCredentialsInSettings": "{}此功能需要额外的凭据(在“设置”中添加)",
"checkOnStart": "启动时进行一次检查", "checkOnStart": "启动时进行一次检查",
"tryInferAppIdFromCode": "尝试从源代码推断应用 ID", "tryInferAppIdFromCode": "尝试从源代码推断应用 ID",
"removeOnExternalUninstall": "自动删除已卸载的外部应用", "removeOnExternalUninstall": "自动删除列表中已卸载的应用",
"pickHighestVersionCode": "自动选版本号最高的 APK 文件", "pickHighestVersionCode": "自动选取内部版本号最高的 APK 文件",
"checkUpdateOnDetailPage": "打开应用详情页时检查更新", "checkUpdateOnDetailPage": "打开应用详情页时进行检查",
"disablePageTransitions": "禁用页面过渡动画效果", "disablePageTransitions": "禁用页面过渡动画效果",
"reversePageTransitions": "反转页面过渡动画效果", "reversePageTransitions": "反转页面过渡动画效果",
"minStarCount": "最小星标数", "minStarCount": "最小星标数",
"addInfoBelow": "在下方添加此凭据。", "addInfoBelow": "在下方添加此凭据。",
"addInfoInSettings": "在“设置”中添加此凭据。", "addInfoInSettings": "在“设置”中添加此凭据。",
"githubSourceNote": "使用访问令牌可避免触发 GitHub 的 API 请求限制。", "githubSourceNote": "使用访问令牌可避免触发 GitHub 的 API 请求限制。",
"gitlabSourceNote": "未使用访问令牌时可能无法从 GitLab 获取 APK 文件。", "sortByLastLinkSegment": "仅根据链接的末尾部分进行筛选",
"sortByFileNamesNotLinks": "Sort by file names instead of full links", "filterReleaseNotesByRegEx": "筛选发行说明的正则表达式",
"filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", "customLinkFilterRegex": "筛选自定义来源的 APK 文件链接\n正则表达式默认匹配模式为“.apk$”)",
"customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", "appsPossiblyUpdated": "已尝试更新应用",
"appsPossiblyUpdatedNotifDescription": "当应用已尝试在后台更新时发送通知",
"xWasPossiblyUpdatedToY": "已尝试将“{}”更新至 {}。",
"enableBackgroundUpdates": "启用全局后台更新",
"backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。",
"backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。",
"verifyLatestTag": "验证“Latest”标签",
"intermediateLinkRegex": "筛选中转链接的正则表达式",
"filterByLinkText": "根据链接文本进行筛选",
"intermediateLinkNotFound": "未找到中转链接",
"intermediateLink": "中转链接",
"exemptFromBackgroundUpdates": "禁用后台更新(仅此应用生效,即使已启用全局后台更新)",
"bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新",
"bgUpdatesWhileChargingOnly": "不充电时禁用后台更新",
"autoSelectHighestVersionCode": "自动选择内部版本号最高的 APK 文件",
"versionExtractionRegEx": "提取版本号的正则表达式",
"trimVersionString": "使用 RegEx 修剪版本字符串",
"matchGroupToUseForX": "用于\"{}\"的匹配组",
"matchGroupToUse": "从上述匹配结果中引用的捕获组",
"highlightTouchTargets": "突出展示不明显的可交互区域",
"pickExportDir": "选择导出文件夹",
"autoExportOnChanges": "数据变更时自动导出",
"includeSettings": "同时导出应用设置",
"filterVersionsByRegEx": "筛选版本号的正则表达式",
"trySelectingSuggestedVersionCode": "尝试选择推荐版本的 APK 文件",
"dontSortReleasesList": "保持来自 API 的发行顺序",
"reverseSort": "反转排序",
"takeFirstLink": "选取第一个链接",
"skipSort": "不进行排序",
"debugMenu": "调试选项",
"bgTaskStarted": "后台任务已启动 - 详见日志",
"runBgCheckNow": "立即进行后台更新检查",
"versionExtractWholePage": "将版本号提取规则应用于完整页面",
"installing": "正在安装",
"skipUpdateNotifications": "忽略更新通知",
"updatesAvailableNotifChannel": "更新可用",
"appsUpdatedNotifChannel": "应用已更新",
"appsPossiblyUpdatedNotifChannel": "已尝试更新应用",
"errorCheckingUpdatesNotifChannel": "检查更新出错",
"appsRemovedNotifChannel": "应用已删除",
"downloadingXNotifChannel": "正在下载“{}”",
"completeAppInstallationNotifChannel": "完成应用安装",
"checkingForUpdatesNotifChannel": "正在检查更新",
"onlyCheckInstalledOrTrackOnlyApps": "只检查已安装和“仅追踪”的应用",
"supportFixedAPKURL": "支持固定的 APK 文件链接",
"selectX": "选择{}",
"parallelDownloads": "启用并行下载",
"useShizuku": "使用 Shizuku 或 Sui 安装",
"shizukuBinderNotFound": "未发现兼容的 Shizuku 服务",
"shizukuOld": "Shizuku 版本过低(<11- 请更新",
"shizukuOldAndroidWithADB": "正在低版本 Android<8.1)系统中以 ADB 模式运行 Shizuku - 请更新 Android 系统版本或使用 Sui 代替",
"shizukuPretendToBeGooglePlay": "将安装来源伪装为 Google Play需要使用 Shizuku",
"useSystemFont": "使用系统字体",
"useVersionCodeAsOSVersion": "使用内部版本号代替应用定义的版本号",
"requestHeader": "请求标头",
"useLatestAssetDateAsReleaseDate": "使用最新文件上传时间作为发行日期",
"defaultPseudoVersioningMethod": "默认虚拟版本方案",
"partialAPKHash": "APK 文件散列值片段",
"APKLinkHash": "APK 文件链接散列值",
"directAPKLink": "APK 文件直链",
"pseudoVersionInUse": "正在使用虚拟版本号",
"installed": "当前版本",
"latest": "最新版本",
"invertRegEx": "反转匹配",
"note": "备注",
"selfHostedNote": "可以通过“{}”下拉菜单来指向任意来源的自托管/自定义实例。",
"badDownload": "无法解析 APK 文件(不兼容或文件不完整)",
"beforeNewInstallsShareToAppVerifier": "通过 AppVerifier 校验新应用(如果可用)",
"appVerifierInstructionToast": "分享至 AppVerifier完成后返回此处。",
"wiki": "帮助/Wiki",
"crowdsourcedConfigsLabel": "众包应用程序配置(使用风险自负)",
"crowdsourcedConfigsShort": "众包应用程序配置",
"allowInsecure": "允许不安全的 HTTP 请求",
"stayOneVersionBehind": "比最新版本晚一个版本",
"refreshBeforeDownload": "下载前刷新应用程序详细信息",
"tencentAppStore": "腾讯应用宝",
"removeAppQuestion": { "removeAppQuestion": {
"one": "是否删除应用?", "one": "是否删除应用?",
"other": "是否删除应用?" "other": "是否删除应用?"
}, },
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {
"one": "API 请求过于频繁(速率限制)- 在 {} 分钟后重试", "one": "API 请求过于频繁(速率限制)- 在 {} 分钟后重试",
"other": "API 请求过于频繁(速率限制)- 在 {} 分钟后重试" "other": "API 请求过于频繁(速率限制)- 在 {} 分钟后重试"
}, },
"bgUpdateGotErrorRetryInMinutes": { "bgUpdateGotErrorRetryInMinutes": {
"one": "后台更新检查遇到了“{}”问题,预定于 {} 分钟后重试", "one": "后台更新检查遇到了“{}”问题,于 {} 分钟后重试",
"other": "后台更新检查遇到了“{}”问题,预定于 {} 分钟后重试" "other": "后台更新检查遇到了“{}”问题,于 {} 分钟后重试"
}, },
"bgCheckFoundUpdatesWillNotifyIfNeeded": { "bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "后台检查发现 {} 个应用更新 - 如有需要将发通知", "one": "后台检查发现 {} 个应用更新 - 如有需要将发通知",
"other": "后台检查发现 {} 个应用更新 - 如有需要将发通知" "other": "后台检查发现 {} 个应用更新 - 如有需要将发通知"
}, },
"apps": { "apps": {
"one": "{} 个应用", "one": "{} 个应用",
@ -288,11 +360,23 @@
"other": "清除了 {n} 个日志({before} 之前,{after} 之后)" "other": "清除了 {n} 个日志({before} 之前,{after} 之后)"
}, },
"xAndNMoreUpdatesAvailable": { "xAndNMoreUpdatesAvailable": {
"one": "{} 和另外 1 个应用可以更新了。", "one": "{}和另外 1 个应用可以更新了。",
"other": "{} 和另外 {} 个应用可以更新了。" "other": "{}和另外 {} 个应用可以更新了。"
}, },
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "{} 和另外 1 个应用已更新。", "one": "{} 和另外 1 个应用已更新。",
"other": "{} 和另外 {} 个应用已更新。" "other": "{}和另外 {} 个应用已更新。"
},
"xAndNMoreUpdatesFailed": {
"one": "{} 和另外 1 个应用更新失败。",
"other": "{} 和另外 {} 个应用更新失败。"
},
"xAndNMoreUpdatesPossiblyInstalled": {
"one": "{} 和另外 1 个应用已尝试更新。",
"other": "“{}”和另外 {} 个应用已尝试更新。"
},
"apk": {
"one": "{}APK",
"other": "{}APK"
} }
} }

27
build.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/bash
# Convenience script
CURR_DIR="$(pwd)"
trap "cd "$CURR_DIR"" EXIT
if [ -z "$1" ]; then
git fetch && git merge origin/main && git push # Typically run after a PR to main, so bring dev up to date
fi
cd .flutter
git fetch
git checkout "$(flutter --version | head -2 | tail -1 | awk '{print $4}')" # Ensure included Flutter submodule version equals my environment
cd ..
rm ./build/app/outputs/flutter-apk/* 2>/dev/null # Get rid of older builds if any
flutter build apk --flavor normal && flutter build apk --split-per-abi --flavor normal # Build (both split and combined APKs)
for file in ./build/app/outputs/flutter-apk/app-*normal*.apk*; do mv "$file" "${file//-normal/}"; done
flutter build apk --flavor fdroid -t lib/main_fdroid.dart && # Do the same for the F-Droid flavour
flutter build apk --split-per-abi --flavor fdroid -t lib/main_fdroid.dart
for file in ./build/app/outputs/flutter-apk/*.sha1; do gpg --sign --detach-sig "$file"; done # Generate PGP signatures
rsync -r ./build/app/outputs/flutter-apk/ ~/Downloads/Obtainium-build/ # Dropoff in Downloads to allow for drag-drop into Flatpak Firefox
cd ~/Downloads/Obtainium-build/ # Make zips just in case (for in-comment uploads)
for apk in *.apk; do
PREFIX="$(echo "$apk" | head -c -5)"
zip "$PREFIX" "$PREFIX"*
done
mkdir -p zips
mv *.zip zips/

View File

@ -0,0 +1,46 @@
<p>Obtainium allows you to install and update Apps directly from their releases pages, and receive notifications when new releases are made available.</p>
<p>Read the <a href="https://wiki.obtainium.imranr.dev/">Wiki</a></p>
<p>
<b>Currently supported App sources:</b>
</p>
<ul>
<li>
<p>Open Source - General:</p>
<ul>
<li>GitHub</li>
<li>GitLab</li>
<li>Forgejo (Codeberg)</li>
<li>F-Droid</li>
<li>Third Party F-Droid Repos</li>
<li>IzzyOnDroid</li>
<li>SourceHut</li>
</ul>
</li>
<li>
<p>Other - General:</p>
<ul>
<li>APKPure</li>
<li>Aptoide</li>
<li>Uptodown</li>
<li>APKMirror (Track-Only)</li>
<li>Huawei AppGallery</li>
<li>Tencent App Store</li>
<li>Jenkins Jobs</li>
<li>RuStore</li>
</ul>
</li>
<li>
<p>Other - App-Specific:</p>
<ul>
<li>Telegram App</li>
<li>Neutron Code</li>
</ul>
</li>
<li><p>"HTML" (Fallback): Any other URL that returns an HTML page with links to APK files</p></li>
</ul>
<p>
<b>Limitations:</b>
</p>
<p>
For some sources, data is gathered using Web scraping and can easily break due to changes in website design. In such cases, more reliable methods may be unavailable.
</p>

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

View File

@ -0,0 +1 @@
Get Android app updates directly from the source

View File

@ -0,0 +1 @@
Obtainium

View File

@ -0,0 +1,46 @@
<p>Obtainium позволяет вам устанавливать и обновлять приложения прямо с их объявлений о выпусках и получать уведомления о новых выпусках.</p>
<p>Для деталей читайте <a href="https://wiki.obtainium.imranr.dev/">Вики</a></p>
<p>
<b>Поддерживаемые источники приложений:</b>
</p>
<ul>
<li>
<p>Свободное ПО - Общие:</p>
<ul>
<li>GitHub</li>
<li>GitLab</li>
<li>Forgejo (Codeberg)</li>
<li>F-Droid</li>
<li>Third Party F-Droid Repos</li>
<li>IzzyOnDroid</li>
<li>SourceHut</li>
</ul>
</li>
<li>
<p>Другие - Общие:</p>
<ul>
<li>APKPure</li>
<li>Aptoide</li>
<li>Uptodown</li>
<li>APKMirror (Track-Only)</li>
<li>Huawei AppGallery</li>
<li>Tencent App Store</li>
<li>Jenkins Jobs</li>
<li>RuStore</li>
</ul>
</li>
<li>
<p>Другие - Для отдельных приложений:</p>
<ul>
<li>Telegram App</li>
<li>Neutron Code</li>
</ul>
</li>
<li><p>"HTML" (Подстраховка): Любой другой URL-адрес, который возвращает HTML-страницу со ссылками на APK-файлы.</p></li>
</ul>
<p>
<b>Ограничения:</b>
</p>
<p>
Для некоторых источников данные собираются с помощью веб-скрапинга и могут легко сломаться из-за изменений в дизайне веб-сайта. В таких случаях более надежные методы могут быть недоступны.
</p>

View File

@ -0,0 +1 @@
Получайте обновления приложений прямо из источника

View File

@ -5,17 +5,20 @@ import 'package:obtainium/providers/source_provider.dart';
class APKCombo extends AppSource { class APKCombo extends AppSource {
APKCombo() { APKCombo() {
host = 'apkcombo.com'; hosts = ['apkcombo.com'];
showReleaseDateAsVersionToggle = true;
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp('^https?://$host/+[^/]+/+[^/]+'); RegExp standardUrlRegEx = RegExp(
var match = standardUrlRegEx.firstMatch(url.toLowerCase()); '^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+[^/]+',
caseSensitive: false);
var match = standardUrlRegEx.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
@ -25,15 +28,20 @@ class APKCombo extends AppSource {
} }
@override @override
Map<String, String> get requestHeaders => { Future<Map<String, String>?> getRequestHeaders(
"User-Agent": "curl/8.0.1", Map<String, dynamic> additionalSettings,
"Accept": "*/*", {bool forAPKDownload = false}) async {
"Connection": "keep-alive", return {
"Host": "$host" "User-Agent": "curl/8.0.1",
}; "Accept": "*/*",
"Connection": "keep-alive",
"Host": hosts[0]
};
}
Future<List<MapEntry<String, String>>> getApkUrls(String standardUrl) async { Future<List<MapEntry<String, String>>> getApkUrls(
var res = await sourceRequest('$standardUrl/download/apk'); String standardUrl, Map<String, dynamic> additionalSettings) async {
var res = await sourceRequest('$standardUrl/download/apk', {});
if (res.statusCode != 200) { if (res.statusCode != 200) {
throw getObtainiumHttpError(res); throw getObtainiumHttpError(res);
} }
@ -66,9 +74,9 @@ class APKCombo extends AppSource {
} }
@override @override
Future<String> apkUrlPrefetchModifier( Future<String> apkUrlPrefetchModifier(String apkUrl, String standardUrl,
String apkUrl, String standardUrl) async { Map<String, dynamic> additionalSettings) async {
var freshURLs = await getApkUrls(standardUrl); var freshURLs = await getApkUrls(standardUrl, additionalSettings);
var path2Match = Uri.parse(apkUrl).path; var path2Match = Uri.parse(apkUrl).path;
for (var url in freshURLs) { for (var url in freshURLs) {
if (Uri.parse(url.value).path == path2Match) { if (Uri.parse(url.value).path == path2Match) {
@ -84,7 +92,7 @@ class APKCombo extends AppSource {
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
String appId = (await tryInferringAppId(standardUrl))!; String appId = (await tryInferringAppId(standardUrl))!;
var preres = await sourceRequest(standardUrl); var preres = await sourceRequest(standardUrl, additionalSettings);
if (preres.statusCode != 200) { if (preres.statusCode != 200) {
throw getObtainiumHttpError(preres); throw getObtainiumHttpError(preres);
} }
@ -108,7 +116,9 @@ class APKCombo extends AppSource {
} }
} }
return APKDetails( return APKDetails(
version, await getApkUrls(standardUrl), AppNames(author, appName), version,
await getApkUrls(standardUrl, additionalSettings),
AppNames(author, appName),
releaseDate: releaseDate); releaseDate: releaseDate);
} }
} }

View File

@ -5,12 +5,15 @@ import 'package:html/parser.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/apps_provider.dart';
import 'package:obtainium/providers/settings_provider.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
class APKMirror extends AppSource { class APKMirror extends AppSource {
APKMirror() { APKMirror() {
host = 'apkmirror.com'; hosts = ['apkmirror.com'];
enforceTrackOnly = true; enforceTrackOnly = true;
showReleaseDateAsVersionToggle = true;
additionalSourceAppSpecificSettingFormItems = [ additionalSourceAppSpecificSettingFormItems = [
[ [
@ -31,13 +34,25 @@ class APKMirror extends AppSource {
} }
@override @override
String sourceSpecificStandardizeURL(String url) { Future<Map<String, String>?> getRequestHeaders(
RegExp standardUrlRegEx = RegExp('^https?://$host/apk/[^/]+/[^/]+'); Map<String, dynamic> additionalSettings,
RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase()); {bool forAPKDownload = false}) async {
return {
"User-Agent":
"Obtainium/${(await getInstalledInfo(obtainiumId))?.versionName ?? '1.0.0'}"
};
}
@override
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp(
'^https?://(www\\.)?${getSourceRegex(hosts)}/apk/[^/]+/[^/]+',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
@ -57,7 +72,7 @@ class APKMirror extends AppSource {
true true
? additionalSettings['filterReleaseTitlesByRegEx'] ? additionalSettings['filterReleaseTitlesByRegEx']
: null; : null;
Response res = await sourceRequest('$standardUrl/feed'); Response res = await sourceRequest('$standardUrl/feed', additionalSettings);
if (res.statusCode == 200) { if (res.statusCode == 200) {
var items = parse(res.body).querySelectorAll('item'); var items = parse(res.body).querySelectorAll('item');
dynamic targetRelease; dynamic targetRelease;
@ -83,7 +98,7 @@ class APKMirror extends AppSource {
dateString != null ? HttpDate.parse('$dateString GMT') : null; dateString != null ? HttpDate.parse('$dateString GMT') : null;
String? version = titleString String? version = titleString
?.substring(RegExp('[0-9]').firstMatch(titleString)?.start ?? 0, ?.substring(RegExp('[0-9]').firstMatch(titleString)?.start ?? 0,
RegExp(' by ').firstMatch(titleString)?.start ?? 0) RegExp(' by ').allMatches(titleString).last.start)
.trim(); .trim();
if (version == null || version.isEmpty) { if (version == null || version.isEmpty) {
version = titleString; version = titleString;

View File

@ -1,26 +1,62 @@
import 'package:device_info_plus/device_info_plus.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:html/parser.dart'; import 'package:html/parser.dart';
import 'package:obtainium/app_sources/html.dart';
import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
parseDateTimeMMMddCommayyyy(String? dateString) {
DateTime? releaseDate;
try {
releaseDate = dateString != null
? DateFormat('MMM dd, yyyy').parse(dateString)
: null;
releaseDate = dateString != null && releaseDate == null
? DateFormat('MMMM dd, yyyy').parse(dateString)
: releaseDate;
} catch (err) {
// ignore
}
return releaseDate;
}
class APKPure extends AppSource { class APKPure extends AppSource {
APKPure() { APKPure() {
host = 'apkpure.com'; hosts = ['apkpure.net', 'apkpure.com'];
allowSubDomains = true;
naiveStandardVersionDetection = true;
showReleaseDateAsVersionToggle = true;
additionalSourceAppSpecificSettingFormItems = [
[
GeneratedFormSwitch('fallbackToOlderReleases',
label: tr('fallbackToOlderReleases'), defaultValue: true)
],
[
GeneratedFormSwitch('stayOneVersionBehind',
label: tr('stayOneVersionBehind'), defaultValue: false)
]
];
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegExB = RegExp('^https?://m.$host/+[^/]+/+[^/]+'); RegExp standardUrlRegExB = RegExp(
RegExpMatch? match = standardUrlRegExB.firstMatch(url.toLowerCase()); '^https?://m.${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+',
caseSensitive: false);
RegExpMatch? match = standardUrlRegExB.firstMatch(url);
if (match != null) { if (match != null) {
url = 'https://$host/${Uri.parse(url).path}'; var uri = Uri.parse(url);
url = 'https://${uri.host.substring(2)}${uri.path}';
} }
RegExp standardUrlRegExA = RegExp('^https?://$host/+[^/]+/+[^/]+'); RegExp standardUrlRegExA = RegExp(
match = standardUrlRegExA.firstMatch(url.toLowerCase()); '^https?://(www\\.)?${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+',
caseSensitive: false);
match = standardUrlRegExA.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
@ -29,6 +65,98 @@ class APKPure extends AppSource {
return Uri.parse(standardUrl).pathSegments.last; return Uri.parse(standardUrl).pathSegments.last;
} }
getDetailsForVersionLink(
String standardUrl,
String appId,
String host,
List<String> supportedArchs,
String link,
Map<String, dynamic> additionalSettings) async {
var res = await sourceRequest(link, additionalSettings);
if (res.statusCode == 200) {
var html = parse(res.body);
var apksDiv =
html.querySelector('#version-list div div.show-more-content');
DateTime? topReleaseDate;
var apkUrls = apksDiv
?.querySelectorAll('div.group-title')
.map((e) {
String architectureString = e.text.trim();
if (architectureString.toLowerCase() == 'unlimited' ||
architectureString.toLowerCase() == 'universal') {
architectureString = '';
}
List<String> architectures = architectureString
.split(',')
.map((e) => e.trim())
.where((e) => e.isNotEmpty)
.toList();
// Only take the first APK for each architecture, ignore others for now, for simplicity
// Unclear why there can even be multiple APKs for the same version and arch
var apkInfo = e.nextElementSibling?.querySelector('div.info');
String? versionCode = RegExp('[0-9]+')
.firstMatch(
apkInfo?.querySelector('div.info-top .code')?.text ??
'')
?.group(0)
?.trim();
var types = apkInfo
?.querySelectorAll('div.info-top span.tag')
.map((e) => e.text.trim())
.map((t) => t == 'APKs' ? 'APK' : t) ??
[];
String type = types.isEmpty ? 'APK' : types.first;
String? dateString = apkInfo
?.querySelector('div.info-bottom span.time')
?.text
.trim();
DateTime? releaseDate = parseDateTimeMMMddCommayyyy(dateString);
if (additionalSettings['autoApkFilterByArch'] == true &&
architectures.isNotEmpty &&
architectures
.where((a) => supportedArchs.contains(a))
.isEmpty) {
return const MapEntry('', '');
}
topReleaseDate ??=
releaseDate; // Just use the release date of the first APK in the list as the release date for this version
return MapEntry(
'$appId-$versionCode-$architectureString.${type.toLowerCase()}',
'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?versionCode=$versionCode');
})
.where((e) => e.key.isNotEmpty)
.toList() ??
[];
if (apkUrls.isEmpty) {
throw NoAPKError();
}
String version = Uri.parse(link).pathSegments.last;
String? author;
try {
author = html
.querySelector('span.info-sdk')
?.text
.trim()
.substring(version.length + 4) ??
Uri.parse(standardUrl).pathSegments.reversed.last;
} catch (e) {
author = html.querySelector('span.info-sdk')?.text.trim() ??
Uri.parse(standardUrl).pathSegments.reversed.last;
}
String appName =
html.querySelector('h1.info-title')?.text.trim() ?? appId;
String? changeLog = html
.querySelector('div.module.change-log')
?.innerHtml
.trim()
.replaceAll("<br>", " \n");
return APKDetails(version, apkUrls, AppNames(author, appName),
releaseDate: topReleaseDate, changeLog: changeLog);
} else {
throw getObtainiumHttpError(res);
}
}
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, String standardUrl,
@ -36,47 +164,44 @@ class APKPure extends AppSource {
) async { ) async {
String appId = (await tryInferringAppId(standardUrl))!; String appId = (await tryInferringAppId(standardUrl))!;
String host = Uri.parse(standardUrl).host; String host = Uri.parse(standardUrl).host;
var res = await sourceRequest('$standardUrl/download');
var resChangelog = await sourceRequest(standardUrl); var res0 = await sourceRequest('$standardUrl/versions', additionalSettings);
if (res.statusCode == 200 && resChangelog.statusCode == 200) { var decodedStandardUrl = standardUrl;
var html = parse(res.body); try {
var htmlChangelog = parse(resChangelog.body); decodedStandardUrl = Uri.decodeFull(decodedStandardUrl);
String? version = html.querySelector('span.info-sdk span')?.text.trim(); } catch (e) {
if (version == null) { //
throw NoVersionError();
}
String? dateString =
html.querySelector('span.info-other span.date')?.text.trim();
DateTime? releaseDate;
try {
releaseDate = dateString != null
? DateFormat('MMM dd, yyyy').parse(dateString)
: null;
releaseDate = dateString != null && releaseDate == null
? DateFormat('MMMM dd, yyyy').parse(dateString)
: null;
} catch (err) {
// ignore
}
String type = html.querySelector('a.info-tag')?.text.trim() ?? 'APK';
List<MapEntry<String, String>> apkUrls = [
MapEntry('$appId.apk', 'https://d.$host/b/$type/$appId?version=latest')
];
String author = html
.querySelector('span.info-sdk')
?.text
.trim()
.substring(version.length + 4) ??
Uri.parse(standardUrl).pathSegments.reversed.last;
String appName =
html.querySelector('h1.info-title')?.text.trim() ?? appId;
String? changeLog = htmlChangelog.querySelector("div.whats-new-info p:not(.date)")?.innerHtml
.trim().replaceAll("<br>", " \n");
return APKDetails(version, apkUrls, AppNames(author, appName),
releaseDate: releaseDate,
changeLog: changeLog);
} else {
throw getObtainiumHttpError(res);
} }
var versionLinks = await grabLinksCommon(res0, {
'skipSort': true,
'customLinkFilterRegex': '$decodedStandardUrl/download/[^/]+\$'
});
var supportedArchs = (await DeviceInfoPlugin().androidInfo).supportedAbis;
if (additionalSettings['autoApkFilterByArch'] != true) {
// No need to request multiple versions when we're not going to filter them (always pick the top one)
versionLinks = versionLinks.sublist(0, 1);
}
if (versionLinks.isEmpty) {
throw NoReleasesError();
}
for (var i = 0; i < versionLinks.length; i++) {
var link = versionLinks[i];
try {
if (i == 0 && additionalSettings['stayOneVersionBehind'] == true) {
throw NoReleasesError();
}
return await getDetailsForVersionLink(standardUrl, appId, host,
supportedArchs, link.key, additionalSettings);
} catch (e) {
if (additionalSettings['fallbackToOlderReleases'] != true ||
i == versionLinks.length - 1) {
rethrow;
}
}
}
throw NoAPKError();
} }
} }

View File

@ -0,0 +1,82 @@
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
class Aptoide extends AppSource {
Aptoide() {
hosts = ['aptoide.com'];
name = 'Aptoide';
allowSubDomains = true;
naiveStandardVersionDetection = true;
showReleaseDateAsVersionToggle = true;
}
@override
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp(
'^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) {
throw InvalidURLError(name);
}
return match.group(0)!;
}
@override
Future<String?> tryInferringAppId(String standardUrl,
{Map<String, dynamic> additionalSettings = const {}}) async {
return (await getAppDetailsJSON(
standardUrl, additionalSettings))['package'];
}
Future<Map<String, dynamic>> getAppDetailsJSON(
String standardUrl, Map<String, dynamic> additionalSettings) async {
var res = await sourceRequest(standardUrl, additionalSettings);
if (res.statusCode != 200) {
throw getObtainiumHttpError(res);
}
var idMatch = RegExp('"app":{"id":[0-9]+').firstMatch(res.body);
String? id;
if (idMatch != null) {
id = res.body.substring(idMatch.start + 12, idMatch.end);
} else {
throw NoReleasesError();
}
var res2 = await sourceRequest(
'https://ws2.aptoide.com/api/7/getApp/app_id/$id', additionalSettings);
if (res2.statusCode != 200) {
throw getObtainiumHttpError(res);
}
return jsonDecode(res2.body)?['nodes']?['meta']?['data'];
}
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
var appDetails = await getAppDetailsJSON(standardUrl, additionalSettings);
String appName = appDetails['name'] ?? tr('app');
String author = appDetails['developer']?['name'] ?? name;
String? dateStr = appDetails['updated'];
String? version = appDetails['file']?['vername'];
String? apkUrl = appDetails['file']?['path'];
if (version == null) {
throw NoVersionError();
}
if (apkUrl == null) {
throw NoAPKError();
}
DateTime? relDate;
if (dateStr != null) {
relDate = DateTime.parse(dateStr);
}
return APKDetails(
version, getApkUrlsFromUrls([apkUrl]), AppNames(author, appName),
releaseDate: relDate);
}
}

View File

@ -5,7 +5,8 @@ import 'package:obtainium/providers/source_provider.dart';
class Codeberg extends AppSource { class Codeberg extends AppSource {
GitHub gh = GitHub(); GitHub gh = GitHub();
Codeberg() { Codeberg() {
host = 'codeberg.org'; name = 'Forgejo (Codeberg)';
hosts = ['codeberg.org'];
additionalSourceAppSpecificSettingFormItems = additionalSourceAppSpecificSettingFormItems =
gh.additionalSourceAppSpecificSettingFormItems; gh.additionalSourceAppSpecificSettingFormItems;
@ -15,13 +16,15 @@ class Codeberg extends AppSource {
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp('^https?://$host/[^/]+/[^/]+'); RegExp standardUrlRegEx = RegExp(
RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase()); '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
@ -35,7 +38,7 @@ class Codeberg extends AppSource {
) async { ) async {
return await gh.getLatestAPKDetailsCommon2(standardUrl, additionalSettings, return await gh.getLatestAPKDetailsCommon2(standardUrl, additionalSettings,
(bool useTagUrl) async { (bool useTagUrl) async {
return 'https://$host/api/v1/repos${standardUrl.substring('https://$host'.length)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100'; return 'https://${hosts[0]}/api/v1/repos${standardUrl.substring('https://${hosts[0]}'.length)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100';
}, null); }, null);
} }
@ -50,7 +53,7 @@ class Codeberg extends AppSource {
{Map<String, dynamic> querySettings = const {}}) async { {Map<String, dynamic> querySettings = const {}}) async {
return gh.searchCommon( return gh.searchCommon(
query, query,
'https://$host/api/v1/repos/search?q=${Uri.encodeQueryComponent(query)}&limit=100', 'https://${hosts[0]}/api/v1/repos/search?q=${Uri.encodeQueryComponent(query)}&limit=100',
'data', 'data',
querySettings: querySettings); querySettings: querySettings);
} }

View File

@ -0,0 +1,65 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:obtainium/app_sources/html.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
class DirectAPKLink extends AppSource {
HTML html = HTML();
DirectAPKLink() {
name = tr('directAPKLink');
additionalSourceAppSpecificSettingFormItems = html
.additionalSourceAppSpecificSettingFormItems
.where((element) => element
.where((element) => element.key == 'requestHeader')
.isNotEmpty)
.toList();
excludeCommonSettingKeys = [
'versionExtractionRegEx',
'matchGroupToUse',
'versionDetection',
'useVersionCodeAsOSVersion',
'apkFilterRegEx',
'autoApkFilterByArch'
];
}
@override
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
if (!forSelection) {
return url;
}
RegExp standardUrlRegExA = RegExp('.+\\.apk\$', caseSensitive: false);
var match = standardUrlRegExA.firstMatch(url);
if (match == null) {
throw InvalidURLError(name);
}
return match.group(0)!;
}
@override
Future<Map<String, String>?> getRequestHeaders(
Map<String, dynamic> additionalSettings,
{bool forAPKDownload = false}) {
return html.getRequestHeaders(additionalSettings,
forAPKDownload: forAPKDownload);
}
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
var additionalSettingsNew =
getDefaultValuesFromFormItems(html.combinedAppSpecificSettingFormItems);
for (var s in additionalSettings.keys) {
if (additionalSettingsNew.containsKey(s)) {
additionalSettingsNew[s] = additionalSettings[s];
}
}
additionalSettingsNew['defaultPseudoVersioningMethod'] = 'partialAPKHash';
additionalSettingsNew['directAPKLink'] = true;
additionalSettings['versionDetection'] = false;
return html.getLatestAPKDetails(standardUrl, additionalSettingsNew);
}
}

View File

@ -3,31 +3,58 @@ import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:html/parser.dart'; import 'package:html/parser.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:obtainium/app_sources/github.dart';
import 'package:obtainium/app_sources/gitlab.dart';
import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
class FDroid extends AppSource { class FDroid extends AppSource {
FDroid() { FDroid() {
host = 'f-droid.org'; hosts = ['f-droid.org'];
name = tr('fdroid'); name = tr('fdroid');
naiveStandardVersionDetection = true;
canSearch = true; canSearch = true;
additionalSourceAppSpecificSettingFormItems = [
[
GeneratedFormTextField('filterVersionsByRegEx',
label: tr('filterVersionsByRegEx'),
required: false,
additionalValidators: [
(value) {
return regExValidator(value);
}
])
],
[
GeneratedFormSwitch('trySelectingSuggestedVersionCode',
label: tr('trySelectingSuggestedVersionCode'))
],
[
GeneratedFormSwitch('autoSelectHighestVersionCode',
label: tr('autoSelectHighestVersionCode'))
],
];
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegExB = RegExp standardUrlRegExB = RegExp(
RegExp('^https?://$host/+[^/]+/+packages/+[^/]+'); '^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+packages/+[^/]+',
RegExpMatch? match = standardUrlRegExB.firstMatch(url.toLowerCase()); caseSensitive: false);
RegExpMatch? match = standardUrlRegExB.firstMatch(url);
if (match != null) { if (match != null) {
url = url =
'https://${Uri.parse(url.substring(0, match.end)).host}/packages/${Uri.parse(url).pathSegments.last}'; 'https://${Uri.parse(match.group(0)!).host}/packages/${Uri.parse(url).pathSegments.where((s) => s.trim().isNotEmpty).last}';
} }
RegExp standardUrlRegExA = RegExp('^https?://$host/+packages/+[^/]+'); RegExp standardUrlRegExA = RegExp(
match = standardUrlRegExA.firstMatch(url.toLowerCase()); '^https?://(www\\.)?${getSourceRegex(hosts)}/+packages/+[^/]+',
caseSensitive: false);
match = standardUrlRegExA.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
@ -36,28 +63,6 @@ class FDroid extends AppSource {
return Uri.parse(standardUrl).pathSegments.last; return Uri.parse(standardUrl).pathSegments.last;
} }
APKDetails getAPKUrlsFromFDroidPackagesAPIResponse(
Response res, String apkUrlPrefix, String standardUrl) {
if (res.statusCode == 200) {
List<dynamic> releases = jsonDecode(res.body)['packages'] ?? [];
if (releases.isEmpty) {
throw NoReleasesError();
}
String? latestVersion = releases[0]['versionName'];
if (latestVersion == null) {
throw NoVersionError();
}
List<String> apkUrls = releases
.where((element) => element['versionName'] == latestVersion)
.map((e) => '${apkUrlPrefix}_${e['versionCode']}.apk')
.toList();
return APKDetails(latestVersion, getApkUrlsFromUrls(apkUrls),
AppNames(name, Uri.parse(standardUrl).pathSegments.last));
} else {
throw getObtainiumHttpError(res);
}
}
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, String standardUrl,
@ -65,17 +70,66 @@ class FDroid extends AppSource {
) async { ) async {
String? appId = await tryInferringAppId(standardUrl); String? appId = await tryInferringAppId(standardUrl);
String host = Uri.parse(standardUrl).host; String host = Uri.parse(standardUrl).host;
return getAPKUrlsFromFDroidPackagesAPIResponse( var details = getAPKUrlsFromFDroidPackagesAPIResponse(
await sourceRequest('https://$host/api/v1/packages/$appId'), await sourceRequest(
'https://$host/api/v1/packages/$appId', additionalSettings),
'https://$host/repo/$appId', 'https://$host/repo/$appId',
standardUrl); standardUrl,
name,
additionalSettings: additionalSettings);
if (!hostChanged) {
try {
var res = await sourceRequest(
'https://gitlab.com/fdroid/fdroiddata/-/raw/master/metadata/$appId.yml',
additionalSettings);
var lines = res.body.split('\n');
var authorLines = lines.where((l) => l.startsWith('AuthorName: '));
if (authorLines.isNotEmpty) {
details.names.author =
authorLines.first.split(': ').sublist(1).join(': ');
}
var changelogUrls = lines
.where((l) => l.startsWith('Changelog: '))
.map((e) => e.split(' ').sublist(1).join(' '));
if (changelogUrls.isNotEmpty) {
details.changeLog = changelogUrls.first;
bool isGitHub = false;
bool isGitLab = false;
try {
GitHub().sourceSpecificStandardizeURL(details.changeLog!);
isGitHub = true;
} catch (e) {
//
}
try {
GitLab().sourceSpecificStandardizeURL(details.changeLog!);
isGitLab = true;
} catch (e) {
//
}
if ((isGitHub || isGitLab) &&
(details.changeLog?.indexOf('/blob/') ?? -1) >= 0) {
details.changeLog = (await sourceRequest(
details.changeLog!.replaceFirst('/blob/', '/raw/'),
additionalSettings))
.body;
}
}
} catch (e) {
// Fail silently
}
if ((details.changeLog?.length ?? 0) > 2048) {
details.changeLog = '${details.changeLog!.substring(0, 2048)}...';
}
}
return details;
} }
@override @override
Future<Map<String, List<String>>> search(String query, Future<Map<String, List<String>>> search(String query,
{Map<String, dynamic> querySettings = const {}}) async { {Map<String, dynamic> querySettings = const {}}) async {
Response res = await sourceRequest( Response res = await sourceRequest(
'https://search.$host/?q=${Uri.encodeQueryComponent(query)}'); 'https://search.${hosts[0]}/?q=${Uri.encodeQueryComponent(query)}', {});
if (res.statusCode == 200) { if (res.statusCode == 200) {
Map<String, List<String>> urlsWithDescriptions = {}; Map<String, List<String>> urlsWithDescriptions = {};
parse(res.body).querySelectorAll('.package-header').forEach((e) { parse(res.body).querySelectorAll('.package-header').forEach((e) {
@ -100,4 +154,97 @@ class FDroid extends AppSource {
throw getObtainiumHttpError(res); throw getObtainiumHttpError(res);
} }
} }
APKDetails getAPKUrlsFromFDroidPackagesAPIResponse(
Response res, String apkUrlPrefix, String standardUrl, String sourceName,
{Map<String, dynamic> additionalSettings = const {}}) {
var autoSelectHighestVersionCode =
additionalSettings['autoSelectHighestVersionCode'] == true;
var trySelectingSuggestedVersionCode =
additionalSettings['trySelectingSuggestedVersionCode'] == true;
var filterVersionsByRegEx =
(additionalSettings['filterVersionsByRegEx'] as String?)?.isNotEmpty ==
true
? additionalSettings['filterVersionsByRegEx']
: null;
var apkFilterRegEx =
(additionalSettings['apkFilterRegEx'] as String?)?.isNotEmpty == true
? additionalSettings['apkFilterRegEx']
: null;
if (res.statusCode == 200) {
var response = jsonDecode(res.body);
List<dynamic> releases = response['packages'] ?? [];
if (apkFilterRegEx != null) {
releases = releases.where((rel) {
String apk = '${apkUrlPrefix}_${rel['versionCode']}.apk';
return filterApks([MapEntry(apk, apk)], apkFilterRegEx, false)
.isNotEmpty;
}).toList();
}
if (releases.isEmpty) {
throw NoReleasesError();
}
String? version;
Iterable<dynamic> releaseChoices = [];
// Grab the versionCode suggested if the user chose to do that
// Only do so at this stage if the user has no release filter
if (trySelectingSuggestedVersionCode &&
response['suggestedVersionCode'] != null &&
filterVersionsByRegEx == null) {
var suggestedReleases = releases.where((element) =>
element['versionCode'] == response['suggestedVersionCode']);
if (suggestedReleases.isNotEmpty) {
releaseChoices = suggestedReleases;
version = suggestedReleases.first['versionName'];
}
}
// Apply the release filter if any
if (filterVersionsByRegEx?.isNotEmpty == true) {
version = null;
releaseChoices = [];
for (var i = 0; i < releases.length; i++) {
if (RegExp(filterVersionsByRegEx!)
.hasMatch(releases[i]['versionName'])) {
version = releases[i]['versionName'];
}
}
if (version == null) {
throw NoVersionError();
}
}
// Default to the highest version
version ??= releases[0]['versionName'];
if (version == null) {
throw NoVersionError();
}
// If a suggested release was not already picked, pick all those with the selected version
if (releaseChoices.isEmpty) {
releaseChoices =
releases.where((element) => element['versionName'] == version);
}
// For the remaining releases, use the toggles to auto-select one if possible
if (releaseChoices.length > 1) {
if (autoSelectHighestVersionCode) {
releaseChoices = [releaseChoices.first];
} else if (trySelectingSuggestedVersionCode &&
response['suggestedVersionCode'] != null) {
var suggestedReleases = releaseChoices.where((element) =>
element['versionCode'] == response['suggestedVersionCode']);
if (suggestedReleases.isNotEmpty) {
releaseChoices = suggestedReleases;
}
}
}
if (releaseChoices.isEmpty) {
throw NoReleasesError();
}
List<String> apkUrls = releaseChoices
.map((e) => '${apkUrlPrefix}_${e['versionCode']}.apk')
.toList();
return APKDetails(version, getApkUrlsFromUrls(apkUrls.toSet().toList()),
AppNames(sourceName, Uri.parse(standardUrl).pathSegments.last));
} else {
throw getObtainiumHttpError(res);
}
}
} }

View File

@ -1,5 +1,6 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:html/parser.dart'; import 'package:html/parser.dart';
import 'package:http/http.dart';
import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
@ -7,6 +8,10 @@ import 'package:obtainium/providers/source_provider.dart';
class FDroidRepo extends AppSource { class FDroidRepo extends AppSource {
FDroidRepo() { FDroidRepo() {
name = tr('fdroidThirdPartyRepo'); name = tr('fdroidThirdPartyRepo');
canSearch = true;
includeAdditionalOptsInMainSearch = true;
neverAutoSelect = true;
showReleaseDateAsVersionToggle = true;
additionalSourceAppSpecificSettingFormItems = [ additionalSourceAppSpecificSettingFormItems = [
[ [
@ -22,17 +27,145 @@ class FDroidRepo extends AppSource {
]; ];
} }
String removeQueryParamsFromUrl(String url, {List<String> keep = const []}) {
var uri = Uri.parse(url);
Map<String, dynamic> resultParams = {};
uri.queryParameters.forEach((key, value) {
if (keep.contains(key)) {
resultParams[key] = value;
}
});
url = uri.replace(queryParameters: resultParams).toString();
if (url.endsWith('?')) {
url = url.substring(0, url.length - 1);
}
return url;
}
@override
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
var standardUri = Uri.parse(url);
var pathSegments = standardUri.pathSegments;
if (pathSegments.isNotEmpty && pathSegments.last == 'index.xml') {
pathSegments.removeLast();
standardUri = standardUri.replace(path: pathSegments.join('/'));
}
return removeQueryParamsFromUrl(standardUri.toString(), keep: ['appId']);
}
@override
Future<Map<String, List<String>>> search(String query,
{Map<String, dynamic> querySettings = const {}}) async {
String? url = querySettings['url'];
if (url == null) {
throw NoReleasesError();
}
url = removeQueryParamsFromUrl(standardizeUrl(url));
var res = await sourceRequestWithURLVariants(url, {});
if (res.statusCode == 200) {
var body = parse(res.body);
Map<String, List<String>> results = {};
body.querySelectorAll('application').toList().forEach((app) {
String appId = app.attributes['id']!;
String appName = app.querySelector('name')?.innerHtml ?? appId;
String appDesc = app.querySelector('desc')?.innerHtml ?? '';
if (query.isEmpty ||
appId.contains(query) ||
appName.contains(query) ||
appDesc.contains(query)) {
results[
'${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}?appId=$appId'] = [
appName,
appDesc
];
}
});
return results;
} else {
throw getObtainiumHttpError(res);
}
}
@override
void runOnAddAppInputChange(String userInput) {
additionalSourceAppSpecificSettingFormItems =
additionalSourceAppSpecificSettingFormItems.map((row) {
row = row.map((item) {
if (item.key == 'appIdOrName') {
try {
var appId = Uri.parse(userInput).queryParameters['appId'];
if (appId != null && item is GeneratedFormTextField) {
item.required = false;
}
} catch (e) {
//
}
}
return item;
}).toList();
return row;
}).toList();
}
@override
App endOfGetAppChanges(App app) {
var uri = Uri.parse(app.url);
String? appId;
if (!isTempId(app)) {
appId = app.id;
} else if (uri.queryParameters['appId'] != null) {
appId = uri.queryParameters['appId'];
}
if (appId != null) {
app.url = uri
.replace(
queryParameters: Map.fromEntries(
[...uri.queryParameters.entries, MapEntry('appId', appId)]))
.toString();
app.additionalSettings['appIdOrName'] = appId;
app.id = appId;
}
return app;
}
Future<Response> sourceRequestWithURLVariants(
String url,
Map<String, dynamic> additionalSettings,
) async {
var res = await sourceRequest(
'$url${url.endsWith('/index.xml') ? '' : '/index.xml'}',
additionalSettings);
if (res.statusCode != 200) {
var base = url.endsWith('/index.xml')
? url.split('/').reversed.toList().sublist(1).reversed.join('/')
: url;
res = await sourceRequest('$base/repo/index.xml', additionalSettings);
if (res.statusCode != 200) {
res = await sourceRequest(
'$base/fdroid/repo/index.xml', additionalSettings);
}
}
return res;
}
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, String standardUrl,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
String? appIdOrName = additionalSettings['appIdOrName']; String? appIdOrName = additionalSettings['appIdOrName'];
var standardUri = Uri.parse(standardUrl);
if (standardUri.queryParameters['appId'] != null) {
appIdOrName = standardUri.queryParameters['appId'];
}
standardUrl = removeQueryParamsFromUrl(standardUrl);
bool pickHighestVersionCode = additionalSettings['pickHighestVersionCode']; bool pickHighestVersionCode = additionalSettings['pickHighestVersionCode'];
if (appIdOrName == null) { if (appIdOrName == null) {
throw NoReleasesError(); throw NoReleasesError();
} }
var res = await sourceRequest('$standardUrl/index.xml'); additionalSettings['appIdOrName'] = appIdOrName;
var res =
await sourceRequestWithURLVariants(standardUrl, additionalSettings);
if (res.statusCode == 200) { if (res.statusCode == 200) {
var body = parse(res.body); var body = parse(res.body);
var foundApps = body.querySelectorAll('application').where((element) { var foundApps = body.querySelectorAll('application').where((element) {
@ -41,7 +174,7 @@ class FDroidRepo extends AppSource {
if (foundApps.isEmpty) { if (foundApps.isEmpty) {
foundApps = body.querySelectorAll('application').where((element) { foundApps = body.querySelectorAll('application').where((element) {
return element.querySelector('name')?.innerHtml.toLowerCase() == return element.querySelector('name')?.innerHtml.toLowerCase() ==
appIdOrName.toLowerCase(); appIdOrName!.toLowerCase();
}).toList(); }).toList();
} }
if (foundApps.isEmpty) { if (foundApps.isEmpty) {
@ -50,7 +183,7 @@ class FDroidRepo extends AppSource {
.querySelector('name') .querySelector('name')
?.innerHtml ?.innerHtml
.toLowerCase() .toLowerCase()
.contains(appIdOrName.toLowerCase()) ?? .contains(appIdOrName!.toLowerCase()) ??
false; false;
}).toList(); }).toList();
} }
@ -58,8 +191,9 @@ class FDroidRepo extends AppSource {
throw ObtainiumError(tr('appWithIdOrNameNotFound')); throw ObtainiumError(tr('appWithIdOrNameNotFound'));
} }
var authorName = body.querySelector('repo')?.attributes['name'] ?? name; var authorName = body.querySelector('repo')?.attributes['name'] ?? name;
var appName = String appId = foundApps[0].attributes['id']!;
foundApps[0].querySelector('name')?.innerHtml ?? appIdOrName; foundApps[0].querySelector('name')?.innerHtml ?? appId;
var appName = foundApps[0].querySelector('name')?.innerHtml ?? appId;
var releases = foundApps[0].querySelectorAll('package'); var releases = foundApps[0].querySelectorAll('package');
String? latestVersion = releases[0].querySelector('version')?.innerHtml; String? latestVersion = releases[0].querySelector('version')?.innerHtml;
String? added = releases[0].querySelector('added')?.innerHtml; String? added = releases[0].querySelector('added')?.innerHtml;
@ -80,7 +214,8 @@ class FDroidRepo extends AppSource {
latestVersionReleases = [latestVersionReleases[0]]; latestVersionReleases = [latestVersionReleases[0]];
} }
List<String> apkUrls = latestVersionReleases List<String> apkUrls = latestVersionReleases
.map((e) => '$standardUrl/${e.querySelector('apkname')!.innerHtml}') .map((e) =>
'${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}/${e.querySelector('apkname')!.innerHtml}')
.toList(); .toList();
return APKDetails(latestVersion, getApkUrlsFromUrls(apkUrls), return APKDetails(latestVersion, getApkUrlsFromUrls(apkUrls),
AppNames(authorName, appName), AppNames(authorName, appName),

View File

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
@ -13,29 +14,15 @@ import 'package:url_launcher/url_launcher_string.dart';
class GitHub extends AppSource { class GitHub extends AppSource {
GitHub() { GitHub() {
host = 'github.com'; hosts = ['github.com'];
appIdInferIsOptional = true; appIdInferIsOptional = true;
showReleaseDateAsVersionToggle = true;
sourceConfigSettingFormItems = [ sourceConfigSettingFormItems = [
GeneratedFormTextField('github-creds', GeneratedFormTextField('github-creds',
label: tr('githubPATLabel'), label: tr('githubPATLabel'),
password: true, password: true,
required: false, required: false,
additionalValidators: [
(value) {
if (value != null && value.trim().isNotEmpty) {
if (value
.split(':')
.where((element) => element.trim().isNotEmpty)
.length !=
2) {
return tr('githubPATHint');
}
}
return null;
}
],
hint: tr('githubPATFormat'),
belowWidgets: [ belowWidgets: [
const SizedBox( const SizedBox(
height: 4, height: 4,
@ -85,6 +72,19 @@ class GitHub extends AppSource {
return regExValidator(value); return regExValidator(value);
} }
]) ])
],
[GeneratedFormSwitch('verifyLatestTag', label: tr('verifyLatestTag'))],
[
GeneratedFormSwitch('dontSortReleasesList',
label: tr('dontSortReleasesList'))
],
[
GeneratedFormSwitch('useLatestAssetDateAsReleaseDate',
label: tr('useLatestAssetDateAsReleaseDate'), defaultValue: false)
],
[
GeneratedFormSwitch('releaseTitleAsVersion',
label: tr('releaseTitleAsVersion'), defaultValue: false)
] ]
]; ];
@ -117,7 +117,8 @@ class GitHub extends AppSource {
for (var path in possibleBuildGradleLocations) { for (var path in possibleBuildGradleLocations) {
try { try {
var res = await sourceRequest( var res = await sourceRequest(
'${await convertStandardUrlToAPIUrl(standardUrl, additionalSettings)}/contents/$path'); '${await convertStandardUrlToAPIUrl(standardUrl, additionalSettings)}/contents/$path',
additionalSettings);
if (res.statusCode == 200) { if (res.statusCode == 200) {
try { try {
var body = jsonDecode(res.body); var body = jsonDecode(res.body);
@ -126,22 +127,23 @@ class GitHub extends AppSource {
.decode(body['content'].toString().split('\n').join(''))) .decode(body['content'].toString().split('\n').join('')))
.split('\n') .split('\n')
.map((e) => e.trim()); .map((e) => e.trim());
var appId = trimmedLines var appIds = trimmedLines.where((l) =>
.where((l) => l.startsWith('applicationId "') ||
l.startsWith('applicationId "') || l.startsWith('applicationId \''));
l.startsWith('applicationId \'')) appIds = appIds.map((appId) => appId
.first; .split(appId.startsWith('applicationId "') ? '"' : '\'')[1]);
appId = appId appIds = appIds.map((appId) {
.split(appId.startsWith('applicationId "') ? '"' : '\'')[1]; if (appId.startsWith('\${') && appId.endsWith('}')) {
if (appId.startsWith('\${') && appId.endsWith('}')) { appId = trimmedLines
appId = trimmedLines .where((l) => l.startsWith(
.where((l) => l.startsWith( 'def ${appId.substring(2, appId.length - 1)}'))
'def ${appId.substring(2, appId.length - 1)}')) .first;
.first; appId = appId.split(appId.contains('"') ? '"' : '\'')[1];
appId = appId.split(appId.contains('"') ? '"' : '\'')[1]; }
}
if (appId.isNotEmpty) {
return appId; return appId;
}).where((appId) => appId.isNotEmpty);
if (appIds.length == 1) {
return appIds.first;
} }
} catch (err) { } catch (err) {
LogsProvider().add( LogsProvider().add(
@ -156,39 +158,68 @@ class GitHub extends AppSource {
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp('^https?://$host/[^/]+/[^/]+'); RegExp standardUrlRegEx = RegExp(
RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase()); '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
Future<String> getCredentialPrefixIfAny( @override
Map<String, dynamic> additionalSettings) async { Future<Map<String, String>?> getRequestHeaders(
Map<String, dynamic> additionalSettings,
{bool forAPKDownload = false}) async {
var token = await getTokenIfAny(additionalSettings);
var headers = <String, String>{};
if (token != null && token.isNotEmpty) {
headers[HttpHeaders.authorizationHeader] = 'Token $token';
}
if (forAPKDownload == true) {
headers[HttpHeaders.acceptHeader] = 'application/octet-stream';
}
if (headers.isNotEmpty) {
return headers;
} else {
return null;
}
}
Future<String?> getTokenIfAny(Map<String, dynamic> additionalSettings) async {
SettingsProvider settingsProvider = SettingsProvider(); SettingsProvider settingsProvider = SettingsProvider();
await settingsProvider.initializeSettings(); await settingsProvider.initializeSettings();
var sourceConfig = var sourceConfig =
await getSourceConfigValues(additionalSettings, settingsProvider); await getSourceConfigValues(additionalSettings, settingsProvider);
String? creds = sourceConfig['github-creds']; String? creds = sourceConfig['github-creds'];
return creds != null && creds.isNotEmpty ? '$creds@' : ''; if (creds != null) {
var userNameEndIndex = creds.indexOf(':');
if (userNameEndIndex > 0) {
creds = creds.substring(
userNameEndIndex + 1); // For old username-included token inputs
}
return creds;
} else {
return null;
}
} }
@override @override
Future<String?> getSourceNote() async { Future<String?> getSourceNote() async {
if (!hostChanged && (await getCredentialPrefixIfAny({})).isEmpty) { if (!hostChanged && (await getTokenIfAny({})) == null) {
return '${tr('githubSourceNote')} ${hostChanged ? tr('addInfoBelow') : tr('addInfoInSettings')}'; return '${tr('githubSourceNote')} ${hostChanged ? tr('addInfoBelow') : tr('addInfoInSettings')}';
} }
return null; return null;
} }
Future<String> getAPIHost(Map<String, dynamic> additionalSettings) async => Future<String> getAPIHost(Map<String, dynamic> additionalSettings) async =>
'https://${await getCredentialPrefixIfAny(additionalSettings)}api.$host'; 'https://api.${hosts[0]}';
Future<String> convertStandardUrlToAPIUrl( Future<String> convertStandardUrlToAPIUrl(
String standardUrl, Map<String, dynamic> additionalSettings) async => String standardUrl, Map<String, dynamic> additionalSettings) async =>
'${await getAPIHost(additionalSettings)}/repos${standardUrl.substring('https://$host'.length)}'; '${await getAPIHost(additionalSettings)}/repos${standardUrl.substring('https://${hosts[0]}'.length)}';
@override @override
String? changeLogPageFromStandardUrl(String standardUrl) => String? changeLogPageFromStandardUrl(String standardUrl) =>
@ -212,52 +243,126 @@ class GitHub extends AppSource {
true true
? additionalSettings['filterReleaseNotesByRegEx'] ? additionalSettings['filterReleaseNotesByRegEx']
: null; : null;
Response res = await sourceRequest(requestUrl); bool verifyLatestTag = additionalSettings['verifyLatestTag'] == true;
bool dontSortReleasesList =
additionalSettings['dontSortReleasesList'] == true;
bool useLatestAssetDateAsReleaseDate =
additionalSettings['useLatestAssetDateAsReleaseDate'] == true;
dynamic latestRelease;
if (verifyLatestTag) {
var temp = requestUrl.split('?');
Response res = await sourceRequest(
'${temp[0]}/latest${temp.length > 1 ? '?${temp.sublist(1).join('?')}' : ''}',
additionalSettings);
if (res.statusCode != 200) {
if (onHttpErrorCode != null) {
onHttpErrorCode(res);
}
throw getObtainiumHttpError(res);
}
latestRelease = jsonDecode(res.body);
}
Response res = await sourceRequest(requestUrl, additionalSettings);
if (res.statusCode == 200) { if (res.statusCode == 200) {
var releases = jsonDecode(res.body) as List<dynamic>; var releases = jsonDecode(res.body) as List<dynamic>;
if (latestRelease != null) {
var latestTag = latestRelease['tag_name'] ?? latestRelease['name'];
if (releases
.where((element) =>
(element['tag_name'] ?? element['name']) == latestTag)
.isEmpty) {
releases = [latestRelease, ...releases];
}
}
List<MapEntry<String, String>> getReleaseAPKUrls(dynamic release) => findReleaseAssetUrls(dynamic release) =>
(release['assets'] as List<dynamic>?) (release['assets'] as List<dynamic>?)?.map((e) {
?.map((e) { var url = !e['name'].toString().toLowerCase().endsWith('.apk')
return e['name'] != null && e['browser_download_url'] != null ? (e['browser_download_url'] ?? e['url'])
? MapEntry(e['name'] as String, : (e['url'] ?? e['browser_download_url']);
e['browser_download_url'] as String) e['final_url'] = (e['name'] != null) && (url != null)
: const MapEntry('', ''); ? MapEntry(e['name'] as String, url as String)
}) : const MapEntry('', '');
.where((element) => element.key.toLowerCase().endsWith('.apk')) return e;
.toList() ?? }).toList() ??
[]; [];
DateTime? getReleaseDateFromRelease(dynamic rel) => DateTime? getPublishDateFromRelease(dynamic rel) =>
rel?['published_at'] != null rel?['published_at'] != null
? DateTime.parse(rel['published_at']) ? DateTime.parse(rel['published_at'])
: null; : rel?['commit']?['created'] != null
releases.sort((a, b) { ? DateTime.parse(rel['commit']['created'])
// See #478 and #534 : null;
if (a == b) { DateTime? getNewestAssetDateFromRelease(dynamic rel) {
return 0; var allAssets = rel['assets'] as List<dynamic>?;
} else if (a == null) { var filteredAssets = rel['filteredAssets'] as List<dynamic>?;
return -1; var t = (filteredAssets ?? allAssets)
} else if (b == null) { ?.map((e) {
return 1; return e?['updated_at'] != null
} else { ? DateTime.parse(e['updated_at'])
var nameA = a['tag_name'] ?? a['name']; : null;
var nameB = b['tag_name'] ?? b['name']; })
var stdFormats = findStandardFormatsForVersion(nameA, true) .where((e) => e != null)
.intersection(findStandardFormatsForVersion(nameB, true)); .toList();
if (stdFormats.isNotEmpty) { t?.sort((a, b) => b!.compareTo(a!));
var reg = RegExp(stdFormats.first); if (t?.isNotEmpty == true) {
var matchA = reg.firstMatch(nameA); return t!.first;
var matchB = reg.firstMatch(nameB);
return compareAlphaNumeric(
(nameA as String).substring(matchA!.start, matchA.end),
(nameB as String).substring(matchB!.start, matchB.end));
} else {
return (getReleaseDateFromRelease(a) ?? DateTime(1))
.compareTo(getReleaseDateFromRelease(b) ?? DateTime(0));
}
} }
}); return null;
}
DateTime? getReleaseDateFromRelease(dynamic rel, bool useAssetDate) =>
!useAssetDate
? getPublishDateFromRelease(rel)
: getNewestAssetDateFromRelease(rel);
if (dontSortReleasesList) {
releases = releases.reversed.toList();
} else {
releases.sort((a, b) {
// See #478 and #534
if (a == b) {
return 0;
} else if (a == null) {
return -1;
} else if (b == null) {
return 1;
} else {
var nameA = a['tag_name'] ?? a['name'];
var nameB = b['tag_name'] ?? b['name'];
var stdFormats = findStandardFormatsForVersion(nameA, true)
.intersection(findStandardFormatsForVersion(nameB, true));
if (stdFormats.isNotEmpty) {
var reg = RegExp(stdFormats.first);
var matchA = reg.firstMatch(nameA);
var matchB = reg.firstMatch(nameB);
return compareAlphaNumeric(
(nameA as String).substring(matchA!.start, matchA.end),
(nameB as String).substring(matchB!.start, matchB.end));
} else {
return (getReleaseDateFromRelease(
a, useLatestAssetDateAsReleaseDate) ??
DateTime(1))
.compareTo(getReleaseDateFromRelease(
b, useLatestAssetDateAsReleaseDate) ??
DateTime(0));
}
}
});
}
if (latestRelease != null &&
(latestRelease['tag_name'] ?? latestRelease['name']) != null &&
releases.isNotEmpty &&
latestRelease !=
(releases[releases.length - 1]['tag_name'] ??
releases[0]['name'])) {
var ind = releases.indexWhere((element) =>
(latestRelease['tag_name'] ?? latestRelease['name']) ==
(element['tag_name'] ?? element['name']));
if (ind >= 0) {
releases.add(releases.removeAt(ind));
}
}
releases = releases.reversed.toList(); releases = releases.reversed.toList();
dynamic targetRelease; dynamic targetRelease;
var prerrelsSkipped = 0; var prerrelsSkipped = 0;
@ -285,29 +390,73 @@ class GitHub extends AppSource {
.hasMatch(((releases[i]['body'] as String?) ?? '').trim())) { .hasMatch(((releases[i]['body'] as String?) ?? '').trim())) {
continue; continue;
} }
var apkUrls = getReleaseAPKUrls(releases[i]); var allAssetsWithUrls = findReleaseAssetUrls(releases[i]);
if (apkUrls.isEmpty && additionalSettings['trackOnly'] != true) { List<MapEntry<String, String>> allAssetUrls = allAssetsWithUrls
.map((e) => e['final_url'] as MapEntry<String, String>)
.toList();
var apkAssetsWithUrls = allAssetsWithUrls
.where((element) =>
(element['final_url'] as MapEntry<String, String>)
.key
.toLowerCase()
.endsWith('.apk'))
.toList();
var filteredApkUrls = filterApks(
apkAssetsWithUrls
.map((e) => e['final_url'] as MapEntry<String, String>)
.toList(),
additionalSettings['apkFilterRegEx'],
additionalSettings['invertAPKFilter']);
var filteredApks = apkAssetsWithUrls
.where((e) => filteredApkUrls
.where((e2) =>
e2.key == (e['final_url'] as MapEntry<String, String>).key)
.isNotEmpty)
.toList();
if (filteredApks.isEmpty && additionalSettings['trackOnly'] != true) {
continue; continue;
} }
targetRelease = releases[i]; targetRelease = releases[i];
targetRelease['apkUrls'] = apkUrls; targetRelease['apkUrls'] = filteredApkUrls;
targetRelease['filteredAssets'] = filteredApks;
targetRelease['version'] =
additionalSettings['releaseTitleAsVersion'] == true
? nameToFilter
: targetRelease['tag_name'] ?? targetRelease['name'];
if (targetRelease['tarball_url'] != null) {
allAssetUrls.add(MapEntry(
(targetRelease['version'] ?? 'source') + '.tar.gz',
targetRelease['tarball_url']));
}
if (targetRelease['zipball_url'] != null) {
allAssetUrls.add(MapEntry(
(targetRelease['version'] ?? 'source') + '.zip',
targetRelease['zipball_url']));
}
targetRelease['allAssetUrls'] = allAssetUrls;
break; break;
} }
if (targetRelease == null) { if (targetRelease == null) {
throw NoReleasesError(); throw NoReleasesError();
} }
String? version = targetRelease['tag_name'] ?? targetRelease['name']; String? version = targetRelease['version'];
DateTime? releaseDate = getReleaseDateFromRelease(targetRelease);
DateTime? releaseDate = getReleaseDateFromRelease(
targetRelease, useLatestAssetDateAsReleaseDate);
if (version == null) { if (version == null) {
throw NoVersionError(); throw NoVersionError();
} }
var changeLog = targetRelease['body'].toString(); var changeLog = (targetRelease['body'] ?? '').toString();
return APKDetails( return APKDetails(
version, version,
targetRelease['apkUrls'] as List<MapEntry<String, String>>, targetRelease['apkUrls'] as List<MapEntry<String, String>>,
getAppNames(standardUrl), getAppNames(standardUrl),
releaseDate: releaseDate, releaseDate: releaseDate,
changeLog: changeLog.isEmpty ? null : changeLog); changeLog: changeLog.isEmpty ? null : changeLog,
allAssetUrls:
targetRelease['allAssetUrls'] as List<MapEntry<String, String>>);
} else { } else {
if (onHttpErrorCode != null) { if (onHttpErrorCode != null) {
onHttpErrorCode(res); onHttpErrorCode(res);
@ -352,14 +501,14 @@ class GitHub extends AppSource {
AppNames getAppNames(String standardUrl) { AppNames getAppNames(String standardUrl) {
String temp = standardUrl.substring(standardUrl.indexOf('://') + 3); String temp = standardUrl.substring(standardUrl.indexOf('://') + 3);
List<String> names = temp.substring(temp.indexOf('/') + 1).split('/'); List<String> names = temp.substring(temp.indexOf('/') + 1).split('/');
return AppNames(names[0], names[1]); return AppNames(names[0], names.sublist(1).join('/'));
} }
Future<Map<String, List<String>>> searchCommon( Future<Map<String, List<String>>> searchCommon(
String query, String requestUrl, String rootProp, String query, String requestUrl, String rootProp,
{Function(Response)? onHttpErrorCode, {Function(Response)? onHttpErrorCode,
Map<String, dynamic> querySettings = const {}}) async { Map<String, dynamic> querySettings = const {}}) async {
Response res = await sourceRequest(requestUrl); Response res = await sourceRequest(requestUrl, {});
if (res.statusCode == 200) { if (res.statusCode == 200) {
int minStarCount = querySettings['minStarCount'] != null int minStarCount = querySettings['minStarCount'] != null
? int.parse(querySettings['minStarCount']) ? int.parse(querySettings['minStarCount'])

View File

@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:html/parser.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:obtainium/app_sources/github.dart'; import 'package:obtainium/app_sources/github.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
@ -13,8 +13,9 @@ import 'package:url_launcher/url_launcher_string.dart';
class GitLab extends AppSource { class GitLab extends AppSource {
GitLab() { GitLab() {
host = 'gitlab.com'; hosts = ['gitlab.com'];
canSearch = true; canSearch = true;
showReleaseDateAsVersionToggle = true;
sourceConfigSettingFormItems = [ sourceConfigSettingFormItems = [
GeneratedFormTextField('gitlab-creds', GeneratedFormTextField('gitlab-creds',
@ -51,13 +52,19 @@ class GitLab extends AppSource {
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp('^https?://$host/[^/]+/[^/]+'); var urlSegments = url.split('/');
RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase()); var cutOffIndex = urlSegments.indexWhere((s) => s == '-');
url =
urlSegments.sublist(0, cutOffIndex <= 0 ? null : cutOffIndex).join('/');
RegExp standardUrlRegEx = RegExp(
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+(/[^((\b/\b)|(\b/-/\b))]+){1,20}',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
Future<String?> getPATIfAny(Map<String, dynamic> additionalSettings) async { Future<String?> getPATIfAny(Map<String, dynamic> additionalSettings) async {
@ -69,31 +76,19 @@ class GitLab extends AppSource {
return creds != null && creds.isNotEmpty ? creds : null; return creds != null && creds.isNotEmpty ? creds : null;
} }
@override
Future<String?> getSourceNote() async {
if ((await getPATIfAny({})) == null) {
return '${tr('gitlabSourceNote')} ${hostChanged ? tr('addInfoBelow') : tr('addInfoInSettings')}';
}
return null;
}
@override @override
Future<Map<String, List<String>>> search(String query, Future<Map<String, List<String>>> search(String query,
{Map<String, dynamic> querySettings = const {}}) async { {Map<String, dynamic> querySettings = const {}}) async {
String? PAT = await getPATIfAny({});
if (PAT == null) {
throw CredsNeededError(name);
}
var url = var url =
'https://$host/api/v4/search?private_token=$PAT&scope=projects&search=${Uri.encodeQueryComponent(query)}'; 'https://${hosts[0]}/api/v4/projects?search=${Uri.encodeQueryComponent(query)}';
var res = await sourceRequest(url); var res = await sourceRequest(url, {});
if (res.statusCode != 200) { if (res.statusCode != 200) {
throw getObtainiumHttpError(res); throw getObtainiumHttpError(res);
} }
var json = jsonDecode(res.body) as List<dynamic>; var json = jsonDecode(res.body) as List<dynamic>;
Map<String, List<String>> results = {}; Map<String, List<String>> results = {};
for (var element in json) { for (var element in json) {
results['https://$host/${element['path_with_namespace']}'] = [ results['https://${hosts[0]}/${element['path_with_namespace']}'] = [
element['name_with_namespace'], element['name_with_namespace'],
element['description'] ?? tr('noDescription') element['description'] ?? tr('noDescription')
]; ];
@ -105,104 +100,133 @@ class GitLab extends AppSource {
String? changeLogPageFromStandardUrl(String standardUrl) => String? changeLogPageFromStandardUrl(String standardUrl) =>
'$standardUrl/-/releases'; '$standardUrl/-/releases';
@override
Future<Map<String, String>?> getRequestHeaders(
Map<String, dynamic> additionalSettings,
{bool forAPKDownload = false}) async {
// Change headers to pacify, e.g. cloudflare protection
// Related to: (#1397, #1389, #1384, #1382, #1381, #1380, #1359, #854, #785, #697)
var headers = <String, String>{};
headers[HttpHeaders.refererHeader] = 'https://${hosts[0]}';
if (headers.isNotEmpty) {
return headers;
} else {
return null;
}
}
@override
Future<String> apkUrlPrefetchModifier(String apkUrl, String standardUrl,
Map<String, dynamic> additionalSettings) async {
String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {});
String optionalAuth = (PAT != null) ? 'private_token=$PAT' : '';
return '$apkUrl?$optionalAuth';
}
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, String standardUrl,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
bool fallbackToOlderReleases = // Prepare request params
additionalSettings['fallbackToOlderReleases'] == true; var names = GitHub().getAppNames(standardUrl);
String projectUriComponent =
'${Uri.encodeComponent(names.author)}%2F${Uri.encodeComponent(names.name)}';
String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {});
Iterable<APKDetails> apkDetailsList = []; String optionalAuth = (PAT != null) ? 'private_token=$PAT' : '';
if (PAT != null) {
var names = GitHub().getAppNames(standardUrl); bool trackOnly = additionalSettings['trackOnly'] == true;
Response res = await sourceRequest(
'https://$host/api/v4/projects/${names.author}%2F${names.name}/releases?private_token=$PAT'); // Get project ID
if (res.statusCode != 200) { Response res0 = await sourceRequest(
throw getObtainiumHttpError(res); 'https://${hosts[0]}/api/v4/projects/$projectUriComponent?$optionalAuth',
} additionalSettings);
var json = jsonDecode(res.body) as List<dynamic>; if (res0.statusCode != 200) {
apkDetailsList = json.map((e) { throw getObtainiumHttpError(res0);
var apkUrlsFromAssets = (e['assets']?['links'] as List<dynamic>? ?? [])
.map((e) {
return (e['direct_asset_url'] ?? e['url'] ?? '') as String;
})
.where((s) => s.isNotEmpty)
.toList();
List<String> uploadedAPKsFromDescription =
((e['description'] ?? '') as String)
.split('](')
.join('\n')
.split('.apk)')
.join('.apk\n')
.split('\n')
.where((s) => s.startsWith('/uploads/') && s.endsWith('apk'))
.map((s) => '$standardUrl$s')
.toList();
var apkUrlsSet = apkUrlsFromAssets.toSet();
apkUrlsSet.addAll(uploadedAPKsFromDescription);
var releaseDateString = e['released_at'] ?? e['created_at'];
DateTime? releaseDate = releaseDateString != null
? DateTime.parse(releaseDateString)
: null;
return APKDetails(
e['tag_name'] ?? e['name'],
getApkUrlsFromUrls(apkUrlsSet.toList()),
GitHub().getAppNames(standardUrl),
releaseDate: releaseDate);
});
} else {
Response res = await sourceRequest('$standardUrl/-/tags?format=atom');
if (res.statusCode != 200) {
throw getObtainiumHttpError(res);
}
var standardUri = Uri.parse(standardUrl);
var parsedHtml = parse(res.body);
apkDetailsList = parsedHtml.querySelectorAll('entry').map((entry) {
var entryContent = parse(
parseFragment(entry.querySelector('content')!.innerHtml).text);
var apkUrls = [
...getLinksFromParsedHTML(
entryContent,
RegExp(
'^${standardUri.path.replaceAllMapped(RegExp(r'[.*+?^${}()|[\]\\]'), (x) {
return '\\${x[0]}';
})}/uploads/[^/]+/[^/]+\\.apk\$',
caseSensitive: false),
standardUri.origin),
// GitLab releases may contain links to externally hosted APKs
...getLinksFromParsedHTML(entryContent,
RegExp('/[^/]+\\.apk\$', caseSensitive: false), '')
.where((element) => Uri.parse(element).host != '')
.toList()
];
var entryId = entry.querySelector('id')?.innerHtml;
var version =
entryId == null ? null : Uri.parse(entryId).pathSegments.last;
var releaseDateString = entry.querySelector('updated')?.innerHtml;
DateTime? releaseDate = releaseDateString != null
? DateTime.parse(releaseDateString)
: null;
if (version == null) {
throw NoVersionError();
}
return APKDetails(version, getApkUrlsFromUrls(apkUrls),
GitHub().getAppNames(standardUrl),
releaseDate: releaseDate);
});
} }
int? projectId = jsonDecode(res0.body)['id'];
if (projectId == null) {
throw NoReleasesError();
}
// Request data from REST API
Response res = await sourceRequest(
'https://${hosts[0]}/api/v4/projects/$projectUriComponent/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth',
additionalSettings);
if (res.statusCode != 200) {
throw getObtainiumHttpError(res);
}
// Extract .apk details from received data
Iterable<APKDetails> apkDetailsList = [];
var json = jsonDecode(res.body) as List<dynamic>;
apkDetailsList = json.map((e) {
var apkUrlsFromAssets = (e['assets']?['links'] as List<dynamic>? ?? [])
.map((e) {
var url = (e['direct_asset_url'] ?? e['url'] ?? '') as String;
var parsedUrl = url.isNotEmpty ? Uri.parse(url) : null;
return MapEntry(
(e['name'] ??
(parsedUrl != null && parsedUrl.pathSegments.isNotEmpty
? parsedUrl.pathSegments.last
: 'unknown')) as String,
(e['direct_asset_url'] ?? e['url'] ?? '') as String);
})
.where((s) => s.key.isNotEmpty)
.toList();
var uploadedAPKsFromDescription = ((e['description'] ?? '') as String)
.split('](')
.join('\n')
.split('.apk)')
.join('.apk\n')
.split('\n')
.where((s) => s.startsWith('/uploads/') && s.endsWith('apk'))
.map((s) => 'https://${hosts[0]}/-/project/$projectId$s')
.map((l) => MapEntry(Uri.parse(l).pathSegments.last, l))
.toList();
Map<String, String> apkUrls = {};
for (var entry in apkUrlsFromAssets) {
apkUrls[entry.key] = entry.value;
}
for (var entry in uploadedAPKsFromDescription) {
apkUrls[entry.key] = entry.value;
}
var releaseDateString =
e['released_at'] ?? e['created_at'] ?? e['commit']?['created_at'];
DateTime? releaseDate =
releaseDateString != null ? DateTime.parse(releaseDateString) : null;
return APKDetails(e['tag_name'] ?? e['name'], apkUrls.entries.toList(),
AppNames(names.author, names.name.split('/').last),
releaseDate: releaseDate);
});
if (apkDetailsList.isEmpty) { if (apkDetailsList.isEmpty) {
throw NoReleasesError(); throw NoReleasesError();
} }
if (fallbackToOlderReleases) { var finalResult = apkDetailsList.first;
if (additionalSettings['trackOnly'] != true) {
apkDetailsList = // Fallback procedure
apkDetailsList.where((e) => e.apkUrls.isNotEmpty).toList(); bool fallbackToOlderReleases =
} additionalSettings['fallbackToOlderReleases'] == true;
if (apkDetailsList.isEmpty) { if (finalResult.apkUrls.isEmpty && fallbackToOlderReleases && !trackOnly) {
throw NoReleasesError(); apkDetailsList =
} apkDetailsList.where((e) => e.apkUrls.isNotEmpty).toList();
finalResult = apkDetailsList.first;
} }
return apkDetailsList.first;
if (finalResult.apkUrls.isEmpty && !trackOnly) {
throw NoAPKError();
}
finalResult.apkUrls = finalResult.apkUrls.map((apkUrl) {
if (RegExp('^$standardUrl/-/jobs/[0-9]+/artifacts/file/[^/]+')
.hasMatch(apkUrl.value)) {
return MapEntry(
apkUrl.key, apkUrl.value.replaceFirst('/file/', '/raw/'));
} else {
return apkUrl;
}
}).toList();
return finalResult;
} }
} }

View File

@ -3,9 +3,13 @@ import 'package:html/parser.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/apps_provider.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl) { String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl) {
if (ambiguousUrl.startsWith('//')) {
ambiguousUrl = '${referenceAbsoluteUrl.scheme}:$ambiguousUrl';
}
try { try {
Uri.parse(ambiguousUrl).origin; Uri.parse(ambiguousUrl).origin;
return ambiguousUrl; return ambiguousUrl;
@ -16,13 +20,19 @@ String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl) {
.split('/') .split('/')
.where((element) => element.trim().isNotEmpty) .where((element) => element.trim().isNotEmpty)
.toList(); .toList();
if (ambiguousUrl.startsWith('/') || currPathSegments.isEmpty) { String absoluteUrl;
return '${referenceAbsoluteUrl.origin}/$ambiguousUrl'; if (ambiguousUrl.startsWith('/')) {
} else if (ambiguousUrl.split('/').length == 1) { absoluteUrl = '${referenceAbsoluteUrl.origin}$ambiguousUrl';
return '${referenceAbsoluteUrl.origin}/${currPathSegments.join('/')}/$ambiguousUrl'; } else if (currPathSegments.isEmpty) {
absoluteUrl = '${referenceAbsoluteUrl.origin}/$ambiguousUrl';
} else if (ambiguousUrl.split('/').where((e) => e.isNotEmpty).length == 1) {
absoluteUrl =
'${referenceAbsoluteUrl.origin}/${currPathSegments.join('/')}/$ambiguousUrl';
} else { } else {
return '${referenceAbsoluteUrl.origin}/${currPathSegments.sublist(0, currPathSegments.length - 1).join('/')}/$ambiguousUrl'; absoluteUrl =
'${referenceAbsoluteUrl.origin}/${currPathSegments.sublist(0, currPathSegments.length - (currPathSegments.last.contains('.') ? 1 : 0)).join('/')}/$ambiguousUrl';
} }
return Uri.parse(absoluteUrl).toString();
} }
int compareAlphaNumeric(String a, String b) { int compareAlphaNumeric(String a, String b) {
@ -85,36 +95,203 @@ bool _isNumeric(String s) {
return s.codeUnitAt(0) >= 48 && s.codeUnitAt(0) <= 57; return s.codeUnitAt(0) >= 48 && s.codeUnitAt(0) <= 57;
} }
// Given an HTTP response, grab some links according to the common additional settings
// (those that apply to intermediate and final steps)
Future<List<MapEntry<String, String>>> grabLinksCommon(
Response res, Map<String, dynamic> additionalSettings) async {
if (res.statusCode != 200) {
throw getObtainiumHttpError(res);
}
var html = parse(res.body);
List<MapEntry<String, String>> allLinks = html
.querySelectorAll('a')
.map((element) => MapEntry(
element.attributes['href'] ?? '',
element.text.isNotEmpty
? element.text
: (element.attributes['href'] ?? '').split('/').last))
.where((element) => element.key.isNotEmpty)
.map((e) => MapEntry(ensureAbsoluteUrl(e.key, res.request!.url), e.value))
.toList();
if (allLinks.isEmpty) {
allLinks = RegExp(
r'(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?')
.allMatches(res.body)
.map((match) =>
MapEntry(match.group(0)!, match.group(0)?.split('/').last ?? ''))
.toList();
}
List<MapEntry<String, String>> links = [];
bool skipSort = additionalSettings['skipSort'] == true;
bool filterLinkByText = additionalSettings['filterByLinkText'] == true;
if ((additionalSettings['customLinkFilterRegex'] as String?)?.isNotEmpty ==
true) {
var reg = RegExp(additionalSettings['customLinkFilterRegex']);
links = allLinks.where((element) {
var link = element.key;
try {
link = Uri.decodeFull(element.key);
} catch (e) {
// Some links may not have valid encoding
}
return reg.hasMatch(filterLinkByText ? element.value : link);
}).toList();
} else {
links = allLinks.where((element) {
var link = element.key;
try {
link = Uri.decodeFull(element.key);
} catch (e) {
// Some links may not have valid encoding
}
return Uri.parse(filterLinkByText ? element.value : link)
.path
.toLowerCase()
.endsWith('.apk');
}).toList();
}
if (!skipSort) {
links.sort((a, b) => additionalSettings['sortByLastLinkSegment'] == true
? compareAlphaNumeric(a.key.split('/').where((e) => e.isNotEmpty).last,
b.key.split('/').where((e) => e.isNotEmpty).last)
: compareAlphaNumeric(a.key, b.key));
}
if (additionalSettings['reverseSort'] == true) {
links = links.reversed.toList();
}
return links;
}
class HTML extends AppSource { class HTML extends AppSource {
@override
List<List<GeneratedFormItem>> get combinedAppSpecificSettingFormItems {
return super.combinedAppSpecificSettingFormItems.map((r) {
return r.map((e) {
if (e.key == 'versionExtractionRegEx') {
e.label = tr('versionExtractionRegEx');
}
if (e.key == 'matchGroupToUse') {
e.label = tr('matchGroupToUse');
}
return e;
}).toList();
}).toList();
}
var finalStepFormitems = [
[
GeneratedFormTextField('customLinkFilterRegex',
label: tr('customLinkFilterRegex'),
hint: 'download/(.*/)?(android|apk|mobile)',
required: false,
additionalValidators: [
(value) {
return regExValidator(value);
}
])
],
[
GeneratedFormSwitch('versionExtractWholePage',
label: tr('versionExtractWholePage'))
]
];
var commonFormItems = [
[GeneratedFormSwitch('filterByLinkText', label: tr('filterByLinkText'))],
[GeneratedFormSwitch('skipSort', label: tr('skipSort'))],
[GeneratedFormSwitch('reverseSort', label: tr('takeFirstLink'))],
[
GeneratedFormSwitch('sortByLastLinkSegment',
label: tr('sortByLastLinkSegment'))
],
];
var intermediateFormItems = [
[
GeneratedFormTextField('customLinkFilterRegex',
label: tr('intermediateLinkRegex'),
hint: '([0-9]+.)*[0-9]+/\$',
required: true,
additionalValidators: [(value) => regExValidator(value)])
],
];
HTML() { HTML() {
additionalSourceAppSpecificSettingFormItems = [ additionalSourceAppSpecificSettingFormItems = [
[ [
GeneratedFormSwitch('sortByFileNamesNotLinks', GeneratedFormSubForm(
label: tr('sortByFileNamesNotLinks')) 'intermediateLink', [...intermediateFormItems, ...commonFormItems],
label: tr('intermediateLink'))
], ],
finalStepFormitems[0],
...commonFormItems,
...finalStepFormitems.sublist(1),
[ [
GeneratedFormTextField('customLinkFilterRegex', GeneratedFormSubForm(
label: tr('customLinkFilterRegex'), 'requestHeader',
hint: 'download/(.*/)?(android|apk|mobile)', [
required: false, [
additionalValidators: [ GeneratedFormTextField('requestHeader',
(value) { label: tr('requestHeader'),
return regExValidator(value); required: false,
additionalValidators: [
(value) {
if ((value ?? 'empty:valid')
.split(':')
.map((e) => e.trim())
.where((e) => e.isNotEmpty)
.length <
2) {
return tr('invalidInput');
}
return null;
}
])
]
],
label: tr('requestHeader'),
defaultValue: [
{
'requestHeader':
'User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36'
} }
]) ])
], ],
[
GeneratedFormDropdown(
'defaultPseudoVersioningMethod',
[
MapEntry('partialAPKHash', tr('partialAPKHash')),
MapEntry('APKLinkHash', tr('APKLinkHash'))
],
label: tr('defaultPseudoVersioningMethod'),
defaultValue: 'partialAPKHash')
]
]; ];
} }
@override @override
// TODO: implement requestHeaders choice, hardcoded for now Future<Map<String, String>?> getRequestHeaders(
Map<String, String>? get requestHeaders => { Map<String, dynamic> additionalSettings,
"User-Agent": {bool forAPKDownload = false}) async {
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36" if (additionalSettings.isNotEmpty) {
}; if (additionalSettings['requestHeader']?.isNotEmpty != true) {
additionalSettings['requestHeader'] = [];
}
additionalSettings['requestHeader'] = additionalSettings['requestHeader']
.where((l) => l['requestHeader'].isNotEmpty == true)
.toList();
Map<String, String> requestHeaders = {};
for (int i = 0; i < (additionalSettings['requestHeader'].length); i++) {
var temp =
(additionalSettings['requestHeader'][i]['requestHeader'] as String)
.split(':');
requestHeaders[temp[0].trim()] = temp.sublist(1).join(':').trim();
}
return requestHeaders;
}
return null;
}
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
return url; return url;
} }
@ -123,46 +300,70 @@ class HTML extends AppSource {
String standardUrl, String standardUrl,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
var uri = Uri.parse(standardUrl); var currentUrl = standardUrl;
Response res = await sourceRequest(standardUrl); if (additionalSettings['intermediateLink']?.isNotEmpty != true) {
if (res.statusCode == 200) { additionalSettings['intermediateLink'] = [];
var html = parse(res.body);
List<String> allLinks = html
.querySelectorAll('a')
.map((element) => element.attributes['href'] ?? '')
.toList();
List<String> links = [];
if ((additionalSettings['customLinkFilterRegex'] as String?)
?.isNotEmpty ==
true) {
var reg = RegExp(additionalSettings['customLinkFilterRegex']);
links = allLinks.where((element) => reg.hasMatch(element)).toList();
} else {
links = allLinks
.where((element) =>
Uri.parse(element).path.toLowerCase().endsWith('.apk'))
.toList();
}
links.sort((a, b) => additionalSettings['sortByFileNamesNotLinks'] == true
? compareAlphaNumeric(a.split('/').where((e) => e.isNotEmpty).last,
b.split('/').where((e) => e.isNotEmpty).last)
: compareAlphaNumeric(a, b));
if ((additionalSettings['apkFilterRegEx'] as String?)?.isNotEmpty ==
true) {
var reg = RegExp(additionalSettings['apkFilterRegEx']);
links = links.where((element) => reg.hasMatch(element)).toList();
}
if (links.isEmpty) {
throw NoReleasesError();
}
var rel = links.last;
var version = rel.hashCode.toString();
List<String> apkUrls =
[rel].map((e) => ensureAbsoluteUrl(e, uri)).toList();
return APKDetails(version, apkUrls.map((e) => MapEntry(e, e)).toList(),
AppNames(uri.host, tr('app')));
} else {
throw getObtainiumHttpError(res);
} }
additionalSettings['intermediateLink'] =
additionalSettings['intermediateLink']
.where((l) => l['customLinkFilterRegex'].isNotEmpty == true)
.toList();
for (int i = 0; i < (additionalSettings['intermediateLink'].length); i++) {
var intLinks = await grabLinksCommon(
await sourceRequest(currentUrl, additionalSettings),
additionalSettings['intermediateLink'][i]);
if (intLinks.isEmpty) {
throw NoReleasesError(note: currentUrl);
} else {
currentUrl = intLinks.last.key;
}
}
var uri = Uri.parse(currentUrl);
List<MapEntry<String, String>> links = [];
String versionExtractionWholePageString = currentUrl;
if (additionalSettings['directAPKLink'] != true) {
Response res = await sourceRequest(currentUrl, additionalSettings);
versionExtractionWholePageString =
res.body.split('\r\n').join('\n').split('\n').join('\\n');
links = await grabLinksCommon(res, additionalSettings);
links = filterApks(links, additionalSettings['apkFilterRegEx'],
additionalSettings['invertAPKFilter']);
if (links.isEmpty) {
throw NoReleasesError(note: currentUrl);
}
} else {
links = [MapEntry(currentUrl, currentUrl)];
}
var rel = links.last.key;
var relDecoded = rel;
try {
relDecoded = Uri.decodeFull(rel);
} catch (e) {
// Some links may not have valid encoding
}
String? version;
version = extractVersion(
additionalSettings['versionExtractionRegEx'] as String?,
additionalSettings['matchGroupToUse'] as String?,
additionalSettings['versionExtractWholePage'] == true
? versionExtractionWholePageString
: relDecoded);
version ??= additionalSettings['defaultPseudoVersioningMethod'] ==
'APKLinkHash'
? rel.hashCode.toString()
: (await checkPartialDownloadHashDynamic(rel,
headers: await getRequestHeaders(additionalSettings,
forAPKDownload: true),
allowInsecure: additionalSettings['allowInsecure'] == true))
.toString();
return APKDetails(
version,
[rel].map((e) {
var uri = Uri.parse(e);
var fileName =
uri.pathSegments.isNotEmpty ? uri.pathSegments.last : uri.origin;
return MapEntry('${e.hashCode}-$fileName', e);
}).toList(),
AppNames(uri.host, tr('app')));
} }
} }

View File

@ -0,0 +1,97 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:http/http.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
class HuaweiAppGallery extends AppSource {
HuaweiAppGallery() {
name = 'Huawei AppGallery';
hosts = ['appgallery.huawei.com', 'appgallery.cloud.huawei.com'];
versionDetectionDisallowed = true;
showReleaseDateAsVersionToggle = true;
}
@override
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp(
'^https?://(www\\.)?${getSourceRegex(hosts)}(/#)?/(app|appdl)/[^/]+',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) {
throw InvalidURLError(name);
}
return match.group(0)!;
}
getDlUrl(String standardUrl) =>
'https://${hosts[0].replaceAll('appgallery.huawei', 'appgallery.cloud.huawei')}/appdl/${standardUrl.split('/').last}';
requestAppdlRedirect(
String dlUrl, Map<String, dynamic> additionalSettings) async {
Response res =
await sourceRequest(dlUrl, additionalSettings, followRedirects: false);
if (res.statusCode == 200 ||
res.statusCode == 302 ||
res.statusCode == 304) {
return res;
} else {
throw getObtainiumHttpError(res);
}
}
appIdFromRedirectDlUrl(String redirectDlUrl) {
var parts = redirectDlUrl
.split('?')[0]
.split('/')
.last
.split('.')
.reversed
.toList();
parts.removeAt(0);
parts.removeAt(0);
return parts.reversed.join('.');
}
@override
Future<String?> tryInferringAppId(String standardUrl,
{Map<String, dynamic> additionalSettings = const {}}) async {
String dlUrl = getDlUrl(standardUrl);
Response res = await requestAppdlRedirect(dlUrl, additionalSettings);
return res.headers['location'] != null
? appIdFromRedirectDlUrl(res.headers['location']!)
: null;
}
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
String dlUrl = getDlUrl(standardUrl);
Response res = await requestAppdlRedirect(dlUrl, additionalSettings);
if (res.headers['location'] == null) {
throw NoReleasesError();
}
String appId = appIdFromRedirectDlUrl(res.headers['location']!);
if (appId.isEmpty) {
throw NoReleasesError();
}
var relDateStr =
res.headers['location']?.split('?')[0].split('.').reversed.toList()[1];
if (relDateStr == null || relDateStr.length != 10) {
throw NoVersionError();
}
var relDateStrAdj = relDateStr.split('');
var tempLen = relDateStrAdj.length;
var i = 2;
while (i < tempLen) {
relDateStrAdj.insert((i + i ~/ 2 - 1), '-');
i += 2;
}
var relDate =
DateFormat('yy-MM-dd-HH-mm', 'en_US').parse(relDateStrAdj.join(''));
return APKDetails(
relDateStr, [MapEntry('$appId.apk', dlUrl)], AppNames(name, appId),
releaseDate: relDate);
}
}

View File

@ -3,24 +3,38 @@ import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
class IzzyOnDroid extends AppSource { class IzzyOnDroid extends AppSource {
late FDroid fd;
IzzyOnDroid() { IzzyOnDroid() {
host = 'android.izzysoft.de'; hosts = ['izzysoft.de'];
fd = FDroid();
additionalSourceAppSpecificSettingFormItems =
fd.additionalSourceAppSpecificSettingFormItems;
allowSubDomains = true;
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp('^https?://$host/repo/apk/[^/]+'); RegExp standardUrlRegExA = RegExp(
RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase()); '^https?://android.${getSourceRegex(hosts)}/repo/apk/[^/]+',
caseSensitive: false);
RegExpMatch? match = standardUrlRegExA.firstMatch(url);
if (match == null) {
RegExp standardUrlRegExB = RegExp(
'^https?://apt.${getSourceRegex(hosts)}/fdroid/index/apk/[^/]+',
caseSensitive: false);
match = standardUrlRegExB.firstMatch(url);
}
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
Future<String?> tryInferringAppId(String standardUrl, Future<String?> tryInferringAppId(String standardUrl,
{Map<String, dynamic> additionalSettings = const {}}) async { {Map<String, dynamic> additionalSettings = const {}}) async {
return FDroid().tryInferringAppId(standardUrl); return fd.tryInferringAppId(standardUrl);
} }
@override @override
@ -29,10 +43,13 @@ class IzzyOnDroid extends AppSource {
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
String? appId = await tryInferringAppId(standardUrl); String? appId = await tryInferringAppId(standardUrl);
return FDroid().getAPKUrlsFromFDroidPackagesAPIResponse( return fd.getAPKUrlsFromFDroidPackagesAPIResponse(
await sourceRequest( await sourceRequest(
'https://apt.izzysoft.de/fdroid/api/v1/packages/$appId'), 'https://apt.izzysoft.de/fdroid/api/v1/packages/$appId',
additionalSettings),
'https://android.izzysoft.de/frepo/$appId', 'https://android.izzysoft.de/frepo/$appId',
standardUrl); standardUrl,
name,
additionalSettings: additionalSettings);
} }
} }

View File

@ -6,7 +6,9 @@ import 'package:obtainium/providers/source_provider.dart';
class Jenkins extends AppSource { class Jenkins extends AppSource {
Jenkins() { Jenkins() {
overrideVersionDetectionFormDefault('releaseDateAsVersion', true); versionDetectionDisallowed = true;
neverAutoSelect = true;
showReleaseDateAsVersionToggle = true;
} }
String trimJobUrl(String url) { String trimJobUrl(String url) {
@ -15,7 +17,7 @@ class Jenkins extends AppSource {
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
@ -28,8 +30,8 @@ class Jenkins extends AppSource {
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
standardUrl = trimJobUrl(standardUrl); standardUrl = trimJobUrl(standardUrl);
Response res = Response res = await sourceRequest(
await sourceRequest('$standardUrl/lastSuccessfulBuild/api/json'); '$standardUrl/lastSuccessfulBuild/api/json', additionalSettings);
if (res.statusCode == 200) { if (res.statusCode == 200) {
var json = jsonDecode(res.body); var json = jsonDecode(res.body);
var releaseDate = json['timestamp'] == null var releaseDate = json['timestamp'] == null

View File

@ -6,17 +6,19 @@ import 'package:obtainium/providers/source_provider.dart';
class Mullvad extends AppSource { class Mullvad extends AppSource {
Mullvad() { Mullvad() {
host = 'mullvad.net'; hosts = ['mullvad.net'];
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp('^https?://$host'); RegExp standardUrlRegEx = RegExp(
RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase()); '^https?://(www\\.)?${getSourceRegex(hosts)}',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
@ -28,7 +30,8 @@ class Mullvad extends AppSource {
String standardUrl, String standardUrl,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
Response res = await sourceRequest('$standardUrl/en/download/android'); Response res = await sourceRequest(
'$standardUrl/en/download/android', additionalSettings);
if (res.statusCode == 200) { if (res.statusCode == 200) {
var versions = parse(res.body) var versions = parse(res.body)
.querySelectorAll('p') .querySelectorAll('p')

View File

@ -5,17 +5,20 @@ import 'package:obtainium/providers/source_provider.dart';
class NeutronCode extends AppSource { class NeutronCode extends AppSource {
NeutronCode() { NeutronCode() {
host = 'neutroncode.com'; hosts = ['neutroncode.com'];
showReleaseDateAsVersionToggle = true;
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp('^https?://$host/downloads/file/[^/]+'); RegExp standardUrlRegEx = RegExp(
RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase()); '^https?://(www\\.)?${getSourceRegex(hosts)}/downloads/file/[^/]+',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
@ -78,7 +81,7 @@ class NeutronCode extends AppSource {
String standardUrl, String standardUrl,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
Response res = await sourceRequest(standardUrl); Response res = await sourceRequest(standardUrl, additionalSettings);
if (res.statusCode == 200) { if (res.statusCode == 200) {
var http = parse(res.body); var http = parse(res.body);
var name = http.querySelector('.pd-title')?.innerHtml; var name = http.querySelector('.pd-title')?.innerHtml;
@ -91,7 +94,7 @@ class NeutronCode extends AppSource {
if (version == null) { if (version == null) {
throw NoVersionError(); throw NoVersionError();
} }
String? apkUrl = 'https://$host/download/$filename'; String? apkUrl = 'https://${hosts[0]}/download/$filename';
var dateStringOriginal = var dateStringOriginal =
http.querySelector('.pd-date-txt')?.nextElementSibling?.innerHtml; http.querySelector('.pd-date-txt')?.nextElementSibling?.innerHtml;
var dateString = dateStringOriginal != null var dateString = dateStringOriginal != null

View File

@ -0,0 +1,98 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter_charset_detector/flutter_charset_detector.dart';
import 'package:http/http.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
class RuStore extends AppSource {
RuStore() {
hosts = ['rustore.ru'];
name = 'RuStore';
naiveStandardVersionDetection = true;
showReleaseDateAsVersionToggle = true;
}
@override
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp(
'^https?://(www\\.)?${getSourceRegex(hosts)}/catalog/app/+[^/]+',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) {
throw InvalidURLError(name);
}
return match.group(0)!;
}
@override
Future<String?> tryInferringAppId(String standardUrl,
{Map<String, dynamic> additionalSettings = const {}}) async {
return Uri.parse(standardUrl).pathSegments.last;
}
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
String? appId = await tryInferringAppId(standardUrl);
Response res0 = await sourceRequest(
'https://backapi.rustore.ru/applicationData/overallInfo/$appId',
additionalSettings);
if (res0.statusCode != 200) {
throw getObtainiumHttpError(res0);
}
var appDetails = jsonDecode(res0.body)['body'];
if (appDetails['appId'] == null) {
throw NoReleasesError();
}
String appName = appDetails['appName'] ?? tr('app');
String author = appDetails['companyName'] ?? name;
String? dateStr = appDetails['updatedAt'];
String? version = appDetails['versionName'];
String? changeLog = appDetails['whatsNew'];
if (version == null) {
throw NoVersionError();
}
DateTime? relDate;
if (dateStr != null) {
relDate = DateTime.parse(dateStr);
}
Response res1 = await sourceRequest(
'https://backapi.rustore.ru/applicationData/download-link',
additionalSettings,
followRedirects: false,
postBody: {"appId": appDetails['appId'], "firstInstall": true});
var downloadDetails = jsonDecode(res1.body)['body'];
if (res1.statusCode != 200 || downloadDetails['apkUrl'] == null) {
throw NoAPKError();
}
appName = (await CharsetDetector.autoDecode(
Uint8List.fromList(appName.codeUnits)))
.string;
author =
(await CharsetDetector.autoDecode(Uint8List.fromList(author.codeUnits)))
.string;
changeLog = changeLog != null
? (await CharsetDetector.autoDecode(
Uint8List.fromList(changeLog.codeUnits)))
.string
: null;
return APKDetails(
version,
getApkUrlsFromUrls([
(downloadDetails['apkUrl'] as String)
.replaceAll(RegExp('\\.zip\$'), '.apk')
]),
AppNames(author, appName),
releaseDate: relDate,
changeLog: changeLog);
}
}

View File

@ -1,37 +0,0 @@
import 'dart:convert';
import 'package:http/http.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
class Signal extends AppSource {
Signal() {
host = 'signal.org';
}
@override
String sourceSpecificStandardizeURL(String url) {
return 'https://$host';
}
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
Response res =
await sourceRequest('https://updates.$host/android/latest.json');
if (res.statusCode == 200) {
var json = jsonDecode(res.body);
String? apkUrl = json['url'];
List<String> apkUrls = apkUrl == null ? [] : [apkUrl];
String? version = json['versionName'];
if (version == null) {
throw NoVersionError();
}
return APKDetails(
version, getApkUrlsFromUrls(apkUrls), AppNames(name, 'Signal'));
} else {
throw getObtainiumHttpError(res);
}
}
}

View File

@ -5,23 +5,34 @@ import 'package:obtainium/providers/source_provider.dart';
class SourceForge extends AppSource { class SourceForge extends AppSource {
SourceForge() { SourceForge() {
host = 'sourceforge.net'; hosts = ['sourceforge.net'];
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegExB = RegExp('^https?://$host/p/[^/]+'); var sourceRegex = getSourceRegex(hosts);
RegExpMatch? match = standardUrlRegExB.firstMatch(url.toLowerCase()); RegExp standardUrlRegExC =
RegExp('^https?://(www\\.)?$sourceRegex/p/.+', caseSensitive: false);
RegExpMatch? match = standardUrlRegExC.firstMatch(url);
if (match != null) { if (match != null) {
url = url =
'https://${Uri.parse(url.substring(0, match.end)).host}/projects/${url.substring(Uri.parse(url.substring(0, match.end)).host.length + '/projects/'.length + 1)}'; 'https://${Uri.parse(match.group(0)!).host}/projects/${url.substring(Uri.parse(match.group(0)!).host.length + '/projects/'.length + 1)}';
} }
RegExp standardUrlRegExA = RegExp('^https?://$host/projects/[^/]+'); RegExp standardUrlRegExB = RegExp(
match = standardUrlRegExA.firstMatch(url.toLowerCase()); '^https?://(www\\.)?$sourceRegex/projects/[^/]+',
caseSensitive: false);
match = standardUrlRegExB.firstMatch(url);
if (match != null && match.group(0) == url) {
url = '$url/files';
}
RegExp standardUrlRegExA = RegExp(
'^https?://(www\\.)?$sourceRegex/projects/[^/]+/files(/.+)?',
caseSensitive: false);
match = standardUrlRegExA.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
@ -29,37 +40,79 @@ class SourceForge extends AppSource {
String standardUrl, String standardUrl,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
Response res = await sourceRequest('$standardUrl/rss?path=/'); var standardUri = Uri.parse(standardUrl);
if (standardUri.pathSegments.length == 2) {
standardUrl = '$standardUrl/files';
standardUri = Uri.parse(standardUrl);
}
Response res = await sourceRequest(
'${standardUri.origin}/${standardUri.pathSegments.sublist(0, 2).join('/')}/rss?path=/',
additionalSettings);
if (res.statusCode == 200) { if (res.statusCode == 200) {
var parsedHtml = parse(res.body); var parsedHtml = parse(res.body);
var allDownloadLinks = var allDownloadLinks = parsedHtml
parsedHtml.querySelectorAll('guid').map((e) => e.innerHtml).toList(); .querySelectorAll('guid')
.map((e) => e.innerHtml)
.where((element) => element.startsWith(standardUrl))
.toList();
getVersion(String url) { getVersion(String url) {
try { try {
var tokens = url.split('/'); var segments = url
var fi = tokens.indexOf('files'); .substring(standardUrl.length)
return tokens[tokens[fi + 2] == 'download' ? fi - 1 : fi + 1]; .split('/')
.where((element) => element.isNotEmpty)
.toList()
.reversed
.toList()
.sublist(1)
.reversed
.toList();
segments = segments.length > 1
? segments.reversed.toList().sublist(1).reversed.toList()
: segments;
var version = segments.isNotEmpty ? segments.join('/') : null;
if (version != null) {
try {
var extractedVersion = extractVersion(
additionalSettings['versionExtractionRegEx'] as String?,
additionalSettings['matchGroupToUse'] as String?,
version);
if (extractedVersion != null) {
version = extractedVersion;
}
} catch (e) {
if (e is NoVersionError) {
version = null;
} else {
rethrow;
}
}
}
return version;
} catch (e) { } catch (e) {
return null; return null;
} }
} }
String? version = getVersion(allDownloadLinks[0]); var apkUrlListAllReleases = allDownloadLinks
.where((element) => element.toLowerCase().endsWith('.apk/download'))
.where((element) => getVersion(element) != null)
.toList();
if (apkUrlListAllReleases.isEmpty) {
throw NoReleasesError();
}
String? version = getVersion(apkUrlListAllReleases[0]);
if (version == null) { if (version == null) {
throw NoVersionError(); throw NoVersionError();
} }
var apkUrlListAllReleases = allDownloadLinks
.where((element) => element.toLowerCase().endsWith('.apk/download'))
.toList();
var apkUrlList = var apkUrlList =
apkUrlListAllReleases // This can be used skipped for fallback support later apkUrlListAllReleases // This can be used skipped for fallback support later
.where((element) => getVersion(element) == version) .where((element) => getVersion(element) == version)
.toList(); .toList();
return APKDetails( var segments = standardUrl.split('/');
version, return APKDetails(version, getApkUrlsFromUrls(apkUrlList),
getApkUrlsFromUrls(apkUrlList), AppNames(name, segments[segments.indexOf('files') - 1]));
AppNames(
name, standardUrl.substring(standardUrl.lastIndexOf('/') + 1)));
} else { } else {
throw getObtainiumHttpError(res); throw getObtainiumHttpError(res);
} }

View File

@ -8,7 +8,8 @@ import 'package:easy_localization/easy_localization.dart';
class SourceHut extends AppSource { class SourceHut extends AppSource {
SourceHut() { SourceHut() {
host = 'git.sr.ht'; hosts = ['git.sr.ht'];
showReleaseDateAsVersionToggle = true;
additionalSourceAppSpecificSettingFormItems = [ additionalSourceAppSpecificSettingFormItems = [
[ [
@ -19,13 +20,15 @@ class SourceHut extends AppSource {
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp('^https?://$host/[^/]+/[^/]+'); RegExp standardUrlRegEx = RegExp(
RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase()); '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) { if (match == null) {
throw InvalidURLError(name); throw InvalidURLError(name);
} }
return url.substring(0, match.end); return match.group(0)!;
} }
@override @override
@ -36,19 +39,38 @@ class SourceHut extends AppSource {
String standardUrl, String standardUrl,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
if (standardUrl.endsWith('/refs')) {
standardUrl = standardUrl
.split('/')
.reversed
.toList()
.sublist(1)
.reversed
.join('/');
}
Uri standardUri = Uri.parse(standardUrl); Uri standardUri = Uri.parse(standardUrl);
String appName = standardUri.pathSegments.last; String appName = standardUri.pathSegments.last;
bool fallbackToOlderReleases = bool fallbackToOlderReleases =
additionalSettings['fallbackToOlderReleases'] == true; additionalSettings['fallbackToOlderReleases'] == true;
Response res = await sourceRequest('$standardUrl/refs/rss.xml'); Response res =
await sourceRequest('$standardUrl/refs/rss.xml', additionalSettings);
if (res.statusCode == 200) { if (res.statusCode == 200) {
var parsedHtml = parse(res.body); var parsedHtml = parse(res.body);
List<APKDetails> apkDetailsList = []; List<APKDetails> apkDetailsList = [];
int ind = 0; int ind = 0;
for (var entry in parsedHtml.querySelectorAll('item').sublist(0, 6)) { for (var entry in parsedHtml.querySelectorAll('item').sublist(0, 6)) {
// Limit 5 for speed ind++;
if (!fallbackToOlderReleases && ind > 0) { String releasePage = // querySelector('link') fails for some reason
entry
.querySelector('guid') // Luckily guid is identical
?.innerHtml
.trim() ??
'';
if (!releasePage.startsWith('$standardUrl/refs')) {
continue;
}
if (!fallbackToOlderReleases && ind > 1) {
break; break;
} }
String? version = entry.querySelector('title')?.text.trim(); String? version = entry.querySelector('title')?.text.trim();
@ -56,7 +78,6 @@ class SourceHut extends AppSource {
throw NoVersionError(); throw NoVersionError();
} }
String? releaseDateString = entry.querySelector('pubDate')?.innerHtml; String? releaseDateString = entry.querySelector('pubDate')?.innerHtml;
String releasePage = '$standardUrl/refs/$version';
DateTime? releaseDate; DateTime? releaseDate;
try { try {
releaseDate = releaseDateString != null releaseDate = releaseDateString != null
@ -69,7 +90,7 @@ class SourceHut extends AppSource {
} catch (e) { } catch (e) {
// ignore // ignore
} }
var res2 = await sourceRequest(releasePage); var res2 = await sourceRequest(releasePage, additionalSettings);
List<MapEntry<String, String>> apkUrls = []; List<MapEntry<String, String>> apkUrls = [];
if (res2.statusCode == 200) { if (res2.statusCode == 200) {
apkUrls = getApkUrlsFromUrls(parse(res2.body) apkUrls = getApkUrlsFromUrls(parse(res2.body)
@ -85,7 +106,6 @@ class SourceHut extends AppSource {
AppNames(entry.querySelector('author')?.innerHtml.trim() ?? appName, AppNames(entry.querySelector('author')?.innerHtml.trim() ?? appName,
appName), appName),
releaseDate: releaseDate)); releaseDate: releaseDate));
ind++;
} }
if (apkDetailsList.isEmpty) { if (apkDetailsList.isEmpty) {
throw NoReleasesError(); throw NoReleasesError();

View File

@ -1,62 +0,0 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:html/parser.dart';
import 'package:http/http.dart';
import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
class SteamMobile extends AppSource {
SteamMobile() {
host = 'store.steampowered.com';
name = tr('steam');
additionalSourceAppSpecificSettingFormItems = [
[
GeneratedFormDropdown('app', apks.entries.toList(),
label: tr('app'), defaultValue: apks.entries.toList()[0].key)
]
];
}
final apks = {'steam': tr('steamMobile'), 'steam-chat-app': tr('steamChat')};
@override
String sourceSpecificStandardizeURL(String url) {
return 'https://$host';
}
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
Response res = await sourceRequest('https://$host/mobile');
if (res.statusCode == 200) {
var apkNamePrefix = additionalSettings['app'] as String?;
if (apkNamePrefix == null) {
throw NoReleasesError();
}
String apkInURLRegexPattern =
'/$apkNamePrefix-([0-9]+\\.)*[0-9]+\\.apk\$';
var links = parse(res.body)
.querySelectorAll('a')
.map((e) => e.attributes['href'] ?? '')
.where((e) => RegExp('https://.*$apkInURLRegexPattern').hasMatch(e))
.toList();
if (links.isEmpty) {
throw NoReleasesError();
}
var versionMatch = RegExp(apkInURLRegexPattern).firstMatch(links[0]);
if (versionMatch == null) {
throw NoVersionError();
}
var version = links[0].substring(
versionMatch.start + apkNamePrefix.length + 2, versionMatch.end - 4);
var apkUrls = [links[0]];
return APKDetails(version, getApkUrlsFromUrls(apkUrls),
AppNames(name, apks[apkNamePrefix]!));
} else {
throw getObtainiumHttpError(res);
}
}
}

View File

@ -6,13 +6,13 @@ import 'package:obtainium/providers/source_provider.dart';
class TelegramApp extends AppSource { class TelegramApp extends AppSource {
TelegramApp() { TelegramApp() {
host = 'telegram.org'; hosts = ['telegram.org'];
name = 'Telegram ${tr('app')}'; name = 'Telegram ${tr('app')}';
} }
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
return 'https://$host'; return 'https://${hosts[0]}';
} }
@override @override
@ -20,7 +20,8 @@ class TelegramApp extends AppSource {
String standardUrl, String standardUrl,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
Response res = await sourceRequest('https://t.me/s/TAndroidAPK'); Response res =
await sourceRequest('https://t.me/s/TAndroidAPK', additionalSettings);
if (res.statusCode == 200) { if (res.statusCode == 200) {
var http = parse(res.body); var http = parse(res.body);
var messages = var messages =
@ -32,7 +33,9 @@ class TelegramApp extends AppSource {
throw NoVersionError(); throw NoVersionError();
} }
String? apkUrl = 'https://telegram.org/dl/android/apk'; String? apkUrl = 'https://telegram.org/dl/android/apk';
return APKDetails(version, getApkUrlsFromUrls([apkUrl]), return APKDetails(
version,
[MapEntry<String, String>('telegram-$version.apk', apkUrl)],
AppNames('Telegram', 'Telegram')); AppNames('Telegram', 'Telegram'));
} else { } else {
throw getObtainiumHttpError(res); throw getObtainiumHttpError(res);

View File

@ -0,0 +1,79 @@
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
class Tencent extends AppSource {
Tencent() {
name = tr('tencentAppStore');
hosts = ['sj.qq.com'];
naiveStandardVersionDetection = true;
showReleaseDateAsVersionToggle = true;
}
@override
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp(
'^https?://${getSourceRegex(hosts)}/appdetail/[^/]+',
caseSensitive: false);
var match = standardUrlRegEx.firstMatch(url);
if (match == null) {
throw InvalidURLError(name);
}
return match.group(0)!;
}
@override
Future<String?> tryInferringAppId(String standardUrl,
{Map<String, dynamic> additionalSettings = const {}}) async {
return Uri.parse(standardUrl).pathSegments.last;
}
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
String appId = (await tryInferringAppId(standardUrl))!;
String baseHost = Uri.parse(standardUrl)
.host
.split('.')
.reversed
.toList()
.sublist(0, 2)
.reversed
.join('.');
var res = await sourceRequest(
'https://upage.html5.$baseHost/wechat-apkinfo', additionalSettings,
followRedirects: false, postBody: {"packagename": appId});
if (res.statusCode == 200) {
var json = jsonDecode(res.body);
if (json['app_detail_records'][appId] == null) {
throw NoReleasesError();
}
var version =
json['app_detail_records'][appId]['apk_all_data']['version_name'];
var apkUrl = json['app_detail_records'][appId]['apk_all_data']['url'];
if (apkUrl == null) {
throw NoAPKError();
}
var appName = json['app_detail_records'][appId]['app_info']['name'];
var author = json['app_detail_records'][appId]['app_info']['author'];
var releaseDate =
json['app_detail_records'][appId]['app_info']['update_time'];
var apkName = Uri.parse(apkUrl).queryParameters['fsname'] ??
'${appId}_${version}.apk';
return APKDetails(
version, [MapEntry(apkName, apkUrl)], AppNames(author, appName),
releaseDate: releaseDate != null
? DateTime.fromMillisecondsSinceEpoch(releaseDate * 1000)
: null);
} else {
throw getObtainiumHttpError(res);
}
}
}

View File

@ -0,0 +1,114 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:html/parser.dart';
import 'package:obtainium/app_sources/apkpure.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
class Uptodown extends AppSource {
Uptodown() {
hosts = ['uptodown.com'];
allowSubDomains = true;
naiveStandardVersionDetection = true;
showReleaseDateAsVersionToggle = true;
urlsAlwaysHaveExtension = true;
}
@override
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
RegExp standardUrlRegEx = RegExp(
'^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}',
caseSensitive: false);
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
if (match == null) {
throw InvalidURLError(name);
}
return '${match.group(0)!}/android/download';
}
@override
Future<String?> tryInferringAppId(String standardUrl,
{Map<String, dynamic> additionalSettings = const {}}) async {
return (await getAppDetailsFromPage(
standardUrl, additionalSettings))['appId'];
}
Future<Map<String, String?>> getAppDetailsFromPage(
String standardUrl, Map<String, dynamic> additionalSettings) async {
var res = await sourceRequest(standardUrl, additionalSettings);
if (res.statusCode != 200) {
throw getObtainiumHttpError(res);
}
var html = parse(res.body);
String? version = html.querySelector('div.version')?.innerHtml;
String? name = html.querySelector('#detail-app-name')?.innerHtml.trim();
String? author = html.querySelector('#author-link')?.innerHtml.trim();
var detailElements = html
.querySelectorAll('#technical-information td')
.map((e) => e.innerHtml.trim())
.where((e) => !e.startsWith('<'))
.toList();
String? appId = detailElements.elementAtOrNull(0);
String? dateStr = detailElements.elementAtOrNull(6);
String? fileId =
html.querySelector('#detail-app-name')?.attributes['data-file-id'];
String? extension = detailElements.elementAtOrNull(7)?.toLowerCase();
return Map.fromEntries([
MapEntry('version', version),
MapEntry('appId', appId),
MapEntry('name', name),
MapEntry('author', author),
MapEntry('dateStr', dateStr),
MapEntry('fileId', fileId),
MapEntry('extension', extension)
]);
}
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
var appDetails =
await getAppDetailsFromPage(standardUrl, additionalSettings);
var version = appDetails['version'];
var appId = appDetails['appId'];
var fileId = appDetails['fileId'];
var extension = appDetails['extension'];
if (version == null) {
throw NoVersionError();
}
if (fileId == null) {
throw NoAPKError();
}
var apkUrl = '$standardUrl/$fileId-x';
if (appId == null) {
throw NoReleasesError();
}
String appName = appDetails['name'] ?? tr('app');
String author = appDetails['author'] ?? name;
String? dateStr = appDetails['dateStr'];
DateTime? relDate;
if (dateStr != null) {
relDate = parseDateTimeMMMddCommayyyy(dateStr);
}
return APKDetails(version, [MapEntry('$appId.$extension', apkUrl)],
AppNames(author, appName),
releaseDate: relDate);
}
@override
Future<String> apkUrlPrefetchModifier(String apkUrl, String standardUrl,
Map<String, dynamic> additionalSettings) async {
var res = await sourceRequest(apkUrl, additionalSettings);
if (res.statusCode != 200) {
throw getObtainiumHttpError(res);
}
var html = parse(res.body);
var finalUrlKey =
html.querySelector('#detail-download-button')?.attributes['data-url'];
if (finalUrlKey == null) {
throw NoAPKError();
}
return 'https://dw.${hosts[0]}/dwn/$finalUrlKey';
}
}

View File

@ -1,76 +0,0 @@
import 'package:html/parser.dart';
import 'package:http/http.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
class VLC extends AppSource {
VLC() {
host = 'videolan.org';
}
@override
String sourceSpecificStandardizeURL(String url) {
return 'https://$host';
}
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
Response res = await sourceRequest(
'https://www.videolan.org/vlc/download-android.html');
if (res.statusCode == 200) {
var dwUrlBase = 'get.videolan.org/vlc-android';
var dwLinks = parse(res.body)
.querySelectorAll('a')
.where((element) =>
element.attributes['href']?.contains(dwUrlBase) ?? false)
.toList();
String? version = dwLinks.isNotEmpty
? dwLinks.first.attributes['href']
?.split('/')
.where((s) => s.isNotEmpty)
.last
: null;
if (version == null) {
throw NoVersionError();
}
String? targetUrl = 'https://$dwUrlBase/$version/';
Response res2 = await sourceRequest(targetUrl);
List<String> apkUrls = [];
if (res2.statusCode == 200) {
apkUrls = parse(res2.body)
.querySelectorAll('a')
.map((e) => e.attributes['href']?.split('/').last)
.where((h) =>
h != null && h.isNotEmpty && h.toLowerCase().endsWith('.apk'))
.map((e) => targetUrl + e!)
.toList();
} else {
throw getObtainiumHttpError(res2);
}
return APKDetails(
version, getApkUrlsFromUrls(apkUrls), AppNames('VideoLAN', 'VLC'));
} else {
throw getObtainiumHttpError(res);
}
}
@override
Future<String> apkUrlPrefetchModifier(
String apkUrl, String standardUrl) async {
Response res = await sourceRequest(apkUrl);
if (res.statusCode == 200) {
String? apkUrl =
parse(res.body).querySelector('#alt_link')?.attributes['href'];
if (apkUrl == null) {
throw NoAPKError();
}
return apkUrl;
} else {
throw getObtainiumHttpError(res);
}
}
}

View File

@ -1,75 +0,0 @@
import 'package:html/parser.dart';
import 'package:http/http.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
class WhatsApp extends AppSource {
WhatsApp() {
host = 'whatsapp.com';
}
@override
String sourceSpecificStandardizeURL(String url) {
return 'https://$host';
}
@override
Future<String> apkUrlPrefetchModifier(
String apkUrl, String standardUrl) async {
Response res = await sourceRequest('https://www.whatsapp.com/android');
if (res.statusCode == 200) {
var targetLinks = parse(res.body)
.querySelectorAll('a')
.map((e) => e.attributes['href'] ?? '')
.where((e) => e.isNotEmpty)
.where((e) =>
e.contains('content.whatsapp.net') && e.contains('WhatsApp.apk'))
.toList();
if (targetLinks.isEmpty) {
throw NoAPKError();
}
return targetLinks[0];
} else {
throw getObtainiumHttpError(res);
}
}
@override
Future<APKDetails> getLatestAPKDetails(
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
Response res = await sourceRequest('https://www.whatsapp.com/android');
if (res.statusCode == 200) {
var targetElements = parse(res.body)
.querySelectorAll('p')
.where((element) => element.innerHtml.contains('Version '))
.toList();
if (targetElements.isEmpty) {
throw NoVersionError();
}
var vLines = targetElements[0]
.innerHtml
.split('\n')
.where((element) => element.contains('Version '))
.toList();
if (vLines.isEmpty) {
throw NoVersionError();
}
var versionMatch = RegExp('[0-9]+(\\.[0-9]+)+').firstMatch(vLines[0]);
if (versionMatch == null) {
throw NoVersionError();
}
String version =
vLines[0].substring(versionMatch.start, versionMatch.end);
return APKDetails(
version,
getApkUrlsFromUrls([
'https://www.whatsapp.com/android?v=$version&=thisIsaPlaceholder&a=realURLPrefetchedAtDownloadTime'
]),
AppNames('Meta', 'WhatsApp'));
} else {
throw getObtainiumHttpError(res);
}
}
}

View File

@ -4,6 +4,8 @@ import 'package:hsluv/hsluv.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:obtainium/components/generated_form_modal.dart'; import 'package:obtainium/components/generated_form_modal.dart';
import 'package:obtainium/providers/source_provider.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
abstract class GeneratedFormItem { abstract class GeneratedFormItem {
late String key; late String key;
@ -12,6 +14,7 @@ abstract class GeneratedFormItem {
late dynamic defaultValue; late dynamic defaultValue;
List<dynamic> additionalValidators; List<dynamic> additionalValidators;
dynamic ensureType(dynamic val); dynamic ensureType(dynamic val);
GeneratedFormItem clone();
GeneratedFormItem(this.key, GeneratedFormItem(this.key,
{this.label = 'Input', {this.label = 'Input',
@ -25,26 +28,40 @@ class GeneratedFormTextField extends GeneratedFormItem {
late int max; late int max;
late String? hint; late String? hint;
late bool password; late bool password;
late TextInputType? textInputType;
late List<String>? autoCompleteOptions;
GeneratedFormTextField(String key, GeneratedFormTextField(super.key,
{String label = 'Input', {super.label,
List<Widget> belowWidgets = const [], super.belowWidgets,
String defaultValue = '', String super.defaultValue = '',
List<String? Function(String? value)> additionalValidators = const [], List<String? Function(String? value)> super.additionalValidators =
const [],
this.required = true, this.required = true,
this.max = 1, this.max = 1,
this.hint, this.hint,
this.password = false}) this.password = false,
: super(key, this.textInputType,
label: label, this.autoCompleteOptions});
belowWidgets: belowWidgets,
defaultValue: defaultValue,
additionalValidators: additionalValidators);
@override @override
String ensureType(val) { String ensureType(val) {
return val.toString(); return val.toString();
} }
@override
GeneratedFormTextField clone() {
return GeneratedFormTextField(key,
label: label,
belowWidgets: belowWidgets,
defaultValue: defaultValue,
additionalValidators: List.from(additionalValidators),
required: required,
max: max,
hint: hint,
password: password,
textInputType: textInputType);
}
} }
class GeneratedFormDropdown extends GeneratedFormItem { class GeneratedFormDropdown extends GeneratedFormItem {
@ -52,42 +69,61 @@ class GeneratedFormDropdown extends GeneratedFormItem {
List<String>? disabledOptKeys; List<String>? disabledOptKeys;
GeneratedFormDropdown( GeneratedFormDropdown(
String key, super.key,
this.opts, { this.opts, {
String label = 'Input', super.label,
List<Widget> belowWidgets = const [], super.belowWidgets,
String defaultValue = '', String super.defaultValue = '',
this.disabledOptKeys, this.disabledOptKeys,
List<String? Function(String? value)> additionalValidators = const [], List<String? Function(String? value)> super.additionalValidators = const [],
}) : super(key, });
label: label,
belowWidgets: belowWidgets,
defaultValue: defaultValue,
additionalValidators: additionalValidators);
@override @override
String ensureType(val) { String ensureType(val) {
return val.toString(); return val.toString();
} }
@override
GeneratedFormDropdown clone() {
return GeneratedFormDropdown(
key,
opts?.map((e) => MapEntry(e.key, e.value)).toList(),
label: label,
belowWidgets: belowWidgets,
defaultValue: defaultValue,
disabledOptKeys:
disabledOptKeys != null ? List.from(disabledOptKeys!) : null,
additionalValidators: List.from(additionalValidators),
);
}
} }
class GeneratedFormSwitch extends GeneratedFormItem { class GeneratedFormSwitch extends GeneratedFormItem {
bool disabled = false;
GeneratedFormSwitch( GeneratedFormSwitch(
String key, { super.key, {
String label = 'Input', super.label,
List<Widget> belowWidgets = const [], super.belowWidgets,
bool defaultValue = false, bool super.defaultValue = false,
List<String? Function(bool value)> additionalValidators = const [], bool disabled = false,
}) : super(key, List<String? Function(bool value)> super.additionalValidators = const [],
label: label, });
belowWidgets: belowWidgets,
defaultValue: defaultValue,
additionalValidators: additionalValidators);
@override @override
bool ensureType(val) { bool ensureType(val) {
return val == true || val == 'true'; return val == true || val == 'true';
} }
@override
GeneratedFormSwitch clone() {
return GeneratedFormSwitch(key,
label: label,
belowWidgets: belowWidgets,
defaultValue: defaultValue,
disabled: false,
additionalValidators: List.from(additionalValidators));
}
} }
class GeneratedFormTagInput extends GeneratedFormItem { class GeneratedFormTagInput extends GeneratedFormItem {
@ -96,27 +132,36 @@ class GeneratedFormTagInput extends GeneratedFormItem {
late WrapAlignment alignment; late WrapAlignment alignment;
late String emptyMessage; late String emptyMessage;
late bool showLabelWhenNotEmpty; late bool showLabelWhenNotEmpty;
GeneratedFormTagInput(String key, GeneratedFormTagInput(super.key,
{String label = 'Input', {super.label,
List<Widget> belowWidgets = const [], super.belowWidgets,
Map<String, MapEntry<int, bool>> defaultValue = const {}, Map<String, MapEntry<int, bool>> super.defaultValue = const {},
List<String? Function(Map<String, MapEntry<int, bool>> value)> List<String? Function(Map<String, MapEntry<int, bool>> value)>
additionalValidators = const [], super.additionalValidators = const [],
this.deleteConfirmationMessage, this.deleteConfirmationMessage,
this.singleSelect = false, this.singleSelect = false,
this.alignment = WrapAlignment.start, this.alignment = WrapAlignment.start,
this.emptyMessage = 'Input', this.emptyMessage = 'Input',
this.showLabelWhenNotEmpty = true}) this.showLabelWhenNotEmpty = true});
: super(key,
label: label,
belowWidgets: belowWidgets,
defaultValue: defaultValue,
additionalValidators: additionalValidators);
@override @override
Map<String, MapEntry<int, bool>> ensureType(val) { Map<String, MapEntry<int, bool>> ensureType(val) {
return val is Map<String, MapEntry<int, bool>> ? val : {}; return val is Map<String, MapEntry<int, bool>> ? val : {};
} }
@override
GeneratedFormTagInput clone() {
return GeneratedFormTagInput(key,
label: label,
belowWidgets: belowWidgets,
defaultValue: defaultValue,
additionalValidators: List.from(additionalValidators),
deleteConfirmationMessage: deleteConfirmationMessage,
singleSelect: singleSelect,
alignment: alignment,
emptyMessage: emptyMessage,
showLabelWhenNotEmpty: showLabelWhenNotEmpty);
}
} }
typedef OnValueChanges = void Function( typedef OnValueChanges = void Function(
@ -133,6 +178,37 @@ class GeneratedForm extends StatefulWidget {
State<GeneratedForm> createState() => _GeneratedFormState(); State<GeneratedForm> createState() => _GeneratedFormState();
} }
List<List<GeneratedFormItem>> cloneFormItems(
List<List<GeneratedFormItem>> items) {
List<List<GeneratedFormItem>> clonedItems = [];
for (var row in items) {
List<GeneratedFormItem> clonedRow = [];
for (var it in row) {
clonedRow.add(it.clone());
}
clonedItems.add(clonedRow);
}
return clonedItems;
}
class GeneratedFormSubForm extends GeneratedFormItem {
final List<List<GeneratedFormItem>> items;
GeneratedFormSubForm(super.key, this.items,
{super.label, super.belowWidgets, super.defaultValue = const []});
@override
ensureType(val) {
return val; // Not easy to validate List<Map<String, dynamic>>
}
@override
GeneratedFormSubForm clone() {
return GeneratedFormSubForm(key, cloneFormItems(items),
label: label, belowWidgets: belowWidgets, defaultValue: defaultValue);
}
}
// Generates a color in the HSLuv (Pastel) color space // Generates a color in the HSLuv (Pastel) color space
// https://pub.dev/documentation/hsluv/latest/hsluv/Hsluv/hpluvToRgb.html // https://pub.dev/documentation/hsluv/latest/hsluv/Hsluv/hpluvToRgb.html
Color generateRandomLightColor() { Color generateRandomLightColor() {
@ -144,32 +220,44 @@ Color generateRandomLightColor() {
// Map from HPLuv color space to RGB, use constant saturation=100, lightness=70 // Map from HPLuv color space to RGB, use constant saturation=100, lightness=70
final List<double> rgbValuesDbl = Hsluv.hpluvToRgb([hue, 100, 70]); final List<double> rgbValuesDbl = Hsluv.hpluvToRgb([hue, 100, 70]);
// Map RBG values from 0-1 to 0-255: // Map RBG values from 0-1 to 0-255:
final List<int> rgbValues = rgbValuesDbl.map((rgb) => (rgb * 255).toInt()).toList(); final List<int> rgbValues =
rgbValuesDbl.map((rgb) => (rgb * 255).toInt()).toList();
return Color.fromARGB(255, rgbValues[0], rgbValues[1], rgbValues[2]); return Color.fromARGB(255, rgbValues[0], rgbValues[1], rgbValues[2]);
} }
int generateRandomNumber(int seed1,
{int seed2 = 0, int seed3 = 0, max = 10000}) {
int combinedSeed = seed1.hashCode ^ seed2.hashCode ^ seed3.hashCode;
Random random = Random(combinedSeed);
int randomNumber = random.nextInt(max);
return randomNumber;
}
bool validateTextField(TextFormField tf) =>
(tf.key as GlobalKey<FormFieldState>).currentState?.isValid == true;
class _GeneratedFormState extends State<GeneratedForm> { class _GeneratedFormState extends State<GeneratedForm> {
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();
Map<String, dynamic> values = {}; Map<String, dynamic> values = {};
late List<List<Widget>> formInputs; late List<List<Widget>> formInputs;
List<List<Widget>> rows = []; List<List<Widget>> rows = [];
String? initKey; String? initKey;
int forceUpdateKeyCount = 0;
// If any value changes, call this to update the parent with value and validity // If any value changes, call this to update the parent with value and validity
void someValueChanged({bool isBuilding = false}) { void someValueChanged({bool isBuilding = false, bool forceInvalid = false}) {
Map<String, dynamic> returnValues = values; Map<String, dynamic> returnValues = values;
var valid = true; var valid = true;
for (int r = 0; r < widget.items.length; r++) { for (int r = 0; r < formInputs.length; r++) {
for (int i = 0; i < widget.items[r].length; i++) { for (int i = 0; i < formInputs[r].length; i++) {
if (formInputs[r][i] is TextFormField) { if (formInputs[r][i] is TextFormField) {
var fieldState = valid = valid && validateTextField(formInputs[r][i] as TextFormField);
(formInputs[r][i].key as GlobalKey<FormFieldState>).currentState;
if (fieldState != null) {
valid = valid && fieldState.isValid;
}
} }
} }
} }
if (forceInvalid) {
valid = false;
}
widget.onValueChanges(returnValues, valid, isBuilding); widget.onValueChanges(returnValues, valid, isBuilding);
} }
@ -189,37 +277,62 @@ class _GeneratedFormState extends State<GeneratedForm> {
var formItem = e.value; var formItem = e.value;
if (formItem is GeneratedFormTextField) { if (formItem is GeneratedFormTextField) {
final formFieldKey = GlobalKey<FormFieldState>(); final formFieldKey = GlobalKey<FormFieldState>();
return TextFormField( var ctrl = TextEditingController(text: values[formItem.key]);
obscureText: formItem.password, return TypeAheadField<String>(
autocorrect: !formItem.password, controller: ctrl,
enableSuggestions: !formItem.password, builder: (context, controller, focusNode) {
key: formFieldKey, return TextFormField(
initialValue: values[formItem.key], controller: ctrl,
autovalidateMode: AutovalidateMode.onUserInteraction, focusNode: focusNode,
onChanged: (value) { keyboardType: formItem.textInputType,
obscureText: formItem.password,
autocorrect: !formItem.password,
enableSuggestions: !formItem.password,
key: formFieldKey,
autovalidateMode: AutovalidateMode.onUserInteraction,
onChanged: (value) {
setState(() {
values[formItem.key] = value;
someValueChanged();
});
},
decoration: InputDecoration(
helperText:
formItem.label + (formItem.required ? ' *' : ''),
hintText: formItem.hint),
minLines: formItem.max <= 1 ? null : formItem.max,
maxLines: formItem.max <= 1 ? 1 : formItem.max,
validator: (value) {
if (formItem.required &&
(value == null || value.trim().isEmpty)) {
return '${formItem.label} ${tr('requiredInBrackets')}';
}
for (var validator in formItem.additionalValidators) {
String? result = validator(value);
if (result != null) {
return result;
}
}
return null;
},
);
},
itemBuilder: (context, value) {
return ListTile(title: Text(value));
},
onSelected: (value) {
ctrl.text = value;
setState(() { setState(() {
values[formItem.key] = value; values[formItem.key] = value;
someValueChanged(); someValueChanged();
}); });
}, },
decoration: InputDecoration( suggestionsCallback: (search) {
helperText: formItem.label + (formItem.required ? ' *' : ''), return formItem.autoCompleteOptions
hintText: formItem.hint), ?.where((t) => t.toLowerCase().contains(search.toLowerCase()))
minLines: formItem.max <= 1 ? null : formItem.max, .toList();
maxLines: formItem.max <= 1 ? 1 : formItem.max,
validator: (value) {
if (formItem.required &&
(value == null || value.trim().isEmpty)) {
return '${formItem.label} ${tr('requiredInBrackets')}';
}
for (var validator in formItem.additionalValidators) {
String? result = validator(value);
if (result != null) {
return result;
}
}
return null;
}, },
hideOnEmpty: true,
); );
} else if (formItem is GeneratedFormDropdown) { } else if (formItem is GeneratedFormDropdown) {
if (formItem.opts!.isEmpty) { if (formItem.opts!.isEmpty) {
@ -243,6 +356,17 @@ class _GeneratedFormState extends State<GeneratedForm> {
someValueChanged(); someValueChanged();
}); });
}); });
} else if (formItem is GeneratedFormSubForm) {
values[formItem.key] = [];
for (Map<String, dynamic> v
in ((formItem.defaultValue ?? []) as List<dynamic>)) {
var fullDefaults = getDefaultValuesFromFormItems(formItem.items);
for (var element in v.entries) {
fullDefaults[element.key] = element.value;
}
values[formItem.key].add(fullDefaults);
}
return Container();
} else { } else {
return Container(); // Some input types added in build return Container(); // Some input types added in build
} }
@ -264,6 +388,7 @@ class _GeneratedFormState extends State<GeneratedForm> {
} }
for (var r = 0; r < formInputs.length; r++) { for (var r = 0; r < formInputs.length; r++) {
for (var e = 0; e < formInputs[r].length; e++) { for (var e = 0; e < formInputs[r].length; e++) {
String fieldKey = widget.items[r][e].key;
if (widget.items[r][e] is GeneratedFormSwitch) { if (widget.items[r][e] is GeneratedFormSwitch) {
formInputs[r][e] = Row( formInputs[r][e] = Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -273,20 +398,55 @@ class _GeneratedFormState extends State<GeneratedForm> {
width: 8, width: 8,
), ),
Switch( Switch(
value: values[widget.items[r][e].key], value: values[fieldKey],
onChanged: (value) { onChanged:
setState(() { (widget.items[r][e] as GeneratedFormSwitch).disabled
values[widget.items[r][e].key] = value; ? null
someValueChanged(); : (value) {
}); setState(() {
}) values[fieldKey] = value;
someValueChanged();
});
})
], ],
); );
} else if (widget.items[r][e] is GeneratedFormTagInput) { } else if (widget.items[r][e] is GeneratedFormTagInput) {
onAddPressed() {
showDialog<Map<String, dynamic>?>(
context: context,
builder: (BuildContext ctx) {
return GeneratedFormModal(
title: widget.items[r][e].label,
items: [
[GeneratedFormTextField('label', label: tr('label'))]
]);
}).then((value) {
String? label = value?['label'];
if (label != null) {
setState(() {
var temp =
values[fieldKey] as Map<String, MapEntry<int, bool>>?;
temp ??= {};
if (temp[label] == null) {
var singleSelect =
(widget.items[r][e] as GeneratedFormTagInput)
.singleSelect;
var someSelected = temp.entries
.where((element) => element.value.value)
.isNotEmpty;
temp[label] = MapEntry(generateRandomLightColor().value,
!(someSelected && singleSelect));
values[fieldKey] = temp;
someValueChanged();
}
});
}
});
}
formInputs[r][e] = formInputs[r][e] =
Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [
if ((values[widget.items[r][e].key] if ((values[fieldKey] as Map<String, MapEntry<int, bool>>?)
as Map<String, MapEntry<int, bool>>?)
?.isNotEmpty == ?.isNotEmpty ==
true && true &&
(widget.items[r][e] as GeneratedFormTagInput) (widget.items[r][e] as GeneratedFormTagInput)
@ -309,17 +469,15 @@ class _GeneratedFormState extends State<GeneratedForm> {
(widget.items[r][e] as GeneratedFormTagInput).alignment, (widget.items[r][e] as GeneratedFormTagInput).alignment,
crossAxisAlignment: WrapCrossAlignment.center, crossAxisAlignment: WrapCrossAlignment.center,
children: [ children: [
(values[widget.items[r][e].key] // (values[fieldKey] as Map<String, MapEntry<int, bool>>?)
as Map<String, MapEntry<int, bool>>?) // ?.isEmpty ==
?.isEmpty == // true
true // ? Text(
? Text( // (widget.items[r][e] as GeneratedFormTagInput)
(widget.items[r][e] as GeneratedFormTagInput) // .emptyMessage,
.emptyMessage, // )
) // : const SizedBox.shrink(),
: const SizedBox.shrink(), ...(values[fieldKey] as Map<String, MapEntry<int, bool>>?)
...(values[widget.items[r][e].key]
as Map<String, MapEntry<int, bool>>?)
?.entries ?.entries
.map((e2) { .map((e2) {
return Padding( return Padding(
@ -332,11 +490,10 @@ class _GeneratedFormState extends State<GeneratedForm> {
selected: e2.value.value, selected: e2.value.value,
onSelected: (value) { onSelected: (value) {
setState(() { setState(() {
(values[widget.items[r][e].key] as Map<String, (values[fieldKey] as Map<String,
MapEntry<int, bool>>)[e2.key] = MapEntry<int, bool>>)[e2.key] =
MapEntry( MapEntry(
(values[widget.items[r][e].key] as Map< (values[fieldKey] as Map<String,
String,
MapEntry<int, bool>>)[e2.key]! MapEntry<int, bool>>)[e2.key]!
.key, .key,
value); value);
@ -344,22 +501,18 @@ class _GeneratedFormState extends State<GeneratedForm> {
as GeneratedFormTagInput) as GeneratedFormTagInput)
.singleSelect && .singleSelect &&
value == true) { value == true) {
for (var key in (values[ for (var key in (values[fieldKey]
widget.items[r][e].key]
as Map<String, MapEntry<int, bool>>) as Map<String, MapEntry<int, bool>>)
.keys) { .keys) {
if (key != e2.key) { if (key != e2.key) {
(values[widget.items[r][e].key] as Map< (values[fieldKey] as Map<
String, String,
MapEntry<int, bool>>)[key] = MapEntry<int,
MapEntry( bool>>)[key] = MapEntry(
(values[widget.items[r][e].key] (values[fieldKey] as Map<String,
as Map< MapEntry<int, bool>>)[key]!
String, .key,
MapEntry<int, false);
bool>>)[key]!
.key,
false);
} }
} }
} }
@ -369,38 +522,39 @@ class _GeneratedFormState extends State<GeneratedForm> {
)); ));
}) ?? }) ??
[const SizedBox.shrink()], [const SizedBox.shrink()],
(values[widget.items[r][e].key] (values[fieldKey] as Map<String, MapEntry<int, bool>>?)
as Map<String, MapEntry<int, bool>>?) ?.values
?.values .where((e) => e.value)
.where((e) => e.value) .length ==
.length == 1 1
? Padding( ? Padding(
padding: const EdgeInsets.symmetric(horizontal: 4), padding: const EdgeInsets.symmetric(horizontal: 4),
child: IconButton( child: IconButton(
onPressed: () { onPressed: () {
setState(() { setState(() {
var temp = values[widget.items[r][e].key] var temp = values[fieldKey]
as Map<String, MapEntry<int, bool>>; as Map<String, MapEntry<int, bool>>;
// get selected category str where bool is true // get selected category str where bool is true
final oldEntry = temp.entries.firstWhere((entry) => entry.value.value); final oldEntry = temp.entries
// generate new color, ensure it is not the same .firstWhere((entry) => entry.value.value);
int newColor = oldEntry.value.key; // generate new color, ensure it is not the same
while(oldEntry.value.key == newColor) { int newColor = oldEntry.value.key;
newColor = generateRandomLightColor().value; while (oldEntry.value.key == newColor) {
} newColor = generateRandomLightColor().value;
// Update entry with new color, remain selected }
temp.update(oldEntry.key, (old) => MapEntry(newColor, old.value)); // Update entry with new color, remain selected
values[widget.items[r][e].key] = temp; temp.update(oldEntry.key,
someValueChanged(); (old) => MapEntry(newColor, old.value));
}); values[fieldKey] = temp;
}, someValueChanged();
icon: const Icon(Icons.format_color_fill_rounded), });
visualDensity: VisualDensity.compact, },
tooltip: tr('colour'), icon: const Icon(Icons.format_color_fill_rounded),
)) visualDensity: VisualDensity.compact,
tooltip: tr('colour'),
))
: const SizedBox.shrink(), : const SizedBox.shrink(),
(values[widget.items[r][e].key] (values[fieldKey] as Map<String, MapEntry<int, bool>>?)
as Map<String, MapEntry<int, bool>>?)
?.values ?.values
.where((e) => e.value) .where((e) => e.value)
.isNotEmpty == .isNotEmpty ==
@ -411,10 +565,10 @@ class _GeneratedFormState extends State<GeneratedForm> {
onPressed: () { onPressed: () {
fn() { fn() {
setState(() { setState(() {
var temp = values[widget.items[r][e].key] var temp = values[fieldKey]
as Map<String, MapEntry<int, bool>>; as Map<String, MapEntry<int, bool>>;
temp.removeWhere((key, value) => value.value); temp.removeWhere((key, value) => value.value);
values[widget.items[r][e].key] = temp; values[fieldKey] = temp;
someValueChanged(); someValueChanged();
}); });
} }
@ -446,52 +600,120 @@ class _GeneratedFormState extends State<GeneratedForm> {
tooltip: tr('remove'), tooltip: tr('remove'),
)) ))
: const SizedBox.shrink(), : const SizedBox.shrink(),
Padding( (values[fieldKey] as Map<String, MapEntry<int, bool>>?)
padding: const EdgeInsets.symmetric(horizontal: 4), ?.isEmpty ==
child: IconButton( true
onPressed: () { ? Padding(
showDialog<Map<String, dynamic>?>( padding: const EdgeInsets.symmetric(horizontal: 4),
context: context, child: TextButton.icon(
builder: (BuildContext ctx) { onPressed: onAddPressed,
return GeneratedFormModal( icon: const Icon(Icons.add),
title: widget.items[r][e].label, label: Text(
items: [ (widget.items[r][e] as GeneratedFormTagInput)
[ .label),
GeneratedFormTextField('label', ))
label: tr('label')) : Padding(
] padding: const EdgeInsets.symmetric(horizontal: 4),
]); child: IconButton(
}).then((value) { onPressed: onAddPressed,
String? label = value?['label']; icon: const Icon(Icons.add),
if (label != null) { visualDensity: VisualDensity.compact,
setState(() { tooltip: tr('add'),
var temp = values[widget.items[r][e].key] )),
as Map<String, MapEntry<int, bool>>?;
temp ??= {};
if (temp[label] == null) {
var singleSelect = (widget.items[r][e]
as GeneratedFormTagInput)
.singleSelect;
var someSelected = temp.entries
.where((element) => element.value.value)
.isNotEmpty;
temp[label] = MapEntry(
generateRandomLightColor().value,
!(someSelected && singleSelect));
values[widget.items[r][e].key] = temp;
someValueChanged();
}
});
}
});
},
icon: const Icon(Icons.add),
visualDensity: VisualDensity.compact,
tooltip: tr('add'),
)),
], ],
) )
]); ]);
} else if (widget.items[r][e] is GeneratedFormSubForm) {
List<Widget> subformColumn = [];
var compact = (widget.items[r][e] as GeneratedFormSubForm)
.items
.length ==
1 &&
(widget.items[r][e] as GeneratedFormSubForm).items[0].length == 1;
for (int i = 0; i < values[fieldKey].length; i++) {
var internalFormKey = ValueKey(generateRandomNumber(
values[fieldKey].length,
seed2: i,
seed3: forceUpdateKeyCount));
subformColumn.add(Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (!compact)
const SizedBox(
height: 16,
),
if (!compact)
Text(
'${(widget.items[r][e] as GeneratedFormSubForm).label} (${i + 1})',
style: const TextStyle(fontWeight: FontWeight.bold),
),
GeneratedForm(
key: internalFormKey,
items: cloneFormItems(
(widget.items[r][e] as GeneratedFormSubForm).items)
.map((x) => x.map((y) {
y.defaultValue = values[fieldKey]?[i]?[y.key];
y.key = '${y.key.toString()},$internalFormKey';
return y;
}).toList())
.toList(),
onValueChanges: (values, valid, isBuilding) {
values = values.map(
(key, value) => MapEntry(key.split(',')[0], value));
if (valid) {
this.values[fieldKey]?[i] = values;
}
someValueChanged(
isBuilding: isBuilding, forceInvalid: !valid);
},
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton.icon(
style: TextButton.styleFrom(
foregroundColor:
Theme.of(context).colorScheme.error),
onPressed: (values[fieldKey].length > 0)
? () {
var temp = List.from(values[fieldKey]);
temp.removeAt(i);
values[fieldKey] = List.from(temp);
forceUpdateKeyCount++;
someValueChanged();
}
: null,
label: Text(
'${(widget.items[r][e] as GeneratedFormSubForm).label} (${i + 1})',
),
icon: const Icon(
Icons.delete_outline_rounded,
))
],
)
],
));
}
subformColumn.add(Padding(
padding: const EdgeInsets.only(bottom: 0, top: 8),
child: Row(
children: [
Expanded(
child: ElevatedButton.icon(
onPressed: () {
values[fieldKey].add(getDefaultValuesFromFormItems(
(widget.items[r][e] as GeneratedFormSubForm)
.items));
forceUpdateKeyCount++;
someValueChanged();
},
icon: const Icon(Icons.add),
label: Text((widget.items[r][e] as GeneratedFormSubForm)
.label))),
],
),
));
formInputs[r][e] = Column(children: subformColumn);
} }
} }
} }

View File

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:android_package_installer/android_package_installer.dart'; import 'package:android_package_installer/android_package_installer.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -32,7 +34,9 @@ class CredsNeededError extends ObtainiumError {
} }
class NoReleasesError extends ObtainiumError { class NoReleasesError extends ObtainiumError {
NoReleasesError() : super(tr('noReleaseFound')); NoReleasesError({String? note})
: super(
'${tr('noReleaseFound')}${note?.isNotEmpty == true ? '\n\n$note' : ''}');
} }
class NoAPKError extends ObtainiumError { class NoAPKError extends ObtainiumError {
@ -65,30 +69,43 @@ class NotImplementedError extends ObtainiumError {
} }
class MultiAppMultiError extends ObtainiumError { class MultiAppMultiError extends ObtainiumError {
Map<String, List<String>> content = {}; Map<String, dynamic> rawErrors = {};
Map<String, List<String>> idsByErrorString = {};
Map<String, String> appIdNames = {};
MultiAppMultiError() : super(tr('placeholder'), unexpected: true); MultiAppMultiError() : super(tr('placeholder'), unexpected: true);
add(String appId, String string) { add(String appId, dynamic error, {String? appName}) {
var tempIds = content.remove(string); if (error is SocketException) {
error = error.message;
}
rawErrors[appId] = error;
var string = error.toString();
var tempIds = idsByErrorString.remove(string);
tempIds ??= []; tempIds ??= [];
tempIds.add(appId); tempIds.add(appId);
content.putIfAbsent(string, () => tempIds!); idsByErrorString.putIfAbsent(string, () => tempIds!);
if (appName != null) {
appIdNames[appId] = appName;
}
} }
String errorString(String appId, {bool includeIdsWithNames = false}) =>
'${appIdNames.containsKey(appId) ? '${appIdNames[appId]}${includeIdsWithNames ? ' ($appId)' : ''}' : appId}: ${rawErrors[appId].toString()}';
String errorsAppsString(String errString, List<String> appIds,
{bool includeIdsWithNames = false}) =>
'$errString [${list2FriendlyString(appIds.map((id) => appIdNames.containsKey(id) == true ? '${appIdNames[id]}${includeIdsWithNames ? ' ($id)' : ''}' : id).toList())}]';
@override @override
String toString() { String toString() => idsByErrorString.entries
String finalString = ''; .map((e) => errorsAppsString(e.key, e.value))
for (var e in content.keys) { .join('\n\n');
finalString += '$e: ${content[e].toString()}\n\n';
}
return finalString;
}
} }
showError(dynamic e, BuildContext context) { showMessage(dynamic e, BuildContext context, {bool isError = false}) {
Provider.of<LogsProvider>(context, listen: false) Provider.of<LogsProvider>(context, listen: false)
.add(e.toString(), level: LogLevels.error); .add(e.toString(), level: isError ? LogLevels.error : LogLevels.info);
if (e is String || (e is ObtainiumError && !e.unexpected)) { if (e is String || (e is ObtainiumError && !e.unexpected)) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(e.toString())), SnackBar(content: Text(e.toString())),
@ -100,8 +117,8 @@ showError(dynamic e, BuildContext context) {
return AlertDialog( return AlertDialog(
scrollable: true, scrollable: true,
title: Text(e is MultiAppMultiError title: Text(e is MultiAppMultiError
? tr('someErrors') ? tr(isError ? 'someErrors' : 'updates')
: tr('unexpectedError')), : tr(isError ? 'unexpectedError' : 'unknown')),
content: GestureDetector( content: GestureDetector(
onLongPress: () { onLongPress: () {
Clipboard.setData(ClipboardData(text: e.toString())); Clipboard.setData(ClipboardData(text: e.toString()));
@ -122,6 +139,10 @@ showError(dynamic e, BuildContext context) {
} }
} }
showError(dynamic e, BuildContext context) {
showMessage(e, context, isError: true);
}
String list2FriendlyString(List<String> list) { String list2FriendlyString(List<String> list) {
return list.length == 2 return list.length == 2
? '${list[0]} ${tr('and')} ${list[1]}' ? '${list[0]} ${tr('and')} ${list[1]}'

View File

@ -1,13 +1,11 @@
import 'dart:io'; import 'dart:io';
import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:http/http.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/pages/home.dart'; import 'package:obtainium/pages/home.dart';
import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/apps_provider.dart';
import 'package:obtainium/providers/logs_provider.dart'; import 'package:obtainium/providers/logs_provider.dart';
import 'package:obtainium/providers/native_provider.dart';
import 'package:obtainium/providers/notifications_provider.dart'; import 'package:obtainium/providers/notifications_provider.dart';
import 'package:obtainium/providers/settings_provider.dart'; import 'package:obtainium/providers/settings_provider.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
@ -15,22 +13,17 @@ import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:dynamic_color/dynamic_color.dart'; import 'package:dynamic_color/dynamic_color.dart';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:android_alarm_manager_plus/android_alarm_manager_plus.dart'; import 'package:background_fetch/background_fetch.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
// ignore: implementation_imports // ignore: implementation_imports
import 'package:easy_localization/src/easy_localization_controller.dart'; import 'package:easy_localization/src/easy_localization_controller.dart';
// ignore: implementation_imports // ignore: implementation_imports
import 'package:easy_localization/src/localization.dart'; import 'package:easy_localization/src/localization.dart';
const String currentVersion = '0.13.24';
const String currentReleaseTag =
'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES
const int bgUpdateCheckAlarmId = 666;
List<MapEntry<Locale, String>> supportedLocales = const [ List<MapEntry<Locale, String>> supportedLocales = const [
MapEntry(Locale('en'), 'English'), MapEntry(Locale('en'), 'English'),
MapEntry(Locale('zh'), '汉语'), MapEntry(Locale('zh'), '简体中文'),
MapEntry(Locale('zh', 'Hant_TW'), '臺灣話'),
MapEntry(Locale('it'), 'Italiano'), MapEntry(Locale('it'), 'Italiano'),
MapEntry(Locale('ja'), '日本語'), MapEntry(Locale('ja'), '日本語'),
MapEntry(Locale('hu'), 'Magyar'), MapEntry(Locale('hu'), 'Magyar'),
@ -39,11 +32,24 @@ List<MapEntry<Locale, String>> supportedLocales = const [
MapEntry(Locale('fr'), 'Français'), MapEntry(Locale('fr'), 'Français'),
MapEntry(Locale('es'), 'Español'), MapEntry(Locale('es'), 'Español'),
MapEntry(Locale('pl'), 'Polski'), MapEntry(Locale('pl'), 'Polski'),
MapEntry(Locale('ru'), 'Русский язык'), MapEntry(Locale('ru'), 'Русский'),
MapEntry(Locale('bs'), 'Bosanski'), MapEntry(Locale('bs'), 'Bosanski'),
MapEntry(Locale('pt'), 'Brasileiro'),
MapEntry(Locale('cs'), 'Česky'),
MapEntry(Locale('sv'), 'Svenska'),
MapEntry(Locale('nl'), 'Nederlands'),
MapEntry(Locale('vi'), 'Tiếng Việt'),
MapEntry(Locale('tr'), 'Türkçe'),
MapEntry(Locale('uk'), 'Українська'),
MapEntry(Locale('da'), 'Dansk'),
MapEntry(Locale('en', 'EO'),
'Esperanto'), // https://github.com/aissat/easy_localization/issues/220#issuecomment-846035493
MapEntry(Locale('in'), 'Bahasa Indonesia'),
MapEntry(Locale('ko'), '한국어'),
]; ];
const fallbackLocale = Locale('en'); const fallbackLocale = Locale('en');
const localeDir = 'assets/translations'; const localeDir = 'assets/translations';
var fdroid = false;
final globalNavigatorKey = GlobalKey<NavigatorState>(); final globalNavigatorKey = GlobalKey<NavigatorState>();
@ -55,11 +61,11 @@ Future<void> loadTranslations() async {
var forceLocale = s.forcedLocale; var forceLocale = s.forcedLocale;
final controller = EasyLocalizationController( final controller = EasyLocalizationController(
saveLocale: true, saveLocale: true,
forceLocale: forceLocale != null ? Locale(forceLocale) : null, forceLocale: forceLocale,
fallbackLocale: fallbackLocale, fallbackLocale: fallbackLocale,
supportedLocales: supportedLocales.map((e) => e.key).toList(), supportedLocales: supportedLocales.map((e) => e.key).toList(),
assetLoader: const RootBundleAssetLoader(), assetLoader: const RootBundleAssetLoader(),
useOnlyLangCode: true, useOnlyLangCode: false,
useFallbackTranslations: true, useFallbackTranslations: true,
path: localeDir, path: localeDir,
onLoadError: (FlutterError e) { onLoadError: (FlutterError e) {
@ -73,86 +79,16 @@ Future<void> loadTranslations() async {
} }
@pragma('vm:entry-point') @pragma('vm:entry-point')
Future<void> bgUpdateCheck(int taskId, Map<String, dynamic>? params) async { void backgroundFetchHeadlessTask(HeadlessTask task) async {
WidgetsFlutterBinding.ensureInitialized(); String taskId = task.taskId;
await EasyLocalization.ensureInitialized(); bool isTimeout = task.timeout;
if (isTimeout) {
await loadTranslations(); print('BG update task timed out.');
BackgroundFetch.finish(taskId);
LogsProvider logs = LogsProvider(); return;
logs.add(tr('startedBgUpdateTask'));
int? ignoreAfterMicroseconds = params?['ignoreAfterMicroseconds'];
await AndroidAlarmManager.initialize();
DateTime? ignoreAfter = ignoreAfterMicroseconds != null
? DateTime.fromMicrosecondsSinceEpoch(ignoreAfterMicroseconds)
: null;
logs.add(tr('bgUpdateIgnoreAfterIs', args: [ignoreAfter.toString()]));
var notificationsProvider = NotificationsProvider();
await notificationsProvider.notify(checkingUpdatesNotification);
try {
var appsProvider = AppsProvider();
await notificationsProvider.cancel(ErrorCheckingUpdatesNotification('').id);
await appsProvider.loadApps();
List<String> existingUpdateIds =
appsProvider.findExistingUpdates(installedOnly: true);
DateTime nextIgnoreAfter = DateTime.now();
String? err;
try {
logs.add(tr('startedActualBGUpdateCheck'));
await appsProvider.checkUpdates(
ignoreAppsCheckedAfter: ignoreAfter, throwErrorsForRetry: true);
} catch (e) {
if (e is RateLimitError || e is ClientException) {
var remainingMinutes = e is RateLimitError ? e.remainingMinutes : 15;
logs.add(
plural('bgUpdateGotErrorRetryInMinutes', remainingMinutes, args: [
e is ClientException
? '${(e).message}, ${e.uri?.path}'
: e.toString(),
remainingMinutes.toString()
]));
AndroidAlarmManager.oneShot(Duration(minutes: remainingMinutes),
Random().nextInt(pow(2, 31) as int), bgUpdateCheck, params: {
'ignoreAfterMicroseconds': nextIgnoreAfter.microsecondsSinceEpoch
});
} else {
err = e.toString();
}
}
List<App> newUpdates = appsProvider
.findExistingUpdates(installedOnly: true)
.where((id) => !existingUpdateIds.contains(id))
.map((e) => appsProvider.apps[e]!.app)
.toList();
// TODO: This silent update code doesn't work yet
// List<String> silentlyUpdated = await appsProvider
// .downloadAndInstallLatestApp(
// [...newUpdates.map((e) => e.id), ...existingUpdateIds], null);
// if (silentlyUpdated.isNotEmpty) {
// newUpdates = newUpdates
// .where((element) => !silentlyUpdated.contains(element.id))
// .toList();
// notificationsProvider.notify(
// SilentUpdateNotification(
// silentlyUpdated.map((e) => appsProvider.apps[e]!.app).toList()),
// cancelExisting: true);
// }
logs.add(
plural('bgCheckFoundUpdatesWillNotifyIfNeeded', newUpdates.length));
if (newUpdates.isNotEmpty) {
notificationsProvider.notify(UpdateNotification(newUpdates));
}
if (err != null) {
throw err;
}
} catch (e) {
notificationsProvider
.notify(ErrorCheckingUpdatesNotification(e.toString()));
} finally {
logs.add(tr('bgUpdateTaskFinished'));
await notificationsProvider.cancel(checkingUpdatesNotification.id);
} }
await bgUpdateCheck(taskId, null);
BackgroundFetch.finish(taskId);
} }
void main() async { void main() async {
@ -172,7 +108,6 @@ void main() async {
); );
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
} }
await AndroidAlarmManager.initialize();
runApp(MultiProvider( runApp(MultiProvider(
providers: [ providers: [
ChangeNotifierProvider(create: (context) => AppsProvider()), ChangeNotifierProvider(create: (context) => AppsProvider()),
@ -184,13 +119,12 @@ void main() async {
supportedLocales: supportedLocales.map((e) => e.key).toList(), supportedLocales: supportedLocales.map((e) => e.key).toList(),
path: localeDir, path: localeDir,
fallbackLocale: fallbackLocale, fallbackLocale: fallbackLocale,
useOnlyLangCode: true, useOnlyLangCode: false,
child: const Obtainium()), child: const Obtainium()),
)); ));
BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask);
} }
var defaultThemeColour = Colors.deepPurple;
class Obtainium extends StatefulWidget { class Obtainium extends StatefulWidget {
const Obtainium({super.key}); const Obtainium({super.key});
@ -201,6 +135,33 @@ class Obtainium extends StatefulWidget {
class _ObtainiumState extends State<Obtainium> { class _ObtainiumState extends State<Obtainium> {
var existingUpdateInterval = -1; var existingUpdateInterval = -1;
@override
void initState() {
super.initState();
initPlatformState();
}
Future<void> initPlatformState() async {
await BackgroundFetch.configure(
BackgroundFetchConfig(
minimumFetchInterval: 15,
stopOnTerminate: false,
startOnBoot: true,
enableHeadless: true,
requiresBatteryNotLow: false,
requiresCharging: false,
requiresStorageNotLow: false,
requiresDeviceIdle: false,
requiredNetworkType: NetworkType.ANY), (String taskId) async {
await bgUpdateCheck(taskId, null);
BackgroundFetch.finish(taskId);
}, (String taskId) async {
context.read<LogsProvider>().add('BG update task timed out.');
BackgroundFetch.finish(taskId);
});
if (!mounted) return;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SettingsProvider settingsProvider = context.watch<SettingsProvider>(); SettingsProvider settingsProvider = context.watch<SettingsProvider>();
@ -212,50 +173,41 @@ class _ObtainiumState extends State<Obtainium> {
} else { } else {
bool isFirstRun = settingsProvider.checkAndFlipFirstRun(); bool isFirstRun = settingsProvider.checkAndFlipFirstRun();
if (isFirstRun) { if (isFirstRun) {
logs.add(tr('firstRun')); logs.add('This is the first ever run of Obtainium.');
// If this is the first run, ask for notification permissions and add Obtainium to the Apps list // If this is the first run, ask for notification permissions and add Obtainium to the Apps list
Permission.notification.request(); Permission.notification.request();
appsProvider.saveApps([ if (!fdroid) {
App( getInstalledInfo(obtainiumId).then((value) {
obtainiumId, if (value?.versionName != null) {
'https://github.com/ImranR98/Obtainium', appsProvider.saveApps([
'ImranR98', App(
'Obtainium', obtainiumId,
currentReleaseTag, obtainiumUrl,
currentReleaseTag, 'ImranR98',
[], 'Obtainium',
0, value!.versionName,
{'includePrereleases': true}, value.versionName!,
null, [],
false) 0,
], onlyIfExists: false); {
'versionDetection': true,
'apkFilterRegEx': 'fdroid',
'invertAPKFilter': true
},
null,
false)
], onlyIfExists: false);
}
}).catchError((err) {
print(err);
});
}
} }
if (!supportedLocales if (!supportedLocales.map((e) => e.key).contains(context.locale) ||
.map((e) => e.key.languageCode)
.contains(context.locale.languageCode) ||
(settingsProvider.forcedLocale == null && (settingsProvider.forcedLocale == null &&
context.deviceLocale.languageCode != context.deviceLocale != context.locale)) {
context.locale.languageCode)) {
settingsProvider.resetLocaleSafe(context); settingsProvider.resetLocaleSafe(context);
} }
// Register the background update task according to the user's setting
if (existingUpdateInterval != settingsProvider.updateInterval) {
if (existingUpdateInterval != -1) {
logs.add(tr('settingUpdateCheckIntervalTo',
args: [settingsProvider.updateInterval.toString()]));
}
existingUpdateInterval = settingsProvider.updateInterval;
if (existingUpdateInterval == 0) {
AndroidAlarmManager.cancel(bgUpdateCheckAlarmId);
} else {
AndroidAlarmManager.periodic(
Duration(minutes: existingUpdateInterval),
bgUpdateCheckAlarmId,
bgUpdateCheck,
rescheduleOnReboot: true,
wakeup: true);
}
}
} }
return DynamicColorBuilder( return DynamicColorBuilder(
@ -265,41 +217,49 @@ class _ObtainiumState extends State<Obtainium> {
ColorScheme darkColorScheme; ColorScheme darkColorScheme;
if (lightDynamic != null && if (lightDynamic != null &&
darkDynamic != null && darkDynamic != null &&
settingsProvider.colour == ColourSettings.materialYou) { settingsProvider.useMaterialYou) {
lightColorScheme = lightDynamic.harmonized(); lightColorScheme = lightDynamic.harmonized();
darkColorScheme = darkDynamic.harmonized(); darkColorScheme = darkDynamic.harmonized();
} else { } else {
lightColorScheme = ColorScheme.fromSeed(seedColor: defaultThemeColour); lightColorScheme =
ColorScheme.fromSeed(seedColor: settingsProvider.themeColor);
darkColorScheme = ColorScheme.fromSeed( darkColorScheme = ColorScheme.fromSeed(
seedColor: defaultThemeColour, brightness: Brightness.dark); seedColor: settingsProvider.themeColor,
brightness: Brightness.dark);
} }
// set the background and surface colors to pure black in the amoled theme // set the background and surface colors to pure black in the amoled theme
if (settingsProvider.useBlackTheme) { if (settingsProvider.useBlackTheme) {
darkColorScheme = darkColorScheme darkColorScheme =
.copyWith(background: Colors.black, surface: Colors.black) darkColorScheme.copyWith(surface: Colors.black).harmonized();
.harmonized();
} }
if (settingsProvider.useSystemFont) NativeFeatures.loadSystemFont();
return MaterialApp( return MaterialApp(
title: 'Obtainium', title: 'Obtainium',
localizationsDelegates: context.localizationDelegates, localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales, supportedLocales: context.supportedLocales,
locale: context.locale, locale: context.locale,
navigatorKey: globalNavigatorKey, navigatorKey: globalNavigatorKey,
debugShowCheckedModeBanner: false,
theme: ThemeData( theme: ThemeData(
useMaterial3: true, useMaterial3: true,
colorScheme: settingsProvider.theme == ThemeSettings.dark colorScheme: settingsProvider.theme == ThemeSettings.dark
? darkColorScheme ? darkColorScheme
: lightColorScheme, : lightColorScheme,
fontFamily: 'Metropolis'), fontFamily:
settingsProvider.useSystemFont ? 'SystemFont' : 'Montserrat'),
darkTheme: ThemeData( darkTheme: ThemeData(
useMaterial3: true, useMaterial3: true,
colorScheme: settingsProvider.theme == ThemeSettings.light colorScheme: settingsProvider.theme == ThemeSettings.light
? lightColorScheme ? lightColorScheme
: darkColorScheme, : darkColorScheme,
fontFamily: 'Metropolis'), fontFamily:
home: const HomePage()); settingsProvider.useSystemFont ? 'SystemFont' : 'Montserrat'),
home: Shortcuts(shortcuts: <LogicalKeySet, Intent>{
LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(),
}, child: const HomePage()));
}); });
} }
} }

6
lib/main_fdroid.dart Normal file
View File

@ -0,0 +1,6 @@
import 'main.dart' as m;
void main() async {
m.fdroid = true;
m.main();
}

Some files were not shown because too many files have changed in this diff Show More