mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-07-15 14:16:43 +02:00
Compare commits
269 Commits
Author | SHA1 | Date | |
---|---|---|---|
ab949af700 | |||
5c9a35c4f0 | |||
8651f58744 | |||
d93798a8df | |||
0822f991ff | |||
fde63a0f05 | |||
523e1151b2 | |||
d5d6825ed9 | |||
79c4d3b9fe | |||
d6b99b903f | |||
335752ee7c | |||
e5afe75213 | |||
0df1c1c512 | |||
bd2ac73b9f | |||
26b5a2d976 | |||
c0968e8991 | |||
243b1eb2ac | |||
c6c61d1c83 | |||
f207967411 | |||
29bb5cc8cd | |||
dbbc2ff19c | |||
c012b016f9 | |||
22815b8209 | |||
619d4f1a51 | |||
50e8929763 | |||
0e2a0b65ec | |||
5b79f399d1 | |||
2961d5ac17 | |||
4af4160aaa | |||
327f73cc9e | |||
e82170fec6 | |||
8922b1c048 | |||
e9550c6ff0 | |||
890c3682c4 | |||
a2c38968e1 | |||
a9c3ee4c54 | |||
36db226024 | |||
6fbdf62afa | |||
9344ebbb06 | |||
51b66ab983 | |||
7f2a9b6fa5 | |||
ac6bc4d786 | |||
acd30b516c | |||
5bc9234101 | |||
80d15f5232 | |||
eb7c2a9fc4 | |||
40175468b2 | |||
814b5a71bd | |||
38a1e43116 | |||
5064b78c79 | |||
767350e4e3 | |||
4caae51904 | |||
83616b7a79 | |||
52b2d0868c | |||
94f629859e | |||
773d3455ae | |||
919ab16528 | |||
268b89eaf6 | |||
9c9a264e39 | |||
e1e612455a | |||
e191d75300 | |||
fce2a2f15c | |||
dd8acd9451 | |||
2d5676f13d | |||
dfbf9e925c | |||
e44f77a68a | |||
cc373c8d7f | |||
2ad88bf3ca | |||
b1f9375bb1 | |||
0e14e17236 | |||
fc541837ef | |||
da0b1d0684 | |||
3fd89e8567 | |||
8cab348eed | |||
6bd821985f | |||
1f2efe435f | |||
8276a809a5 | |||
5fe1a8a370 | |||
58710093ba | |||
ac6f8c456d | |||
905461c242 | |||
e3fcf6e0b5 | |||
903fad5158 | |||
1de93e827a | |||
a5040aa0c1 | |||
9f7c4e23d5 | |||
876f67aacb | |||
2ed2c2c5f9 | |||
7f35589d49 | |||
9d5ce75e27 | |||
09f1f27fa8 | |||
ea239ffa3a | |||
07ef86ae75 | |||
c670fce652 | |||
ba8ef7e5b0 | |||
0ec3fb0064 | |||
c1c06b3f9c | |||
d121463bad | |||
862e85f882 | |||
5e0333c4c8 | |||
efb75afb9b | |||
b4510e10a7 | |||
25233f3259 | |||
cff6b86997 | |||
344a6efbf6 | |||
59a4b88a88 | |||
cf7c41bf4c | |||
d32543b5d0 | |||
892a3b3c30 | |||
56c791d3e5 | |||
e4103c8352 | |||
672bc159cc | |||
ee5d121bf0 | |||
e5d1fafc13 | |||
8bb4f46209 | |||
504e1d551b | |||
5e7e143bba | |||
91a82af418 | |||
7af2145e9a | |||
74b9de3516 | |||
f5b540dd8b | |||
01d701d8cd | |||
4017253470 | |||
b0b6ddb8fd | |||
192b7fc6ce | |||
b74dbb973c | |||
46ccf8478b | |||
9a354ecf0e | |||
738dd5649f | |||
9f50d8db2d | |||
eeb57dbe35 | |||
cbcc8c4eaf | |||
f4d27c8494 | |||
7507e7bf5c | |||
783e8029b6 | |||
3554257918 | |||
ef98ceaaa2 | |||
86540e703d | |||
1b7c340e2c | |||
ba6148dfef | |||
6b47048e43 | |||
b698947ecf | |||
e677d3179c | |||
25ef35c13c | |||
ba167fed33 | |||
d03c4dec4e | |||
e2525eef74 | |||
35caec61c5 | |||
33a7af216c | |||
b7c477fd40 | |||
045d8cfbe8 | |||
ea6e0b37a3 | |||
d58eba984e | |||
3d46237d17 | |||
ed3cff87ca | |||
2002581106 | |||
e968d50aac | |||
1e03194765 | |||
10c558faaf | |||
dcf6957842 | |||
77bebc48bc | |||
cad14dd6a4 | |||
5d72af5b20 | |||
1fcb923469 | |||
f89bc41ac1 | |||
70988a91fd | |||
f3481f94dd | |||
204eadd809 | |||
69f2ec1777 | |||
b98c23e369 | |||
64779fb55a | |||
845cf0a035 | |||
9dba240202 | |||
8aa682028f | |||
cb80b80efb | |||
eb1d997413 | |||
986badc653 | |||
2432db0b31 | |||
87c66b4d09 | |||
5be2c9b51d | |||
d801994fed | |||
19bb9a0331 | |||
b8dc6f9a53 | |||
3a7ba00486 | |||
86416df7dd | |||
704f209e4d | |||
e1bed6f0cf | |||
61c88596f0 | |||
a07c51a04a | |||
0e46a83843 | |||
1a4b9658c3 | |||
9b922abe48 | |||
6f0f883d88 | |||
aafcc4d96e | |||
e019c8027b | |||
b6acb43055 | |||
d9f6e3328e | |||
0e50132e13 | |||
c74e8456d2 | |||
33c60c9d4f | |||
151e085655 | |||
b1d641ae24 | |||
7ddb35f933 | |||
b05a2ed14f | |||
b22a82d11b | |||
ee051153ca | |||
46871191c4 | |||
0cb518d434 | |||
03778fd743 | |||
514ca3e28b | |||
37e90dabe7 | |||
ee99f2b71f | |||
ca9289f104 | |||
aefe7eaa5f | |||
e979f7c6f3 | |||
e2118a3b53 | |||
d3a5d3b0fa | |||
bc7c70aca6 | |||
6cde454bd9 | |||
78e20984ed | |||
f963996a19 | |||
1ddf2869a6 | |||
f9b97b4469 | |||
6f706ab493 | |||
ed2e6e2e9e | |||
f00758cd83 | |||
25bd61f289 | |||
25d19d22cf | |||
9ffb91266f | |||
8d921cfbf1 | |||
3ed6b168e1 | |||
4a45c900c3 | |||
7e9e6958a3 | |||
9de082f684 | |||
b40afc7329 | |||
4fb3da45e9 | |||
1f8e051ed6 | |||
adc4e7c2b4 | |||
325d2f48dc | |||
aa00f42a23 | |||
62dbffab52 | |||
fd38444836 | |||
71cc49a30f | |||
e4187c8e17 | |||
15ae98d426 | |||
7b4fa2269e | |||
656e14793d | |||
d23381147b | |||
cfe184c6d5 | |||
9c16f24a08 | |||
ce200403e0 | |||
caca84f84d | |||
ac2d7b9639 | |||
78069a9b26 | |||
3e23fffaea | |||
624b9fb6dc | |||
fbd6189721 | |||
6a44fe227c | |||
d1cb2688c6 | |||
b43b2f9740 | |||
6288a9cb8d | |||
18c6f75054 | |||
1f8d187b84 | |||
77618ad1ff | |||
75efd335e9 | |||
c4438de200 | |||
e3c9a227d3 | |||
548f859349 | |||
db413badec |
2
.flutter
2
.flutter
Submodule .flutter updated: 761747bfc5...dec2ee5c1f
47
.github/workflows/release.yml
vendored
47
.github/workflows/release.yml
vendored
@ -6,7 +6,7 @@ on:
|
|||||||
beta:
|
beta:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: Is beta?
|
description: Is beta?
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -15,6 +15,9 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
channel: stable
|
||||||
|
flutter-version: 3.24.5
|
||||||
- uses: actions/setup-java@v4
|
- uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin' # See 'Supported distributions' for available options
|
distribution: 'temurin' # See 'Supported distributions' for available options
|
||||||
@ -24,24 +27,11 @@ jobs:
|
|||||||
id: flutter_doctor
|
id: flutter_doctor
|
||||||
run: |
|
run: |
|
||||||
flutter doctor -v
|
flutter doctor -v
|
||||||
|
|
||||||
- name: Import GPG key
|
|
||||||
id: import_pgp_key
|
|
||||||
uses: crazy-max/ghaction-import-gpg@v6
|
|
||||||
with:
|
|
||||||
gpg_private_key: ${{ secrets.PGP_KEY_BASE64 }}
|
|
||||||
passphrase: ${{ secrets.PGP_PASSPHRASE }}
|
|
||||||
|
|
||||||
- name: Check submodule
|
- name: Check submodule
|
||||||
id: check_submodule
|
id: check_submodule
|
||||||
run: |
|
run: |
|
||||||
SUBMODULE_COMMIT_LONG="$(git submodule status | head -1 | tail -c +2 | awk '{print $1}')"
|
git checkout ${{ inputs.checkout }}
|
||||||
FLUTTER_COMMIT_SHORT="$(flutter --version | head -2 | tail -1 | awk '{print $4}')"
|
|
||||||
echo "SUBMODULE_COMMIT_LONG=$SUBMODULE_COMMIT_LONG, FLUTTER_COMMIT_SHORT=$FLUTTER_COMMIT_SHORT"
|
|
||||||
if ! [[ "$SUBMODULE_COMMIT_LONG" =~ ^$FLUTTER_COMMIT_SHORT ]]; then
|
|
||||||
echo "Your submodule has not been updated!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Extract Version
|
- name: Extract Version
|
||||||
id: extract_version
|
id: extract_version
|
||||||
@ -60,24 +50,13 @@ jobs:
|
|||||||
for file in build/app/outputs/flutter-apk/app-*normal*.apk*; do mv "$file" "${file//-normal/}"; done
|
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
|
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
|
rm ./build/app/outputs/flutter-apk/*.sha1
|
||||||
|
cp ./sign.sh ./build/app/outputs/flutter-apk/
|
||||||
ls -l ./build/app/outputs/flutter-apk/
|
ls -l ./build/app/outputs/flutter-apk/
|
||||||
|
|
||||||
- name: Sign APKs
|
- name: Save Unsigned APKs as Action Artifacts
|
||||||
env:
|
uses: actions/upload-artifact@v4
|
||||||
KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
|
with:
|
||||||
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
|
path: build/app/outputs/flutter-apk/*
|
||||||
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
|
|
||||||
run: |
|
|
||||||
echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore
|
|
||||||
for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do
|
|
||||||
unsignedFn=${apk/-release/-unsigned}
|
|
||||||
mv "$apk" "$unsignedFn"
|
|
||||||
${ANDROID_HOME}/build-tools/$(ls ${ANDROID_HOME}/build-tools/ | tail -1)/apksigner sign --ks apksign.keystore --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}"
|
|
||||||
sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256
|
|
||||||
gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256
|
|
||||||
done
|
|
||||||
rm apksign.keystore
|
|
||||||
PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}"
|
|
||||||
|
|
||||||
- name: Create Tag
|
- name: Create Tag
|
||||||
uses: mathieudutour/github-tag-action@v6.1
|
uses: mathieudutour/github-tag-action@v6.1
|
||||||
@ -86,11 +65,11 @@ jobs:
|
|||||||
custom_tag: "${{ steps.extract_version.outputs.tag }}"
|
custom_tag: "${{ steps.extract_version.outputs.tag }}"
|
||||||
tag_prefix: ""
|
tag_prefix: ""
|
||||||
|
|
||||||
- name: Create Release And Upload APKs
|
- name: Create Draft Release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GH_ACCESS_TOKEN }}
|
token: ${{ secrets.GH_ACCESS_TOKEN }}
|
||||||
tag: "${{ steps.extract_version.outputs.tag }}"
|
tag: "${{ steps.extract_version.outputs.tag }}"
|
||||||
prerelease: "${{ steps.extract_version.outputs.beta }}"
|
prerelease: "${{ steps.extract_version.outputs.beta }}"
|
||||||
artifacts: ./build/app/outputs/flutter-apk/*-release*.apk*
|
draft: "true"
|
||||||
generateReleaseNotes: true
|
generateReleaseNotes: true
|
||||||
|
24
README.md
24
README.md
@ -2,21 +2,23 @@
|
|||||||
|
|
||||||
[](https://techforpalestine.org/learn-more)
|
[](https://techforpalestine.org/learn-more)
|
||||||
|
|
||||||
Get Android App Updates Directly From the Source.
|
Get Android app updates straight from the source.
|
||||||
|
|
||||||
Obtainium allows you to install and update apps directly from their releases pages, and receive notifications when new releases are made available.
|
Obtainium allows you to install and update apps directly from their releases pages, and receive notifications when new releases are made available.
|
||||||
|
|
||||||
More info:
|
More info:
|
||||||
- [Obtainium/wiki](https://github.com/ImranR98/Obtainium/wiki)
|
- [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)
|
- [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
|
- [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
|
- [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:
|
||||||
- Open Source - General:
|
- Open Source - General:
|
||||||
- [GitHub](https://github.com/)
|
- [GitHub](https://github.com/)
|
||||||
- [GitLab](https://gitlab.com/)
|
- [GitLab](https://gitlab.com/)
|
||||||
- [Codeberg](https://codeberg.org/)
|
- [Forgejo](https://forgejo.org/) ([Codeberg](https://codeberg.org/))
|
||||||
- [F-Droid](https://f-droid.org/)
|
- [F-Droid](https://f-droid.org/)
|
||||||
- Third Party F-Droid Repos
|
- Third Party F-Droid Repos
|
||||||
- [IzzyOnDroid](https://android.izzysoft.de/)
|
- [IzzyOnDroid](https://android.izzysoft.de/)
|
||||||
@ -25,15 +27,11 @@ Currently supported App sources:
|
|||||||
- [APKPure](https://apkpure.net/)
|
- [APKPure](https://apkpure.net/)
|
||||||
- [Aptoide](https://aptoide.com/)
|
- [Aptoide](https://aptoide.com/)
|
||||||
- [Uptodown](https://uptodown.com/)
|
- [Uptodown](https://uptodown.com/)
|
||||||
- [APKMirror](https://apkmirror.com/) (Track-Only)
|
|
||||||
- [Huawei AppGallery](https://appgallery.huawei.com/)
|
- [Huawei AppGallery](https://appgallery.huawei.com/)
|
||||||
|
- [Tencent App Store](https://sj.qq.com/)
|
||||||
- Jenkins Jobs
|
- Jenkins Jobs
|
||||||
- Open Source - App-Specific:
|
- [APKMirror](https://apkmirror.com/) (Track-Only)
|
||||||
- [Signal](https://signal.org/)
|
|
||||||
- [VLC](https://videolan.org/)
|
|
||||||
- Other - App-Specific:
|
- Other - App-Specific:
|
||||||
- [WhatsApp](https://whatsapp.com)
|
|
||||||
- [Telegram App](https://telegram.org)
|
|
||||||
- [Neutron Code](https://neutroncode.com)
|
- [Neutron Code](https://neutroncode.com)
|
||||||
- Direct APK Link
|
- Direct APK Link
|
||||||
- "HTML" (Fallback): Any other URL that returns an HTML page with links to APK files
|
- "HTML" (Fallback): Any other URL that returns an HTML page with links to APK files
|
||||||
@ -58,7 +56,11 @@ Or, contribute some configurations to the website by creating a PR at [this repo
|
|||||||
alt="Get it on F-Droid"
|
alt="Get it on F-Droid"
|
||||||
height="80">](https://f-droid.org/packages/dev.imranr.obtainium.fdroid/)
|
height="80">](https://f-droid.org/packages/dev.imranr.obtainium.fdroid/)
|
||||||
|
|
||||||
[PGP Public Key](https://keyserver.ubuntu.com/pks/lookup?search=contact%40imranr.dev&fingerprint=on&op=index)
|
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
|
||||||
- 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.
|
||||||
|
@ -81,6 +81,10 @@ android {
|
|||||||
release {
|
release {
|
||||||
signingConfig signingConfigs.release
|
signingConfig signingConfigs.release
|
||||||
}
|
}
|
||||||
|
debug {
|
||||||
|
applicationIdSuffix = ".debug"
|
||||||
|
versionNameSuffix = "-debug"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
android/app/src/debug/res/values/string.xml
Normal file
4
android/app/src/debug/res/values/string.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="label">Obtainium Debug</string>
|
||||||
|
</resources>
|
@ -2,7 +2,7 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
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"
|
||||||
|
4
android/app/src/main/res/values/string.xml
Normal file
4
android/app/src/main/res/values/string.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="label">Obtainium</string>
|
||||||
|
</resources>
|
Binary file not shown.
BIN
assets/fonts/WixMadeforDisplay-Regular.otf
Normal file
BIN
assets/fonts/WixMadeforDisplay-Regular.otf
Normal file
Binary file not shown.
@ -24,7 +24,7 @@
|
|||||||
"colour": "Boja",
|
"colour": "Boja",
|
||||||
"standard": "Standard",
|
"standard": "Standard",
|
||||||
"custom": "Custom",
|
"custom": "Custom",
|
||||||
"useMaterialYou": "Use Material You",
|
"useMaterialYou": "Koristi Material You temu",
|
||||||
"githubStarredRepos": "GitHub repo-i sa zvjezdicom",
|
"githubStarredRepos": "GitHub repo-i sa zvjezdicom",
|
||||||
"uname": "Korisničko ime",
|
"uname": "Korisničko ime",
|
||||||
"wrongArgNum": "Naveden je pogrešan broj argumenata",
|
"wrongArgNum": "Naveden je pogrešan broj argumenata",
|
||||||
@ -113,7 +113,7 @@
|
|||||||
"dark": "Tamna",
|
"dark": "Tamna",
|
||||||
"light": "Svijetla",
|
"light": "Svijetla",
|
||||||
"followSystem": "Pratite sistem",
|
"followSystem": "Pratite sistem",
|
||||||
"followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
|
"followSystemThemeExplanation": "Praćenje sistemske teme je moguće jedino koristeći aplikacije treće strane",
|
||||||
"useBlackTheme": "Koristite čisto crnu tamnu temu",
|
"useBlackTheme": "Koristite čisto crnu tamnu temu",
|
||||||
"appSortBy": "Aplikacije sortirane po",
|
"appSortBy": "Aplikacije sortirane po",
|
||||||
"authorName": "Autor/Ime",
|
"authorName": "Autor/Ime",
|
||||||
@ -147,10 +147,10 @@
|
|||||||
"noNewUpdates": "Nema novih ažuriranja.",
|
"noNewUpdates": "Nema novih ažuriranja.",
|
||||||
"xHasAnUpdate": "{} ima ažuriranje.",
|
"xHasAnUpdate": "{} ima ažuriranje.",
|
||||||
"appsUpdated": "Aplikacije su ažurirane",
|
"appsUpdated": "Aplikacije su ažurirane",
|
||||||
"appsNotUpdated": "Failed to update applications",
|
"appsNotUpdated": "Neuspješno ažuriranje aplikacija",
|
||||||
"appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija",
|
"appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija",
|
||||||
"xWasUpdatedToY": "{} je ažuriran na {}.",
|
"xWasUpdatedToY": "{} je ažuriran na {}.",
|
||||||
"xWasNotUpdatedToY": "Failed to update {} to {}.",
|
"xWasNotUpdatedToY": "Neuspješno ažuriranje {} na {}.",
|
||||||
"errorCheckingUpdates": "Greška pri provjeri ažuriranja",
|
"errorCheckingUpdates": "Greška pri provjeri ažuriranja",
|
||||||
"errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije",
|
"errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije",
|
||||||
"appsRemoved": "Aplikacije su uklonjene",
|
"appsRemoved": "Aplikacije su uklonjene",
|
||||||
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "Nije pronađena aplikacija s tim ID-om ili imenom",
|
"appWithIdOrNameNotFound": "Nije pronađena aplikacija s tim ID-om ili imenom",
|
||||||
"reposHaveMultipleApps": "Repo-i mogu sadržavati više aplikacija",
|
"reposHaveMultipleApps": "Repo-i mogu sadržavati više aplikacija",
|
||||||
"fdroidThirdPartyRepo": "F-Droid Repo treće strane",
|
"fdroidThirdPartyRepo": "F-Droid Repo treće strane",
|
||||||
"steamMobile": "Steam Mobile",
|
|
||||||
"steamChat": "Razgovor na Steamu (chat)",
|
|
||||||
"install": "Instaliraj",
|
"install": "Instaliraj",
|
||||||
"markInstalled": "Označi kao instalirano",
|
"markInstalled": "Označi kao instalirano",
|
||||||
"update": "Nadogradi",
|
"update": "Nadogradi",
|
||||||
@ -191,7 +189,7 @@
|
|||||||
"downloadingX": "Preuzimanje {}",
|
"downloadingX": "Preuzimanje {}",
|
||||||
"downloadX": "Download {}",
|
"downloadX": "Download {}",
|
||||||
"downloadedX": "Downloaded {}",
|
"downloadedX": "Downloaded {}",
|
||||||
"releaseAsset": "Release Asset",
|
"releaseAsset": "Fajlovi verzije",
|
||||||
"downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije",
|
"downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije",
|
||||||
"noAPKFound": "APK nije pronađen",
|
"noAPKFound": "APK nije pronađen",
|
||||||
"noVersionDetection": "Nema detekcije verzije",
|
"noVersionDetection": "Nema detekcije verzije",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "Deinstaliraj s uređaja",
|
"uninstallFromDevice": "Deinstaliraj s uređaja",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Radi samo za aplikacije s onemogućenom detekcijom verzije.",
|
"onlyWorksWithNonVersionDetectApps": "Radi samo za aplikacije s onemogućenom detekcijom verzije.",
|
||||||
"releaseDateAsVersion": "Koristi datum izdanja kao verziju",
|
"releaseDateAsVersion": "Koristi datum izdanja kao verziju",
|
||||||
|
"releaseTitleAsVersion": "Use release title as version string",
|
||||||
"releaseDateAsVersionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno, ali je datum izdavanja dostupan.",
|
"releaseDateAsVersionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno, ali je datum izdavanja dostupan.",
|
||||||
"changes": "Promjene",
|
"changes": "Promjene",
|
||||||
"releaseDate": "Datum izdavanja",
|
"releaseDate": "Datum izdavanja",
|
||||||
@ -253,12 +252,15 @@
|
|||||||
"verifyLatestTag": "Provjerite 'posljednu' ('latest') oznaku",
|
"verifyLatestTag": "Provjerite 'posljednu' ('latest') oznaku",
|
||||||
"intermediateLinkRegex": "Filter za 'srednju' vezu za posjetu",
|
"intermediateLinkRegex": "Filter za 'srednju' vezu za posjetu",
|
||||||
"filterByLinkText": "Filtriraj linkove prema tekstu linka",
|
"filterByLinkText": "Filtriraj linkove prema tekstu linka",
|
||||||
"intermediateLinkNotFound": "Intermediate link nije nađen",
|
"intermediateLinkNotFound": "Intermediate veza nije nađena",
|
||||||
"intermediateLink": "srednja karika",
|
"intermediateLink": "Intermediate veza",
|
||||||
"exemptFromBackgroundUpdates": "Izuzmi iz ažuriranja u pozadini (ako su uključeni)",
|
"exemptFromBackgroundUpdates": "Izuzmi iz ažuriranja u pozadini (ako su uključeni)",
|
||||||
"bgUpdatesOnWiFiOnly": "Isključite ažuriranje u pozadini kada niste na WiFi-ju",
|
"bgUpdatesOnWiFiOnly": "Isključite ažuriranje u pozadini kada niste na WiFi-ju",
|
||||||
|
"bgUpdatesWhileChargingOnly": "Disable background updates when not charging",
|
||||||
"autoSelectHighestVersionCode": "Automatski izaberite najveću (verziju) versionCode APK-a",
|
"autoSelectHighestVersionCode": "Automatski izaberite najveću (verziju) versionCode APK-a",
|
||||||
"versionExtractionRegEx": "RegEx ekstrakcija verzije",
|
"versionExtractionRegEx": "RegEx ekstrakcija verzije",
|
||||||
|
"trimVersionString": "Trim Version String With RegEx",
|
||||||
|
"matchGroupToUseForX": "Match Group to Use for \"{}\"",
|
||||||
"matchGroupToUse": "Podjesite grupu za upotebu",
|
"matchGroupToUse": "Podjesite grupu za upotebu",
|
||||||
"highlightTouchTargets": "Istaknite manje vidljive touch mete",
|
"highlightTouchTargets": "Istaknite manje vidljive touch mete",
|
||||||
"pickExportDir": "Izaberite datoteku za izvoz",
|
"pickExportDir": "Izaberite datoteku za izvoz",
|
||||||
@ -288,11 +290,11 @@
|
|||||||
"supportFixedAPKURL": "Podržite fiksne APK URL-ove",
|
"supportFixedAPKURL": "Podržite fiksne APK URL-ove",
|
||||||
"selectX": "Izaberite {}",
|
"selectX": "Izaberite {}",
|
||||||
"parallelDownloads": "Dozvoli paralelna preuzimanja",
|
"parallelDownloads": "Dozvoli paralelna preuzimanja",
|
||||||
"useShizuku": "Use Shizuku or Sui to install",
|
"useShizuku": "Koristi Shizuku ili Sui za instaliranje",
|
||||||
"shizukuBinderNotFound": "Shizuku is not running",
|
"shizukuBinderNotFound": "Shizuku nije pokrenut",
|
||||||
"shizukuOld": "Old Shizuku version (<11) - update it",
|
"shizukuOld": "Stara Shizuku verzija (<11) - ažurirajte je",
|
||||||
"shizukuOldAndroidWithADB": "Shizuku running on Android < 8.1 with ADB - update Android or use Sui instead",
|
"shizukuOldAndroidWithADB": "Shizuku pokrenut na Android-u < 8.1 pomoću ADB-a - ažurirajte Android ili koristite Sui",
|
||||||
"shizukuPretendToBeGooglePlay": "Set Google Play as the installation source (if Shizuku is used)",
|
"shizukuPretendToBeGooglePlay": "Postavi Google Play kao izvor instalacije (samo ako je Shizuku u upotrebi)",
|
||||||
"useSystemFont": "Koristite sistemski font",
|
"useSystemFont": "Koristite sistemski font",
|
||||||
"useVersionCodeAsOSVersion": "Koristite kod verzije aplikacije kao verziju koju je otkrio OS",
|
"useVersionCodeAsOSVersion": "Koristite kod verzije aplikacije kao verziju koju je otkrio OS",
|
||||||
"requestHeader": "Zaglavlje zahtjeva",
|
"requestHeader": "Zaglavlje zahtjeva",
|
||||||
@ -305,13 +307,17 @@
|
|||||||
"installed": "Instalirano",
|
"installed": "Instalirano",
|
||||||
"latest": "Najnoviji",
|
"latest": "Najnoviji",
|
||||||
"invertRegEx": "Obrni regularni izraz",
|
"invertRegEx": "Obrni regularni izraz",
|
||||||
"note": "Note",
|
"note": "Zabelješke",
|
||||||
"selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.",
|
"selfHostedNote": "\"{}\" padajući meni se može koristiti da dosegnete vlastite/prilagođene instance bilo kojeg izvora.",
|
||||||
"badDownload": "The APK could not be parsed (incompatible or partial download)",
|
"badDownload": "APK ne može biti raščlanjen (nekomaptibilno ili delimično preuzimanje)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
|
"beforeNewInstallsShareToAppVerifier": "Dijeli nove aplikacije sa AppVerifier-om (ako je dostupno)",
|
||||||
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
|
"appVerifierInstructionToast": "Dijeli sa AppVerifier-om, zatim se vratite kada ste spremni.",
|
||||||
"wiki": "Help/Wiki",
|
"wiki": "Pomoć/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Želite li ukloniti aplikaciju?",
|
"one": "Želite li ukloniti aplikaciju?",
|
||||||
"other": "Želite li ukloniti aplikacije?"
|
"other": "Želite li ukloniti aplikacije?"
|
||||||
@ -370,6 +376,6 @@
|
|||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{} APK",
|
"one": "{} APK",
|
||||||
"other": "{} APKs"
|
"other": "{} APK-a"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "Žádná aplikace s tímto ID nebo názvem nebyla nalezena",
|
"appWithIdOrNameNotFound": "Žádná aplikace s tímto ID nebo názvem nebyla nalezena",
|
||||||
"reposHaveMultipleApps": "Repozitáře mohou obsahovat více aplikací",
|
"reposHaveMultipleApps": "Repozitáře mohou obsahovat více aplikací",
|
||||||
"fdroidThirdPartyRepo": "F-Droid repozitář třetí strany",
|
"fdroidThirdPartyRepo": "F-Droid repozitář třetí strany",
|
||||||
"steamMobile": "Steam Mobile",
|
|
||||||
"steamChat": "Steam Chat",
|
|
||||||
"install": "Nainstalujte",
|
"install": "Nainstalujte",
|
||||||
"markInstalled": "Označit jako nainstalovaný",
|
"markInstalled": "Označit jako nainstalovaný",
|
||||||
"update": "Aktualizovat",
|
"update": "Aktualizovat",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "Odinstalovat ze zařízení",
|
"uninstallFromDevice": "Odinstalovat ze zařízení",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Funguje pouze pro aplikace s vypnutou detekcí verze.",
|
"onlyWorksWithNonVersionDetectApps": "Funguje pouze pro aplikace s vypnutou detekcí verze.",
|
||||||
"releaseDateAsVersion": "Použít datum vydání jako verzi",
|
"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í.",
|
"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",
|
"changes": "Změny",
|
||||||
"releaseDate": "Datum vydání",
|
"releaseDate": "Datum vydání",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "Připojený odkaz",
|
"intermediateLink": "Připojený odkaz",
|
||||||
"exemptFromBackgroundUpdates": "Vyloučit z aktualizací na pozadí (je-li povoleno)",
|
"exemptFromBackgroundUpdates": "Vyloučit z aktualizací na pozadí (je-li povoleno)",
|
||||||
"bgUpdatesOnWiFiOnly": "Deaktivovat aktualizace na pozadí, pokud není k dispozici Wi-Fi",
|
"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",
|
"autoSelectHighestVersionCode": "Automaticky vybrat nejvyšší verzi APK",
|
||||||
"versionExtractionRegEx": "Extrakce verze pomocí RegEx",
|
"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ě",
|
"matchGroupToUse": "Odpovídá použité skupině",
|
||||||
"highlightTouchTargets": "Zvýraznit méně zjevné cíle dotyku",
|
"highlightTouchTargets": "Zvýraznit méně zjevné cíle dotyku",
|
||||||
"pickExportDir": "Vybrat adresář pro export",
|
"pickExportDir": "Vybrat adresář pro export",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.",
|
"appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.",
|
||||||
"wiki": "Nápověda/Wiki",
|
"wiki": "Nápověda/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Konfigurace aplikací s využitím crowdsourcingu (použití na vlastní nebezpečí)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Odstranit Apku?",
|
"one": "Odstranit Apku?",
|
||||||
"other": "Odstranit Apky?"
|
"other": "Odstranit Apky?"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"invalidURLForSource": "Ikke et gyldigt {} App-URL",
|
"invalidURLForSource": "Ikke et gyldigt {} app-URL",
|
||||||
"noReleaseFound": "Kunne ikke finde en passende udgivelse",
|
"noReleaseFound": "Kunne ikke finde en passende udgivelse",
|
||||||
"noVersionFound": "Kunne ikke afgøre udgivelsesversion",
|
"noVersionFound": "Kunne ikke afgøre udgivelsesversion",
|
||||||
"urlMatchesNoSource": "URL'en matcher ikke en kendt kilde",
|
"urlMatchesNoSource": "URL'en matcher ikke en kendt kilde",
|
||||||
@ -28,7 +28,7 @@
|
|||||||
"githubStarredRepos": "Stjernemarkeret GitHub-repos",
|
"githubStarredRepos": "Stjernemarkeret GitHub-repos",
|
||||||
"uname": "Brugernavn",
|
"uname": "Brugernavn",
|
||||||
"wrongArgNum": "Forkert antal argumenter angivet",
|
"wrongArgNum": "Forkert antal argumenter angivet",
|
||||||
"xIsTrackOnly": "{} kan kun følges",
|
"xIsTrackOnly": "{} er 'Følg Kun'",
|
||||||
"source": "Kilde",
|
"source": "Kilde",
|
||||||
"app": "App",
|
"app": "App",
|
||||||
"appsFromSourceAreTrackOnly": "Apps fra denne kilde er 'Følg Kun'.",
|
"appsFromSourceAreTrackOnly": "Apps fra denne kilde er 'Følg Kun'.",
|
||||||
@ -36,14 +36,14 @@
|
|||||||
"trackOnlyAppDescription": "Appen tjekkes for opdateringer, men Obtainium kan ikke hente eller installere den.",
|
"trackOnlyAppDescription": "Appen tjekkes for opdateringer, men Obtainium kan ikke hente eller installere den.",
|
||||||
"cancelled": "Annulleret",
|
"cancelled": "Annulleret",
|
||||||
"appAlreadyAdded": "Appen er allerede tilføjet",
|
"appAlreadyAdded": "Appen er allerede tilføjet",
|
||||||
"alreadyUpToDateQuestion": "Appen er allerede opdateret?",
|
"alreadyUpToDateQuestion": "Er appen allerede opdateret?",
|
||||||
"addApp": "Tilføj app",
|
"addApp": "Tilføj app",
|
||||||
"appSourceURL": "URL til app-kilde",
|
"appSourceURL": "URL til app-kilde",
|
||||||
"error": "Fejl",
|
"error": "Fejl",
|
||||||
"add": "Tilføj",
|
"add": "Tilføj",
|
||||||
"searchSomeSourcesLabel": "Søg (kun visse kilder)",
|
"searchSomeSourcesLabel": "Søg (kun visse kilder)",
|
||||||
"search": "Søg",
|
"search": "Søg",
|
||||||
"additionalOptsFor": "Yderligere indstillinger for {}",
|
"additionalOptsFor": "Flere indstillinger for {}",
|
||||||
"supportedSources": "Understøttede kilder",
|
"supportedSources": "Understøttede kilder",
|
||||||
"trackOnlyInBrackets": "(Følg Kun)",
|
"trackOnlyInBrackets": "(Følg Kun)",
|
||||||
"searchableInBrackets": "(Kan Søges)",
|
"searchableInBrackets": "(Kan Søges)",
|
||||||
@ -51,7 +51,7 @@
|
|||||||
"noApps": "Ingen apps",
|
"noApps": "Ingen apps",
|
||||||
"noAppsForFilter": "Ingen apps til filter",
|
"noAppsForFilter": "Ingen apps til filter",
|
||||||
"byX": "Af {}",
|
"byX": "Af {}",
|
||||||
"percentProgress": "Fremskridt: {}%",
|
"percentProgress": "Hentning: {}%",
|
||||||
"pleaseWait": "Vent venligst",
|
"pleaseWait": "Vent venligst",
|
||||||
"updateAvailable": "Opdatering tilgængelig",
|
"updateAvailable": "Opdatering tilgængelig",
|
||||||
"notInstalled": "Ikke installeret",
|
"notInstalled": "Ikke installeret",
|
||||||
@ -74,14 +74,14 @@
|
|||||||
"pinToTop": "Fastgør til toppen",
|
"pinToTop": "Fastgør til toppen",
|
||||||
"unpinFromTop": "Frigør fra toppen",
|
"unpinFromTop": "Frigør fra toppen",
|
||||||
"resetInstallStatusForSelectedAppsQuestion": "Nulstil installationsstatus for valgte apps?",
|
"resetInstallStatusForSelectedAppsQuestion": "Nulstil installationsstatus for valgte apps?",
|
||||||
"installStatusOfXWillBeResetExplanation": "Installationsstatus for alle valgte apps nulstilles.\n\nDette kan hjælpe, når den app-version, der vises i Obtainium, er forkert grundet mislykkede opdateringer eller andre problemer.",
|
"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",
|
"customLinkMessage": "Disse links virker på enheder med Obtainium installeret",
|
||||||
"shareAppConfigLinks": "Del app-konfiguration som HTML-link",
|
"shareAppConfigLinks": "Del app-konfiguration som HTML-link",
|
||||||
"shareSelectedAppURLs": "Del valgte app-URL'er",
|
"shareSelectedAppURLs": "Del valgte app-URL'er",
|
||||||
"resetInstallStatus": "Nulstil installationsstatus",
|
"resetInstallStatus": "Nulstil installationsstatus",
|
||||||
"more": "Mere",
|
"more": "Mere",
|
||||||
"removeOutdatedFilter": "Fjern forældet app-filter",
|
"removeOutdatedFilter": "Fjern forældet app-filter",
|
||||||
"showOutdatedOnly": "Vis kun forældet apps",
|
"showOutdatedOnly": "Vis kun forældede apps",
|
||||||
"filter": "Filtrer",
|
"filter": "Filtrer",
|
||||||
"filterApps": "Filtrer Apps",
|
"filterApps": "Filtrer Apps",
|
||||||
"appName": "Appnavn",
|
"appName": "Appnavn",
|
||||||
@ -114,7 +114,7 @@
|
|||||||
"light": "Lys",
|
"light": "Lys",
|
||||||
"followSystem": "Følg system",
|
"followSystem": "Følg system",
|
||||||
"followSystemThemeExplanation": "Det er kun muligt at følge systemtemaet ved brug af tredjepartsapplikationer",
|
"followSystemThemeExplanation": "Det er kun muligt at følge systemtemaet ved brug af tredjepartsapplikationer",
|
||||||
"useBlackTheme": "Brug rent sort, mørkt tema",
|
"useBlackTheme": "Brug rent sort mørkt tema",
|
||||||
"appSortBy": "Sortér apps efter:",
|
"appSortBy": "Sortér apps efter:",
|
||||||
"authorName": "Udvikler/Navn",
|
"authorName": "Udvikler/Navn",
|
||||||
"nameAuthor": "Navn/Udvikler",
|
"nameAuthor": "Navn/Udvikler",
|
||||||
@ -125,8 +125,8 @@
|
|||||||
"bgUpdateCheckInterval": "Kontrolinterval for baggrundsopdatering",
|
"bgUpdateCheckInterval": "Kontrolinterval for baggrundsopdatering",
|
||||||
"neverManualOnly": "Aldrig - Kun manuelt",
|
"neverManualOnly": "Aldrig - Kun manuelt",
|
||||||
"appearance": "Udseende",
|
"appearance": "Udseende",
|
||||||
"showWebInAppView": "Vis kildewebsiden i appvisning",
|
"showWebInAppView": "Vis kildewebsiden i app-visning",
|
||||||
"pinUpdates": "Fastgør opdateringer til toppen af appvisning",
|
"pinUpdates": "Fastgør opdateringer øverst i app-visning",
|
||||||
"updates": "Opdateringer",
|
"updates": "Opdateringer",
|
||||||
"sourceSpecific": "Kildespecifik",
|
"sourceSpecific": "Kildespecifik",
|
||||||
"appSource": "App-kilde",
|
"appSource": "App-kilde",
|
||||||
@ -138,12 +138,12 @@
|
|||||||
"obtainiumExportHyphenatedLowercase": "obtainium-eksport",
|
"obtainiumExportHyphenatedLowercase": "obtainium-eksport",
|
||||||
"pickAnAPK": "Vælg en APK",
|
"pickAnAPK": "Vælg en APK",
|
||||||
"appHasMoreThanOnePackage": "{} har mere end én pakke:",
|
"appHasMoreThanOnePackage": "{} har mere end én pakke:",
|
||||||
"deviceSupportsXArch": "Din enhed understøtter {} CPU-arkitekturen.",
|
"deviceSupportsXArch": "Din enhed understøtter CPU-arkitekturen {}.",
|
||||||
"deviceSupportsFollowingArchs": "Din enhed understøtter følgende CPU-arkitekturer:",
|
"deviceSupportsFollowingArchs": "Din enhed understøtter følgende CPU-arkitekturer:",
|
||||||
"warning": "Advarsel",
|
"warning": "Advarsel",
|
||||||
"sourceIsXButPackageFromYPrompt": "App-kilden er '{}', men udgivelsespakken kommer fra '{}'. Fortsæt?",
|
"sourceIsXButPackageFromYPrompt": "App-kilden er '{}', men udgivelsespakken kommer fra '{}'. Fortsæt?",
|
||||||
"updatesAvailable": "Opdateringer tilgængelige",
|
"updatesAvailable": "Opdateringer tilgængelige",
|
||||||
"updatesAvailableNotifDescription": "Underretter brugeren om, at opdateringer er tilgængelige for en eller flere apps, der spores af Obtainium",
|
"updatesAvailableNotifDescription": "Underretter brugeren om tilgængelige opdateringer for en eller flere apps, som Obtainium følger",
|
||||||
"noNewUpdates": "Ingen nye opdateringer.",
|
"noNewUpdates": "Ingen nye opdateringer.",
|
||||||
"xHasAnUpdate": "{} har en opdatering.",
|
"xHasAnUpdate": "{} har en opdatering.",
|
||||||
"appsUpdated": "Apps opdateret",
|
"appsUpdated": "Apps opdateret",
|
||||||
@ -152,19 +152,19 @@
|
|||||||
"xWasUpdatedToY": "{} blev opdateret til {}.",
|
"xWasUpdatedToY": "{} blev opdateret til {}.",
|
||||||
"xWasNotUpdatedToY": "Kunne ikke opdatere {} til {}.",
|
"xWasNotUpdatedToY": "Kunne ikke opdatere {} til {}.",
|
||||||
"errorCheckingUpdates": "Fejl ved tjek for opdateringer",
|
"errorCheckingUpdates": "Fejl ved tjek for opdateringer",
|
||||||
"errorCheckingUpdatesNotifDescription": "En meddelelse, der vises, når opdateringstjek i baggrunden mislykkes",
|
"errorCheckingUpdatesNotifDescription": "En meddelelse, der vises, opdateringstjek i baggrunden mislykkes",
|
||||||
"appsRemoved": "Apps fjernet",
|
"appsRemoved": "Apps fjernet",
|
||||||
"appsRemovedNotifDescription": "Underretter brugeren om, at en eller flere apps blev fjernet grundet fejl under indlæsning af dem",
|
"appsRemovedNotifDescription": "Underretter brugeren om, at en eller flere apps blev fjernet grundet fejl under indlæsning af dem",
|
||||||
"xWasRemovedDueToErrorY": "{} blev fjernet grundet denne fejl: {}",
|
"xWasRemovedDueToErrorY": "{} blev fjernet grundet denne fejl: {}",
|
||||||
"completeAppInstallation": "Færdiggør app-installation",
|
"completeAppInstallation": "Færdiggør app-installation",
|
||||||
"obtainiumMustBeOpenToInstallApps": "Obtainium skal være åben for at installere apps",
|
"obtainiumMustBeOpenToInstallApps": "Obtainium skal være åben for at installere apps",
|
||||||
"completeAppInstallationNotifDescription": "Beder brugeren om at vende tilbage til Obtainium for at afslutte installationen af en app",
|
"completeAppInstallationNotifDescription": "Beder brugeren om at gå tilbage til Obtainium for at færdiggøre installation af en app",
|
||||||
"checkingForUpdates": "Tjekker for opdateringer",
|
"checkingForUpdates": "Tjekker for opdateringer",
|
||||||
"checkingForUpdatesNotifDescription": "Kortvarig meddelelse, der vises ved tjek for opdateringer",
|
"checkingForUpdatesNotifDescription": "Kortvarig meddelelse ved tjek for opdateringer",
|
||||||
"pleaseAllowInstallPerm": "Tillad venligst Obtainium at installere apps",
|
"pleaseAllowInstallPerm": "Tillad venligst Obtainium at installere apps",
|
||||||
"trackOnly": "Følg Kun",
|
"trackOnly": "Følg Kun",
|
||||||
"errorWithHttpStatusCode": "Fejl {}",
|
"errorWithHttpStatusCode": "Fejl {}",
|
||||||
"versionCorrectionDisabled": "Versionskorrigering deaktiveret (plugin ser ikke ud til at virke)",
|
"versionCorrectionDisabled": "Versionskorrektion deaktiveret (plugin ser ikke ud til at virke)",
|
||||||
"unknown": "Ukendt",
|
"unknown": "Ukendt",
|
||||||
"none": "Ingen",
|
"none": "Ingen",
|
||||||
"never": "Aldrig",
|
"never": "Aldrig",
|
||||||
@ -174,25 +174,23 @@
|
|||||||
"remove": "Fjern",
|
"remove": "Fjern",
|
||||||
"yesMarkUpdated": "Ja, markér som opdateret",
|
"yesMarkUpdated": "Ja, markér som opdateret",
|
||||||
"fdroid": "F-Droid Officiel",
|
"fdroid": "F-Droid Officiel",
|
||||||
"appIdOrName": "App-ID eller navn",
|
"appIdOrName": "App-ID eller -navn",
|
||||||
"appId": "App-ID",
|
"appId": "App-ID",
|
||||||
"appWithIdOrNameNotFound": "Ingen app med det ID eller navn blev fundet",
|
"appWithIdOrNameNotFound": "Ingen app med det ID eller navn blev fundet",
|
||||||
"reposHaveMultipleApps": "Repos kan indeholde flere apps",
|
"reposHaveMultipleApps": "Repos kan indeholde flere apps",
|
||||||
"fdroidThirdPartyRepo": "F-Droid Tredjeparts-repo",
|
"fdroidThirdPartyRepo": "F-Droid Tredjeparts-repo",
|
||||||
"steamMobile": "Steam Mobil",
|
|
||||||
"steamChat": "Steam Chat",
|
|
||||||
"install": "Installer",
|
"install": "Installer",
|
||||||
"markInstalled": "Markér som installeret",
|
"markInstalled": "Markér som installeret",
|
||||||
"update": "Opdater",
|
"update": "Opdater",
|
||||||
"markUpdated": "Markér som opdateret",
|
"markUpdated": "Markér som opdateret",
|
||||||
"additionalOptions": "Yderligere indstillinger",
|
"additionalOptions": "Flere indstillinger",
|
||||||
"disableVersionDetection": "Deaktivér versionsregistrering",
|
"disableVersionDetection": "Deaktivér versionsregistrering",
|
||||||
"noVersionDetectionExplanation": "Denne indstilling bør kun bruges til apps, hvor versionsregistrering ikke virker korrekt.",
|
"noVersionDetectionExplanation": "Denne indstilling bør kun bruges til apps, hvor versionsregistrering ikke virker korrekt.",
|
||||||
"downloadingX": "Henter {}",
|
"downloadingX": "Henter {}",
|
||||||
"downloadX": "Hent {}",
|
"downloadX": "Hent {}",
|
||||||
"downloadedX": "Hentede {}",
|
"downloadedX": "Hentede {}",
|
||||||
"releaseAsset": "Udgivelsesressource",
|
"releaseAsset": "Udgivelsesressource",
|
||||||
"downloadNotifDescription": "Underretter brugeren om fremskridt i hentning af en app",
|
"downloadNotifDescription": "Underretter brugeren om status på hentning af en app",
|
||||||
"noAPKFound": "Ingen APK fundet",
|
"noAPKFound": "Ingen APK fundet",
|
||||||
"noVersionDetection": "Ingen versionsregistrering",
|
"noVersionDetection": "Ingen versionsregistrering",
|
||||||
"categorize": "Kategoriser",
|
"categorize": "Kategoriser",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "Afinstaller fra enhed",
|
"uninstallFromDevice": "Afinstaller fra enhed",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Virker kun for apps med versionsregistrering deaktiveret.",
|
"onlyWorksWithNonVersionDetectApps": "Virker kun for apps med versionsregistrering deaktiveret.",
|
||||||
"releaseDateAsVersion": "Brug udgivelsesdato som versionsstreng",
|
"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.",
|
"releaseDateAsVersionExplanation": "Denne indstilling bør kun bruges til apps, hvor versionsregistrering ikke virker korrekt, men hvor en udgivelsesdato er tilgængelig.",
|
||||||
"changes": "Ændringer",
|
"changes": "Ændringer",
|
||||||
"releaseDate": "Udgivelsesdato",
|
"releaseDate": "Udgivelsesdato",
|
||||||
@ -223,10 +222,10 @@
|
|||||||
"groupByCategory": "Gruppér efter kategori",
|
"groupByCategory": "Gruppér efter kategori",
|
||||||
"autoApkFilterByArch": "Forsøg at filtrere APK'er efter CPU-arkitektur, hvis muligt",
|
"autoApkFilterByArch": "Forsøg at filtrere APK'er efter CPU-arkitektur, hvis muligt",
|
||||||
"overrideSource": "Tilsidesæt kilde",
|
"overrideSource": "Tilsidesæt kilde",
|
||||||
"dontShowAgain": "Vis ikke denne igen",
|
"dontShowAgain": "Vis ikke igen",
|
||||||
"dontShowTrackOnlyWarnings": "Vis ikke 'Følg Kun'-advarsler",
|
"dontShowTrackOnlyWarnings": "Vis ikke 'Følg Kun'-advarsler",
|
||||||
"dontShowAPKOriginWarnings": "Vis ikke advarsler om APK-oprindelse",
|
"dontShowAPKOriginWarnings": "Vis ikke advarsler om APK-oprindelse",
|
||||||
"moveNonInstalledAppsToBottom": "Flyt ikke-installerede apps til bunden af appvisning",
|
"moveNonInstalledAppsToBottom": "Flyt ikke-installerede apps nederst i app-visning",
|
||||||
"gitlabPATLabel": "GitLab Personlig Adgangstoken",
|
"gitlabPATLabel": "GitLab Personlig Adgangstoken",
|
||||||
"about": "Om",
|
"about": "Om",
|
||||||
"requiresCredentialsInSettings": "{} kræver yderligere legitimation (i Indstillinger)",
|
"requiresCredentialsInSettings": "{} kræver yderligere legitimation (i Indstillinger)",
|
||||||
@ -239,41 +238,44 @@
|
|||||||
"reversePageTransitions": "Omvendte sideovergangsanimationer",
|
"reversePageTransitions": "Omvendte sideovergangsanimationer",
|
||||||
"minStarCount": "Minimum antal stjerner",
|
"minStarCount": "Minimum antal stjerner",
|
||||||
"addInfoBelow": "Tilføj denne info nedenfor.",
|
"addInfoBelow": "Tilføj denne info nedenfor.",
|
||||||
"addInfoInSettings": "Tilføj denne info i indstillingerne.",
|
"addInfoInSettings": "Tilføj denne info i Indstillinger.",
|
||||||
"githubSourceNote": "GitHubs hastighedsbegrænsning kan undgås med en API-nøgle.",
|
"githubSourceNote": "GitHub's hastighedsbegrænsning kan undgås med en API-nøgle.",
|
||||||
"sortByLastLinkSegment": "Sortér kun efter det sidste segment af linket",
|
"sortByLastLinkSegment": "Sortér kun efter det sidste segment af linket",
|
||||||
"filterReleaseNotesByRegEx": "Filtrer udgivelsesnoter efter regulært udtryk",
|
"filterReleaseNotesByRegEx": "Filtrer udgivelsesnoter efter regulært udtryk",
|
||||||
"customLinkFilterRegex": "Brugerdefineret APK-linkfilter efter regulært udtryk (standard '.apk$')",
|
"customLinkFilterRegex": "Brugerdefineret APK-linkfilter efter regulært udtryk (standard '.apk$')",
|
||||||
"appsPossiblyUpdated": "App-opdateringer forsøgt",
|
"appsPossiblyUpdated": "App-opdateringer forsøgt",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Underretter brugeren om, at opdateringer til en eller flere apps potentielt blev udført i baggrunden",
|
"appsPossiblyUpdatedNotifDescription": "Underretter brugeren om, at opdateringer til en eller flere apps muligvis blev udført i baggrunden",
|
||||||
"xWasPossiblyUpdatedToY": "{} er muligvis blevet opdateret til {}.",
|
"xWasPossiblyUpdatedToY": "{} er muligvis blevet opdateret til {}.",
|
||||||
"enableBackgroundUpdates": "Aktivér baggrundsopdateringer",
|
"enableBackgroundUpdates": "Aktivér baggrundsopdateringer",
|
||||||
"backgroundUpdateReqsExplanation": "Baggrundsopdateringer er muligvis ikke mulige for alle apps.",
|
"backgroundUpdateReqsExplanation": "Baggrundsopdateringer er måske ikke mulige for alle apps.",
|
||||||
"backgroundUpdateLimitsExplanation": "Om en baggrundsinstallation er vellykket, kan kun afgøres, når Obtainium åbnes.",
|
"backgroundUpdateLimitsExplanation": "En vellykket baggrundsinstallation kan kun afgøres, når Obtainium åbnes.",
|
||||||
"verifyLatestTag": "Verificer 'seneste'-tagget",
|
"verifyLatestTag": "Verificer 'seneste'-tagget",
|
||||||
"intermediateLinkRegex": "Filtrer efter et 'mellemliggende' link at besøge",
|
"intermediateLinkRegex": "Filtrer efter et 'mellemliggende' link at besøge",
|
||||||
"filterByLinkText": "Filtrer links efter linktekst",
|
"filterByLinkText": "Filtrer links efter linktekst",
|
||||||
"intermediateLinkNotFound": "Mellemliggende link ikke fundet",
|
"intermediateLinkNotFound": "Mellemliggende link ikke fundet",
|
||||||
"intermediateLink": "Mellemliggende link",
|
"intermediateLink": "Mellemliggende link",
|
||||||
"exemptFromBackgroundUpdates": "Undtag fra baggrundsopdateringer (hvis aktiveret)",
|
"exemptFromBackgroundUpdates": "Undtag fra baggrundsopdateringer (hvis aktiveret)",
|
||||||
"bgUpdatesOnWiFiOnly": "Deaktivér baggrundsopdateringer, når du ikke er på WiFi",
|
"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",
|
"autoSelectHighestVersionCode": "Auto-vælg højeste versionKode af APK",
|
||||||
"versionExtractionRegEx": "RegEx for versionsstrengsudtrækning",
|
"versionExtractionRegEx": "RegEx for versionsstrengsudtrækning",
|
||||||
"matchGroupToUse": "Match gruppe til brug til 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",
|
"highlightTouchTargets": "Fremhæv mindre åbenlyse berøringsmål",
|
||||||
"pickExportDir": "Vælg eksportmappe",
|
"pickExportDir": "Vælg eksportmappe",
|
||||||
"autoExportOnChanges": "Auto-eksport ved ændringer",
|
"autoExportOnChanges": "Auto-eksportér ved ændringer",
|
||||||
"includeSettings": "Inkluder indstillinger",
|
"includeSettings": "Inkluder indstillinger",
|
||||||
"filterVersionsByRegEx": "Filtrer versioner efter regulært udtryk",
|
"filterVersionsByRegEx": "Filtrer versioner efter regulært udtryk",
|
||||||
"trySelectingSuggestedVersionCode": "Forsøg at vælge den foreslåede versionKode af APK",
|
"trySelectingSuggestedVersionCode": "Forsøg at vælge den foreslåede versionKode af APK",
|
||||||
"dontSortReleasesList": "Behold udgivelsesordre fra API",
|
"dontSortReleasesList": "Behold udgivelsesrækkefølge fra API",
|
||||||
"reverseSort": "Omvendt sortering",
|
"reverseSort": "Omvendt sortering",
|
||||||
"takeFirstLink": "Tag første link",
|
"takeFirstLink": "Tag første link",
|
||||||
"skipSort": "Spring sortering over",
|
"skipSort": "Spring sortering over",
|
||||||
"debugMenu": "Fejlfindingsmenu",
|
"debugMenu": "Fejlfindingsmenu",
|
||||||
"bgTaskStarted": "Baggrundsopgave startet - tjek logfiler.",
|
"bgTaskStarted": "Baggrundsopgave startet - tjek logfiler.",
|
||||||
"runBgCheckNow": "Kør baggrundsopdateringstjek nu",
|
"runBgCheckNow": "Kør baggrundsopdateringstjek nu",
|
||||||
"versionExtractWholePage": "Anvend RegEx for versionsstrengsudtrækning for hele siden",
|
"versionExtractWholePage": "Anvend RegEx til versionsstrengsudtrækning på hele siden",
|
||||||
"installing": "Installerer",
|
"installing": "Installerer",
|
||||||
"skipUpdateNotifications": "Spring opdateringsmeddelelser over",
|
"skipUpdateNotifications": "Spring opdateringsmeddelelser over",
|
||||||
"updatesAvailableNotifChannel": "Opdateringer tilgængelige",
|
"updatesAvailableNotifChannel": "Opdateringer tilgængelige",
|
||||||
@ -284,7 +286,7 @@
|
|||||||
"downloadingXNotifChannel": "Henter {}",
|
"downloadingXNotifChannel": "Henter {}",
|
||||||
"completeAppInstallationNotifChannel": "Færdiggør app-installation",
|
"completeAppInstallationNotifChannel": "Færdiggør app-installation",
|
||||||
"checkingForUpdatesNotifChannel": "Tjekker for opdateringer",
|
"checkingForUpdatesNotifChannel": "Tjekker for opdateringer",
|
||||||
"onlyCheckInstalledOrTrackOnlyApps": "Tjek kun installeret og 'Følg Kun'-apps for opdateringer",
|
"onlyCheckInstalledOrTrackOnlyApps": "Tjek kun installerede og 'Følg Kun'-apps for opdateringer",
|
||||||
"supportFixedAPKURL": "Understøt fikserede APK-URL'er",
|
"supportFixedAPKURL": "Understøt fikserede APK-URL'er",
|
||||||
"selectX": "Vælg {}",
|
"selectX": "Vælg {}",
|
||||||
"parallelDownloads": "Tillad samtidige overførsler",
|
"parallelDownloads": "Tillad samtidige overførsler",
|
||||||
@ -294,8 +296,8 @@
|
|||||||
"shizukuOldAndroidWithADB": "Shizuku kører på Android <8.1 med ADB. Opdater Android eller brug Sui i stedet",
|
"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)",
|
"shizukuPretendToBeGooglePlay": "Indstil Google Play som installationskilde (hvis Shizuku bruges)",
|
||||||
"useSystemFont": "Brug systemskrifttype",
|
"useSystemFont": "Brug systemskrifttype",
|
||||||
"useVersionCodeAsOSVersion": "Brug app versionKode som OS-registreret version",
|
"useVersionCodeAsOSVersion": "Brug app-versionKode som OS-registreret version",
|
||||||
"requestHeader": "Anmod overskrift",
|
"requestHeader": "Anmodningsheader",
|
||||||
"useLatestAssetDateAsReleaseDate": "Brug seneste ressourceupload som udgivelsesdato",
|
"useLatestAssetDateAsReleaseDate": "Brug seneste ressourceupload som udgivelsesdato",
|
||||||
"defaultPseudoVersioningMethod": "Standard pseudo-versioneringsmetode",
|
"defaultPseudoVersioningMethod": "Standard pseudo-versioneringsmetode",
|
||||||
"partialAPKHash": "Delvis APK-hash",
|
"partialAPKHash": "Delvis APK-hash",
|
||||||
@ -305,13 +307,17 @@
|
|||||||
"installed": "Installeret",
|
"installed": "Installeret",
|
||||||
"latest": "Seneste",
|
"latest": "Seneste",
|
||||||
"invertRegEx": "Inverter regulært udtryk",
|
"invertRegEx": "Inverter regulært udtryk",
|
||||||
"note": "Note",
|
"note": "Bemærk",
|
||||||
"selfHostedNote": "Rullemenuen \"{}\" kan bruges til at nå selvhostede/brugerdefinerede instanser af enhver kilde.",
|
"selfHostedNote": "Rullemenuen \"{}\" kan bruges til at nå selvhostede/brugerdefinerede instanser af enhver kilde.",
|
||||||
"badDownload": "APK'en kunne ikke analyseres (inkompatibel eller delvis hentning)",
|
"badDownload": "APK'en kunne ikke analyseres (inkompatibel eller delvis hentning)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Del nye apps med AppVerifier (hvis tilgængelig)",
|
"beforeNewInstallsShareToAppVerifier": "Del nye apps med AppVerifier (hvis tilgængelig)",
|
||||||
"appVerifierInstructionToast": "Del til AppVerifier, og vend tilbage hertil, når du er klar.",
|
"appVerifierInstructionToast": "Del til AppVerifier, og vend tilbage, når du er klar.",
|
||||||
"wiki": "Hjælp/Wiki",
|
"wiki": "Hjælp/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourcede app-konfigurationer (brug på egen risiko)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Fjern app?",
|
"one": "Fjern app?",
|
||||||
"other": "Fjern apps?"
|
"other": "Fjern apps?"
|
||||||
@ -350,7 +356,7 @@
|
|||||||
},
|
},
|
||||||
"clearedNLogsBeforeXAfterY": {
|
"clearedNLogsBeforeXAfterY": {
|
||||||
"one": "Ryddet {n} log (før = {before}, efter = {after})",
|
"one": "Ryddet {n} log (før = {before}, efter = {after})",
|
||||||
"other": "Ryddet {n} logs (før = {before}, efter = {after})"
|
"other": "Ryddede {n} logs (før = {before}, efter = {after})"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesAvailable": {
|
"xAndNMoreUpdatesAvailable": {
|
||||||
"one": "{} og 1 anden app har opdateringer.",
|
"one": "{} og 1 anden app har opdateringer.",
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
"unexpectedError": "Unerwarteter Fehler",
|
"unexpectedError": "Unerwarteter Fehler",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"and": "und",
|
"and": "und",
|
||||||
"githubPATLabel": "GitHub Personal Access Token (Erhöht das Ratenlimit)",
|
"githubPATLabel": "Persönlicher Zugangstoken für GitHub (erhöht das Ratenlimit)",
|
||||||
"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",
|
||||||
@ -24,15 +24,15 @@
|
|||||||
"colour": "Farbe",
|
"colour": "Farbe",
|
||||||
"standard": "Standard",
|
"standard": "Standard",
|
||||||
"custom": "Benutzerdefiniert",
|
"custom": "Benutzerdefiniert",
|
||||||
"useMaterialYou": "Verwende Material You",
|
"useMaterialYou": "Material You verwenden",
|
||||||
"githubStarredRepos": "GitHub Starred Repos",
|
"githubStarredRepos": "GitHub Starred Repos",
|
||||||
"uname": "Benutzername",
|
"uname": "Benutzername",
|
||||||
"wrongArgNum": "Falsche Anzahl von Argumenten (Parametern) ü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 zum Nachverfolgen.",
|
"appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind nur zur Nachverfolgung.",
|
||||||
"youPickedTrackOnly": "Sie haben die Option „Nur Nachverfolgen“ gewählt.",
|
"youPickedTrackOnly": "Sie haben die Option „Nur nachverfolgen“ gewählt.",
|
||||||
"trackOnlyAppDescription": "Die App wird auf Aktualisierungen überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.",
|
"trackOnlyAppDescription": "Die App wird auf Aktualisierungen überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.",
|
||||||
"cancelled": "Abgebrochen",
|
"cancelled": "Abgebrochen",
|
||||||
"appAlreadyAdded": "App bereits hinzugefügt",
|
"appAlreadyAdded": "App bereits hinzugefügt",
|
||||||
@ -45,7 +45,7 @@
|
|||||||
"search": "Suchen",
|
"search": "Suchen",
|
||||||
"additionalOptsFor": "Zusatzoptionen für {}",
|
"additionalOptsFor": "Zusatzoptionen für {}",
|
||||||
"supportedSources": "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",
|
||||||
@ -61,22 +61,22 @@
|
|||||||
"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",
|
"customLinkMessage": "Diese Links funktionieren auf Geräten, wo Obtainium installiert ist",
|
||||||
"shareAppConfigLinks": "Teile die Appkonfiguration als HTML-Link",
|
"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",
|
||||||
@ -84,25 +84,25 @@
|
|||||||
"showOutdatedOnly": "Nur nicht aktuelle Apps anzeigen",
|
"showOutdatedOnly": "Nur nicht aktuelle Apps anzeigen",
|
||||||
"filter": "Filter",
|
"filter": "Filter",
|
||||||
"filterApps": "Apps filtern",
|
"filterApps": "Apps filtern",
|
||||||
"appName": "App Name",
|
"appName": "App-Name",
|
||||||
"author": "Autor",
|
"author": "Autor",
|
||||||
"upToDateApps": "Apps mit aktueller Version",
|
"upToDateApps": "Apps mit aktueller 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": "Importieren {}",
|
"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, installieren Sie 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:",
|
||||||
@ -113,8 +113,8 @@
|
|||||||
"dark": "Dunkel",
|
"dark": "Dunkel",
|
||||||
"light": "Hell",
|
"light": "Hell",
|
||||||
"followSystem": "System folgen",
|
"followSystem": "System folgen",
|
||||||
"followSystemThemeExplanation": "Das Folgen des Systemthemes ist unter Android <10 nur mit Hilfe von Drittanbieteranwendungen möglich",
|
"followSystemThemeExplanation": "Das Folgen des Systemthemes ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich",
|
||||||
"useBlackTheme": "Verwende Pure Black Dark Theme",
|
"useBlackTheme": "Rein schwarzen Hintergrund verwenden",
|
||||||
"appSortBy": "App sortieren nach",
|
"appSortBy": "App sortieren nach",
|
||||||
"authorName": "Autor/Name",
|
"authorName": "Autor/Name",
|
||||||
"nameAuthor": "Name/Autor",
|
"nameAuthor": "Name/Autor",
|
||||||
@ -146,8 +146,8 @@
|
|||||||
"updatesAvailableNotifDescription": "Benachrichtigt den Nutzer, dass Aktualisierungen für eine oder mehrere von Obtainium verfolgte Apps verfügbar sind",
|
"updatesAvailableNotifDescription": "Benachrichtigt den Nutzer, dass 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",
|
||||||
"appsNotUpdated": "Aktualisierung der Anwendungen fehlgeschlagen",
|
"appsNotUpdated": "Aktualisierung der Apps fehlgeschlagen",
|
||||||
"appsUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps im Hintergrund durchgeführt wurden",
|
"appsUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass 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.",
|
"xWasNotUpdatedToY": "Die Aktualisierung von {} auf {} ist fehlgeschlagen.",
|
||||||
@ -156,13 +156,13 @@
|
|||||||
"appsRemoved": "Apps entfernt",
|
"appsRemoved": "Apps entfernt",
|
||||||
"appsRemovedNotifDescription": "Benachrichtigt den Benutzer, dass eine oder mehrere Apps aufgrund von Fehlern beim Laden entfernt wurden",
|
"appsRemovedNotifDescription": "Benachrichtigt den Benutzer, dass 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 an den Benutzer, 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 erlauben Sie 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",
|
||||||
@ -173,25 +173,23 @@
|
|||||||
"lastUpdateCheckX": "Letzte Aktualisierungsprüfung: {}",
|
"lastUpdateCheckX": "Letzte Aktualisierungsprüfung: {}",
|
||||||
"remove": "Entfernen",
|
"remove": "Entfernen",
|
||||||
"yesMarkUpdated": "Ja, als aktualisiert markieren",
|
"yesMarkUpdated": "Ja, als aktualisiert markieren",
|
||||||
"fdroid": "offizielles F-Droid-Repo",
|
"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 Drittparteienrepo",
|
"fdroidThirdPartyRepo": "F-Droid-Drittanbieter-Repo",
|
||||||
"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",
|
||||||
"downloadX": "{} herunterladen",
|
"downloadX": "{} herunterladen",
|
||||||
"downloadedX": "{} heruntergeladen",
|
"downloadedX": "{} heruntergeladen",
|
||||||
"releaseAsset": "release Asset",
|
"releaseAsset": "Release-Asset",
|
||||||
"downloadNotifDescription": "Benachrichtigt den Nutzer über den Fortschritt beim Herunterladen einer App",
|
"downloadNotifDescription": "Benachrichtigt den Nutzer über den Fortschritt beim Herunterladen einer App",
|
||||||
"noAPKFound": "Keine APK gefunden",
|
"noAPKFound": "Keine APK gefunden",
|
||||||
"noVersionDetection": "Keine Versionserkennung",
|
"noVersionDetection": "Keine Versionserkennung",
|
||||||
@ -213,53 +211,57 @@
|
|||||||
"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",
|
"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",
|
"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": "Automatisches Entfernen von extern deinstallierten Apps",
|
||||||
"pickHighestVersionCode": "Automatische Auswahl des APK mit höchstem Versionscode",
|
"pickHighestVersionCode": "Automatische Auswahl des APK mit höchstem Versionscode",
|
||||||
"checkUpdateOnDetailPage": "Nach Aktualisierungen 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.",
|
||||||
"sortByLastLinkSegment": "Sortiere nur nach dem letzten Teil des Links",
|
"sortByLastLinkSegment": "Nur nach dem letzten Teil des Links sortieren",
|
||||||
"filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck filtern",
|
"filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck filtern",
|
||||||
"customLinkFilterRegex": "Benutzerdefinierter APK Link Filter nach Regulärem Ausdruck (Standard '.apk$')",
|
"customLinkFilterRegex": "Benutzerdefinierter APK-Linkfilter durch regulären Ausdruck (Standard '.apk$')",
|
||||||
"appsPossiblyUpdated": "App Aktualisierungen wurden versucht",
|
"appsPossiblyUpdated": "App-Aktualisierungen wurden versucht",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps möglicherweise im Hintergrund durchgeführt wurden",
|
"appsPossiblyUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps möglicherweise im Hintergrund durchgeführt wurden",
|
||||||
"xWasPossiblyUpdatedToY": "{} wurde möglicherweise aktualisiert auf {}.",
|
"xWasPossiblyUpdatedToY": "{} wurde möglicherweise aktualisiert auf {}.",
|
||||||
"enableBackgroundUpdates": "Aktiviere Hintergrundaktualisierungen",
|
"enableBackgroundUpdates": "Hintergrundaktualisierungen aktivieren",
|
||||||
"backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist möglicherweise nicht für alle Apps möglich.",
|
"backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist möglicherweise nicht für alle Apps möglich.",
|
||||||
"backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.",
|
"backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.",
|
||||||
"verifyLatestTag": "Überprüfe das „latest“ Tag",
|
"verifyLatestTag": "„Latest“-Tag überprüfen",
|
||||||
"intermediateLinkRegex": "Filter für einen „Zwischen“-Link, der zuerst besucht werden soll",
|
"intermediateLinkRegex": "Filter für einen „Zwischen“-Link, der zuerst besucht werden soll",
|
||||||
"filterByLinkText": "Filtere Links durch Linktext",
|
"filterByLinkText": "Links durch Linktext filtern",
|
||||||
"intermediateLinkNotFound": "„Zwischen“-Link nicht gefunden",
|
"intermediateLinkNotFound": "„Zwischen“-Link nicht gefunden",
|
||||||
"intermediateLink": "„Zwischen“-Link",
|
"intermediateLink": "„Zwischen“-Link",
|
||||||
"exemptFromBackgroundUpdates": "Ausschluss von Hintergrundaktualisierungen (falls aktiviert)",
|
"exemptFromBackgroundUpdates": "Ausschluss von Hintergrundaktualisierungen (falls aktiviert)",
|
||||||
"bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen deaktivieren, wenn kein WLAN vorhanden ist",
|
"bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen deaktivieren, wenn kein WLAN vorhanden ist",
|
||||||
|
"bgUpdatesWhileChargingOnly": "Hintergrundaktualisierungen deaktivieren, wenn nicht geladen wird",
|
||||||
"autoSelectHighestVersionCode": "Automatisch höchste APK-Version auswählen",
|
"autoSelectHighestVersionCode": "Automatisch höchste APK-Version auswählen",
|
||||||
"versionExtractionRegEx": "Versions-Extraktion per RegEx",
|
"versionExtractionRegEx": "Versionsextraktion per RegEx",
|
||||||
"matchGroupToUse": "zu verwendende Gruppe abgleichen",
|
"trimVersionString": "Versionszeichenfolge mit RegEx kürzen",
|
||||||
|
"matchGroupToUseForX": "Zu verwendende Abgleichsgruppe für „{}“",
|
||||||
|
"matchGroupToUse": "Zu verwendende Gruppe abgleichen",
|
||||||
"highlightTouchTargets": "Weniger offensichtliche Touch-Ziele hervorheben",
|
"highlightTouchTargets": "Weniger offensichtliche Touch-Ziele hervorheben",
|
||||||
"pickExportDir": "Export-Verzeichnis wählen",
|
"pickExportDir": "Export-Verzeichnis wählen",
|
||||||
"autoExportOnChanges": "Automatischer Export bei Änderung(en)",
|
"autoExportOnChanges": "Automatischer Export bei Änderung(en)",
|
||||||
@ -268,57 +270,61 @@
|
|||||||
"trySelectingSuggestedVersionCode": "Versuchen, den vorgeschlagenen APK-Versionscode auszuwählen",
|
"trySelectingSuggestedVersionCode": "Versuchen, den vorgeschlagenen APK-Versionscode auszuwählen",
|
||||||
"dontSortReleasesList": "Freigaberelease von der API ordern",
|
"dontSortReleasesList": "Freigaberelease von der API ordern",
|
||||||
"reverseSort": "Umgekehrtes Sortieren",
|
"reverseSort": "Umgekehrtes Sortieren",
|
||||||
"takeFirstLink": "Verwende den ersten Link",
|
"takeFirstLink": "Ersten Link verwenden",
|
||||||
"skipSort": "Überspringe Sortieren",
|
"skipSort": "Sortieren überspringen",
|
||||||
"debugMenu": "Debug-Menü",
|
"debugMenu": "Debug-Menü",
|
||||||
"bgTaskStarted": "Hintergrundaufgabe gestartet – Logs prüfen.",
|
"bgTaskStarted": "Hintergrundaufgabe gestartet – Logs prüfen.",
|
||||||
"runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen",
|
"runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen",
|
||||||
"versionExtractWholePage": "Versions-Extraktion per RegEx auf die gesamte Seite anwenden",
|
"versionExtractWholePage": "Versionsextraktion per RegEx auf die gesamte Seite anwenden",
|
||||||
"installing": "Installiere",
|
"installing": "Installieren",
|
||||||
"skipUpdateNotifications": "Keine Benachrichtigung zu App-Aktualisierungen geben",
|
"skipUpdateNotifications": "Update-Benachrichtigungen überspringen",
|
||||||
"updatesAvailableNotifChannel": "Aktualisierungen verfügbar",
|
"updatesAvailableNotifChannel": "Aktualisierungen verfügbar",
|
||||||
"appsUpdatedNotifChannel": "Apps aktualisiert",
|
"appsUpdatedNotifChannel": "Apps aktualisiert",
|
||||||
"appsPossiblyUpdatedNotifChannel": "App Aktualisierungen wurden versucht",
|
"appsPossiblyUpdatedNotifChannel": "App-Aktualisierungen wurden versucht",
|
||||||
"errorCheckingUpdatesNotifChannel": "Fehler beim Prüfen auf Aktualisierungen",
|
"errorCheckingUpdatesNotifChannel": "Fehler beim Prüfen auf Aktualisierungen",
|
||||||
"appsRemovedNotifChannel": "Apps entfernt",
|
"appsRemovedNotifChannel": "Apps entfernt",
|
||||||
"downloadingXNotifChannel": "Lade {} herunter",
|
"downloadingXNotifChannel": "{} herunterladen",
|
||||||
"completeAppInstallationNotifChannel": "App Installation abschließen",
|
"completeAppInstallationNotifChannel": "App-Installation abschließen",
|
||||||
"checkingForUpdatesNotifChannel": "Nach Aktualisierungen suchen",
|
"checkingForUpdatesNotifChannel": "Nach Aktualisierungen suchen",
|
||||||
"onlyCheckInstalledOrTrackOnlyApps": "Überprüfe nur installierte und mit „nur Nachverfolgen“ markierte Apps auf Aktualisierungen",
|
"onlyCheckInstalledOrTrackOnlyApps": "Nur installierte und mit „Nur nachverfolgen“ markierte Apps auf Aktualisierungen prüfen",
|
||||||
"supportFixedAPKURL": "neuere Version anhand der ersten dreißig Zahlen der Checksumme der APK URL erraten, wenn anderweitig nicht unterstützt",
|
"supportFixedAPKURL": "Unterstützung von festen APK-URLs",
|
||||||
"selectX": "Wähle {}",
|
"selectX": "{} wählen",
|
||||||
"parallelDownloads": "Erlaube parallele Downloads",
|
"parallelDownloads": "Parallele Downloads erlauben",
|
||||||
"useShizuku": "Verwenden Sie Shizuku oder Sui zur Installation",
|
"useShizuku": "Shizuku oder Sui zur Installation verwenden",
|
||||||
"shizukuBinderNotFound": "Kompatibler Shizukudienst wurde nicht gefunden",
|
"shizukuBinderNotFound": "Kompatibler Shizuku-Dienst wurde nicht gefunden",
|
||||||
"shizukuOld": "Alte Shizuku-Version (<11) - aktualisieren Sie sie",
|
"shizukuOld": "Alte Shizuku-Version (< 11) - aktualisieren Sie sie",
|
||||||
"shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB - aktualisieren Sie Android oder verwenden Sie stattdessen Sui",
|
"shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB - aktualisieren Sie Android oder verwenden Sie stattdessen Sui",
|
||||||
"shizukuPretendToBeGooglePlay": "Google Play als Installationsquelle festlegen (wenn Shizuku verwendet wird)",
|
"shizukuPretendToBeGooglePlay": "Google Play als Installationsquelle festlegen (wenn Shizuku verwendet wird)",
|
||||||
"useSystemFont": "Verwende die Systemschriftart",
|
"useSystemFont": "Systemschriftart verwenden",
|
||||||
"useVersionCodeAsOSVersion": "Verwende die Appversion als erkannte Version vom Betriebssystem",
|
"useVersionCodeAsOSVersion": "App-Version als erkannte Version vom Betriebssystem verwenden",
|
||||||
"requestHeader": "Request Header",
|
"requestHeader": "Kopfzeile anfordern",
|
||||||
"useLatestAssetDateAsReleaseDate": "Den letzten Asset-Upload als Veröffentlichungsdatum verwenden",
|
"useLatestAssetDateAsReleaseDate": "Letzten Asset-Upload als Veröffentlichungsdatum verwenden",
|
||||||
"defaultPseudoVersioningMethod": "Standardmäßiges Verfahren zur Pseudo-Versionierung",
|
"defaultPseudoVersioningMethod": "Standardmäßiges Verfahren zur Pseudo-Versionierung",
|
||||||
"partialAPKHash": "partieller APK-Hash",
|
"partialAPKHash": "Partieller APK-Hash",
|
||||||
"APKLinkHash": "APK-Link-Hash",
|
"APKLinkHash": "APK-Link-Hash",
|
||||||
"directAPKLink": "Direkter APK-Link",
|
"directAPKLink": "Direkter APK-Link",
|
||||||
"pseudoVersionInUse": "Es werden Pseudoversionen verwendet",
|
"pseudoVersionInUse": "Es werden Pseudoversionen verwendet",
|
||||||
"installed": "Installiert",
|
"installed": "Installiert",
|
||||||
"latest": "Neueste Version",
|
"latest": "Neueste Version",
|
||||||
"invertRegEx": "Regulären Ausdruck invertieren",
|
"invertRegEx": "Regulären Ausdruck invertieren",
|
||||||
"note": "Hinweis",
|
"note": "Hinweis",
|
||||||
"selfHostedNote": "Das „{}“-Dropdown-Menü kann verwendet werden, um selbst gehostete/angepasste Instanzen einer beliebigen Quelle zu erreichen.",
|
"selfHostedNote": "Das „{}“-Drop-down-Menü kann verwendet werden, um selbst gehostete/angepasste Instanzen einer beliebigen Quelle zu erreichen.",
|
||||||
"badDownload": "Die APK konnte nicht geparst werden (inkompatibler oder teilweiser Download)",
|
"badDownload": "Die APK konnte nicht geparst werden (inkompatibler oder teilweiser Download)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)",
|
"beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)",
|
||||||
"appVerifierInstructionToast": "Geben Sie die Daten an AppVerifier weiter und kehren Sie dann hierher zurück, wenn Sie fertig sind.",
|
"appVerifierInstructionToast": "Geben Sie die Daten an AppVerifier weiter und kehren Sie dann hierher zurück, wenn Sie fertig sind.",
|
||||||
"wiki": "Hilfe/Wiki",
|
"wiki": "Hilfe/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (Verwendung auf eigene Gefahr)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "App entfernen?",
|
"one": "App entfernen?",
|
||||||
"other": "Apps entfernen?"
|
"other": "Apps entfernen?"
|
||||||
},
|
},
|
||||||
"tooManyRequestsTryAgainInMinutes": {
|
"tooManyRequestsTryAgainInMinutes": {
|
||||||
"one": "Zu viele Anfragen (Rate begrenzt) – versuche es in {} Minute erneut",
|
"one": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minute erneut",
|
||||||
"other": "Zu viele Anfragen (Rate begrenzt) – versuche es in {} Minuten erneut"
|
"other": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie 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",
|
||||||
@ -329,12 +335,12 @@
|
|||||||
"other": "Die Hintergrundaktualisierungsprüfung fand {} Aktualisierungen – benachrichtigt den Benutzer, falls erforderlich"
|
"other": "Die Hintergrundaktualisierungsprüfung fand {} Aktualisierungen – benachrichtigt den Benutzer, falls erforderlich"
|
||||||
},
|
},
|
||||||
"apps": {
|
"apps": {
|
||||||
"eine": "{} App",
|
"one": "{} App",
|
||||||
"andere": "{} Apps"
|
"other": "{} Apps"
|
||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
"eine": "{} URL",
|
"one": "{} URL",
|
||||||
"andere": "{} URLs"
|
"other": "{} URLs"
|
||||||
},
|
},
|
||||||
"minute": {
|
"minute": {
|
||||||
"one": "{} Minute",
|
"one": "{} Minute",
|
||||||
@ -357,16 +363,16 @@
|
|||||||
"other": "{} und {} weitere Apps haben Aktualisierungen."
|
"other": "{} und {} weitere Apps haben Aktualisierungen."
|
||||||
},
|
},
|
||||||
"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": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "Aktualisierung fehlgeschlagen {} und 1 weitere Anwendung.",
|
"one": "Die Aktualisierung von {} und 1 weiteren App ist fehlgeschlagen.",
|
||||||
"other": "Die Aktualisierung von {} und {} weiteren Anwendungen ist fehlgeschlagen."
|
"other": "Die Aktualisierung von {} und {} weiteren Apps ist fehlgeschlagen."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} und 1 weitere Anwendung wurden möglicherweise aktualisiert.",
|
"one": "{} und 1 weitere App wurden möglicherweise aktualisiert.",
|
||||||
"other": "{} und {} weitere Anwendungen wurden möglicherweise aktualisiert."
|
"other": "{} und {} weitere Apps wurden möglicherweise aktualisiert."
|
||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{} APK",
|
"one": "{} APK",
|
||||||
|
381
assets/translations/en-EO.json
Normal file
381
assets/translations/en-EO.json
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
{
|
||||||
|
"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",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
@ -179,8 +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",
|
||||||
"steamMobile": "Steam Mobile",
|
|
||||||
"steamChat": "Steam Chat",
|
|
||||||
"install": "Install",
|
"install": "Install",
|
||||||
"markInstalled": "Mark Installed",
|
"markInstalled": "Mark Installed",
|
||||||
"update": "Update",
|
"update": "Update",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"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 string",
|
"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",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "Intermediate link",
|
"intermediateLink": "Intermediate link",
|
||||||
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
||||||
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
||||||
|
"bgUpdatesWhileChargingOnly": "Disable background updates when not charging",
|
||||||
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
||||||
"versionExtractionRegEx": "Version String Extraction RegEx",
|
"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",
|
"matchGroupToUse": "Match Group to Use for Version String Extraction RegEx",
|
||||||
"highlightTouchTargets": "Highlight less obvious touch targets",
|
"highlightTouchTargets": "Highlight less obvious touch targets",
|
||||||
"pickExportDir": "Pick Export Directory",
|
"pickExportDir": "Pick Export Directory",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
|
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
|
||||||
"wiki": "Help/Wiki",
|
"wiki": "Help/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remove App?",
|
"one": "Remove App?",
|
||||||
"other": "Remove Apps?"
|
"other": "Remove Apps?"
|
||||||
@ -372,4 +378,4 @@
|
|||||||
"one": "{} APK",
|
"one": "{} APK",
|
||||||
"other": "{} APKs"
|
"other": "{} APKs"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "No se han encontrado aplicaciones con ese 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": "Repositorio de terceros F-Droid",
|
"fdroidThirdPartyRepo": "Repositorio de terceros F-Droid",
|
||||||
"steamMobile": "Steam para móviles",
|
|
||||||
"steamChat": "Chat de Steam",
|
|
||||||
"install": "Instalar",
|
"install": "Instalar",
|
||||||
"markInstalled": "Marcar como instalada",
|
"markInstalled": "Marcar como instalada",
|
||||||
"update": "Actualizar",
|
"update": "Actualizar",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"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": "Por fecha de publicació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",
|
||||||
@ -257,9 +256,12 @@
|
|||||||
"intermediateLink": "Enlace intermedio",
|
"intermediateLink": "Enlace intermedio",
|
||||||
"exemptFromBackgroundUpdates": "Exenta de actualizciones en segundo plano (si están habilitadas)",
|
"exemptFromBackgroundUpdates": "Exenta de actualizciones en segundo plano (si están habilitadas)",
|
||||||
"bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin WiFi",
|
"bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin WiFi",
|
||||||
|
"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",
|
"autoSelectHighestVersionCode": "Auto selección del paquete APK con versión más reciente",
|
||||||
"versionExtractionRegEx": "Versión de extracción regex",
|
"versionExtractionRegEx": "Versión de extracción RegEx",
|
||||||
"matchGroupToUse": "Grupo a usar para 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",
|
"highlightTouchTargets": "Resaltar objetivos menos obvios",
|
||||||
"pickExportDir": "Directorio para exportar",
|
"pickExportDir": "Directorio para exportar",
|
||||||
"autoExportOnChanges": "Auto exportar cuando haya cambios",
|
"autoExportOnChanges": "Auto exportar cuando haya cambios",
|
||||||
@ -273,7 +275,7 @@
|
|||||||
"debugMenu": "Menu Depurar",
|
"debugMenu": "Menu Depurar",
|
||||||
"bgTaskStarted": "Iniciada tarea en segundo plano; revise los registros.",
|
"bgTaskStarted": "Iniciada tarea en segundo plano; revise los registros.",
|
||||||
"runBgCheckNow": "Ejecutar verficiación de actualizaciones en segundo plano",
|
"runBgCheckNow": "Ejecutar verficiación de actualizaciones en segundo plano",
|
||||||
"versionExtractWholePage": "Aplicar la versión de extracción regex a la página entera",
|
"versionExtractWholePage": "Aplicar la versión de extracción RegEx a la página entera",
|
||||||
"installing": "Instalando",
|
"installing": "Instalando",
|
||||||
"skipUpdateNotifications": "No notificar sobre actualizaciones",
|
"skipUpdateNotifications": "No notificar sobre actualizaciones",
|
||||||
"updatesAvailableNotifChannel": "Actualizaciones disponibles",
|
"updatesAvailableNotifChannel": "Actualizaciones disponibles",
|
||||||
@ -308,10 +310,14 @@
|
|||||||
"note": "Nota",
|
"note": "Nota",
|
||||||
"selfHostedNote": "El desplegable «{}» puede usarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.",
|
"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)",
|
"badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Compartir aplicaciones nuevas con AppVerifier (si está disponible)",
|
"beforeNewInstallsShareToAppVerifier": "Compartir aplicaciones nuevas con AppVerifier (si está instalado)",
|
||||||
"appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.",
|
"appVerifierInstructionToast": "Compartir con AppVerifier y vuelver aquí cuando esté listo.",
|
||||||
"wiki": "Ayuda/Wiki",
|
"wiki": "Ayuda/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (uso bajo su propia responsabilidad)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "¿Eliminar aplicación?",
|
"one": "¿Eliminar aplicación?",
|
||||||
"other": "¿Eliminar aplicaciones?"
|
"other": "¿Eliminar aplicaciones?"
|
||||||
@ -333,8 +339,8 @@
|
|||||||
"other": "{} Aplicaciones"
|
"other": "{} Aplicaciones"
|
||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
"uno": "{} URL",
|
"one": "{} URL",
|
||||||
"otro": "{} URL"
|
"other": "{} URL"
|
||||||
},
|
},
|
||||||
"minute": {
|
"minute": {
|
||||||
"one": "{} minuto",
|
"one": "{} minuto",
|
||||||
|
@ -22,9 +22,9 @@
|
|||||||
"requiredInBrackets": "(ضروری)",
|
"requiredInBrackets": "(ضروری)",
|
||||||
"dropdownNoOptsError": "خطا: کشویی باید حداقل یک گزینه داشته باشد",
|
"dropdownNoOptsError": "خطا: کشویی باید حداقل یک گزینه داشته باشد",
|
||||||
"colour": "رنگ",
|
"colour": "رنگ",
|
||||||
"standard": "Standard",
|
"standard": "استاندارد",
|
||||||
"custom": "Custom",
|
"custom": "سفارشی",
|
||||||
"useMaterialYou": "Use Material You",
|
"useMaterialYou": "از Material You استفاده کنید",
|
||||||
"githubStarredRepos": "مخازن ستاره دار گیتهاب",
|
"githubStarredRepos": "مخازن ستاره دار گیتهاب",
|
||||||
"uname": "نام کاربری",
|
"uname": "نام کاربری",
|
||||||
"wrongArgNum": "تعداد آرگومان های ارائه شده اشتباه است",
|
"wrongArgNum": "تعداد آرگومان های ارائه شده اشتباه است",
|
||||||
@ -88,22 +88,22 @@
|
|||||||
"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": "آدرس های اینترنتی زیر دارای خطا بودند:",
|
||||||
"selectURL": "آدرس اینترنتی انتخاب شده",
|
"selectURL": "آدرس اینترنتی انتخاب شده",
|
||||||
@ -135,7 +135,7 @@
|
|||||||
"close": "بستن",
|
"close": "بستن",
|
||||||
"share": "اشتراک گذاری",
|
"share": "اشتراک گذاری",
|
||||||
"appNotFound": "برنامه پیدا نشد",
|
"appNotFound": "برنامه پیدا نشد",
|
||||||
"obtainiumExportHyphenatedLowercase": "برون ریزی-obtainium",
|
"obtainiumExportHyphenatedLowercase": "صادر کردن-obtainium",
|
||||||
"pickAnAPK": "یک APK انتخاب کنید",
|
"pickAnAPK": "یک APK انتخاب کنید",
|
||||||
"appHasMoreThanOnePackage": "{} بیش از یک بسته دارد:",
|
"appHasMoreThanOnePackage": "{} بیش از یک بسته دارد:",
|
||||||
"deviceSupportsXArch": "دستگاه شما از معماری پردازنده {} پشتیبانی میکند",
|
"deviceSupportsXArch": "دستگاه شما از معماری پردازنده {} پشتیبانی میکند",
|
||||||
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "هیچ برنامه ای با آن شناسه یا نام یافت نشد",
|
"appWithIdOrNameNotFound": "هیچ برنامه ای با آن شناسه یا نام یافت نشد",
|
||||||
"reposHaveMultipleApps": "مخازن ممکن است شامل چندین برنامه باشد",
|
"reposHaveMultipleApps": "مخازن ممکن است شامل چندین برنامه باشد",
|
||||||
"fdroidThirdPartyRepo": "مخازن شخص ثالث F-Droid",
|
"fdroidThirdPartyRepo": "مخازن شخص ثالث F-Droid",
|
||||||
"steamMobile": "استیم موبایل",
|
|
||||||
"steamChat": "چت استیم",
|
|
||||||
"install": "نصب",
|
"install": "نصب",
|
||||||
"markInstalled": "علامت گذاری به عنوان نصب شده",
|
"markInstalled": "علامت گذاری به عنوان نصب شده",
|
||||||
"update": "به روز رسانی",
|
"update": "به روز رسانی",
|
||||||
@ -213,10 +211,11 @@
|
|||||||
"uninstallFromDevice": "حذف نصب از دستگاه",
|
"uninstallFromDevice": "حذف نصب از دستگاه",
|
||||||
"onlyWorksWithNonVersionDetectApps": "فقط برای برنامههایی کار میکند که تشخیص نسخه غیرفعال است.",
|
"onlyWorksWithNonVersionDetectApps": "فقط برای برنامههایی کار میکند که تشخیص نسخه غیرفعال است.",
|
||||||
"releaseDateAsVersion": "از تاریخ انتشار به عنوان نسخه استفاده کنید",
|
"releaseDateAsVersion": "از تاریخ انتشار به عنوان نسخه استفاده کنید",
|
||||||
|
"releaseTitleAsVersion": "Use release title as version string",
|
||||||
"releaseDateAsVersionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند، اما تاریخ انتشار در دسترس است.",
|
"releaseDateAsVersionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند، اما تاریخ انتشار در دسترس است.",
|
||||||
"changes": "تغییرات",
|
"changes": "تغییرات",
|
||||||
"releaseDate": "تاریخ انتشار",
|
"releaseDate": "تاریخ انتشار",
|
||||||
"importFromURLsInFile": "درون ریزی از آدرس های اینترنتی موجود در فایل (مانند OPML)",
|
"importFromURLsInFile": "وارد کردن از آدرس های اینترنتی موجود در فایل (مانند OPML)",
|
||||||
"versionDetectionExplanation": "تطبیق رشته نسخه با نسخه شناسایی شده از سیستم عامل",
|
"versionDetectionExplanation": "تطبیق رشته نسخه با نسخه شناسایی شده از سیستم عامل",
|
||||||
"versionDetection": "تشخیص نسخه",
|
"versionDetection": "تشخیص نسخه",
|
||||||
"standardVersionDetection": "تشخیص نسخه استاندارد",
|
"standardVersionDetection": "تشخیص نسخه استاندارد",
|
||||||
@ -257,12 +256,15 @@
|
|||||||
"intermediateLink": "پیوند میانی",
|
"intermediateLink": "پیوند میانی",
|
||||||
"exemptFromBackgroundUpdates": "معاف از بهروزرسانیهای پسزمینه (در صورت فعال بودن)",
|
"exemptFromBackgroundUpdates": "معاف از بهروزرسانیهای پسزمینه (در صورت فعال بودن)",
|
||||||
"bgUpdatesOnWiFiOnly": "بهروزرسانیهای پسزمینه را در صورت عدم اتصال به WiFi غیرفعال کنید",
|
"bgUpdatesOnWiFiOnly": "بهروزرسانیهای پسزمینه را در صورت عدم اتصال به WiFi غیرفعال کنید",
|
||||||
|
"bgUpdatesWhileChargingOnly": "Disable background updates when not charging",
|
||||||
"autoSelectHighestVersionCode": "انتخاب خودکار بالاترین نسخه کد APK",
|
"autoSelectHighestVersionCode": "انتخاب خودکار بالاترین نسخه کد APK",
|
||||||
"versionExtractionRegEx": "نسخه استخراج RegEx",
|
"versionExtractionRegEx": "نسخه استخراج RegEx",
|
||||||
|
"trimVersionString": "برش رشته نسخه با RegEx",
|
||||||
|
"matchGroupToUseForX": "مطابقت دادن گروه برای استفاده برای \"{}\"",
|
||||||
"matchGroupToUse": "گروه مورد استفاده را مطابقت دهید",
|
"matchGroupToUse": "گروه مورد استفاده را مطابقت دهید",
|
||||||
"highlightTouchTargets": "اهداف لمسی کمتر واضح را برجسته کنید",
|
"highlightTouchTargets": "اهداف لمسی کمتر واضح را برجسته کنید",
|
||||||
"pickExportDir": "فهرست برون ریزی را انتخاب کنید",
|
"pickExportDir": "فهرست صادر کردن را انتخاب کنید",
|
||||||
"autoExportOnChanges": "برون ریزی خودکار تغییرات",
|
"autoExportOnChanges": "صادر کردن خودکار تغییرات",
|
||||||
"includeSettings": "شامل تنظیمات",
|
"includeSettings": "شامل تنظیمات",
|
||||||
"filterVersionsByRegEx": "فیلتر کردن نسخه ها با RegEx",
|
"filterVersionsByRegEx": "فیلتر کردن نسخه ها با RegEx",
|
||||||
"trySelectingSuggestedVersionCode": "نسخه پیشنهادی APK نسخه کد را انتخاب کنید",
|
"trySelectingSuggestedVersionCode": "نسخه پیشنهادی APK نسخه کد را انتخاب کنید",
|
||||||
@ -288,11 +290,11 @@
|
|||||||
"supportFixedAPKURL": "پشتیبانی از URL های APK ثابت",
|
"supportFixedAPKURL": "پشتیبانی از URL های APK ثابت",
|
||||||
"selectX": "انتخاب کنید {}",
|
"selectX": "انتخاب کنید {}",
|
||||||
"parallelDownloads": "اجازه دانلود موازی",
|
"parallelDownloads": "اجازه دانلود موازی",
|
||||||
"useShizuku": "Use Shizuku or Sui to install",
|
"useShizuku": "برای نصب از Shizuku یا Sui استفاده کنید",
|
||||||
"shizukuBinderNotFound": "Shizuku در حال اجرا نیست",
|
"shizukuBinderNotFound": "Shizuku در حال اجرا نیست",
|
||||||
"shizukuOld": "Old Shizuku version (<11) - update it",
|
"shizukuOld": "نسخه قدیمی Shizuku (<11) - آن را به روز کنید",
|
||||||
"shizukuOldAndroidWithADB": "Shizuku running on Android < 8.1 with ADB - update Android or use Sui instead",
|
"shizukuOldAndroidWithADB": "Shizuku در Android < 8.1 با ADB اجرا می شود - اندروید را به روز کنید یا به جای آن از Sui استفاده کنید",
|
||||||
"shizukuPretendToBeGooglePlay": "Set Google Play as the installation source (if Shizuku is used)",
|
"shizukuPretendToBeGooglePlay": "Google Play را به عنوان منبع نصب تنظیم کنید (در صورت استفاده از Shizuku)",
|
||||||
"useSystemFont": "استفاده از فونت سیستم",
|
"useSystemFont": "استفاده از فونت سیستم",
|
||||||
"useVersionCodeAsOSVersion": "استفاده کد نسخه برنامه به جای نسخه شناسایی شده توسط سیستم عامل استفاده کنید",
|
"useVersionCodeAsOSVersion": "استفاده کد نسخه برنامه به جای نسخه شناسایی شده توسط سیستم عامل استفاده کنید",
|
||||||
"requestHeader": "درخواست سطر بالایی",
|
"requestHeader": "درخواست سطر بالایی",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "در AppVerifier به اشتراک بگذارید، سپس پس از آماده شدن به اینجا برگردید.",
|
"appVerifierInstructionToast": "در AppVerifier به اشتراک بگذارید، سپس پس از آماده شدن به اینجا برگردید.",
|
||||||
"wiki": "راهنما/ویکی",
|
"wiki": "راهنما/ویکی",
|
||||||
"crowdsourcedConfigsLabel": "تنظیمات برنامه Crowdsourced (با مسئولیت خود استفاده کنید)",
|
"crowdsourcedConfigsLabel": "تنظیمات برنامه Crowdsourced (با مسئولیت خود استفاده کنید)",
|
||||||
|
"crowdsourcedConfigsShort": "Crowdsourced App Configs",
|
||||||
|
"allowInsecure": "درخواست های HTTP ناامن را مجاز کنید",
|
||||||
|
"stayOneVersionBehind": "Stay one version behind latest",
|
||||||
|
"refreshBeforeDownload": "Refresh app details before download",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "برنامه حذف شود؟",
|
"one": "برنامه حذف شود؟",
|
||||||
"other": "برنامه ها حذف شوند؟"
|
"other": "برنامه ها حذف شوند؟"
|
||||||
|
@ -1,34 +1,34 @@
|
|||||||
{
|
{
|
||||||
"invalidURLForSource": "URL d'application {} invalide",
|
"invalidURLForSource": "URL de l'application {} invalide",
|
||||||
"noReleaseFound": "Impossible de trouver une version adaptée",
|
"noReleaseFound": "Impossible de trouver une publication correspondante",
|
||||||
"noVersionFound": "Impossible de déterminer la variante 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": "D'accord",
|
"ok": "Ok",
|
||||||
"and": "et",
|
"and": "et",
|
||||||
"githubPATLabel": "Jeton d'Accès Personnel GitHub (augmente la limite de débit)",
|
"githubPATLabel": "Jeton d'accès personnel GitHub (augmente la limite de débit)",
|
||||||
"includePrereleases": "Inclure les avant-premières",
|
"includePrereleases": "Inclure les versions préliminaires",
|
||||||
"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",
|
||||||
"standard": "Standard",
|
"standard": "Standard",
|
||||||
"custom": "Sur mesure",
|
"custom": "Personnalisé",
|
||||||
"useMaterialYou": "Utiliser Material You",
|
"useMaterialYou": "Utiliser Material You",
|
||||||
"githubStarredRepos": "Dépôts étoilés GitHub",
|
"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'.",
|
||||||
@ -36,51 +36,51 @@
|
|||||||
"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 {}",
|
||||||
"supportedSources": "Sources prises en charge ",
|
"supportedSources": "Sources prises en charge",
|
||||||
"trackOnlyInBrackets": "(Suivi uniquement)",
|
"trackOnlyInBrackets": "(Suivi uniquement)",
|
||||||
"searchableInBrackets": "(Interrogeable)",
|
"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",
|
||||||
"notInstalled": "Non installé",
|
"notInstalled": "Non installé",
|
||||||
"pseudoVersion": "pseudo-version",
|
"pseudoVersion": "Version fictive",
|
||||||
"selectAll": "Tout sélectionner",
|
"selectAll": "Tout sélectionner",
|
||||||
"deselectX": "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": "Les applications sélectionnées ont été supprimées",
|
||||||
"updateX": "Mise à jour {}",
|
"updateX": "Mettre à jour {}",
|
||||||
"installX": "Installer {}",
|
"installX": "Installer {}",
|
||||||
"markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\n comme 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 étant à 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 étant à jour",
|
"markSelectedAppsUpdated": "Marquer les application sélectionnées comme étant à jour",
|
||||||
"pinToTop": "Épingler en haut",
|
"pinToTop": "Épingler en haut",
|
||||||
"unpinFromTop": "Désépingler du haut",
|
"unpinFromTop": "Désépingler du haut",
|
||||||
"resetInstallStatusForSelectedAppsQuestion": "Réinitialiser le statut d'installation des applications sélectionnées ?",
|
"resetInstallStatusForSelectedAppsQuestion": "Réinitialiser l'état d'installation des applications sélectionnées ?",
|
||||||
"installStatusOfXWillBeResetExplanation": "Le statut 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.",
|
||||||
"customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtainium est installé",
|
"customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtainium est installé",
|
||||||
"shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML",
|
"shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML",
|
||||||
"shareSelectedAppURLs": "Partager les URL d'applications sélectionnées",
|
"shareSelectedAppURLs": "Partager les URL des applications sélectionnées",
|
||||||
"resetInstallStatus": "Réinitialiser le statut d'installation",
|
"resetInstallStatus": "L'état d'installation des applications a été réinitialisé",
|
||||||
"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",
|
||||||
"filterApps": "Filtrer les applications",
|
"filterApps": "Filtrer les applications",
|
||||||
@ -88,45 +88,45 @@
|
|||||||
"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": "Exporter d'Obtainium",
|
"obtainiumExport": "Exporter Obtainium",
|
||||||
"invalidInput": "Entrée invalide",
|
"invalidInput": "Entrée invalide",
|
||||||
"importedX": "Importé {}",
|
"importedX": "Importé {}",
|
||||||
"obtainiumImport": "Importer d'Obtainium",
|
"obtainiumImport": "Importer sur Obtainium",
|
||||||
"importFromURLList": "Importer à partir de la liste d'URL",
|
"importFromURLList": "Importer depuis une liste d'URL",
|
||||||
"searchQuery": "Requête",
|
"searchQuery": "Requête de recherche",
|
||||||
"appURLList": "Liste d'URL d'application",
|
"appURLList": "Liste d'URL de l'application",
|
||||||
"line": "File d'attente",
|
"line": "Ligne",
|
||||||
"searchX": "Rechercher {}",
|
"searchX": "Rechercher {}",
|
||||||
"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 :",
|
||||||
"selectURL": "Sélectionnez l'URL",
|
"selectURL": "Sélectionner l'URL",
|
||||||
"selectURLs": "Sélectionnez les URL",
|
"selectURLs": "Sélectionner les URL",
|
||||||
"pick": "Prendre",
|
"pick": "Choisir",
|
||||||
"theme": "Thème",
|
"theme": "Thème",
|
||||||
"dark": "Sombre",
|
"dark": "Sombre",
|
||||||
"light": "Clair",
|
"light": "Clair",
|
||||||
"followSystem": "Suivre le système",
|
"followSystem": "Correspondre au système",
|
||||||
"followSystemThemeExplanation": "Il n'est possible de suivre le thème du système qu'en utilisant des applications tierces.",
|
"followSystemThemeExplanation": "Correspondre au thème du système est possible en utilisant des applications tierces.",
|
||||||
"useBlackTheme": "Utiliser le thème noir pur",
|
"useBlackTheme": "Utiliser un thème Noir",
|
||||||
"appSortBy": "Applications triées par",
|
"appSortBy": "Trier les applications 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": "Descendant",
|
"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 en tête de la vue 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",
|
||||||
@ -135,32 +135,32 @@
|
|||||||
"close": "Fermer",
|
"close": "Fermer",
|
||||||
"share": "Partager",
|
"share": "Partager",
|
||||||
"appNotFound": "Application introuvable",
|
"appNotFound": "Application introuvable",
|
||||||
"obtainiumExportHyphenatedLowercase": "Exportation-Obtainium",
|
"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 CPU {}.",
|
"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 la version du paquet 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",
|
||||||
"appsNotUpdated": "Échec de la mise à jour des applications",
|
"appsNotUpdated": "Échec de la mise à jour des applications",
|
||||||
"appsUpdatedNotifDescription": "Avertit l'utilisateur que les mises à jour d'une ou plusieurs applications ont été appliquées en arrière-plan",
|
"appsUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont été installées en arrière-plan.",
|
||||||
"xWasUpdatedToY": "{} a été mis à jour pour {}.",
|
"xWasUpdatedToY": "{} a été mis à jour en {}.",
|
||||||
"xWasNotUpdatedToY": "Échec de la mise à jour de {} vers {}.",
|
"xWasNotUpdatedToY": "Échec de la mise à jour de {} vers {}.",
|
||||||
"errorCheckingUpdates": "Erreur lors de la vérification des mises à jour",
|
"errorCheckingUpdates": "Erreur lors de la recherche de mises à jour",
|
||||||
"errorCheckingUpdatesNotifDescription": "Une notification qui s'affiche lorsque la vérification de la mise à jour en arrière-plan échoue",
|
"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 {}",
|
||||||
@ -168,165 +168,171 @@
|
|||||||
"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 Officiel",
|
"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",
|
||||||
"steamMobile": "Application mobile Steam",
|
|
||||||
"steamChat": "Steam Chat",
|
|
||||||
"install": "Installer",
|
"install": "Installer",
|
||||||
"markInstalled": "Marquer comme installée",
|
"markInstalled": "Marquer comme étant installé",
|
||||||
"update": "Mettre à jour",
|
"update": "Mettre à jour",
|
||||||
"markUpdated": "Marquer comme étant à jour",
|
"markUpdated": "Marquer comme étant à jour",
|
||||||
"additionalOptions": "Options additionnelles",
|
"additionalOptions": "Options supplémentaires",
|
||||||
"disableVersionDetection": "Désactiver la détection de version",
|
"disableVersionDetection": "Désactiver la détection de la version",
|
||||||
"noVersionDetectionExplanation": "Cette option être utilisée uniquement 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 {}",
|
||||||
"downloadX": "Télécharger {}",
|
"downloadX": "Télécharger {}",
|
||||||
"downloadedX": "Téléchargé {}",
|
"downloadedX": "Téléchargé {}",
|
||||||
"releaseAsset": "Actif libéré",
|
"releaseAsset": "Version active",
|
||||||
"downloadNotifDescription": "Avertit l'utilisateur de la progression du téléchargement d'une application",
|
"downloadNotifDescription": "Notifie l'utilisateur sur l'avancement du téléchargement d'une application",
|
||||||
"noAPKFound": "Aucun APK trouvé",
|
"noAPKFound": "Aucun APK trouvé",
|
||||||
"noVersionDetection": "Aucune 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": "Aucune catégorie",
|
"noCategory": "Aucune catégorie",
|
||||||
"noCategories": "Aucune catégories",
|
"noCategories": "Aucune catégories",
|
||||||
"deleteCategoriesQuestion": "Supprimer les catégories ?",
|
"deleteCategoriesQuestion": "Supprimer les catégories?",
|
||||||
"categoryDeleteWarning": "Toutes les applications dans les catégories supprimées ne seront plus 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": "Copié dans le presse-papier",
|
"copiedToClipboard": "Copié dans le presse-papier",
|
||||||
"storagePermissionDenied": "Autorisation de stockage refusée",
|
"storagePermissionDenied": "Permission de stockage refusée",
|
||||||
"selectedCategorizeWarning": "Cela remplacera toutes les catégorie définies 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 dont 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)",
|
||||||
"versionDetectionExplanation": "Réconcilier la chaîne de version avec la version détectée à partir du système d'exploitation",
|
"versionDetectionExplanation": "Reporter la chaîne de version selon la version détectée par le système d'exploitation",
|
||||||
"versionDetection": "Détection des versions",
|
"versionDetection": "Détection de la version",
|
||||||
"standardVersionDetection": "Détection de version standard",
|
"standardVersionDetection": "Détection de la version standard",
|
||||||
"groupByCategory": "Regrouper par catégorie",
|
"groupByCategory": "Grouper par catégorie",
|
||||||
"autoApkFilterByArch": "Si possible, essayer de filtrer les APK par architecture CPU",
|
"autoApkFilterByArch": "Essayer de filtrer les APKs par architecture CPU si possible",
|
||||||
"overrideSource": "Remplacer la source",
|
"overrideSource": "Remplacer la source",
|
||||||
"dontShowAgain": "Ne plus montrer",
|
"dontShowAgain": "Ne plus afficher",
|
||||||
"dontShowTrackOnlyWarnings": "Ne pas afficher l'avertissement 'Suivi uniquement'",
|
"dontShowTrackOnlyWarnings": "Ne plus afficher les erreurs 'Suivi uniquement'",
|
||||||
"dontShowAPKOriginWarnings": "Ne pas afficher les avertissements sur l'origine de l'APK",
|
"dontShowAPKOriginWarnings": "Ne plus afficher les erreurs sur l'origine de l'APK",
|
||||||
"moveNonInstalledAppsToBottom": "Déplacer les applications non installées vers le bas de la vue Applications",
|
"moveNonInstalledAppsToBottom": "Déplacer les applications non installées vers le bas de la vue Applications",
|
||||||
"gitlabPATLabel": "Jeton d'accès personnel GitLab",
|
"gitlabPATLabel": "Jeton d'accès personnel GitLab",
|
||||||
"about": "À propos de",
|
"about": "À propos",
|
||||||
"requiresCredentialsInSettings": "{} : Cela nécessite des identifiants supplémentaires (dans Paramètres)",
|
"requiresCredentialsInSettings": "{} a besoin d'un complément d'information (dans les Paramètres)",
|
||||||
"checkOnStart": "Vérifier les mises à jour au démarrage",
|
"checkOnStart": "Rechercher les mises à jour au démarrage",
|
||||||
"tryInferAppIdFromCode": "Essayer de déduire l'ID de l'application à partir du code source",
|
"tryInferAppIdFromCode": "Essayer de déduire l'identifiant de l'application à partir du code source",
|
||||||
"removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées depuis l'extérieur",
|
"removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées en externe",
|
||||||
"pickHighestVersionCode": "Sélectionner automatiquement le code de version de l'APK la plus élevée",
|
"pickHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK",
|
||||||
"checkUpdateOnDetailPage": "Vérifier les mises à jour lors de l'ouverture de la page détaillée d'une application",
|
"checkUpdateOnDetailPage": "Rechercher les mises à jour lors de l'ouverture de la page détaillée d'une application",
|
||||||
"disablePageTransitions": "Désactiver les animations de transition de page",
|
"disablePageTransitions": "Désactiver les animations de transition de page",
|
||||||
"reversePageTransitions": "Inverser les animations de transition de page",
|
"reversePageTransitions": "Inverser les animations de transition de page",
|
||||||
"minStarCount": "Nombre minimum d'étoiles",
|
"minStarCount": "Nombre minimum d'étoiles",
|
||||||
"addInfoBelow": "Ajoutez ces informations ci-dessous.",
|
"addInfoBelow": "Ajoutez cette information ci-dessous.",
|
||||||
"addInfoInSettings": "Ajoutez ces informations dans les paramètres.",
|
"addInfoInSettings": "Ajoutez cette information dans les paramètres.",
|
||||||
"githubSourceNote": "La limite de débit GitHub peut être évitée à l'aide d'une clé API.",
|
"githubSourceNote": "La limitation du débit de GitHub peut être évitée à l'aide d'une clé d'API.",
|
||||||
"sortByLastLinkSegment": "Trier uniquement sur le dernier segment du lien",
|
"sortByLastLinkSegment": "Trier par le dernier segment du lien",
|
||||||
"filterReleaseNotesByRegEx": "Filtrer les notes de version par expression régulière",
|
"filterReleaseNotesByRegEx": "Filtrer les notes de version par expression régulière",
|
||||||
"customLinkFilterRegex": "Filtre du lien APK personnalisé par expression régulière (par défaut '.apk$')",
|
"customLinkFilterRegex": "Filtre de lien APK personnalisé par expression régulière (par défaut '.apk$')",
|
||||||
"appsPossiblyUpdated": "Tentative de mise à jour de l'application",
|
"appsPossiblyUpdated": "Tentative de mise à jour des applications",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Avertit l'utilisateur que des mises à jour d'une ou plusieurs applications ont été potentiellement appliquées en arrière-plan",
|
"appsPossiblyUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont potentiellement été appliquées en arrière-plan",
|
||||||
"xWasPossiblyUpdatedToY": "{} pourrait avoir été mis à jour vers {}.",
|
"xWasPossiblyUpdatedToY": "{} peut être mis à jour en {}.",
|
||||||
"enableBackgroundUpdates": "Activer les mises à jour en arrière-plan",
|
"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.",
|
"backgroundUpdateReqsExplanation": "Les mises à jour en arrière-plan peuvent ne pas être possibles pour toutes les applications.",
|
||||||
"backgroundUpdateLimitsExplanation": "Le succès d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.",
|
"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'",
|
"verifyLatestTag": "Vérifier la balise 'latest'",
|
||||||
"intermediateLinkRegex": " Filtrer un lien \" intermédiaire \" à visiter ",
|
"intermediateLinkRegex": "Filtrer un lien 'intermédiaire' à visiter",
|
||||||
"filterByLinkText": "Filtrer les liens par le texte du lien",
|
"filterByLinkText": "Filtrer les liens par texte du lien",
|
||||||
"intermediateLinkNotFound": "Lien intermédiaire introuvable",
|
"intermediateLinkNotFound": "Lien intermédiaire introuvable",
|
||||||
"intermediateLink": "Lien intermédiaire",
|
"intermediateLink": "Lien intermédiaire",
|
||||||
"exemptFromBackgroundUpdates": "Exempté des mises à jour en arrière-plan (si activé)",
|
"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 connecté au WiFi",
|
"bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas en WiFi",
|
||||||
"autoSelectHighestVersionCode": "Sélection automatique du code de version le plus élevé de l'APK",
|
"bgUpdatesWhileChargingOnly": "Désactiver les mises à jour en arrière-plan lorsque le véhicule n'est pas en charge",
|
||||||
"versionExtractionRegEx": "Expression régulière d'extraction de version",
|
"autoSelectHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK",
|
||||||
"matchGroupToUse": "Groupe de correspondance pour l'expression régulière d'extraction de version",
|
"versionExtractionRegEx": "Extraire la version par Expression régulière",
|
||||||
"highlightTouchTargets": "Mettre en évidence les cibles tactiles moins évidentes",
|
"trimVersionString": "Découper la version par Expression régulière",
|
||||||
"pickExportDir": "Choisir le répertoire d'exportation",
|
"matchGroupToUseForX": "Groupe de correspondance à utiliser pour \"{}\"",
|
||||||
"autoExportOnChanges": "Exporter automatiquement après modification",
|
"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",
|
"includeSettings": "Inclure les paramètres",
|
||||||
"filterVersionsByRegEx": "Filtrer les versions par expression régulière",
|
"filterVersionsByRegEx": "Filtrer les versions par expression régulière",
|
||||||
"trySelectingSuggestedVersionCode": "Essayer de sélectionner le code de la version suggérée de l'APK",
|
"trySelectingSuggestedVersionCode": "Essayer de sélectionner la version suggérée du code APK",
|
||||||
"dontSortReleasesList": "Conserver l'ordre des versions de l'API",
|
"dontSortReleasesList": "Conserver l'ordre de la version de l'API",
|
||||||
"reverseSort": "Tri inversé",
|
"reverseSort": "Tri inversé",
|
||||||
"takeFirstLink": "Prendre le premier lien",
|
"takeFirstLink": "Utiliser le premier lien",
|
||||||
"skipSort": "Éviter le tri",
|
"skipSort": "Ignorer le tri",
|
||||||
"debugMenu": "Menu de débogage",
|
"debugMenu": "Menu de déboggage",
|
||||||
"bgTaskStarted": "Tâche en arrière-plan démarrée — vérifier les journaux.",
|
"bgTaskStarted": "Tâche en arrière-plan démarrée - vérifier les journaux.",
|
||||||
"runBgCheckNow": "Exécuter maintenant la vérification de la mise à jour en arrière-plan",
|
"runBgCheckNow": "Exécuter la recherche de mise à jour en arrière-plan maintenant",
|
||||||
"versionExtractWholePage": "Appliquer l'expression régulière d'extraction de version sur l'ensemble de la page",
|
"versionExtractWholePage": "Appliquer l'extraction de la version par expression régulière à l'ensemble de la page",
|
||||||
"installing": "Installation",
|
"installing": "Installation",
|
||||||
"skipUpdateNotifications": "Ignorer les notifications de mise à jour",
|
"skipUpdateNotifications": "Ignorer les notifications de mise à jour",
|
||||||
"updatesAvailableNotifChannel": "Mises à jour disponibles",
|
"updatesAvailableNotifChannel": "Mises à jour disponibles",
|
||||||
"appsUpdatedNotifChannel": "Applications mises à jour",
|
"appsUpdatedNotifChannel": "Applications mises à jour",
|
||||||
"appsPossiblyUpdatedNotifChannel": "Tentative de mise à jour de l'application",
|
"appsPossiblyUpdatedNotifChannel": "Essayer de mettre à jour les applications",
|
||||||
"errorCheckingUpdatesNotifChannel": "Erreur lors de la vérification des mises à jour",
|
"errorCheckingUpdatesNotifChannel": "Erreur lors de la recherche de mises à jour",
|
||||||
"appsRemovedNotifChannel": "Applications supprimées",
|
"appsRemovedNotifChannel": "Applications supprimées",
|
||||||
"downloadingXNotifChannel": "Téléchargement {}",
|
"downloadingXNotifChannel": "Téléchargement {}",
|
||||||
"completeAppInstallationNotifChannel": "Installation complète de l'application",
|
"completeAppInstallationNotifChannel": "Installation complète de l'application",
|
||||||
"checkingForUpdatesNotifChannel": "Vérification des mises à jour",
|
"checkingForUpdatesNotifChannel": "Recherche de mises à jour",
|
||||||
"onlyCheckInstalledOrTrackOnlyApps": "Vérifier uniquement les mises à jour des applications installées et 'Suivi uniquement'",
|
"onlyCheckInstalledOrTrackOnlyApps": "Rechercher uniquement les mises à jour des applications installées et des applications 'Suivi uniquement'",
|
||||||
"supportFixedAPKURL": "Prise en charge des URL APK fixes",
|
"supportFixedAPKURL": "Prise en charge des URL APK fixes",
|
||||||
"selectX": "Sélectionner {}",
|
"selectX": "Sélectionner {}",
|
||||||
"parallelDownloads": "Autoriser le téléchargement en parallèle",
|
"parallelDownloads": "Autoriser les téléchargements simultanés",
|
||||||
"useShizuku": "Utiliser Shizuku ou Sui pour l'installation",
|
"useShizuku": "Utiliser Shizuku ou Sui pour l'installation",
|
||||||
"shizukuBinderNotFound": "Service Shizuku compatible non trouvé",
|
"shizukuBinderNotFound": "Le service Shizuku est introuvable",
|
||||||
"shizukuOld": "Ancienne version de Shizuku (<11) — la mettre à jour",
|
"shizukuOld": "Ancienne version de Shizuku (<11) - veuillez le mettre à jour",
|
||||||
"shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB — mettez à jour Android ou utilisez Sui à la place",
|
"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é)",
|
"shizukuPretendToBeGooglePlay": "Définir Google Play comme source d'installation (si Shizuku est utilisé)",
|
||||||
"useSystemFont": "Utiliser la police du système",
|
"useSystemFont": "Utiliser la police du système",
|
||||||
"useVersionCodeAsOSVersion": "Utiliser le code de version de l'application comme version détectée par le système d'exploitation",
|
"useVersionCodeAsOSVersion": "Utiliser le code de version de l'application détectée par le système d'exploitation",
|
||||||
"requestHeader": "En-tête de demande",
|
"requestHeader": "Intitulé de la demande",
|
||||||
"useLatestAssetDateAsReleaseDate": "Utiliser le dernier élément téléversé comme date de sortie",
|
"useLatestAssetDateAsReleaseDate": "Utiliser le dernier élément mis en ligne comme date de sortie",
|
||||||
"defaultPseudoVersioningMethod": "Méthode de pseudo-version par défaut",
|
"defaultPseudoVersioningMethod": "Méthode de version fictive par défaut",
|
||||||
"partialAPKHash": "Hash APK partiel",
|
"partialAPKHash": "Hash partiel de l'APK",
|
||||||
"APKLinkHash": "Hash de lien APK",
|
"APKLinkHash": "Hash du lien APK",
|
||||||
"directAPKLink": "Lien APK direct",
|
"directAPKLink": "Lien direct de l'APK",
|
||||||
"pseudoVersionInUse": "Une pseudo-version est utilisée",
|
"pseudoVersionInUse": "Version fictive utilisé",
|
||||||
"installed": "Installée",
|
"installed": "Installée",
|
||||||
"latest": "Dernier",
|
"latest": "Dernière version",
|
||||||
"invertRegEx": "Inverser l'expression régulière",
|
"invertRegEx": "Inverser l'expression régulière",
|
||||||
"note": "Note",
|
"note": "Note",
|
||||||
"selfHostedNote": "La liste déroulante \"{}\" peut être utilisée pour accéder aux instances auto-hébergées/personnalisées de n'importe quelle source.",
|
"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)",
|
"badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)",
|
"beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)",
|
||||||
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque vous êtes prêt.",
|
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque tout est prêt.",
|
||||||
"wiki": "Aide/Wiki",
|
"wiki": "Aide/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Configurations d'applications participative (utilisation à vos risques et périls)",
|
"crowdsourcedConfigsLabel": "Configuration d'applis communautaire (à 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",
|
||||||
"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 {}, une nouvelle tentative de vérification sera planifié 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 {}, une nouvelle tentative de vérification sera planifié 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 a trouvée {} mise à jour — l'utilisateur sera notifié 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ée {} mises à jour — l'utilisateur sera notifié 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",
|
||||||
@ -337,7 +343,7 @@
|
|||||||
"other": "{} URL"
|
"other": "{} URL"
|
||||||
},
|
},
|
||||||
"minute": {
|
"minute": {
|
||||||
"one": "{} Minutes",
|
"one": "{} Minute",
|
||||||
"other": "{} Minutes"
|
"other": "{} Minutes"
|
||||||
},
|
},
|
||||||
"hour": {
|
"hour": {
|
||||||
@ -349,8 +355,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.",
|
||||||
@ -358,15 +364,15 @@
|
|||||||
},
|
},
|
||||||
"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": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "Échec de la mise à jour de {} et d'une autre application.",
|
"one": "Échec de la mise à jour de {} et 1 autre application.",
|
||||||
"other": "Échec de la mise à jour de {} et {} autres applications."
|
"other": "Échec de la mise à jour de {} et {} autres applications."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"une": "{} et 1 application supplémentaire pourraient avoir été mises à jour.",
|
"one": "{} et 1 autre application ont peut-être été mises à jour.",
|
||||||
"other": "{} et {} autres applications pourraient avoir été mises à jour."
|
"other": "{} et {} autres applications ont peut-être étés mis à jour."
|
||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{} APK",
|
"one": "{} APK",
|
||||||
|
@ -1,208 +1,206 @@
|
|||||||
{
|
{
|
||||||
"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ójá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": "Oké",
|
"ok": "OK",
|
||||||
"and": "és",
|
"and": "és",
|
||||||
"githubPATLabel": "GitHub Personal Access Token (megnöveli a díjkorlátot)",
|
"githubPATLabel": "GitHub személyes hozzáférési token (megnöveli a lekérdezés-korlátozást)",
|
||||||
"includePrereleases": "Tartalmazza az előzetes kiadásokat",
|
"includePrereleases": "Tartalmazza az előzetes kiadásokat",
|
||||||
"fallbackToOlderReleases": "Visszatérés a régebbi kiadásokhoz",
|
"fallbackToOlderReleases": "Visszatérés a régebbi kiadásokhoz",
|
||||||
"filterReleaseTitlesByRegEx": "A kiadás címeinek szűrése reguláris kifejezéssel",
|
"filterReleaseTitlesByRegEx": "A kiadás címeinek szűrése reguláris kifejezéssel",
|
||||||
"invalidRegEx": "Érvénytelen reguláris kifejezés",
|
"invalidRegEx": "Érvénytelen reguláris kifejezés",
|
||||||
"noDescription": "Nincs leírás",
|
"noDescription": "Nincs leírás",
|
||||||
"cancel": "Mégse",
|
"cancel": "Mégse",
|
||||||
"continue": "Tovább",
|
"continue": "Folytatás",
|
||||||
"requiredInBrackets": "(Kötelező)",
|
"requiredInBrackets": "(Szükséges)",
|
||||||
"dropdownNoOptsError": "HIBA: A LEDOBÁST LEGALÁBB EGY OPCIÓHOZ KELL RENDELNI",
|
"dropdownNoOptsError": "HIBA: A LEGÖRDÜLŐ LISTÁNAK LEGALÁBB EGY OPCIÓVAL KELL RENDELKEZNIE",
|
||||||
"colour": "Szín",
|
"colour": "Szín",
|
||||||
"standard": "Standard",
|
"standard": "Általános",
|
||||||
"custom": "Custom",
|
"custom": "Egyéni",
|
||||||
"useMaterialYou": "Használja az Ön által használt anyagot",
|
"useMaterialYou": "Material You használata",
|
||||||
"githubStarredRepos": "GitHub Csillagos Repo-k",
|
"githubStarredRepos": "Csillagozott GitHub tárolók",
|
||||||
"uname": "Felh.név",
|
"uname": "Felhasználónév",
|
||||||
"wrongArgNum": "Rossz számú argumentumot adott meg",
|
"wrongArgNum": "A megadott argumentumok száma nem megfelelő",
|
||||||
"xIsTrackOnly": "A(z) {} csak nyomonkövethető",
|
"xIsTrackOnly": "A(z) {} csak nyomonkövethető",
|
||||||
"source": "Forrás",
|
"source": "Forrás",
|
||||||
"app": "Alkalmazás",
|
"app": "Alkalmazás",
|
||||||
"appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások 'Csak nyomon követhetőek'.",
|
"appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások „csak nyomonkövethetők”.",
|
||||||
"youPickedTrackOnly": "A 'Csak követés' opciót választotta.",
|
"youPickedTrackOnly": "„Csak nyomonkövetés” opciót választotta.",
|
||||||
"trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.",
|
"trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.",
|
||||||
"cancelled": "Törölve",
|
"cancelled": "Visszavonva",
|
||||||
"appAlreadyAdded": "Az app már hozzáadva",
|
"appAlreadyAdded": "Az alkalmazás már hozzá van adva",
|
||||||
"alreadyUpToDateQuestion": "Az app már naprakész?",
|
"alreadyUpToDateQuestion": "Az alkalmazás már naprakész?",
|
||||||
"addApp": "App hozzáadás",
|
"addApp": "Hozzáadás",
|
||||||
"appSourceURL": "App forrás URL",
|
"appSourceURL": "Alkalmazás forrásának webcíme",
|
||||||
"error": "Hiba",
|
"error": "Hiba",
|
||||||
"add": "Hozzáadás",
|
"add": "Hozzáadás",
|
||||||
"searchSomeSourcesLabel": "Keresés (csak egyes források)",
|
"searchSomeSourcesLabel": "Keresés (csak bizonyos források)",
|
||||||
"search": "Keresés",
|
"search": "Keresés",
|
||||||
"additionalOptsFor": "További lehetőségek a következőhöz: {}",
|
"additionalOptsFor": "További lehetőségek a következőhöz: {}",
|
||||||
"supportedSources": "Támogatott források",
|
"supportedSources": "Támogatott források",
|
||||||
"trackOnlyInBrackets": "(Csak nyomonkövetés)",
|
"trackOnlyInBrackets": "(Csak nyomonkövetés)",
|
||||||
"searchableInBrackets": "(Kereshető)",
|
"searchableInBrackets": "(Kereshető)",
|
||||||
"appsString": "Appok",
|
"appsString": "Alkalmazások",
|
||||||
"noApps": "Nincs App",
|
"noApps": "Nincsenek alkalmazások",
|
||||||
"noAppsForFilter": "Nincsenek appok a szűrőhöz",
|
"noAppsForFilter": "Nincsenek alkalmazások a szűrőhöz",
|
||||||
"byX": "Fejlesztő: {}",
|
"byX": "Fejlesztő: {}",
|
||||||
"percentProgress": "Folyamat: {}%",
|
"percentProgress": "Folyamat: {}%",
|
||||||
"pleaseWait": "Kis türelmet",
|
"pleaseWait": "Kis türelmet",
|
||||||
"updateAvailable": "Frissítés érhető el",
|
"updateAvailable": "Frissítés érhető el",
|
||||||
"notInstalled": "Nem telepített",
|
"notInstalled": "Nem telepített",
|
||||||
"pseudoVersion": "ál-verzió",
|
"pseudoVersion": "pszeudoverzió",
|
||||||
"selectAll": "Mindet kiválaszt",
|
"selectAll": "Összes kiválasztása",
|
||||||
"deselectX": "Törölje {} kijelölését",
|
"deselectX": "A(z) {} kiválasztásának elvetése",
|
||||||
"xWillBeRemovedButRemainInstalled": "A(z) {} el lesz távolítva az Obtainiumból, de továbbra is telepítve marad az eszközön.",
|
"xWillBeRemovedButRemainInstalled": "A(z) {} el lesz távolítva az Obtainiumból, de továbbra is telepítve marad az eszközön.",
|
||||||
"removeSelectedAppsQuestion": "Eltávolítja a kiválasztott appokat?",
|
"removeSelectedAppsQuestion": "A kiválasztott alkalmazások eltávolítása?",
|
||||||
"removeSelectedApps": "Távolítsa el a kiválasztott appokat",
|
"removeSelectedApps": "A kiválasztott alkalmazások eltávolítása",
|
||||||
"updateX": "Frissítés: {}",
|
"updateX": "{} frissítése",
|
||||||
"installX": "Telepítés: {}",
|
"installX": "{} telepítése",
|
||||||
"markXTrackOnlyAsUpdated": "Jelölje meg: {}\n(Csak nyomon követhető)\nmint Frissített",
|
"markXTrackOnlyAsUpdated": "Megjelölés: {}\n(Csak nyomonkövetés)\nFrissítettként",
|
||||||
"changeX": "Változás {}",
|
"changeX": "{}-változás",
|
||||||
"installUpdateApps": "Appok telepítése/frissítése",
|
"installUpdateApps": "Alkalmazások telepítése/frissítése",
|
||||||
"installUpdateSelectedApps": "Telepítse/frissítse a kiválasztott appokat",
|
"installUpdateSelectedApps": "A kiválasztott alkalmazások telepítése/frissítése",
|
||||||
"markXSelectedAppsAsUpdated": "Megjelöl {} kiválasztott alkalmazást frissítettként?",
|
"markXSelectedAppsAsUpdated": "A(z) {} kiválasztott alkalmazás megjelölése frissítettként?",
|
||||||
"no": "Nem",
|
"no": "Nem",
|
||||||
"yes": "Igen",
|
"yes": "Igen",
|
||||||
"markSelectedAppsUpdated": "Jelölje meg a kiválasztott appokat frissítettként",
|
"markSelectedAppsUpdated": "A kiválasztott alkalmazások megjelölése frissítettként",
|
||||||
"pinToTop": "Rögzítés felülre",
|
"pinToTop": "Kitűzés felülre",
|
||||||
"unpinFromTop": "Eltávolít felülről",
|
"unpinFromTop": "Kitűzés megszüntetése",
|
||||||
"resetInstallStatusForSelectedAppsQuestion": "Visszaállítja a kiválasztott appok telepítési állapotát?",
|
"resetInstallStatusForSelectedAppsQuestion": "Visszaállítja a kiválasztott alkalmazások telepítési állapotát?",
|
||||||
"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.",
|
"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.",
|
||||||
"customLinkMessage": "Ezek a hivatkozások a telepített Obtainium-mal rendelkező eszközökön működnek",
|
"customLinkMessage": "Ezek a hivatkozások a telepített Obtainiummal rendelkező eszközökön működnek",
|
||||||
"shareAppConfigLinks": "App konfiguráció megosztása HTML linkként",
|
"shareAppConfigLinks": "Alkalmazás-konfiguráció megosztása HTML-hivatkozásként",
|
||||||
"shareSelectedAppURLs": "Ossza meg a kiválasztott app URL címeit",
|
"shareSelectedAppURLs": "A kiválasztott alkalmazás hivatkozásának megosztása",
|
||||||
"resetInstallStatus": "Telepítési állapot visszaállítása",
|
"resetInstallStatus": "Telepítési állapot visszaállítása",
|
||||||
"more": "További",
|
"more": "További",
|
||||||
"removeOutdatedFilter": "Távolítsa el az elavult app szűrőt",
|
"removeOutdatedFilter": "Elavult alkalmazás-szűrő eltávolítása",
|
||||||
"showOutdatedOnly": "Csak az elavult appok megjelenítése",
|
"showOutdatedOnly": "Csak az elavult alkalmazások megjelenítése",
|
||||||
"filter": "Szűrő",
|
"filter": "Szűrő",
|
||||||
"filterApps": "Appok szűrése",
|
"filterApps": "Alkalmazások szűrése",
|
||||||
"appName": "App név",
|
"appName": "Név",
|
||||||
"author": "Szerző",
|
"author": "Szerző",
|
||||||
"upToDateApps": "Naprakész appok",
|
"upToDateApps": "Naprakész alkalmazások",
|
||||||
"nonInstalledApps": "Nem telepített appok",
|
"nonInstalledApps": "Nem telepített alkalmazások",
|
||||||
"importExport": "Import Export",
|
"importExport": "Import/Export",
|
||||||
"settings": "Beállítások",
|
"settings": "Beállítások",
|
||||||
"exportedTo": "Exportálva ide {}",
|
"exportedTo": "Exportálva ide: {}",
|
||||||
"obtainiumExport": "Obtainium Adat Exportálás",
|
"obtainiumExport": "Obtainium adatok exportálása",
|
||||||
"invalidInput": "Hibás bemenet",
|
"invalidInput": "Hibás bemenet",
|
||||||
"importedX": "Importálva innen {}",
|
"importedX": "Importálva innen: {}",
|
||||||
"obtainiumImport": "Obtainium Adat Importálás",
|
"obtainiumImport": "Obtainium adatok importálása",
|
||||||
"importFromURLList": "Importálás URL listából",
|
"importFromURLList": "Importálás webcímlistából",
|
||||||
"searchQuery": "Keresési lekérdezés",
|
"searchQuery": "Keresési lekérdezés",
|
||||||
"appURLList": "App URL lista",
|
"appURLList": "Alkalmazás-webcímlista",
|
||||||
"line": "Sor",
|
"line": "Sor",
|
||||||
"searchX": "Keresés {}",
|
"searchX": "{} keresése",
|
||||||
"noResults": "Nincs találat",
|
"noResults": "Nincs találat",
|
||||||
"importX": "Importálás: {}",
|
"importX": "{} importálá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..",
|
"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.",
|
||||||
"importErrors": "Importálási hibák",
|
"importErrors": "Importálási hibák",
|
||||||
"importedXOfYApps": "{}/{} app importálva.",
|
"importedXOfYApps": "{}/{} alkalmazás importálva.",
|
||||||
"followingURLsHadErrors": "A következő URL-ek hibákat tartalmaztak:",
|
"followingURLsHadErrors": "A következő webcímek hibákat tartalmaztak:",
|
||||||
"selectURL": "Válassza ki az URL-t",
|
"selectURL": "Webcím kiválasztása",
|
||||||
"selectURLs": "Kiválasztott URL-ek",
|
"selectURLs": "Webcímek kiválasztása",
|
||||||
"pick": "Válasszon",
|
"pick": "Kiválasztás",
|
||||||
"theme": "Téma",
|
"theme": "Téma",
|
||||||
"dark": "Sötét",
|
"dark": "Sötét",
|
||||||
"light": "Világos",
|
"light": "Világos",
|
||||||
"followSystem": "Rendszer szerint",
|
"followSystem": "Rendszerbeállítás használata",
|
||||||
"followSystemThemeExplanation": "A következő rendszer téma csak harmadik féltől származó alkalmazások használatával lehetséges",
|
"followSystemThemeExplanation": "A következő rendszer téma csak harmadik féltől származó alkalmazások használatával lehetséges",
|
||||||
"useBlackTheme": "Használjon teljesen fekete sötét témát",
|
"useBlackTheme": "Használjon teljesen fekete sötét témát",
|
||||||
"appSortBy": "App rendezés...",
|
"appSortBy": "Rendezési szempont",
|
||||||
"authorName": "Szerző/Név",
|
"authorName": "Szerző/Név",
|
||||||
"nameAuthor": "Név/Szerző",
|
"nameAuthor": "Név/Szerző",
|
||||||
"asAdded": "Mint Hozzáadott",
|
"asAdded": "Hozzáadás dátuma",
|
||||||
"appSortOrder": "Appok rendezése",
|
"appSortOrder": "Rendezési sorrend",
|
||||||
"ascending": "Emelkedő",
|
"ascending": "Növekvő",
|
||||||
"descending": "Csökkenő",
|
"descending": "Csökkenő",
|
||||||
"bgUpdateCheckInterval": "Háttérfrissítés ellenőrzés időköze",
|
"bgUpdateCheckInterval": "Időtartam a frissítések háttérellenőrzése között",
|
||||||
"neverManualOnly": "Soha – csak manuális",
|
"neverManualOnly": "Soha – csak kézi",
|
||||||
"appearance": "Megjelenés",
|
"appearance": "Megjelenés",
|
||||||
"showWebInAppView": "Forrás megjelenítése az Appok nézetben",
|
"showWebInAppView": "Forrás megjelenítése az alkalmazásnézetben",
|
||||||
"pinUpdates": "Frissítések kitűzése az App nézet tetejére",
|
"pinUpdates": "Frissítések kitűzése az alkalmazásnézet tetejére",
|
||||||
"updates": "Frissítések",
|
"updates": "Frissítések",
|
||||||
"sourceSpecific": "Forrás-specifikus",
|
"sourceSpecific": "Forrásspecifikus",
|
||||||
"appSource": "App forrás",
|
"appSource": "Alkalmazás forrása",
|
||||||
"noLogs": "Nincsenek naplók",
|
"noLogs": "Nincsenek naplók",
|
||||||
"appLogs": "App naplók",
|
"appLogs": "Alkalmazásnaplók",
|
||||||
"close": "Bezárás",
|
"close": "Bezárás",
|
||||||
"share": "Megosztás",
|
"share": "Megosztás",
|
||||||
"appNotFound": "App nem található",
|
"appNotFound": "Az alkalmazás nem található",
|
||||||
"obtainiumExportHyphenatedLowercase": "obtainium-export",
|
"obtainiumExportHyphenatedLowercase": "obtainium-adat",
|
||||||
"pickAnAPK": "Válasszon egy APK-t",
|
"pickAnAPK": "Válasszon egy APK-t",
|
||||||
"appHasMoreThanOnePackage": "A(z) {} egynél több csomaggal rendelkezik:",
|
"appHasMoreThanOnePackage": "A(z) {} egynél több csomaggal rendelkezik:",
|
||||||
"deviceSupportsXArch": "Eszköze támogatja a {} CPU architektúrát.",
|
"deviceSupportsXArch": "Ez az eszköz támogatja a(z) {} CPU architektúrát.",
|
||||||
"deviceSupportsFollowingArchs": "Az eszköze a következő CPU architektúrákat támogatja:",
|
"deviceSupportsFollowingArchs": "Ez az eszköz a következő CPU architektúrákat támogatja:",
|
||||||
"warning": "Figyelem",
|
"warning": "Figyelem",
|
||||||
"sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása „{}”, de a kiadási csomag innen származik: „{}”. Folytatja?",
|
"sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása a(z) „{}” tároló, de a kiadási csomag innen származik: „{}”. Folytatja?",
|
||||||
"updatesAvailable": "Frissítések érhetők el",
|
"updatesAvailable": "Frissítések érhetők el",
|
||||||
"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",
|
"updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy egy vagy több, az Obtainium által nyomonkövetett alkalmazáshoz frissítések állnak rendelkezésre",
|
||||||
"noNewUpdates": "Nincsenek új frissítések.",
|
"noNewUpdates": "Nincsenek új frissítések.",
|
||||||
"xHasAnUpdate": "A(z) {} frissítést kapott.",
|
"xHasAnUpdate": "A(z) {} frissítést kapott.",
|
||||||
"appsUpdated": "Alkalmazások frissítve",
|
"appsUpdated": "Alkalmazások frissítve",
|
||||||
"appsNotUpdated": "Nem sikerült frissíteni az alkalmazásokat",
|
"appsNotUpdated": "Nem sikerült frissíteni az alkalmazásokat",
|
||||||
"appsUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy/több app frissítése megtörtént a háttérben",
|
"appsUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése a háttérben történt.",
|
||||||
"xWasUpdatedToY": "{} frissítve a következőre: {}.",
|
"xWasUpdatedToY": "A(z) {} frissítve lett a következőre: {}.",
|
||||||
"xWasNotUpdatedToY": "A {} frissítése a {}-ra nem sikerült.",
|
"xWasNotUpdatedToY": "Nem sikerült frissíteni a következőt: {}, erre: {}.",
|
||||||
"errorCheckingUpdates": "Hiba a frissítések keresésekor",
|
"errorCheckingUpdates": "Hiba a frissítések ellenőrzésekor",
|
||||||
"errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, ha a háttérbeli frissítések ellenőrzése sikertelen",
|
"errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, amikor a frissítések ellenőrzése a háttérben nem sikerül",
|
||||||
"appsRemoved": "Alkalmazások eltávolítva",
|
"appsRemoved": "Alkalmazások eltávolítva",
|
||||||
"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",
|
"appsRemovedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás betöltés közbeni hiba miatt eltávolításra került",
|
||||||
"xWasRemovedDueToErrorY": "A(z) {} a következő hiba miatt lett eltávolítva: {}",
|
"xWasRemovedDueToErrorY": "A(z) {} eltávolításra került a következő hiba miatt: {}",
|
||||||
"completeAppInstallation": "Teljes app telepítés",
|
"completeAppInstallation": "Teljes alkalmazástelepítés",
|
||||||
"obtainiumMustBeOpenToInstallApps": "Az Obtainiumnak megnyitva kell lennie az alkalmazások telepítéséhez",
|
"obtainiumMustBeOpenToInstallApps": "Az alkalmazások telepítéséhez az Obtainiumnak megnyitva kell lennie",
|
||||||
"completeAppInstallationNotifDescription": "Megkéri a felhasználót, hogy térjen vissza az Obtainiumhoz, hogy befejezze az alkalmazás telepítését",
|
"completeAppInstallationNotifDescription": "Megkéri a felhasználót, hogy térjen vissza az Obtainiumhoz, hogy befejezze az alkalmazás telepítését",
|
||||||
"checkingForUpdates": "Frissítések keresése",
|
"checkingForUpdates": "Frissítések ellenőrzése",
|
||||||
"checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések keresésekor jelenik meg",
|
"checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések ellenőrzésekor jelenik meg",
|
||||||
"pleaseAllowInstallPerm": "Kérjük, engedélyezze az Obtainiumnak az alkalmazások telepítését",
|
"pleaseAllowInstallPerm": "Engedélyezze az Obtainiumnak az alkalmazások telepítését",
|
||||||
"trackOnly": "Csak követés",
|
"trackOnly": "Csak nyomonkövetés",
|
||||||
"errorWithHttpStatusCode": "Hiba {}",
|
"errorWithHttpStatusCode": "Hiba {}",
|
||||||
"versionCorrectionDisabled": "Verzió korrekció letiltva (úgy tűnik, a beépülő modul nem működik)",
|
"versionCorrectionDisabled": "Verzió-korrekció letiltva (úgy tűnik, hogy a bővítmény nem működik)",
|
||||||
"unknown": "Ismeretlen",
|
"unknown": "Ismeretlen",
|
||||||
"none": "Egyik sem",
|
"none": "Semmi",
|
||||||
"never": "Soha",
|
"never": "Soha",
|
||||||
"latestVersionX": "Legújabb verzió: {}",
|
"latestVersionX": "Legújabb verzió: {}",
|
||||||
"installedVersionX": "Telepített verzió: {}",
|
"installedVersionX": "Telepített verzió: {}",
|
||||||
"lastUpdateCheckX": "Frissítés ellenőrizve: {}",
|
"lastUpdateCheckX": "Frissítések utoljára ellenőrizve: {}",
|
||||||
"remove": "Eltávolítás",
|
"remove": "Eltávolítás",
|
||||||
"yesMarkUpdated": "Igen, megjelölés frissítettként",
|
"yesMarkUpdated": "Igen, megjelölés frissítettként",
|
||||||
"fdroid": "F-Droid hivatalos",
|
"fdroid": "F-Droid hivatalos",
|
||||||
"appIdOrName": "App ID vagy név",
|
"appIdOrName": "Az alkalmazás-azonosító vagy név",
|
||||||
"appId": "Alkalmazásazonosító",
|
"appId": "Alkalmazás-azonosító",
|
||||||
"appWithIdOrNameNotFound": "Nem található app ezzel az azonosítóval vagy névvel",
|
"appWithIdOrNameNotFound": "Nem található alkalmazás ezzel az azonosítóval vagy névvel",
|
||||||
"reposHaveMultipleApps": "A repók több alkalmazást is tartalmazhatnak",
|
"reposHaveMultipleApps": "A tárolók több alkalmazást is tartalmazhatnak",
|
||||||
"fdroidThirdPartyRepo": "F-Droid Harmadik-fél Repo",
|
"fdroidThirdPartyRepo": "F-Droid harmadik féltől származó tároló",
|
||||||
"steamMobile": "Steam mobil",
|
"install": "Telepítés",
|
||||||
"steamChat": "Steam Chat",
|
"markInstalled": "Telepítettnek jelölés",
|
||||||
"install": "Telepít",
|
"update": "Frissítés",
|
||||||
"markInstalled": "Telepítettnek jelöl",
|
"markUpdated": "Frissítettnek jelölés",
|
||||||
"update": "Frissít",
|
"additionalOptions": "További beállítások",
|
||||||
"markUpdated": "Frissítettnek jelöl",
|
"disableVersionDetection": "Verzió-érzékelés letiltása",
|
||||||
"additionalOptions": "További lehetőségek",
|
"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.",
|
||||||
"disableVersionDetection": "Verzió érzékelés letiltása",
|
"downloadingX": "{} letöltése",
|
||||||
"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.",
|
"downloadX": "{} letöltése",
|
||||||
"downloadingX": "{} letöltés",
|
"downloadedX": "{} letöltve",
|
||||||
"downloadX": "Letöltés {}",
|
"releaseAsset": "Kiadási csomag",
|
||||||
"downloadedX": "Letöltés {}",
|
"downloadNotifDescription": "Értesíti a felhasználót az alkalmazás letöltésének előrehaladásáról",
|
||||||
"releaseAsset": "Kiadási tartalom",
|
|
||||||
"downloadNotifDescription": "Értesíti a felhasználót az app letöltésének előrehaladásáról",
|
|
||||||
"noAPKFound": "Nem található APK",
|
"noAPKFound": "Nem található APK",
|
||||||
"noVersionDetection": "Nincs verzió érzékelés",
|
"noVersionDetection": "Nincs verzió-érzékelés",
|
||||||
"categorize": "Kategorizálás",
|
"categorize": "Kategorizálás",
|
||||||
"categories": "Kategóriák",
|
"categories": "Kategóriák",
|
||||||
"category": "Kategória",
|
"category": "Kategória",
|
||||||
"noCategory": "Nincs kategória",
|
"noCategory": "Nincs kategória",
|
||||||
"noCategories": "Nincsenek kategóriák",
|
"noCategories": "Nincsenek kategóriák",
|
||||||
"deleteCategoriesQuestion": "Törli a kategóriákat?",
|
"deleteCategoriesQuestion": "Törli a kategóriákat?",
|
||||||
"categoryDeleteWarning": "A(z) {} összes app kategorizálatlan állapotba kerül.",
|
"categoryDeleteWarning": "A törölt kategóriákban lévő összes alkalmazás kategorizálatlanná válik.",
|
||||||
"addCategory": "Új kategória",
|
"addCategory": "Kategória hozzáadása",
|
||||||
"label": "Címke",
|
"label": "Címke",
|
||||||
"language": "Nyelv",
|
"language": "Nyelv",
|
||||||
"copiedToClipboard": "Másolva a vágólapra",
|
"copiedToClipboard": "Másolva a vágólapra",
|
||||||
@ -210,131 +208,139 @@
|
|||||||
"selectedCategorizeWarning": "Ez felváltja a kiválasztott alkalmazások meglévő kategória-beállításait.",
|
"selectedCategorizeWarning": "Ez felváltja a kiválasztott alkalmazások meglévő kategória-beállításait.",
|
||||||
"filterAPKsByRegEx": "Az APK-k szűrése reguláris kifejezéssel",
|
"filterAPKsByRegEx": "Az APK-k szűrése reguláris kifejezéssel",
|
||||||
"removeFromObtainium": "Eltávolítás az Obtainiumból",
|
"removeFromObtainium": "Eltávolítás az Obtainiumból",
|
||||||
"uninstallFromDevice": "Eltávolítás a készülékről",
|
"uninstallFromDevice": "Eltávolítás az eszközről",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Csak azoknál az alkalmazásoknál működik, amelyeknél a verzióérzékelés le van tiltva.",
|
"onlyWorksWithNonVersionDetectApps": "Csak azoknál az alkalmazásoknál működik, amelyeknél a verzió-érzékelés le van tiltva.",
|
||||||
"releaseDateAsVersion": "Használja a Kiadás dátumát, mint verziót",
|
"releaseDateAsVersion": "Használja a kiadás dátumát verzió-karakterláncként",
|
||||||
"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.",
|
"releaseTitleAsVersion": "Használja a kiadás címét verzió-karakterláncként",
|
||||||
"changes": "Változtatások",
|
"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.",
|
||||||
|
"changes": "Változáslista",
|
||||||
"releaseDate": "Kiadás dátuma",
|
"releaseDate": "Kiadás dátuma",
|
||||||
"importFromURLsInFile": "Importálás fájlban található URL-ből (mint pl. OPML)",
|
"importFromURLsInFile": "Importálás fájlban található webcímből (pl. OPML)",
|
||||||
"versionDetectionExplanation": "A verzió karakterlánc egyeztetése az OS által észlelt verzióval",
|
"versionDetectionExplanation": "A verzió-karakterlánc egyeztetése az rendszer által érzékelt verzióval",
|
||||||
"versionDetection": "Verzió érzékelés",
|
"versionDetection": "Verzió-érzékelés",
|
||||||
"standardVersionDetection": "Alapért. verzió érzékelés",
|
"standardVersionDetection": "Alapértelmezett verzió-érzékelés",
|
||||||
"groupByCategory": "Csoportosítás Kategória alapján",
|
"groupByCategory": "Csoportosítás kategória alapján",
|
||||||
"autoApkFilterByArch": "Ha lehetséges, próbálja CPU architektúra szerint szűrni az APK-kat",
|
"autoApkFilterByArch": "Ha lehetséges, próbálja CPU architektúra szerint szűrni az APK-kat",
|
||||||
"overrideSource": "Forrás felülbírálása",
|
"overrideSource": "Forrás felülírása",
|
||||||
"dontShowAgain": "Ne mutassa ezt újra",
|
"dontShowAgain": "Ne jelenítse meg ezt többé",
|
||||||
"dontShowTrackOnlyWarnings": "Ne jelenítsen meg 'Csak nyomon követés' figyelmeztetést",
|
"dontShowTrackOnlyWarnings": "Ne jelenítse meg a „Csak nyomonkövetés” figyelmeztetést",
|
||||||
"dontShowAPKOriginWarnings": "Ne jelenítsen meg az APK eredetére vonatkozó figyelmeztetéseket",
|
"dontShowAPKOriginWarnings": "Ne jelenítse meg az APK eredetére vonatkozó figyelmeztetéseket",
|
||||||
"moveNonInstalledAppsToBottom": "Helyezze át a nem telepített appokat az App nézet aljára",
|
"moveNonInstalledAppsToBottom": "Helyezze át a nem telepített alkalmazásokat az alkalmazásnézet aljára",
|
||||||
"gitlabPATLabel": "GitLab személyes hozzáférési token",
|
"gitlabPATLabel": "GitLab személyes hozzáférési token",
|
||||||
"about": "Rólunk",
|
"about": "Névjegy",
|
||||||
"requiresCredentialsInSettings": "{}: Ehhez további hitelesítő adatokra van szükség (a Beállításokban)",
|
"requiresCredentialsInSettings": "A(z) {} alkalmazásnak további hitelesítő adatokra van szüksége (a beállításokban)",
|
||||||
"checkOnStart": "Egyszer az alkalmazás indításakor is",
|
"checkOnStart": "Frissítések ellenőrzése az alkalmazás megnyitásakor",
|
||||||
"tryInferAppIdFromCode": "Próbálja kikövetkeztetni az app azonosítót a forráskódból",
|
"tryInferAppIdFromCode": "Próbálja meg kikövetkeztetni az alkalmazás azonosítóját a forráskódból",
|
||||||
"removeOnExternalUninstall": "A külsőleg eltávolított appok auto. eltávolítása",
|
"removeOnExternalUninstall": "A külsőleg eltávolított alkalmazások automatikus eltávolítása",
|
||||||
"pickHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása",
|
"pickHighestVersionCode": "A legmagasabb verziószámú APK automatikus kiválasztása",
|
||||||
"checkUpdateOnDetailPage": "Frissítések keresése az app részleteit tartalmazó oldal megnyitásakor",
|
"checkUpdateOnDetailPage": "Frissítések ellenőrzése az alkalmazás részleteit tartalmazó oldal megnyitásakor",
|
||||||
"disablePageTransitions": "Lap áttűnési animációk letiltása",
|
"disablePageTransitions": "Lap áttűnési animációk letiltása",
|
||||||
"reversePageTransitions": "Fordított lap áttűnési animációk",
|
"reversePageTransitions": "Fordított lap áttűnési animációk",
|
||||||
"minStarCount": "Minimális csillag szám",
|
"minStarCount": "Minimális csillagozási szám",
|
||||||
"addInfoBelow": "Adja hozzá ezt az infót alább.",
|
"addInfoBelow": "Adja hozzá ezt az információt alább.",
|
||||||
"addInfoInSettings": "Adja hozzá ezt az infót a Beállításokban.",
|
"addInfoInSettings": "Adja hozzá ezt az információt a beállításokban.",
|
||||||
"githubSourceNote": "A GitHub sebességkorlátozás elkerülhető API-kulcs használatával.",
|
"githubSourceNote": "A GitHub/GitLab lekérdezés-korlátozás elkerülhető egy API-kulcs használatával.",
|
||||||
"sortByLastLinkSegment": "Rendezés csak a link utolsó szegmense szerint",
|
"sortByLastLinkSegment": "Rendezés csak a hivatkozás utolsó szakasza szerint",
|
||||||
"filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel",
|
"filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel",
|
||||||
"customLinkFilterRegex": "Egyéni APK hivatkozásszűrő reguláris kifejezéssel (Alapérték '.apk$')",
|
"customLinkFilterRegex": "Egyéni APK-hivatkozásszűrő reguláris kifejezéssel (Alapértelmezett „.apk$”)",
|
||||||
"appsPossiblyUpdated": "App frissítési kísérlet",
|
"appsPossiblyUpdated": "Megkísérelt alkalmazás-frissítések",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése lehetséges a háttérben",
|
"appsPossiblyUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése lehetséges a háttérben",
|
||||||
"xWasPossiblyUpdatedToY": "{} frissítve lehet erre {}.",
|
"xWasPossiblyUpdatedToY": "A(z) {} frissülhetett a következőre: {}.",
|
||||||
"enableBackgroundUpdates": "Frissítések a háttérben",
|
"enableBackgroundUpdates": "Háttérfrissítések engedélyezése",
|
||||||
"backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden appnál lehetséges a háttérbeli frissítés.",
|
"backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden alkalmazásnál lehetséges a háttérbeli frissítés.",
|
||||||
"backgroundUpdateLimitsExplanation": "A háttérben történő telepítés sikeressége csak az Obtainium megnyitásakor állapítható meg.",
|
"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",
|
"verifyLatestTag": "Ellenőrizze a „legújabb” címkét",
|
||||||
"intermediateLinkRegex": "Szűrés egy 'köztes' látogatási linkre",
|
"intermediateLinkRegex": "Szűrő egy „köztes” hivatkozás felkereséséhez",
|
||||||
"filterByLinkText": "A hivatkozások szűrése linkszöveg alapján",
|
"filterByLinkText": "Hivatkozások szűrése hivatkozásszöveg alapján",
|
||||||
"intermediateLinkNotFound": "Köztes link nem található",
|
"intermediateLinkNotFound": "Köztes hivatkozás nem található",
|
||||||
"intermediateLink": "Köztes link",
|
"intermediateLink": "Köztes hivatkozás",
|
||||||
"exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)",
|
"exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)",
|
||||||
"bgUpdatesOnWiFiOnly": "Tiltsa le a háttérben frissítéseket, ha nincs Wi-Fi-n",
|
"bgUpdatesOnWiFiOnly": "Háttérfrissítések letiltása, amikor az eszköz nem csatlakozik a Wi-Fi-hez",
|
||||||
"autoSelectHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása",
|
"bgUpdatesWhileChargingOnly": "Háttérfrissítések letiltása, amikor az eszköz nincs a töltőn",
|
||||||
"versionExtractionRegEx": "Verzió kibontása reguláris kifejezéssel",
|
"autoSelectHighestVersionCode": "A legmagasabb verziókódú APK automatikus kiválasztása",
|
||||||
"matchGroupToUse": "Párosítsa a csoportot a használathoz",
|
"versionExtractionRegEx": "Verzió-karakterlánc kivonatolása reguláris kifejezéssel",
|
||||||
"highlightTouchTargets": "Emelje ki a kevésbé nyilvánvaló érintési célokat",
|
"trimVersionString": "Verzió-karakterlánc levágása reguláris kifejezéssel",
|
||||||
"pickExportDir": "Válassza az Exportálási könyvtárat",
|
"matchGroupToUseForX": "A(z) „{}” esetén használandó csoport egyeztetése",
|
||||||
"autoExportOnChanges": "Auto-exportálás a változások után",
|
"matchGroupToUse": "Verziókarakterlánc-kivonatoláshoz használandó csoport reguláris kifejezéssel való egyeztetése",
|
||||||
|
"highlightTouchTargets": "A kevésbé nyilvánvaló érintési pontok kiemelése",
|
||||||
|
"pickExportDir": "Válassza ki a könyvtárat, ahová exportálni szeretne",
|
||||||
|
"autoExportOnChanges": "Automatikus exportálás a változtatások után",
|
||||||
"includeSettings": "Tartalmazza a beállításokat",
|
"includeSettings": "Tartalmazza a beállításokat",
|
||||||
"filterVersionsByRegEx": "Verziók szűrése reguláris kifejezéssel",
|
"filterVersionsByRegEx": "Verziók szűrése reguláris kifejezéssel",
|
||||||
"trySelectingSuggestedVersionCode": "Próbálja ki a javasolt verziókódú APK-t",
|
"trySelectingSuggestedVersionCode": "Próbálja kiválasztani a „Javasolt” verziókódú APK-t",
|
||||||
"dontSortReleasesList": "Az API-ból származó kiadási sorrend megőrzése",
|
"dontSortReleasesList": "Az API-ból származó kiadási sorrend megőrzése",
|
||||||
"reverseSort": "Fordított rendezés",
|
"reverseSort": "Fordított rendezés",
|
||||||
"takeFirstLink": "Vegye az első linket",
|
"takeFirstLink": "Vegye az első hivatkozást",
|
||||||
"skipSort": "A válogatás kihagyása",
|
"skipSort": "Rendezés kihagyása",
|
||||||
"debugMenu": "Hibakereső menü",
|
"debugMenu": "Hibakereső menü",
|
||||||
"bgTaskStarted": "A háttérfeladat elindult – ellenőrizze a naplókat.",
|
"bgTaskStarted": "A háttérfeladat elindult – ellenőrizze a naplókat.",
|
||||||
"runBgCheckNow": "Futtassa a Háttérben frissítés ellenőrzését most",
|
"runBgCheckNow": "Frissítések ellenőrzése a háttérben most",
|
||||||
"versionExtractWholePage": "Alkalmazza a Version Extraction Regex-et az egész oldalra",
|
"versionExtractWholePage": "„Verzió-karakterlánc kivonatolása reguláris kifejezéssel” alkalmazása az egész oldalra",
|
||||||
"installing": "Telepítés",
|
"installing": "Telepítés",
|
||||||
"skipUpdateNotifications": "A frissítési értesítések kihagyása",
|
"skipUpdateNotifications": "A frissítési értesítések kihagyása",
|
||||||
"updatesAvailableNotifChannel": "Frissítések érhetők el",
|
"updatesAvailableNotifChannel": "Frissítések érhetők el",
|
||||||
"appsUpdatedNotifChannel": "Alkalmazások frissítve",
|
"appsUpdatedNotifChannel": "Alkalmazások frissítve",
|
||||||
"appsPossiblyUpdatedNotifChannel": "App frissítési kísérlet",
|
"appsPossiblyUpdatedNotifChannel": "Megkísérelt alkalmazás-frissítések",
|
||||||
"errorCheckingUpdatesNotifChannel": "Hiba a frissítések keresésekor",
|
"errorCheckingUpdatesNotifChannel": "Hiba a frissítések ellenőrzésekor",
|
||||||
"appsRemovedNotifChannel": "Alkalmazások eltávolítva",
|
"appsRemovedNotifChannel": "Eltávolított alkalmazások",
|
||||||
"downloadingXNotifChannel": "{} letöltés",
|
"downloadingXNotifChannel": "A(z) {} letöltése",
|
||||||
"completeAppInstallationNotifChannel": "Teljes app telepítés",
|
"completeAppInstallationNotifChannel": "Teljes alkalmazás telepítés",
|
||||||
"checkingForUpdatesNotifChannel": "Frissítések keresése",
|
"checkingForUpdatesNotifChannel": "Frissítések ellenőrzése",
|
||||||
"onlyCheckInstalledOrTrackOnlyApps": "Csak a telepített és a csak követhető appokat ellenőrizze frissítésekért",
|
"onlyCheckInstalledOrTrackOnlyApps": "Csak a telepített és a csak nyomonkövethető alkalmazások frissítéseinek ellenőrzése",
|
||||||
"supportFixedAPKURL": "Támogatja a rögzített APK URL-eket",
|
"supportFixedAPKURL": "Támogatja a rögzített APK webcímeket",
|
||||||
"selectX": "Kiválaszt {}",
|
"selectX": "{} kiválasztása",
|
||||||
"parallelDownloads": "Párhuzamos letöltéseket enged",
|
"parallelDownloads": "Párhuzamos letöltések engedélyezése",
|
||||||
"useShizuku": "Használja Shizuku vagy Sui telepítéséhez",
|
"useShizuku": "Shizuku vagy Sui használata a telepítéshez",
|
||||||
"shizukuBinderNotFound": "A Shizuku nem fut",
|
"shizukuBinderNotFound": "A Shizuku szolgáltatás nem fut",
|
||||||
"shizukuOld": "Régi Shizuku verzió (<11) - frissítsd!",
|
"shizukuOld": "Régi Shizuku verzió (<11) - frissítse",
|
||||||
"shizukuOldAndroidWithADB": "Shizuku fut Android < 8.1 ADB-vel - frissítse az Androidot vagy használja a Sui-t helyette",
|
"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 Play-t telepítési forrásként (ha Shizuku-t használ)",
|
"shizukuPretendToBeGooglePlay": "Állítsa be a Google Playt telepítési forrásként (ha Shizukut használ)",
|
||||||
"useSystemFont": "Használja a rendszer betűtípusát",
|
"useSystemFont": "A rendszer betűtípusának használata",
|
||||||
"useVersionCodeAsOSVersion": "Az app verziókód használata a rendszer által észlelt verzióként",
|
"useVersionCodeAsOSVersion": "Az alkalmazás verziókódjának használata a rendszer által érzékelt verzióként",
|
||||||
"requestHeader": "Kérelem fejléc",
|
"requestHeader": "Kérelemfejléc",
|
||||||
"useLatestAssetDateAsReleaseDate": "Használja a legújabb tartalomfeltöltést megjelenési dátumként",
|
"useLatestAssetDateAsReleaseDate": "A kiadás dátumaként használja a legutóbbi csomagfeltöltést",
|
||||||
"defaultPseudoVersioningMethod": "Alapértelmezett álverziós módszer",
|
"defaultPseudoVersioningMethod": "Alapértelmezett pszeudoverziós módszer",
|
||||||
"partialAPKHash": "Részleges APK Hash",
|
"partialAPKHash": "Részleges APK hasító értéke",
|
||||||
"APKLinkHash": "APK Link Hash",
|
"APKLinkHash": "APK hivatkozás hasító értéke",
|
||||||
"directAPKLink": "Közvetlen APK Link",
|
"directAPKLink": "Közvetlen APK hivatkozás",
|
||||||
"pseudoVersionInUse": "Egy álverzió van használatban",
|
"pseudoVersionInUse": "Egy pszeudoverzió van használatban",
|
||||||
"installed": "Telepített",
|
"installed": "Telepített",
|
||||||
"latest": "Legújabb",
|
"latest": "Legújabb",
|
||||||
"invertRegEx": "Invertált reguláris kifejezés",
|
"invertRegEx": "Reguláris kifejezés invertálása",
|
||||||
"note": "Megjegyzés:",
|
"note": "Megjegyzés",
|
||||||
"selfHostedNote": "A \"{}\" legördülő menü használható bármely forrás saját üzemeltetésű/egyéni példányainak eléréséhez.",
|
"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)",
|
"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ő)",
|
"beforeNewInstallsShareToAppVerifier": "Új alkalmazások megosztása az AppVerifierrel (ha elérhető)",
|
||||||
"appVerifierInstructionToast": "Ossza meg az AppVerifierrel, majd térjen vissza ide, ha kész.",
|
"appVerifierInstructionToast": "Ossza meg az AppVerifierrel, majd térjen vissza ide, ha kész.",
|
||||||
"wiki": "Súgó/Wiki",
|
"wiki": "Súgó/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (használat saját felelősségre)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Eltávolítja az alkalmazást?",
|
"one": "Eltávolítja az alkalmazást?",
|
||||||
"other": "Eltávolítja az alkalmazásokat?"
|
"other": "Eltávolítja az alkalmazásokat?"
|
||||||
},
|
},
|
||||||
"tooManyRequestsTryAgainInMinutes": {
|
"tooManyRequestsTryAgainInMinutes": {
|
||||||
"one": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva",
|
"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 (korlátozott arány) – próbálja újra {} perc múlva"
|
"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": {
|
"bgUpdateGotErrorRetryInMinutes": {
|
||||||
"one": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást",
|
"one": "Frissítések ellenőrzése a háttérben a következőt észlelte: {} - Újrapróbálkozás: {} perc múlva",
|
||||||
"other": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást"
|
"other": "Frissítések ellenőrzése a háttérben a következőt észlelte: {} - Újrapróbálkozás: {} perc múlva"
|
||||||
},
|
},
|
||||||
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
||||||
"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",
|
"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": "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"
|
"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": {
|
"apps": {
|
||||||
"one": "{} app",
|
"one": "{} alkalmazás",
|
||||||
"other": "{} app"
|
"other": "{} alkalmazás"
|
||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
"one": "{} URL",
|
"one": "{} webcím",
|
||||||
"other": "{} URL"
|
"other": "{} webcím"
|
||||||
},
|
},
|
||||||
"minute": {
|
"minute": {
|
||||||
"one": "{} perc",
|
"one": "{} perc",
|
||||||
@ -349,27 +355,27 @@
|
|||||||
"other": "{} nap"
|
"other": "{} nap"
|
||||||
},
|
},
|
||||||
"clearedNLogsBeforeXAfterY": {
|
"clearedNLogsBeforeXAfterY": {
|
||||||
"one": "{n} napló törölve (előtte = {előtte}, utána = {utána})",
|
"one": "{n} napló törölve lett ({after} után, és {before} előtt)",
|
||||||
"other": "{n} napló törölve (előtte = {előtte}, utána = {utána})"
|
"other": "{n} napló törölve lett ({after} után, és {before} előtt)"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesAvailable": {
|
"xAndNMoreUpdatesAvailable": {
|
||||||
"one": "A(z) {} és 1 további alkalmazás frissítéseket kapott.",
|
"one": "A(z) {} és 1 további alkalmazás frissítést kapott.",
|
||||||
"other": "{} és {} további alkalmazás frissítéseket kapott."
|
"other": "A(z) {} és {} további alkalmazás frissítést kapott."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesInstalled": {
|
"xAndNMoreUpdatesInstalled": {
|
||||||
"one": "A(z) {} és 1 további alkalmazás frissítve.",
|
"one": "A(z) {} és 1 további alkalmazás frissítve.",
|
||||||
"other": "{} és {} további alkalmazás frissítve."
|
"other": "A(z) {} és {} további alkalmazás frissítve."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesFailed": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "Nem sikerült frissíteni {} és még 1 alkalmazást.",
|
"one": "Nem sikerült frissíteni a következőt: {}, valamint 1 további alkalmazást.",
|
||||||
"other": "Nem sikerült frissíteni {} és {} további alkalmazásokat."
|
"other": "Nem sikerült frissíteni a következőt: {}, valamint {} további alkalmazást."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} és 1 további alkalmazás is frissült.",
|
"one": "A(z) {}, valamint 1 további alkalmazás sikeresen frissítve.",
|
||||||
"other": "{} és {} további alkalmazás is frissült."
|
"other": "A(z) {}, valamint {} további alkalmazás sikeresen frissítve."
|
||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{} APK",
|
"one": "{} APK",
|
||||||
"other": "{} APK-k"
|
"other": "{} APK"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
381
assets/translations/id.json
Normal file
381
assets/translations/id.json
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
{
|
||||||
|
"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 WiFi",
|
||||||
|
"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",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
@ -179,8 +179,6 @@
|
|||||||
"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",
|
||||||
"steamMobile": "Mobile a vapore",
|
|
||||||
"steamChat": "Chat di vapore",
|
|
||||||
"install": "Installa",
|
"install": "Installa",
|
||||||
"markInstalled": "Contrassegna come installata",
|
"markInstalled": "Contrassegna come installata",
|
||||||
"update": "Aggiorna",
|
"update": "Aggiorna",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"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",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "Collegamento intermedio",
|
"intermediateLink": "Collegamento intermedio",
|
||||||
"exemptFromBackgroundUpdates": "Esente da aggiornamenti in secondo piano (se attivo)",
|
"exemptFromBackgroundUpdates": "Esente da aggiornamenti in secondo piano (se attivo)",
|
||||||
"bgUpdatesOnWiFiOnly": "Disattiva aggiornamenti in secondo piano quando non si usa il WiFi",
|
"bgUpdatesOnWiFiOnly": "Disattiva aggiornamenti in secondo piano quando non si usa il WiFi",
|
||||||
|
"bgUpdatesWhileChargingOnly": "Disabilita gli aggiornamenti in background quando non è in carica",
|
||||||
"autoSelectHighestVersionCode": "Auto-seleziona APK con versionCode più alto",
|
"autoSelectHighestVersionCode": "Auto-seleziona APK con versionCode più alto",
|
||||||
"versionExtractionRegEx": "RegEx di estrazione versione",
|
"versionExtractionRegEx": "RegEx di estrazione versione",
|
||||||
|
"trimVersionString": "Tagliare la stringa della versione con RegEx",
|
||||||
|
"matchGroupToUseForX": "Gruppo di corrispondenza da utilizzare per \"{}\"",
|
||||||
"matchGroupToUse": "Gruppo da usare",
|
"matchGroupToUse": "Gruppo da usare",
|
||||||
"highlightTouchTargets": "Evidenzia elementi toccabili meno ovvi",
|
"highlightTouchTargets": "Evidenzia elementi toccabili meno ovvi",
|
||||||
"pickExportDir": "Scegli cartella esp.",
|
"pickExportDir": "Scegli cartella esp.",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "Condividete con AppVerifier, quindi tornate qui quando siete pronti.",
|
"appVerifierInstructionToast": "Condividete con AppVerifier, quindi tornate qui quando siete pronti.",
|
||||||
"wiki": "Aiuto/Wiki",
|
"wiki": "Aiuto/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Configurazioni di app in crowdsourcing (uso a proprio rischio)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Rimuovere l'app?",
|
"one": "Rimuovere l'app?",
|
||||||
"other": "Rimuovere le app?"
|
"other": "Rimuovere le app?"
|
||||||
|
@ -147,21 +147,21 @@
|
|||||||
"noNewUpdates": "新しいアップデートはありません",
|
"noNewUpdates": "新しいアップデートはありません",
|
||||||
"xHasAnUpdate": "{} のアップデートが利用可能です。",
|
"xHasAnUpdate": "{} のアップデートが利用可能です。",
|
||||||
"appsUpdated": "アプリをアップデートしました",
|
"appsUpdated": "アプリをアップデートしました",
|
||||||
"appsNotUpdated": "アプリケーションの更新に失敗",
|
"appsNotUpdated": "アプリのアップデートに失敗しました",
|
||||||
"appsUpdatedNotifDescription": "1つまたは複数のAppのアップデートがバックグラウンドで適用されたことをユーザーに通知する",
|
"appsUpdatedNotifDescription": "1つまたは複数のAppのアップデートがバックグラウンドで適用されたことをユーザーに通知する",
|
||||||
"xWasUpdatedToY": "{} が {} にアップデートされました",
|
"xWasUpdatedToY": "{} が {} にアップデートされました",
|
||||||
"xWasNotUpdatedToY": "への更新に失敗しました。",
|
"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": "バージョン補正無効 (プラグインが動作していません)",
|
||||||
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "そのIDや名前を持つアプリは見つかりませんでした",
|
"appWithIdOrNameNotFound": "そのIDや名前を持つアプリは見つかりませんでした",
|
||||||
"reposHaveMultipleApps": "リポジトリには複数のアプリが含まれることがあります",
|
"reposHaveMultipleApps": "リポジトリには複数のアプリが含まれることがあります",
|
||||||
"fdroidThirdPartyRepo": "F-Droid サードパーティリポジトリ",
|
"fdroidThirdPartyRepo": "F-Droid サードパーティリポジトリ",
|
||||||
"steamMobile": "Steamモバイル",
|
|
||||||
"steamChat": "Steamチャット",
|
|
||||||
"install": "インストール",
|
"install": "インストール",
|
||||||
"markInstalled": "インストール済みとしてマークする",
|
"markInstalled": "インストール済みとしてマークする",
|
||||||
"update": "アップデート",
|
"update": "アップデート",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "デバイスからアンインストールする",
|
"uninstallFromDevice": "デバイスからアンインストールする",
|
||||||
"onlyWorksWithNonVersionDetectApps": "バージョン検出を無効にしているアプリにのみ動作します。",
|
"onlyWorksWithNonVersionDetectApps": "バージョン検出を無効にしているアプリにのみ動作します。",
|
||||||
"releaseDateAsVersion": "リリース日をバージョンとして使用する",
|
"releaseDateAsVersion": "リリース日をバージョンとして使用する",
|
||||||
|
"releaseTitleAsVersion": "リリースタイトルをバージョンとして使用する",
|
||||||
"releaseDateAsVersionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリで、リリース日が利用可能な場合にのみ使用する必要があります。",
|
"releaseDateAsVersionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリで、リリース日が利用可能な場合にのみ使用する必要があります。",
|
||||||
"changes": "変更点",
|
"changes": "変更点",
|
||||||
"releaseDate": "リリース日",
|
"releaseDate": "リリース日",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "中間リンク",
|
"intermediateLink": "中間リンク",
|
||||||
"exemptFromBackgroundUpdates": "バックグラウンドアップデートを行わない (有効な場合)",
|
"exemptFromBackgroundUpdates": "バックグラウンドアップデートを行わない (有効な場合)",
|
||||||
"bgUpdatesOnWiFiOnly": "WiFiを使用していない場合、バックグラウンドアップデートを無効にする",
|
"bgUpdatesOnWiFiOnly": "WiFiを使用していない場合、バックグラウンドアップデートを無効にする",
|
||||||
|
"bgUpdatesWhileChargingOnly": "非充電時にバックグラウンドアップデートを無効にする",
|
||||||
"autoSelectHighestVersionCode": "最も高いバージョンコードのAPKを自動で選択する",
|
"autoSelectHighestVersionCode": "最も高いバージョンコードのAPKを自動で選択する",
|
||||||
"versionExtractionRegEx": "バージョン抽出の正規表現",
|
"versionExtractionRegEx": "バージョン抽出の正規表現",
|
||||||
|
"trimVersionString": "正規表現でバージョン文字列をトリムする",
|
||||||
|
"matchGroupToUseForX": "\"{}\"に使用するマッチしたグループ",
|
||||||
"matchGroupToUse": "使用するマッチしたグループ",
|
"matchGroupToUse": "使用するマッチしたグループ",
|
||||||
"highlightTouchTargets": "目立たないタップ可能な対象をハイライトする",
|
"highlightTouchTargets": "目立たないタップ可能な対象をハイライトする",
|
||||||
"pickExportDir": "エクスポートディレクトリを選択",
|
"pickExportDir": "エクスポートディレクトリを選択",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "AppVerifierに共有し、準備ができたらここに戻ってください。",
|
"appVerifierInstructionToast": "AppVerifierに共有し、準備ができたらここに戻ってください。",
|
||||||
"wiki": "ヘルプ/ウィキ",
|
"wiki": "ヘルプ/ウィキ",
|
||||||
"crowdsourcedConfigsLabel": "クラウドソーシングによるアプリの設定(利用は自己責任で)",
|
"crowdsourcedConfigsLabel": "クラウドソーシングによるアプリの設定(利用は自己責任で)",
|
||||||
|
"crowdsourcedConfigsShort": "クラウドソーシングによるアプリの設定",
|
||||||
|
"allowInsecure": "安全でないHTTPリクエストを許可する",
|
||||||
|
"stayOneVersionBehind": "最新のバージョンから1つ前のものを使用する",
|
||||||
|
"refreshBeforeDownload": "ダウンロード前にアプリの詳細を更新する",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "アプリを削除しますか?",
|
"one": "アプリを削除しますか?",
|
||||||
"other": "アプリを削除しますか?"
|
"other": "アプリを削除しますか?"
|
||||||
@ -353,23 +359,23 @@
|
|||||||
"other": "{n} 個のログをクリアしました (前 = {before}, 後 = {after})"
|
"other": "{n} 個のログをクリアしました (前 = {before}, 後 = {after})"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesAvailable": {
|
"xAndNMoreUpdatesAvailable": {
|
||||||
"one": "{} とさらに {} 個のアプリのアップデートが利用可能です。",
|
"one": "{} とさらに 1 個のアプリのアップデートが利用可能です。",
|
||||||
"other": "{} とさらに {} 個のアプリのアップデートが利用可能です。"
|
"other": "{} とさらに {} 個のアプリのアップデートが利用可能です。"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesInstalled": {
|
"xAndNMoreUpdatesInstalled": {
|
||||||
"one": "{} とさらに {} 個のアプリがアップデートされました。",
|
"one": "{} とさらに 1 個のアプリがアップデートされました。",
|
||||||
"other": "{} とさらに {} 個のアプリがアップデートされました。"
|
"other": "{} とさらに {} 個のアプリがアップデートされました。"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesFailed": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "更新に失敗しました。",
|
"one": "{} とさらに 1 個のアプリのアップデートに失敗しました。",
|
||||||
"other": "アプリのアップデートに失敗しました。"
|
"other": "{} とさらに {} 個のアプリのアップデートに失敗しました。"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。",
|
"one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。",
|
||||||
"other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。"
|
"other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。"
|
||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{}APK",
|
"one": "{} APK",
|
||||||
"other": "{}APK"
|
"other": "{} APK"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "Er is geen app gevonden met dat ID of die naam",
|
"appWithIdOrNameNotFound": "Er is geen app gevonden met dat ID of die naam",
|
||||||
"reposHaveMultipleApps": "Repositories kunnen meerdere apps bevatten",
|
"reposHaveMultipleApps": "Repositories kunnen meerdere apps bevatten",
|
||||||
"fdroidThirdPartyRepo": "F-Droid Repository voor derden",
|
"fdroidThirdPartyRepo": "F-Droid Repository voor derden",
|
||||||
"steamMobile": "Steam Mobile",
|
|
||||||
"steamChat": "Steam Chat",
|
|
||||||
"install": "Installeren",
|
"install": "Installeren",
|
||||||
"markInstalled": "Als geïnstalleerd markeren",
|
"markInstalled": "Als geïnstalleerd markeren",
|
||||||
"update": "Bijwerken",
|
"update": "Bijwerken",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "Van apparaat verwijderen",
|
"uninstallFromDevice": "Van apparaat verwijderen",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Werkt alleen voor apps waarbij versieherkenning is uitgeschakeld.",
|
"onlyWorksWithNonVersionDetectApps": "Werkt alleen voor apps waarbij versieherkenning is uitgeschakeld.",
|
||||||
"releaseDateAsVersion": "Releasedatum als versie gebruiken",
|
"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.",
|
"releaseDateAsVersionExplanation": "Deze optie moet alleen worden gebruikt voor apps waar versieherkenning niet correct werkt, maar waar wel een releasedatum beschikbaar is.",
|
||||||
"changes": "Aanpassingen",
|
"changes": "Aanpassingen",
|
||||||
"releaseDate": "Releasedatum",
|
"releaseDate": "Releasedatum",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "Intermediaire link",
|
"intermediateLink": "Intermediaire link",
|
||||||
"exemptFromBackgroundUpdates": "Vrijgesteld van achtergrond-updates (indien ingeschakeld)",
|
"exemptFromBackgroundUpdates": "Vrijgesteld van achtergrond-updates (indien ingeschakeld)",
|
||||||
"bgUpdatesOnWiFiOnly": "Achtergrond-updates uitschakelen wanneer niet verbonden met WiFi",
|
"bgUpdatesOnWiFiOnly": "Achtergrond-updates uitschakelen wanneer niet verbonden met WiFi",
|
||||||
|
"bgUpdatesWhileChargingOnly": "Achtergrondupdates uitschakelen als er niet wordt opgeladen",
|
||||||
"autoSelectHighestVersionCode": "De APK met de hoogste versiecode automatisch selecteren",
|
"autoSelectHighestVersionCode": "De APK met de hoogste versiecode automatisch selecteren",
|
||||||
"versionExtractionRegEx": "Reguliere expressie voor versie-extractie",
|
"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",
|
"matchGroupToUse": "Overeenkomende groep om te gebruiken voor de reguliere expressie voor versie-extractie",
|
||||||
"highlightTouchTargets": "Minder voor de hand liggende aanraakdoelen markeren.",
|
"highlightTouchTargets": "Minder voor de hand liggende aanraakdoelen markeren.",
|
||||||
"pickExportDir": "Kies de exportmap",
|
"pickExportDir": "Kies de exportmap",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "Deel het met AppVerifier en keer daarna hier terug.",
|
"appVerifierInstructionToast": "Deel het met AppVerifier en keer daarna hier terug.",
|
||||||
"wiki": "Help/Wiki",
|
"wiki": "Help/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App-configuraties (gebruik op eigen risico)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "App verwijderen?",
|
"one": "App verwijderen?",
|
||||||
"other": "Apps verwijderen?"
|
"other": "Apps verwijderen?"
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
"cantInstallOlderVersion": "Nie można zainstalować starszej wersji aplikacji",
|
"cantInstallOlderVersion": "Nie można zainstalować starszej wersji aplikacji",
|
||||||
"appIdMismatch": "Pobrane ID pakietu nie pasuje do istniejącego ID aplikacji",
|
"appIdMismatch": "Pobrane ID pakietu nie pasuje do istniejącego ID aplikacji",
|
||||||
"functionNotImplemented": "Ta klasa nie zaimplementowała tej funkcji",
|
"functionNotImplemented": "Ta klasa nie zaimplementowała tej funkcji",
|
||||||
"placeholder": "Zbiornik",
|
"placeholder": "Placeholder",
|
||||||
"someErrors": "Wystąpiły pewne błędy",
|
"someErrors": "Wystąpiły pewne błędy",
|
||||||
"unexpectedError": "Nieoczekiwany błąd",
|
"unexpectedError": "Nieoczekiwany błąd",
|
||||||
"ok": "Okej",
|
"ok": "Okej",
|
||||||
@ -22,9 +22,9 @@
|
|||||||
"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": "Standard",
|
"standard": "Domyślny",
|
||||||
"custom": "Niestandardowe",
|
"custom": "Własny",
|
||||||
"useMaterialYou": "Używaj materiałów",
|
"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",
|
||||||
@ -55,7 +55,7 @@
|
|||||||
"pleaseWait": "Proszę czekać",
|
"pleaseWait": "Proszę czekać",
|
||||||
"updateAvailable": "Dostępna aktualizacja",
|
"updateAvailable": "Dostępna aktualizacja",
|
||||||
"notInstalled": "Nie zainstalowano",
|
"notInstalled": "Nie zainstalowano",
|
||||||
"pseudoVersion": "pseudowersja",
|
"pseudoVersion": "pseudo-wersja",
|
||||||
"selectAll": "Zaznacz wszystkie",
|
"selectAll": "Zaznacz wszystkie",
|
||||||
"deselectX": "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.",
|
||||||
@ -76,7 +76,7 @@
|
|||||||
"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",
|
"customLinkMessage": "Te linki działają na urządzeniach z zainstalowanym Obtainium",
|
||||||
"shareAppConfigLinks": "Udostępnij konfigurację aplikacji jako link HTML",
|
"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",
|
||||||
@ -150,7 +150,7 @@
|
|||||||
"appsNotUpdated": "Nie udało się zaktualizować aplikacji",
|
"appsNotUpdated": "Nie udało się zaktualizować aplikacji",
|
||||||
"appsUpdatedNotifDescription": "Informuje, gdy co najmniej jedna aplikacja została zaktualizowana w tle",
|
"appsUpdatedNotifDescription": "Informuje, gdy co najmniej jedna aplikacja została zaktualizowana w tle",
|
||||||
"xWasUpdatedToY": "{} zaktualizowano do {}.",
|
"xWasUpdatedToY": "{} zaktualizowano do {}.",
|
||||||
"xWasNotUpdatedToY": "Nie udało się zaktualizować {} do {}.",
|
"xWasNotUpdatedToY": "Błąd aktualizacji {} do {}.",
|
||||||
"errorCheckingUpdates": "Błąd sprawdzania aktualizacji",
|
"errorCheckingUpdates": "Błąd sprawdzania aktualizacji",
|
||||||
"errorCheckingUpdatesNotifDescription": "Jest wyświetlane, gdy sprawdzanie aktualizacji w tle nie powiedzie się",
|
"errorCheckingUpdatesNotifDescription": "Jest wyświetlane, gdy sprawdzanie aktualizacji w tle nie powiedzie się",
|
||||||
"appsRemoved": "Usunięte aplikacje",
|
"appsRemoved": "Usunięte aplikacje",
|
||||||
@ -179,8 +179,6 @@
|
|||||||
"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",
|
||||||
"steamMobile": "Mobilny Steam",
|
|
||||||
"steamChat": "Czat Steam",
|
|
||||||
"install": "Instaluj",
|
"install": "Instaluj",
|
||||||
"markInstalled": "Oznacz jako zainstalowane",
|
"markInstalled": "Oznacz jako zainstalowane",
|
||||||
"update": "Zaktualizuj",
|
"update": "Zaktualizuj",
|
||||||
@ -191,7 +189,7 @@
|
|||||||
"downloadingX": "Pobieranie {}",
|
"downloadingX": "Pobieranie {}",
|
||||||
"downloadX": "Pobierz {}",
|
"downloadX": "Pobierz {}",
|
||||||
"downloadedX": "Pobrano {}",
|
"downloadedX": "Pobrano {}",
|
||||||
"releaseAsset": "Release Asset",
|
"releaseAsset": "Wydany pakiet",
|
||||||
"downloadNotifDescription": "Informuje o postępach w pobieraniu aplikacji",
|
"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",
|
||||||
@ -213,11 +211,12 @@
|
|||||||
"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ą w systemie operacyjnym",
|
"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",
|
||||||
@ -251,14 +250,17 @@
|
|||||||
"backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.",
|
"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.",
|
"backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.",
|
||||||
"verifyLatestTag": "Zweryfikuj najnowszy tag",
|
"verifyLatestTag": "Zweryfikuj najnowszy tag",
|
||||||
"intermediateLinkRegex": "Filtruj link \"pośredni\" do odwiedzenia",
|
"intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności",
|
||||||
"filterByLinkText": "Filtruj linki według tekstu linku",
|
"filterByLinkText": "Filtruj linki według tekstu linku",
|
||||||
"intermediateLinkNotFound": "Nie znaleziono linku pośredniego",
|
"intermediateLinkNotFound": "Nie znaleziono linku pośredniego",
|
||||||
"intermediateLink": "Łącze pośrednie",
|
"intermediateLink": "Link pośredni",
|
||||||
"exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)",
|
"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",
|
"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",
|
"autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK",
|
||||||
"versionExtractionRegEx": "Wyrażenie regularne wyodrębniające wersję",
|
"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",
|
"matchGroupToUse": "Dopasuj grupę do użycia dla wyrażenia regularnego wyodrębniania wersji",
|
||||||
"highlightTouchTargets": "Wyróżnij mniej oczywiste elementy dotykowe",
|
"highlightTouchTargets": "Wyróżnij mniej oczywiste elementy dotykowe",
|
||||||
"pickExportDir": "Wybierz katalog eksportu",
|
"pickExportDir": "Wybierz katalog eksportu",
|
||||||
@ -268,7 +270,7 @@
|
|||||||
"trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK",
|
"trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK",
|
||||||
"dontSortReleasesList": "Utrzymaj kolejność wydań z interfejsu API",
|
"dontSortReleasesList": "Utrzymaj kolejność wydań z interfejsu API",
|
||||||
"reverseSort": "Odwrotne sortowanie",
|
"reverseSort": "Odwrotne sortowanie",
|
||||||
"takeFirstLink": "Weź pierwszy link",
|
"takeFirstLink": "Wykorzystaj pierwszy link",
|
||||||
"skipSort": "Pomiń sortowanie",
|
"skipSort": "Pomiń sortowanie",
|
||||||
"debugMenu": "Menu debugowania",
|
"debugMenu": "Menu debugowania",
|
||||||
"bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.",
|
"bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.",
|
||||||
@ -281,37 +283,41 @@
|
|||||||
"appsPossiblyUpdatedNotifChannel": "Informuj o próbach aktualizacji",
|
"appsPossiblyUpdatedNotifChannel": "Informuj o próbach aktualizacji",
|
||||||
"errorCheckingUpdatesNotifChannel": "Błędy sprawdzania aktualizacji",
|
"errorCheckingUpdatesNotifChannel": "Błędy sprawdzania aktualizacji",
|
||||||
"appsRemovedNotifChannel": "Usunięte aplikacje",
|
"appsRemovedNotifChannel": "Usunięte aplikacje",
|
||||||
"downloadingXNotifChannel": "Pobieranie aplikacji",
|
"downloadingXNotifChannel": "Pobieranie {}",
|
||||||
"completeAppInstallationNotifChannel": "Ukończenie instalacji aplikacji",
|
"completeAppInstallationNotifChannel": "Ukończenie instalacji aplikacji",
|
||||||
"checkingForUpdatesNotifChannel": "Sprawdzanie dostępności aktualizacji",
|
"checkingForUpdatesNotifChannel": "Sprawdzanie dostępności aktualizacji",
|
||||||
"onlyCheckInstalledOrTrackOnlyApps": "Sprawdzaj tylko zainstalowane i obserwowane aplikacje pod kątem aktualizacji",
|
"onlyCheckInstalledOrTrackOnlyApps": "Sprawdzaj tylko zainstalowane i obserwowane aplikacje pod kątem aktualizacji",
|
||||||
"supportFixedAPKURL": "Obsługuj stałe adresy URL APK",
|
"supportFixedAPKURL": "Obsługuj stałe adresy URL APK",
|
||||||
"selectX": "Wybierz {}",
|
"selectX": "Wybierz {}",
|
||||||
"parallelDownloads": "Zezwól na pobieranie równoległe",
|
"parallelDownloads": "Zezwalaj na równoległe pobierania",
|
||||||
"useShizuku": "Użyj Shizuku lub Sui, aby zainstalować",
|
"useShizuku": "Użyj Shizuku lub Sui, aby zainstalować",
|
||||||
"shizukuBinderNotFound": "Shizuku is not running",
|
"shizukuBinderNotFound": "Usługa Shizuku nie działa",
|
||||||
"shizukuOld": "Stara wersja Shizuku (<11) - zaktualizuj ją",
|
"shizukuOld": "Stara wersja Shizuku (<11) - zaktualizuj ją",
|
||||||
"shizukuOldAndroidWithADB": "Shizuku działa na Androidzie < 8.1 z ADB - zaktualizuj Androida lub użyj zamiast tego Sui",
|
"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).",
|
"shizukuPretendToBeGooglePlay": "Ustaw Google Play jako źródło instalacji (jeśli używana jest aplikacja Shizuku)",
|
||||||
"useSystemFont": "Użyj czcionki systemowej",
|
"useSystemFont": "Czcionka systemowa",
|
||||||
"useVersionCodeAsOSVersion": "Użyj kodu wersji aplikacji jako wersji wykrytej przez system operacyjny",
|
"useVersionCodeAsOSVersion": "Użyj versionCode aplikacji jako wersji wykrytej przez system operacyjny",
|
||||||
"requestHeader": "Nagłówek żądania",
|
"requestHeader": "Nagłówek żądania",
|
||||||
"useLatestAssetDateAsReleaseDate": "Użyj najnowszego przesłanego zasobu jako daty wydania",
|
"useLatestAssetDateAsReleaseDate": "Użyj najnowszego przesłanego zasobu jako daty wydania",
|
||||||
"defaultPseudoVersioningMethod": "Domyślna metoda pseudowersji",
|
"defaultPseudoVersioningMethod": "Domyślna metoda pseudo-wersji",
|
||||||
"partialAPKHash": "Częściowy skrót APK",
|
"partialAPKHash": "Częściowy Hash pliku apk",
|
||||||
"APKLinkHash": "Skrót łącza APK",
|
"APKLinkHash": "Link Hash pliku apk",
|
||||||
"directAPKLink": "Bezpośredni link APK",
|
"directAPKLink": "Bezpośredni link do pliku apk",
|
||||||
"pseudoVersionInUse": "Pseudowersja jest w użyciu",
|
"pseudoVersionInUse": "Pseudo-wersja jest w użyciu",
|
||||||
"installed": "Zainstalowano",
|
"installed": "Zainstalowano",
|
||||||
"latest": "Najnowszy",
|
"latest": "Najnowsza",
|
||||||
"invertRegEx": "Odwróć wyrażenie regularne",
|
"invertRegEx": "Odwróć wyrażenie regularne",
|
||||||
"note": "Uwaga",
|
"note": "Uwaga",
|
||||||
"selfHostedNote": "Lista rozwijana \"{}\" może być używana do uzyskiwania dostępu do samodzielnie hostowanych / niestandardowych instancji dowolnego źródła.",
|
"selfHostedNote": "Wybierz \"{}\", aby uzyskać dostęp do samodzielnie hostowanych lub niestandardowych instancji dowolnego źródła.",
|
||||||
"badDownload": "Nie można przeanalizować pliku APK (niekompatybilny lub częściowo pobrany).",
|
"badDownload": "Nie można przeanalizować pliku apk (jest niekompatybilny lub częściowo pobrany)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Udostępnianie nowych aplikacji za pomocą AppVerifier (jeśli dostępne)",
|
"beforeNewInstallsShareToAppVerifier": "Udostępnij nowe aplikacje za pomocą weryfikatora aplikacji (jeśli jest dostępny)",
|
||||||
"appVerifierInstructionToast": "Udostępnij w AppVerifier, a następnie wróć tutaj, gdy będziesz gotowy.",
|
"appVerifierInstructionToast": "Udostępnij do weryfikatora aplikacji, a następnie wróć tutaj.",
|
||||||
"wiki": "Pomoc/Wiki",
|
"wiki": "Pomoc/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Konfiguracje aplikacji pochodzące z crowdsourcingu (korzystanie na własne ryzyko)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Usunąć aplikację?",
|
"one": "Usunąć aplikację?",
|
||||||
"few": "Usunąć aplikacje?",
|
"few": "Usunąć aplikacje?",
|
||||||
@ -385,8 +391,10 @@
|
|||||||
"other": "{} i {} inne apki zostały zaktualizowane."
|
"other": "{} i {} inne apki zostały zaktualizowane."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesFailed": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "Nie udało się zaktualizować {} i 1 innej aplikacji.",
|
"one": "Błąd aktualizacji {} i 1 innej apki.",
|
||||||
"other": "Nie udało się zaktualizować {} i {} więcej aplikacji."
|
"few": "Błąd aktualizacji {} i {} innych apek.",
|
||||||
|
"many": "Błąd aktualizacji {} i {} innych apek.",
|
||||||
|
"other": "Błąd aktualizacji {} i {} innych apek."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} i 1 inna apka mogły zostać zaktualizowane.",
|
"one": "{} i 1 inna apka mogły zostać zaktualizowane.",
|
||||||
@ -395,7 +403,9 @@
|
|||||||
"other": "{} i {} inne apki mogły zostać zaktualizowane."
|
"other": "{} i {} inne apki mogły zostać zaktualizowane."
|
||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{} APK",
|
"one": "{} apk",
|
||||||
"other": "{} APK"
|
"few": "{} apki",
|
||||||
|
"many": "{} apek",
|
||||||
|
"other": "{} apki"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "Nenhum aplicativo foi encontrado com esse ID ou nome",
|
"appWithIdOrNameNotFound": "Nenhum aplicativo foi encontrado com esse ID ou nome",
|
||||||
"reposHaveMultipleApps": "Repositórios podem conter múltiplos aplicativos",
|
"reposHaveMultipleApps": "Repositórios podem conter múltiplos aplicativos",
|
||||||
"fdroidThirdPartyRepo": "Repositórios de terceiros F-Droid",
|
"fdroidThirdPartyRepo": "Repositórios de terceiros F-Droid",
|
||||||
"steamMobile": "Steam para celular",
|
|
||||||
"steamChat": "Chat do Steam",
|
|
||||||
"install": "Instalar",
|
"install": "Instalar",
|
||||||
"markInstalled": "Marcar instalado",
|
"markInstalled": "Marcar instalado",
|
||||||
"update": "Atualizar",
|
"update": "Atualizar",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "Desinstalar do dispositivo",
|
"uninstallFromDevice": "Desinstalar do dispositivo",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Apenas funciona para aplicativos com detecção de versão desativada.",
|
"onlyWorksWithNonVersionDetectApps": "Apenas funciona para aplicativos com detecção de versão desativada.",
|
||||||
"releaseDateAsVersion": "Usar data de lançamento como versão",
|
"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.",
|
"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",
|
"changes": "Alterações",
|
||||||
"releaseDate": "Data de lançamento",
|
"releaseDate": "Data de lançamento",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "Link intermediário",
|
"intermediateLink": "Link intermediário",
|
||||||
"exemptFromBackgroundUpdates": "Isento de atualizações em segundo-plano (se ativadas)",
|
"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",
|
"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",
|
"autoSelectHighestVersionCode": "Auto-selecionar a versão mais recente",
|
||||||
"versionExtractionRegEx": "Regex de extração de versão",
|
"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",
|
"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",
|
"highlightTouchTargets": "Realçar áreas sensíveis ao toque que são menos óbvias",
|
||||||
"pickExportDir": "Escolher diretório para exportação",
|
"pickExportDir": "Escolher diretório para exportação",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "Partilhe com o AppVerifier e, em seguida, regresse aqui quando estiver pronto.",
|
"appVerifierInstructionToast": "Partilhe com o AppVerifier e, em seguida, regresse aqui quando estiver pronto.",
|
||||||
"wiki": "Ajuda/Wiki",
|
"wiki": "Ajuda/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Configurações de aplicações de crowdsourcing (utilização por sua conta e risco)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remover aplicativo?",
|
"one": "Remover aplicativo?",
|
||||||
"other": "Remover aplicativos?"
|
"other": "Remover aplicativos?"
|
||||||
|
@ -129,7 +129,7 @@
|
|||||||
"pinUpdates": "Отображать обновления приложений сверху списка",
|
"pinUpdates": "Отображать обновления приложений сверху списка",
|
||||||
"updates": "Обновления",
|
"updates": "Обновления",
|
||||||
"sourceSpecific": "Настройки источников",
|
"sourceSpecific": "Настройки источников",
|
||||||
"appSource": "Исходный код",
|
"appSource": "Источник",
|
||||||
"noLogs": "Нет журналов",
|
"noLogs": "Нет журналов",
|
||||||
"appLogs": "Логи",
|
"appLogs": "Логи",
|
||||||
"close": "Закрыть",
|
"close": "Закрыть",
|
||||||
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "Приложение с таким ID или названием не было найдено",
|
"appWithIdOrNameNotFound": "Приложение с таким ID или названием не было найдено",
|
||||||
"reposHaveMultipleApps": "В хранилище несколько приложений",
|
"reposHaveMultipleApps": "В хранилище несколько приложений",
|
||||||
"fdroidThirdPartyRepo": "Сторонние репозитории F-Droid",
|
"fdroidThirdPartyRepo": "Сторонние репозитории F-Droid",
|
||||||
"steamMobile": "Приложение Steam",
|
|
||||||
"steamChat": "Steam Chat",
|
|
||||||
"install": "Установить",
|
"install": "Установить",
|
||||||
"markInstalled": "Пометить как установленное",
|
"markInstalled": "Пометить как установленное",
|
||||||
"update": "Обновить",
|
"update": "Обновить",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "Удалить с устройства",
|
"uninstallFromDevice": "Удалить с устройства",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Работает только для приложений с отключенным определением версии",
|
"onlyWorksWithNonVersionDetectApps": "Работает только для приложений с отключенным определением версии",
|
||||||
"releaseDateAsVersion": "Дата выпуска вместо версии",
|
"releaseDateAsVersion": "Дата выпуска вместо версии",
|
||||||
|
"releaseTitleAsVersion": "Используйте название релиза в качестве строки версии",
|
||||||
"releaseDateAsVersionExplanation": "Этот параметр следует использовать только для приложений, в которых определение версии не работает правильно, но имеется дата выпуска",
|
"releaseDateAsVersionExplanation": "Этот параметр следует использовать только для приложений, в которых определение версии не работает правильно, но имеется дата выпуска",
|
||||||
"changes": "Изменения",
|
"changes": "Изменения",
|
||||||
"releaseDate": "Дата выпуска",
|
"releaseDate": "Дата выпуска",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "Промежуточная ссылка",
|
"intermediateLink": "Промежуточная ссылка",
|
||||||
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",
|
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",
|
||||||
"bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi",
|
"bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi",
|
||||||
|
"bgUpdatesWhileChargingOnly": "Отключение фоновых обновлений при отсутствии зарядки",
|
||||||
"autoSelectHighestVersionCode": "Автоматически выбирать APK с актуальной версией кода",
|
"autoSelectHighestVersionCode": "Автоматически выбирать APK с актуальной версией кода",
|
||||||
"versionExtractionRegEx": "Регулярное выражение для извлечения версии",
|
"versionExtractionRegEx": "Регулярное выражение для извлечения версии",
|
||||||
|
"trimVersionString": "Обрезка строки версии с помощью RegEx",
|
||||||
|
"matchGroupToUseForX": "Группа соответствия, которую следует использовать для \"{}\"",
|
||||||
"matchGroupToUse": "Выберите группу для использования",
|
"matchGroupToUse": "Выберите группу для использования",
|
||||||
"highlightTouchTargets": "Выделить менее очевидные элементы управления касанием",
|
"highlightTouchTargets": "Выделить менее очевидные элементы управления касанием",
|
||||||
"pickExportDir": "Выбрать каталог для экспорта",
|
"pickExportDir": "Выбрать каталог для экспорта",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.",
|
"appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.",
|
||||||
"wiki": "Помощь/Вики",
|
"wiki": "Помощь/Вики",
|
||||||
"crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)",
|
"crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)",
|
||||||
|
"crowdsourcedConfigsShort": "Конфиги приложений с помощью краудсорсинга",
|
||||||
|
"allowInsecure": "Разрешить небезопасные HTTP-запросы",
|
||||||
|
"stayOneVersionBehind": "Не отставайте от последней версии",
|
||||||
|
"refreshBeforeDownload": "Обновляйте информацию о приложении перед загрузкой",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Удалить приложение?",
|
"one": "Удалить приложение?",
|
||||||
"other": "Удалить приложения?"
|
"other": "Удалить приложения?"
|
||||||
|
@ -12,7 +12,8 @@ const neverAutoTranslate = {
|
|||||||
root: ['*'],
|
root: ['*'],
|
||||||
obtainiumExportHyphenatedLowercase: ['*'],
|
obtainiumExportHyphenatedLowercase: ['*'],
|
||||||
theme: ['de'],
|
theme: ['de'],
|
||||||
appId: ['de']
|
appId: ['de'],
|
||||||
|
placeholder: ['pl']
|
||||||
}
|
}
|
||||||
|
|
||||||
const translateText = async (text, targetLang, authKey) => {
|
const translateText = async (text, targetLang, authKey) => {
|
||||||
|
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "Ingen App funnen med det namnet eller ID",
|
"appWithIdOrNameNotFound": "Ingen App funnen med det namnet eller ID",
|
||||||
"reposHaveMultipleApps": "Förråd kan innehålla flera ApparR",
|
"reposHaveMultipleApps": "Förråd kan innehålla flera ApparR",
|
||||||
"fdroidThirdPartyRepo": "F-Droid Tredjeparts Förråd",
|
"fdroidThirdPartyRepo": "F-Droid Tredjeparts Förråd",
|
||||||
"steamMobile": "Steam Mobile",
|
|
||||||
"steamChat": "Steam Chat",
|
|
||||||
"install": "Installera",
|
"install": "Installera",
|
||||||
"markInstalled": "Märk Installerad",
|
"markInstalled": "Märk Installerad",
|
||||||
"update": "Uppdatera",
|
"update": "Uppdatera",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "Avinstallera från Enheten",
|
"uninstallFromDevice": "Avinstallera från Enheten",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Fungerar bara för Appar med versionsdetektering inaktiverat..",
|
"onlyWorksWithNonVersionDetectApps": "Fungerar bara för Appar med versionsdetektering inaktiverat..",
|
||||||
"releaseDateAsVersion": "Använd releasedatum som version",
|
"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.",
|
"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",
|
"changes": "Ändringar",
|
||||||
"releaseDate": "Releasedatum",
|
"releaseDate": "Releasedatum",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "Mellanlänk",
|
"intermediateLink": "Mellanlänk",
|
||||||
"exemptFromBackgroundUpdates": "Undta från bakgrundsuppdateringar (om aktiverad)",
|
"exemptFromBackgroundUpdates": "Undta från bakgrundsuppdateringar (om aktiverad)",
|
||||||
"bgUpdatesOnWiFiOnly": "Inaktivera Bakgrundsuppdateringar utan WiFi",
|
"bgUpdatesOnWiFiOnly": "Inaktivera Bakgrundsuppdateringar utan WiFi",
|
||||||
|
"bgUpdatesWhileChargingOnly": "Inaktivera bakgrundsuppdateringar när du inte laddar",
|
||||||
"autoSelectHighestVersionCode": "Välj automatiskt högsta versionskod APK",
|
"autoSelectHighestVersionCode": "Välj automatiskt högsta versionskod APK",
|
||||||
"versionExtractionRegEx": "Version Extraction RegEx",
|
"versionExtractionRegEx": "Version Extraction RegEx",
|
||||||
|
"trimVersionString": "Trimma versionssträng med RegEx",
|
||||||
|
"matchGroupToUseForX": "Matchningsgrupp att använda för \"{}\"",
|
||||||
"matchGroupToUse": "Match Group to Use",
|
"matchGroupToUse": "Match Group to Use",
|
||||||
"highlightTouchTargets": "Markera mindre uppenbara beröringsobjekt",
|
"highlightTouchTargets": "Markera mindre uppenbara beröringsobjekt",
|
||||||
"pickExportDir": "Välj Exportsökväg",
|
"pickExportDir": "Välj Exportsökväg",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "Dela till AppVerifier och återvänd sedan hit när du är klar.",
|
"appVerifierInstructionToast": "Dela till AppVerifier och återvänd sedan hit när du är klar.",
|
||||||
"wiki": "Hjälp/Wiki",
|
"wiki": "Hjälp/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourcade appkonfigurationer (använd på egen risk)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Ta Bort App?",
|
"one": "Ta Bort App?",
|
||||||
"other": "Ta Bort Appar?"
|
"other": "Ta Bort Appar?"
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"noReleaseFound": "Uygun bir sürüm bulunamadı",
|
"noReleaseFound": "Uygun bir sürüm bulunamadı",
|
||||||
"noVersionFound": "Sürüm bulunamadı",
|
"noVersionFound": "Sürüm bulunamadı",
|
||||||
"urlMatchesNoSource": "URL, bilinen bir kaynağa uymuyor",
|
"urlMatchesNoSource": "URL, bilinen bir kaynağa uymuyor",
|
||||||
"cantInstallOlderVersion": "Eski bir sürümü yükleyemem",
|
"cantInstallOlderVersion": "Eski bir sürüm yüklenemez",
|
||||||
"appIdMismatch": "İndirilen paket kimliği mevcut Uygulama kimliği ile eşleşmiyor",
|
"appIdMismatch": "İndirilen paket kimliği mevcut Uygulama kimliği ile eşleşmiyor",
|
||||||
"functionNotImplemented": "Bu sınıf bu işlevi uygulamamıştır",
|
"functionNotImplemented": "Bu sınıf bu işlevi uygulamamıştır",
|
||||||
"placeholder": "Yer Tutucu",
|
"placeholder": "Yer Tutucu",
|
||||||
@ -13,22 +13,22 @@
|
|||||||
"and": "ve",
|
"and": "ve",
|
||||||
"githubPATLabel": "GitHub Kişisel Erişim Anahtarı (Sınırlamayı Artırır)",
|
"githubPATLabel": "GitHub Kişisel Erişim Anahtarı (Sınırlamayı Artırır)",
|
||||||
"includePrereleases": "Ön sürümleri dahil et",
|
"includePrereleases": "Ön sürümleri dahil et",
|
||||||
"fallbackToOlderReleases": "Daha eski sürümlere geri dön",
|
"fallbackToOlderReleases": "Daha eski sürümleri alternatif olarak tut",
|
||||||
"filterReleaseTitlesByRegEx": "Düzenli İfadelerle Sürüm Başlıklarını Filtrele",
|
"filterReleaseTitlesByRegEx": "Düzenli İfadelerle Sürüm Başlıklarını Filtrele",
|
||||||
"invalidRegEx": "Geçersiz düzenli ifade",
|
"invalidRegEx": "Geçersiz düzenli ifade",
|
||||||
"noDescription": "Açıklama yok",
|
"noDescription": "Açıklama yok",
|
||||||
"cancel": "İptal",
|
"cancel": "İptal",
|
||||||
"continue": "Devam Et",
|
"continue": "Devam Et",
|
||||||
"requiredInBrackets": "(Gerekli)",
|
"requiredInBrackets": "(Gerekli)",
|
||||||
"dropdownNoOptsError": "HATA: DİPLOMADA EN AZ BİR SEÇENEK OLMALI",
|
"dropdownNoOptsError": "HATA: AÇILIR MENÜDE EN AZ BİR SEÇENEK OLMALI",
|
||||||
"colour": "Renk",
|
"colour": "Renk",
|
||||||
"standard": "Standart",
|
"standard": "Standart",
|
||||||
"custom": "Özel",
|
"custom": "Özel",
|
||||||
"useMaterialYou": "Sizin Malzemenizi Kullanın",
|
"useMaterialYou": "MaterialYou Kullanın",
|
||||||
"githubStarredRepos": "GitHub'a Yıldızlı Depolar",
|
"githubStarredRepos": "GitHub Yıldızlı Depolar",
|
||||||
"uname": "Kullanıcı Adı",
|
"uname": "Kullanıcı Adı",
|
||||||
"wrongArgNum": "Hatalı argüman sayısı sağlandı",
|
"wrongArgNum": "Hatalı sayıda argüman sağlandı",
|
||||||
"xIsTrackOnly": "{} yalnızca Takip Edilen",
|
"xIsTrackOnly": "{} yalnızca Takip Ediliyor",
|
||||||
"source": "Kaynak",
|
"source": "Kaynak",
|
||||||
"app": "Uygulama",
|
"app": "Uygulama",
|
||||||
"appsFromSourceAreTrackOnly": "Bu kaynaktan gelen uygulamalar 'Yalnızca Takip Edilen'dir.",
|
"appsFromSourceAreTrackOnly": "Bu kaynaktan gelen uygulamalar 'Yalnızca Takip Edilen'dir.",
|
||||||
@ -41,9 +41,9 @@
|
|||||||
"appSourceURL": "Uygulama Kaynak URL'si",
|
"appSourceURL": "Uygulama Kaynak URL'si",
|
||||||
"error": "Hata",
|
"error": "Hata",
|
||||||
"add": "Ekle",
|
"add": "Ekle",
|
||||||
"searchSomeSourcesLabel": "Ara (Bazı Kaynaklar Yalnızca)",
|
"searchSomeSourcesLabel": "Ara (Yalnızca Bazı Kaynaklar)",
|
||||||
"search": "Ara",
|
"search": "Ara",
|
||||||
"additionalOptsFor": "{} İçin Ek Seçenekler",
|
"additionalOptsFor": "{} için Ek Seçenekler",
|
||||||
"supportedSources": "Desteklenen Kaynaklar",
|
"supportedSources": "Desteklenen Kaynaklar",
|
||||||
"trackOnlyInBrackets": "(Yalnızca Takip)",
|
"trackOnlyInBrackets": "(Yalnızca Takip)",
|
||||||
"searchableInBrackets": "(Aranabilir)",
|
"searchableInBrackets": "(Aranabilir)",
|
||||||
@ -173,14 +173,12 @@
|
|||||||
"lastUpdateCheckX": "Son Güncelleme Kontrolü: {}",
|
"lastUpdateCheckX": "Son Güncelleme Kontrolü: {}",
|
||||||
"remove": "Kaldır",
|
"remove": "Kaldır",
|
||||||
"yesMarkUpdated": "Evet, Güncellendi olarak İşaretle",
|
"yesMarkUpdated": "Evet, Güncellendi olarak İşaretle",
|
||||||
"fdroid": "F-Droid Resmi",
|
"fdroid": "Resmi F-Droid",
|
||||||
"appIdOrName": "Uygulama Kimliği veya Adı",
|
"appIdOrName": "Uygulama Kimliği veya Adı",
|
||||||
"appId": "Uygulama Kimliği",
|
"appId": "Uygulama Kimliği",
|
||||||
"appWithIdOrNameNotFound": "Bu kimlik veya ada sahip bir uygulama bulunamadı",
|
"appWithIdOrNameNotFound": "Bu kimlik veya ada sahip bir uygulama bulunamadı",
|
||||||
"reposHaveMultipleApps": "Depolar birden fazla uygulama içerebilir",
|
"reposHaveMultipleApps": "Depolar birden fazla uygulama içerebilir",
|
||||||
"fdroidThirdPartyRepo": "F-Droid Üçüncü Taraf Depo",
|
"fdroidThirdPartyRepo": "F-Droid Üçüncü Parti Depo",
|
||||||
"steamMobile": "Buhar Mobil",
|
|
||||||
"steamChat": "Steam Sohbet",
|
|
||||||
"install": "Yükle",
|
"install": "Yükle",
|
||||||
"markInstalled": "Yüklendi olarak İşaretle",
|
"markInstalled": "Yüklendi olarak İşaretle",
|
||||||
"update": "Güncelle",
|
"update": "Güncelle",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "Cihazdan Kaldır",
|
"uninstallFromDevice": "Cihazdan Kaldır",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Yalnızca Sürüm Algılaması Devre Dışı Uygulamalar İçin Çalışır.",
|
"onlyWorksWithNonVersionDetectApps": "Yalnızca Sürüm Algılaması Devre Dışı Uygulamalar İçin Çalışır.",
|
||||||
"releaseDateAsVersion": "Sürüm Olarak Yayın Tarihi Kullan",
|
"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.",
|
"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",
|
"changes": "Değişiklikler",
|
||||||
"releaseDate": "Yayın Tarihi",
|
"releaseDate": "Yayın Tarihi",
|
||||||
@ -222,7 +221,7 @@
|
|||||||
"standardVersionDetection": "Standart sürüm tespiti",
|
"standardVersionDetection": "Standart sürüm tespiti",
|
||||||
"groupByCategory": "Kategoriye Göre Grupla",
|
"groupByCategory": "Kategoriye Göre Grupla",
|
||||||
"autoApkFilterByArch": "Mümkünse APK'leri CPU mimarisi ile filtreleme girişimi",
|
"autoApkFilterByArch": "Mümkünse APK'leri CPU mimarisi ile filtreleme girişimi",
|
||||||
"overrideSource": "Kaynağı Geçersiz Kıl",
|
"overrideSource": "Öncelenecek Kaynak",
|
||||||
"dontShowAgain": "Bunu tekrar gösterme",
|
"dontShowAgain": "Bunu tekrar gösterme",
|
||||||
"dontShowTrackOnlyWarnings": "'Yalnızca Takip Edilen' uyarılarını gösterme",
|
"dontShowTrackOnlyWarnings": "'Yalnızca Takip Edilen' uyarılarını gösterme",
|
||||||
"dontShowAPKOriginWarnings": "APK kaynağı uyarılarını gösterme",
|
"dontShowAPKOriginWarnings": "APK kaynağı uyarılarını gösterme",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "Ara bağlantı",
|
"intermediateLink": "Ara bağlantı",
|
||||||
"exemptFromBackgroundUpdates": "Arka plan güncellemelerinden muaf tut (etkinse)",
|
"exemptFromBackgroundUpdates": "Arka plan güncellemelerinden muaf tut (etkinse)",
|
||||||
"bgUpdatesOnWiFiOnly": "WiFi olmadığında arka plan güncellemelerini devre dışı bırak",
|
"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ç",
|
"autoSelectHighestVersionCode": "Otomatik olarak en yüksek sürüm kodunu seç",
|
||||||
"versionExtractionRegEx": "Sürüm Çıkarma Düzenli İfade",
|
"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",
|
"matchGroupToUse": "Sürüm Çıkarma Regex için Kullanılacak Eşleşme Grubu",
|
||||||
"highlightTouchTargets": "Daha az belirgin dokunma hedeflerini vurgula",
|
"highlightTouchTargets": "Daha az belirgin dokunma hedeflerini vurgula",
|
||||||
"pickExportDir": "Dışa Aktarılacak Klasörü Seç",
|
"pickExportDir": "Dışa Aktarılacak Klasörü Seç",
|
||||||
@ -286,10 +288,10 @@
|
|||||||
"checkingForUpdatesNotifChannel": "Güncellemeler Kontrol Ediliyor",
|
"checkingForUpdatesNotifChannel": "Güncellemeler Kontrol Ediliyor",
|
||||||
"onlyCheckInstalledOrTrackOnlyApps": "Yalnızca yüklü ve Yalnızca İzleme Uygulamalarını güncelleme",
|
"onlyCheckInstalledOrTrackOnlyApps": "Yalnızca yüklü ve Yalnızca İzleme Uygulamalarını güncelleme",
|
||||||
"supportFixedAPKURL": "Sabit APK URL'lerini destekleyin",
|
"supportFixedAPKURL": "Sabit APK URL'lerini destekleyin",
|
||||||
"selectX": "Seçme {}",
|
"selectX": "{} Tanesini Seç",
|
||||||
"parallelDownloads": "Paralel indirmelere izin ver",
|
"parallelDownloads": "Paralel indirmelere izin ver",
|
||||||
"useShizuku": "Yüklemek için Shizuku veya Sui'yi kullanın",
|
"useShizuku": "Yüklemek için Shizuku veya Sui'yi kullanın",
|
||||||
"shizukuBinderNotFound": "Shizuku is not running",
|
"shizukuBinderNotFound": "Shizuku servisi çalışmıyor",
|
||||||
"shizukuOld": "Eski Shizuku sürümü (<11) - güncelleyin",
|
"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",
|
"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)",
|
"shizukuPretendToBeGooglePlay": "Google Play'i yükleme kaynağı olarak ayarlayın (Shizuku kullanılıyorsa)",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "AppVerifier ile paylaşın, hazır olduğunuzda buraya dönün.",
|
"appVerifierInstructionToast": "AppVerifier ile paylaşın, hazır olduğunuzda buraya dönün.",
|
||||||
"wiki": "Yardım/Wiki",
|
"wiki": "Yardım/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Kitle Kaynaklı Uygulama Yapılandırmaları (riski size ait olmak üzere kullanın)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Uygulamayı Kaldır?",
|
"one": "Uygulamayı Kaldır?",
|
||||||
"other": "Uygulamaları Kaldır?"
|
"other": "Uygulamaları Kaldır?"
|
||||||
@ -334,7 +340,7 @@
|
|||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
"one": "{} URL",
|
"one": "{} URL",
|
||||||
"other": "{} URL'ler"
|
"other": "{} URL"
|
||||||
},
|
},
|
||||||
"minute": {
|
"minute": {
|
||||||
"one": "{} Dakika",
|
"one": "{} Dakika",
|
||||||
@ -370,6 +376,6 @@
|
|||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{} APK",
|
"one": "{} APK",
|
||||||
"other": "{} APK'lar"
|
"other": "{} APK"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "Застосунок з таким ідентифікатором або назвою не знайдено",
|
"appWithIdOrNameNotFound": "Застосунок з таким ідентифікатором або назвою не знайдено",
|
||||||
"reposHaveMultipleApps": "Сховища можуть містити кілька застосунків",
|
"reposHaveMultipleApps": "Сховища можуть містити кілька застосунків",
|
||||||
"fdroidThirdPartyRepo": "F-Droid Стороннє сховище",
|
"fdroidThirdPartyRepo": "F-Droid Стороннє сховище",
|
||||||
"steamMobile": "Мобільний Steam",
|
|
||||||
"steamChat": "Чат Steam",
|
|
||||||
"install": "Встановити",
|
"install": "Встановити",
|
||||||
"markInstalled": "Позначити як встановлене",
|
"markInstalled": "Позначити як встановлене",
|
||||||
"update": "Оновити",
|
"update": "Оновити",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "Видалити з пристрою",
|
"uninstallFromDevice": "Видалити з пристрою",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Працює лише з застосунками з вимкненим визначенням версії.",
|
"onlyWorksWithNonVersionDetectApps": "Працює лише з застосунками з вимкненим визначенням версії.",
|
||||||
"releaseDateAsVersion": "Використовувати дату випуску як рядок версії",
|
"releaseDateAsVersion": "Використовувати дату випуску як рядок версії",
|
||||||
|
"releaseTitleAsVersion": "Використовувати назву випуску як рядок версії",
|
||||||
"releaseDateAsVersionExplanation": "Цю опцію слід використовувати лише для застосунків, де визначення версії працює неправильно, але є дата випуску.",
|
"releaseDateAsVersionExplanation": "Цю опцію слід використовувати лише для застосунків, де визначення версії працює неправильно, але є дата випуску.",
|
||||||
"changes": "Зміни",
|
"changes": "Зміни",
|
||||||
"releaseDate": "Дата випуску",
|
"releaseDate": "Дата випуску",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "Проміжне посилання",
|
"intermediateLink": "Проміжне посилання",
|
||||||
"exemptFromBackgroundUpdates": "Виключено з фонових оновлень (якщо ввімкнено)",
|
"exemptFromBackgroundUpdates": "Виключено з фонових оновлень (якщо ввімкнено)",
|
||||||
"bgUpdatesOnWiFiOnly": "Вимкнути фонові оновлення поза Wi-Fi",
|
"bgUpdatesOnWiFiOnly": "Вимкнути фонові оновлення поза Wi-Fi",
|
||||||
|
"bgUpdatesWhileChargingOnly": "Вимкнути фонові оновлення, коли не заряджається",
|
||||||
"autoSelectHighestVersionCode": "Автоматичний вибір APK з найвищим кодом версії",
|
"autoSelectHighestVersionCode": "Автоматичний вибір APK з найвищим кодом версії",
|
||||||
"versionExtractionRegEx": "Регулярний вираз для вилучення рядка версії",
|
"versionExtractionRegEx": "Регулярний вираз для вилучення рядка версії",
|
||||||
|
"trimVersionString": "Обрізати рядок версії за допомогою RegEx",
|
||||||
|
"matchGroupToUseForX": "Група збігів для \"{}\"",
|
||||||
"matchGroupToUse": "Група співпадінь для використання в регулярному виразі вилучення версії",
|
"matchGroupToUse": "Група співпадінь для використання в регулярному виразі вилучення версії",
|
||||||
"highlightTouchTargets": "Підсвічувати менш очевидні області дотику",
|
"highlightTouchTargets": "Підсвічувати менш очевидні області дотику",
|
||||||
"pickExportDir": "Вибрати каталог експорту",
|
"pickExportDir": "Вибрати каталог експорту",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "Надішліть на AppVerifier, а потім поверніться сюди, коли будете готові.",
|
"appVerifierInstructionToast": "Надішліть на AppVerifier, а потім поверніться сюди, коли будете готові.",
|
||||||
"wiki": "Довідка/Вікі",
|
"wiki": "Довідка/Вікі",
|
||||||
"crowdsourcedConfigsLabel": "Краудсорсингові конфігурації додатків (використовуйте на свій страх і ризик)",
|
"crowdsourcedConfigsLabel": "Краудсорсингові конфігурації додатків (використовуйте на свій страх і ризик)",
|
||||||
|
"crowdsourcedConfigsShort": "Налаштування краудсорсингових додатків",
|
||||||
|
"allowInsecure": "Дозволити незахищені HTTP-запити",
|
||||||
|
"stayOneVersionBehind": "Залишайтеся на одну версію актуальнішою",
|
||||||
|
"refreshBeforeDownload": "Оновіть інформацію про програму перед завантаженням",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Видалити застосунок?",
|
"one": "Видалити застосунок?",
|
||||||
"other": "Видалити застосунки?"
|
"other": "Видалити застосунки?"
|
||||||
|
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "Không tìm thấy ứng dụng nào có ID hoặc tên đó",
|
"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",
|
"reposHaveMultipleApps": "Kho có thể chứa nhiều Ứng dụng",
|
||||||
"fdroidThirdPartyRepo": "Kho lưu trữ bên thứ ba F-Droid",
|
"fdroidThirdPartyRepo": "Kho lưu trữ bên thứ ba F-Droid",
|
||||||
"steamMobile": "Điện thoại di động hơi nước",
|
|
||||||
"steamChat": "Trò chuyện hơi nước",
|
|
||||||
"install": "Cài đặt",
|
"install": "Cài đặt",
|
||||||
"markInstalled": "Đánh dấu là đã cài đặt",
|
"markInstalled": "Đánh dấu là đã cài đặt",
|
||||||
"update": "Cập nhật",
|
"update": "Cập nhật",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "Gỡ cài đặt khỏi thiết bị",
|
"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.",
|
"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",
|
"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.",
|
"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",
|
"changes": "Thay đổi",
|
||||||
"releaseDate": "Ngày phát hành",
|
"releaseDate": "Ngày phát hành",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "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)",
|
"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ó WiFi",
|
"bgUpdatesOnWiFiOnly": "Tắt cập nhật nền khi không có WiFi",
|
||||||
|
"bgUpdatesWhileChargingOnly": "Disable background updates when not charging",
|
||||||
"autoSelectHighestVersionCode": "Tự động chọn APK mã phiên bản cao nhất",
|
"autoSelectHighestVersionCode": "Tự động chọn APK mã phiên bản cao nhất",
|
||||||
"versionExtractionRegEx": "Trích xuất phiên bản RegEx",
|
"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",
|
"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",
|
"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",
|
"pickExportDir": "Chọn thư mục xuất",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.",
|
"appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.",
|
||||||
"wiki": "Trợ giúp/Wiki",
|
"wiki": "Trợ giúp/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
"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",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Gỡ ứng dụng?",
|
"one": "Gỡ ứng dụng?",
|
||||||
"other": "Gỡ ứng dụng?"
|
"other": "Gỡ ứng dụng?"
|
||||||
|
381
assets/translations/zh-Hant-TW.json
Normal file
381
assets/translations/zh-Hant-TW.json
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
{
|
||||||
|
"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": "停用非 WiFi 的背景更新",
|
||||||
|
"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",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
@ -1,375 +0,0 @@
|
|||||||
{
|
|
||||||
"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 Starred Repos",
|
|
||||||
"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 第三方倉庫",
|
|
||||||
"steamMobile": "Steam 行動版",
|
|
||||||
"steamChat": "Steam 聊天",
|
|
||||||
"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": "使用發佈日期作為版本字串",
|
|
||||||
"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": "禁用非 WiFi 的背景更新",
|
|
||||||
"autoSelectHighestVersionCode": "自動選擇最高 versionCode 的 APK",
|
|
||||||
"versionExtractionRegEx": "版本字串提取正則表達式",
|
|
||||||
"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": "群眾外包的應用程式配置(使用風險自負)",
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
}
|
|
@ -179,8 +179,6 @@
|
|||||||
"appWithIdOrNameNotFound": "未找到符合此 ID 或名称的应用",
|
"appWithIdOrNameNotFound": "未找到符合此 ID 或名称的应用",
|
||||||
"reposHaveMultipleApps": "存储库中可能包含多个应用",
|
"reposHaveMultipleApps": "存储库中可能包含多个应用",
|
||||||
"fdroidThirdPartyRepo": "F-Droid 第三方存储库",
|
"fdroidThirdPartyRepo": "F-Droid 第三方存储库",
|
||||||
"steamMobile": "Steam Mobile",
|
|
||||||
"steamChat": "Steam Chat",
|
|
||||||
"install": "安装",
|
"install": "安装",
|
||||||
"markInstalled": "标记为已安装",
|
"markInstalled": "标记为已安装",
|
||||||
"update": "更新",
|
"update": "更新",
|
||||||
@ -188,10 +186,10 @@
|
|||||||
"additionalOptions": "附加选项",
|
"additionalOptions": "附加选项",
|
||||||
"disableVersionDetection": "禁用版本检测",
|
"disableVersionDetection": "禁用版本检测",
|
||||||
"noVersionDetectionExplanation": "此选项应该仅用于无法进行版本检测的应用。",
|
"noVersionDetectionExplanation": "此选项应该仅用于无法进行版本检测的应用。",
|
||||||
"downloadingX": "正在下载“{}”",
|
"downloadingX": "正在下载 {}",
|
||||||
"downloadX": "下载 {}",
|
"downloadX": "下载 {}",
|
||||||
"downloadedX": "下载 {}",
|
"downloadedX": "已下载 {}",
|
||||||
"releaseAsset": "发行版附件",
|
"releaseAsset": "发行文件",
|
||||||
"downloadNotifDescription": "提示应用的下载进度",
|
"downloadNotifDescription": "提示应用的下载进度",
|
||||||
"noAPKFound": "未找到 APK 文件",
|
"noAPKFound": "未找到 APK 文件",
|
||||||
"noVersionDetection": "禁用版本检测",
|
"noVersionDetection": "禁用版本检测",
|
||||||
@ -213,6 +211,7 @@
|
|||||||
"uninstallFromDevice": "从设备中卸载",
|
"uninstallFromDevice": "从设备中卸载",
|
||||||
"onlyWorksWithNonVersionDetectApps": "仅适用于禁用版本检测的应用。",
|
"onlyWorksWithNonVersionDetectApps": "仅适用于禁用版本检测的应用。",
|
||||||
"releaseDateAsVersion": "将发行日期作为版本号",
|
"releaseDateAsVersion": "将发行日期作为版本号",
|
||||||
|
"releaseTitleAsVersion": "使用版本标题作为版本字符串",
|
||||||
"releaseDateAsVersionExplanation": "此选项应该仅用于无法进行版本检测但能够获取发行日期的应用。",
|
"releaseDateAsVersionExplanation": "此选项应该仅用于无法进行版本检测但能够获取发行日期的应用。",
|
||||||
"changes": "更新日志",
|
"changes": "更新日志",
|
||||||
"releaseDate": "发行日期",
|
"releaseDate": "发行日期",
|
||||||
@ -257,8 +256,11 @@
|
|||||||
"intermediateLink": "中转链接",
|
"intermediateLink": "中转链接",
|
||||||
"exemptFromBackgroundUpdates": "禁用后台更新(仅此应用生效,即使已启用全局后台更新)",
|
"exemptFromBackgroundUpdates": "禁用后台更新(仅此应用生效,即使已启用全局后台更新)",
|
||||||
"bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新",
|
"bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新",
|
||||||
|
"bgUpdatesWhileChargingOnly": "不充电时禁用后台更新",
|
||||||
"autoSelectHighestVersionCode": "自动选择内部版本号最高的 APK 文件",
|
"autoSelectHighestVersionCode": "自动选择内部版本号最高的 APK 文件",
|
||||||
"versionExtractionRegEx": "提取版本号的正则表达式",
|
"versionExtractionRegEx": "提取版本号的正则表达式",
|
||||||
|
"trimVersionString": "使用 RegEx 修剪版本字符串",
|
||||||
|
"matchGroupToUseForX": "用于\"{}\"的匹配组",
|
||||||
"matchGroupToUse": "从上述匹配结果中引用的捕获组",
|
"matchGroupToUse": "从上述匹配结果中引用的捕获组",
|
||||||
"highlightTouchTargets": "突出展示不明显的可交互区域",
|
"highlightTouchTargets": "突出展示不明显的可交互区域",
|
||||||
"pickExportDir": "选择导出文件夹",
|
"pickExportDir": "选择导出文件夹",
|
||||||
@ -312,6 +314,10 @@
|
|||||||
"appVerifierInstructionToast": "分享至 AppVerifier,完成后返回此处。",
|
"appVerifierInstructionToast": "分享至 AppVerifier,完成后返回此处。",
|
||||||
"wiki": "帮助/Wiki",
|
"wiki": "帮助/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "众包应用程序配置(使用风险自负)",
|
"crowdsourcedConfigsLabel": "众包应用程序配置(使用风险自负)",
|
||||||
|
"crowdsourcedConfigsShort": "众包应用程序配置",
|
||||||
|
"allowInsecure": "允许不安全的 HTTP 请求",
|
||||||
|
"stayOneVersionBehind": "比最新版本晚一个版本",
|
||||||
|
"refreshBeforeDownload": "下载前刷新应用程序详细信息",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "是否删除应用?",
|
"one": "是否删除应用?",
|
||||||
"other": "是否删除应用?"
|
"other": "是否删除应用?"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<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>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://github.com/ImranR98/Obtainium/wiki">Wiki</a></p>
|
<p>Read the <a href="https://wiki.obtainium.imranr.dev/">Wiki</a></p>
|
||||||
<p>
|
<p>
|
||||||
<b>Currently supported App sources:</b>
|
<b>Currently supported App sources:</b>
|
||||||
</p>
|
</p>
|
||||||
@ -9,7 +9,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li>GitHub</li>
|
<li>GitHub</li>
|
||||||
<li>GitLab</li>
|
<li>GitLab</li>
|
||||||
<li>Codeberg</li>
|
<li>Forgejo (Codeberg)</li>
|
||||||
<li>F-Droid</li>
|
<li>F-Droid</li>
|
||||||
<li>Third Party F-Droid Repos</li>
|
<li>Third Party F-Droid Repos</li>
|
||||||
<li>IzzyOnDroid</li>
|
<li>IzzyOnDroid</li>
|
||||||
|
@ -1 +1 @@
|
|||||||
Get android app updates directly from the source
|
Get Android app updates directly from the source
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<p>Obtainium позволяет вам устанавливать и обновлять приложения прямо с их объявлений о выпусках и получать уведомления о новых выпусках.</p>
|
<p>Obtainium позволяет вам устанавливать и обновлять приложения прямо с их объявлений о выпусках и получать уведомления о новых выпусках.</p>
|
||||||
<p>Для деталей читайте <a href="https://github.com/ImranR98/Obtainium/wiki">Вики</a></p>
|
<p>Для деталей читайте <a href="https://wiki.obtainium.imranr.dev/">Вики</a></p>
|
||||||
<p>
|
<p>
|
||||||
<b>Поддерживаемые источники приложений:</b>
|
<b>Поддерживаемые источники приложений:</b>
|
||||||
</p>
|
</p>
|
||||||
@ -9,7 +9,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li>GitHub</li>
|
<li>GitHub</li>
|
||||||
<li>GitLab</li>
|
<li>GitLab</li>
|
||||||
<li>Codeberg</li>
|
<li>Forgejo (Codeberg)</li>
|
||||||
<li>F-Droid</li>
|
<li>F-Droid</li>
|
||||||
<li>Third Party F-Droid Repos</li>
|
<li>Third Party F-Droid Repos</li>
|
||||||
<li>IzzyOnDroid</li>
|
<li>IzzyOnDroid</li>
|
||||||
|
@ -10,7 +10,7 @@ class APKCombo extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
|
@ -5,6 +5,8 @@ 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 {
|
||||||
@ -32,7 +34,17 @@ class APKMirror extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
Future<Map<String, String>?> getRequestHeaders(
|
||||||
|
Map<String, dynamic> additionalSettings,
|
||||||
|
{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(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/apk/[^/]+/[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}/apk/[^/]+/[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
|
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';
|
||||||
|
|
||||||
@ -24,19 +27,30 @@ class APKPure extends AppSource {
|
|||||||
allowSubDomains = true;
|
allowSubDomains = true;
|
||||||
naiveStandardVersionDetection = true;
|
naiveStandardVersionDetection = true;
|
||||||
showReleaseDateAsVersionToggle = 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(
|
RegExp standardUrlRegExB = RegExp(
|
||||||
'^https?://m.${getSourceRegex(hosts)}/+[^/]+/+[^/]+(/+[^/]+)?',
|
'^https?://m.${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
RegExpMatch? match = standardUrlRegExB.firstMatch(url);
|
RegExpMatch? match = standardUrlRegExB.firstMatch(url);
|
||||||
if (match != null) {
|
if (match != null) {
|
||||||
url = 'https://${getSourceRegex(hosts)}${Uri.parse(url).path}';
|
var uri = Uri.parse(url);
|
||||||
|
url = 'https://${uri.host.substring(2)}${uri.path}';
|
||||||
}
|
}
|
||||||
RegExp standardUrlRegExA = RegExp(
|
RegExp standardUrlRegExA = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+[^/]+(/+[^/]+)?',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
match = standardUrlRegExA.firstMatch(url);
|
match = standardUrlRegExA.firstMatch(url);
|
||||||
if (match == null) {
|
if (match == null) {
|
||||||
@ -51,30 +65,72 @@ class APKPure extends AppSource {
|
|||||||
return Uri.parse(standardUrl).pathSegments.last;
|
return Uri.parse(standardUrl).pathSegments.last;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
getDetailsForVersionLink(
|
||||||
Future<APKDetails> getLatestAPKDetails(
|
String standardUrl,
|
||||||
String standardUrl,
|
String appId,
|
||||||
Map<String, dynamic> additionalSettings,
|
String host,
|
||||||
) async {
|
List<String> supportedArchs,
|
||||||
String appId = (await tryInferringAppId(standardUrl))!;
|
String link,
|
||||||
String host = Uri.parse(standardUrl).host;
|
Map<String, dynamic> additionalSettings) async {
|
||||||
var res = await sourceRequest('$standardUrl/download', additionalSettings);
|
var res = await sourceRequest(link, additionalSettings);
|
||||||
var resChangelog = await sourceRequest(standardUrl, additionalSettings);
|
if (res.statusCode == 200) {
|
||||||
if (res.statusCode == 200 && resChangelog.statusCode == 200) {
|
|
||||||
var html = parse(res.body);
|
var html = parse(res.body);
|
||||||
var htmlChangelog = parse(resChangelog.body);
|
var apksDiv =
|
||||||
String? version = html.querySelector('span.info-sdk span')?.text.trim();
|
html.querySelector('#version-list div div.show-more-content');
|
||||||
if (version == null) {
|
DateTime? topReleaseDate;
|
||||||
throw NoVersionError();
|
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? dateString =
|
String version = Uri.parse(link).pathSegments.last;
|
||||||
html.querySelector('span.info-other span.date')?.text.trim();
|
|
||||||
DateTime? releaseDate = parseDateTimeMMMddCommayyyy(dateString);
|
|
||||||
String type = html.querySelector('a.info-tag')?.text.trim() ?? 'APK';
|
|
||||||
List<MapEntry<String, String>> apkUrls = [
|
|
||||||
MapEntry('$appId.apk',
|
|
||||||
'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?version=latest')
|
|
||||||
];
|
|
||||||
String author = html
|
String author = html
|
||||||
.querySelector('span.info-sdk')
|
.querySelector('span.info-sdk')
|
||||||
?.text
|
?.text
|
||||||
@ -83,15 +139,63 @@ class APKPure extends AppSource {
|
|||||||
Uri.parse(standardUrl).pathSegments.reversed.last;
|
Uri.parse(standardUrl).pathSegments.reversed.last;
|
||||||
String appName =
|
String appName =
|
||||||
html.querySelector('h1.info-title')?.text.trim() ?? appId;
|
html.querySelector('h1.info-title')?.text.trim() ?? appId;
|
||||||
String? changeLog = htmlChangelog
|
String? changeLog = html
|
||||||
.querySelector("div.whats-new-info p:not(.date)")
|
.querySelector('div.module.change-log')
|
||||||
?.innerHtml
|
?.innerHtml
|
||||||
.trim()
|
.trim()
|
||||||
.replaceAll("<br>", " \n");
|
.replaceAll("<br>", " \n");
|
||||||
return APKDetails(version, apkUrls, AppNames(author, appName),
|
return APKDetails(version, apkUrls, AppNames(author, appName),
|
||||||
releaseDate: releaseDate, changeLog: changeLog);
|
releaseDate: topReleaseDate, changeLog: changeLog);
|
||||||
} else {
|
} else {
|
||||||
throw getObtainiumHttpError(res);
|
throw getObtainiumHttpError(res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<APKDetails> getLatestAPKDetails(
|
||||||
|
String standardUrl,
|
||||||
|
Map<String, dynamic> additionalSettings,
|
||||||
|
) async {
|
||||||
|
String appId = (await tryInferringAppId(standardUrl))!;
|
||||||
|
String host = Uri.parse(standardUrl).host;
|
||||||
|
|
||||||
|
var res0 = await sourceRequest('$standardUrl/versions', additionalSettings);
|
||||||
|
var decodedStandardUrl = standardUrl;
|
||||||
|
try {
|
||||||
|
decodedStandardUrl = Uri.decodeFull(decodedStandardUrl);
|
||||||
|
} catch (e) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ class Aptoide extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}',
|
'^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
|
@ -5,6 +5,7 @@ import 'package:obtainium/providers/source_provider.dart';
|
|||||||
class Codeberg extends AppSource {
|
class Codeberg extends AppSource {
|
||||||
GitHub gh = GitHub();
|
GitHub gh = GitHub();
|
||||||
Codeberg() {
|
Codeberg() {
|
||||||
|
name = 'Forgejo (Codeberg)';
|
||||||
hosts = ['codeberg.org'];
|
hosts = ['codeberg.org'];
|
||||||
|
|
||||||
additionalSourceAppSpecificSettingFormItems =
|
additionalSourceAppSpecificSettingFormItems =
|
||||||
@ -15,7 +16,7 @@ class Codeberg extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:obtainium/app_sources/html.dart';
|
import 'package:obtainium/app_sources/html.dart';
|
||||||
|
import 'package:obtainium/custom_errors.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
class DirectAPKLink extends AppSource {
|
class DirectAPKLink extends AppSource {
|
||||||
HTML html = HTML();
|
HTML html = HTML();
|
||||||
|
|
||||||
DirectAPKLink() {
|
DirectAPKLink() {
|
||||||
neverAutoSelect = true;
|
|
||||||
name = tr('directAPKLink');
|
name = tr('directAPKLink');
|
||||||
additionalSourceAppSpecificSettingFormItems = html
|
additionalSourceAppSpecificSettingFormItems = html
|
||||||
.additionalSourceAppSpecificSettingFormItems
|
.additionalSourceAppSpecificSettingFormItems
|
||||||
@ -24,6 +24,19 @@ class DirectAPKLink extends AppSource {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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
|
@override
|
||||||
Future<Map<String, String>?> getRequestHeaders(
|
Future<Map<String, String>?> getRequestHeaders(
|
||||||
Map<String, dynamic> additionalSettings,
|
Map<String, dynamic> additionalSettings,
|
||||||
|
@ -38,14 +38,14 @@ class FDroid extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegExB = RegExp(
|
RegExp standardUrlRegExB = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+packages/+[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+packages/+[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
RegExpMatch? match = standardUrlRegExB.firstMatch(url);
|
RegExpMatch? match = standardUrlRegExB.firstMatch(url);
|
||||||
if (match != null) {
|
if (match != null) {
|
||||||
url =
|
url =
|
||||||
'https://${Uri.parse(match.group(0)!).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(
|
RegExp standardUrlRegExA = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/+packages/+[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}/+packages/+[^/]+',
|
||||||
|
@ -43,7 +43,7 @@ class FDroidRepo extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
var standardUri = Uri.parse(url);
|
var standardUri = Uri.parse(url);
|
||||||
var pathSegments = standardUri.pathSegments;
|
var pathSegments = standardUri.pathSegments;
|
||||||
if (pathSegments.isNotEmpty && pathSegments.last == 'index.xml') {
|
if (pathSegments.isNotEmpty && pathSegments.last == 'index.xml') {
|
||||||
|
@ -81,6 +81,10 @@ class GitHub extends AppSource {
|
|||||||
[
|
[
|
||||||
GeneratedFormSwitch('useLatestAssetDateAsReleaseDate',
|
GeneratedFormSwitch('useLatestAssetDateAsReleaseDate',
|
||||||
label: tr('useLatestAssetDateAsReleaseDate'), defaultValue: false)
|
label: tr('useLatestAssetDateAsReleaseDate'), defaultValue: false)
|
||||||
|
],
|
||||||
|
[
|
||||||
|
GeneratedFormSwitch('releaseTitleAsVersion',
|
||||||
|
label: tr('releaseTitleAsVersion'), defaultValue: false)
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -154,7 +158,7 @@ class GitHub extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
@ -171,7 +175,7 @@ class GitHub extends AppSource {
|
|||||||
{bool forAPKDownload = false}) async {
|
{bool forAPKDownload = false}) async {
|
||||||
var token = await getTokenIfAny(additionalSettings);
|
var token = await getTokenIfAny(additionalSettings);
|
||||||
var headers = <String, String>{};
|
var headers = <String, String>{};
|
||||||
if (token != null) {
|
if (token != null && token.isNotEmpty) {
|
||||||
headers[HttpHeaders.authorizationHeader] = 'Token $token';
|
headers[HttpHeaders.authorizationHeader] = 'Token $token';
|
||||||
}
|
}
|
||||||
if (forAPKDownload == true) {
|
if (forAPKDownload == true) {
|
||||||
@ -271,14 +275,15 @@ class GitHub extends AppSource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MapEntry<String, String>> getReleaseAssetUrls(dynamic release) =>
|
findReleaseAssetUrls(dynamic release) =>
|
||||||
(release['assets'] as List<dynamic>?)?.map((e) {
|
(release['assets'] as List<dynamic>?)?.map((e) {
|
||||||
var url = !e['name'].toString().toLowerCase().endsWith('.apk')
|
var url = !e['name'].toString().toLowerCase().endsWith('.apk')
|
||||||
? (e['browser_download_url'] ?? e['url'])
|
? (e['browser_download_url'] ?? e['url'])
|
||||||
: (e['url'] ?? e['browser_download_url']);
|
: (e['url'] ?? e['browser_download_url']);
|
||||||
return (e['name'] != null) && (url != null)
|
e['final_url'] = (e['name'] != null) && (url != null)
|
||||||
? MapEntry(e['name'] as String, url as String)
|
? MapEntry(e['name'] as String, url as String)
|
||||||
: const MapEntry('', '');
|
: const MapEntry('', '');
|
||||||
|
return e;
|
||||||
}).toList() ??
|
}).toList() ??
|
||||||
[];
|
[];
|
||||||
|
|
||||||
@ -289,7 +294,9 @@ class GitHub extends AppSource {
|
|||||||
? DateTime.parse(rel['commit']['created'])
|
? DateTime.parse(rel['commit']['created'])
|
||||||
: null;
|
: null;
|
||||||
DateTime? getNewestAssetDateFromRelease(dynamic rel) {
|
DateTime? getNewestAssetDateFromRelease(dynamic rel) {
|
||||||
var t = (rel['assets'] as List<dynamic>?)
|
var allAssets = rel['assets'] as List<dynamic>?;
|
||||||
|
var filteredAssets = rel['filteredAssets'] as List<dynamic>?;
|
||||||
|
var t = (filteredAssets ?? allAssets)
|
||||||
?.map((e) {
|
?.map((e) {
|
||||||
return e?['updated_at'] != null
|
return e?['updated_at'] != null
|
||||||
? DateTime.parse(e['updated_at'])
|
? DateTime.parse(e['updated_at'])
|
||||||
@ -383,20 +390,42 @@ class GitHub extends AppSource {
|
|||||||
.hasMatch(((releases[i]['body'] as String?) ?? '').trim())) {
|
.hasMatch(((releases[i]['body'] as String?) ?? '').trim())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var allAssetUrls = getReleaseAssetUrls(releases[i]);
|
var allAssetsWithUrls = findReleaseAssetUrls(releases[i]);
|
||||||
List<MapEntry<String, String>> apkUrls = allAssetUrls
|
List<MapEntry<String, String>> allAssetUrls = allAssetsWithUrls
|
||||||
.where((element) => element.key.toLowerCase().endsWith('.apk'))
|
.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();
|
.toList();
|
||||||
|
|
||||||
apkUrls = filterApks(apkUrls, additionalSettings['apkFilterRegEx'],
|
var filteredApkUrls = filterApks(
|
||||||
|
apkAssetsWithUrls
|
||||||
|
.map((e) => e['final_url'] as MapEntry<String, String>)
|
||||||
|
.toList(),
|
||||||
|
additionalSettings['apkFilterRegEx'],
|
||||||
additionalSettings['invertAPKFilter']);
|
additionalSettings['invertAPKFilter']);
|
||||||
if (apkUrls.isEmpty && additionalSettings['trackOnly'] != true) {
|
var filteredApks = apkAssetsWithUrls
|
||||||
|
.where((e) => filteredApkUrls
|
||||||
|
.where((e2) =>
|
||||||
|
e2.key == (e['final_url'] as MapEntry<String, String>).key)
|
||||||
|
.isNotEmpty)
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
if (apkAssetsWithUrls.isEmpty &&
|
||||||
|
additionalSettings['trackOnly'] != true) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
targetRelease = releases[i];
|
targetRelease = releases[i];
|
||||||
targetRelease['apkUrls'] = apkUrls;
|
targetRelease['apkUrls'] = filteredApkUrls;
|
||||||
|
targetRelease['filteredAssets'] = filteredApks;
|
||||||
targetRelease['version'] =
|
targetRelease['version'] =
|
||||||
targetRelease['tag_name'] ?? targetRelease['name'];
|
additionalSettings['releaseTitleAsVersion'] == true
|
||||||
|
? nameToFilter
|
||||||
|
: targetRelease['tag_name'] ?? targetRelease['name'];
|
||||||
if (targetRelease['tarball_url'] != null) {
|
if (targetRelease['tarball_url'] != null) {
|
||||||
allAssetUrls.add(MapEntry(
|
allAssetUrls.add(MapEntry(
|
||||||
(targetRelease['version'] ?? 'source') + '.tar.gz',
|
(targetRelease['version'] ?? 'source') + '.tar.gz',
|
||||||
@ -414,6 +443,7 @@ class GitHub extends AppSource {
|
|||||||
throw NoReleasesError();
|
throw NoReleasesError();
|
||||||
}
|
}
|
||||||
String? version = targetRelease['version'];
|
String? version = targetRelease['version'];
|
||||||
|
|
||||||
DateTime? releaseDate = getReleaseDateFromRelease(
|
DateTime? releaseDate = getReleaseDateFromRelease(
|
||||||
targetRelease, useLatestAssetDateAsReleaseDate);
|
targetRelease, useLatestAssetDateAsReleaseDate);
|
||||||
if (version == null) {
|
if (version == null) {
|
||||||
|
@ -52,7 +52,7 @@ class GitLab extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
@ -131,6 +131,18 @@ class GitLab extends AppSource {
|
|||||||
|
|
||||||
bool trackOnly = additionalSettings['trackOnly'] == true;
|
bool trackOnly = additionalSettings['trackOnly'] == true;
|
||||||
|
|
||||||
|
// Get project ID
|
||||||
|
Response res0 = await sourceRequest(
|
||||||
|
'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}?$optionalAuth',
|
||||||
|
additionalSettings);
|
||||||
|
if (res0.statusCode != 200) {
|
||||||
|
throw getObtainiumHttpError(res0);
|
||||||
|
}
|
||||||
|
int? projectId = jsonDecode(res0.body)['id'];
|
||||||
|
if (projectId == null) {
|
||||||
|
throw NoReleasesError();
|
||||||
|
}
|
||||||
|
|
||||||
// Request data from REST API
|
// Request data from REST API
|
||||||
Response res = await sourceRequest(
|
Response res = await sourceRequest(
|
||||||
'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth',
|
'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth',
|
||||||
@ -157,7 +169,7 @@ class GitLab extends AppSource {
|
|||||||
.join('.apk\n')
|
.join('.apk\n')
|
||||||
.split('\n')
|
.split('\n')
|
||||||
.where((s) => s.startsWith('/uploads/') && s.endsWith('apk'))
|
.where((s) => s.startsWith('/uploads/') && s.endsWith('apk'))
|
||||||
.map((s) => '$standardUrl$s')
|
.map((s) => 'https://${hosts[0]}/-/project/$projectId$s')
|
||||||
.toList();
|
.toList();
|
||||||
var apkUrlsSet = apkUrlsFromAssets.toSet();
|
var apkUrlsSet = apkUrlsFromAssets.toSet();
|
||||||
apkUrlsSet.addAll(uploadedAPKsFromDescription);
|
apkUrlsSet.addAll(uploadedAPKsFromDescription);
|
||||||
@ -190,7 +202,7 @@ class GitLab extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
finalResult.apkUrls = finalResult.apkUrls.map((apkUrl) {
|
finalResult.apkUrls = finalResult.apkUrls.map((apkUrl) {
|
||||||
if (RegExp('^$standardUrl/-/jobs/[0-9]+/artifacts/file/[^/]+\$')
|
if (RegExp('^$standardUrl/-/jobs/[0-9]+/artifacts/file/[^/]+')
|
||||||
.hasMatch(apkUrl.value)) {
|
.hasMatch(apkUrl.value)) {
|
||||||
return MapEntry(
|
return MapEntry(
|
||||||
apkUrl.key, apkUrl.value.replaceFirst('/file/', '/raw/'));
|
apkUrl.key, apkUrl.value.replaceFirst('/file/', '/raw/'));
|
||||||
|
@ -7,6 +7,9 @@ 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;
|
||||||
@ -18,7 +21,7 @@ String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl) {
|
|||||||
.where((element) => element.trim().isNotEmpty)
|
.where((element) => element.trim().isNotEmpty)
|
||||||
.toList();
|
.toList();
|
||||||
String absoluteUrl;
|
String absoluteUrl;
|
||||||
if (ambiguousUrl.startsWith('/') || currPathSegments.isEmpty) {
|
if (ambiguousUrl.startsWith('/')) {
|
||||||
absoluteUrl = '${referenceAbsoluteUrl.origin}$ambiguousUrl';
|
absoluteUrl = '${referenceAbsoluteUrl.origin}$ambiguousUrl';
|
||||||
} else if (currPathSegments.isEmpty) {
|
} else if (currPathSegments.isEmpty) {
|
||||||
absoluteUrl = '${referenceAbsoluteUrl.origin}/$ambiguousUrl';
|
absoluteUrl = '${referenceAbsoluteUrl.origin}/$ambiguousUrl';
|
||||||
@ -92,7 +95,89 @@ 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 = [
|
var finalStepFormitems = [
|
||||||
[
|
[
|
||||||
GeneratedFormTextField('customLinkFilterRegex',
|
GeneratedFormTextField('customLinkFilterRegex',
|
||||||
@ -206,79 +291,10 @@ class HTML extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<APKDetails> getLatestAPKDetails(
|
Future<APKDetails> getLatestAPKDetails(
|
||||||
String standardUrl,
|
String standardUrl,
|
||||||
@ -337,9 +353,15 @@ class HTML extends AppSource {
|
|||||||
? rel.hashCode.toString()
|
? rel.hashCode.toString()
|
||||||
: (await checkPartialDownloadHashDynamic(rel,
|
: (await checkPartialDownloadHashDynamic(rel,
|
||||||
headers: await getRequestHeaders(additionalSettings,
|
headers: await getRequestHeaders(additionalSettings,
|
||||||
forAPKDownload: true)))
|
forAPKDownload: true),
|
||||||
|
allowInsecure: additionalSettings['allowInsecure'] == true))
|
||||||
.toString();
|
.toString();
|
||||||
return APKDetails(version, [rel].map((e) => MapEntry(e, e)).toList(),
|
return APKDetails(
|
||||||
|
version,
|
||||||
|
[rel]
|
||||||
|
.map((e) =>
|
||||||
|
MapEntry('${e.hashCode}-${Uri.parse(e).pathSegments.last}', e))
|
||||||
|
.toList(),
|
||||||
AppNames(uri.host, tr('app')));
|
AppNames(uri.host, tr('app')));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ class HuaweiAppGallery extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}(/#)?/(app|appdl)/[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}(/#)?/(app|appdl)/[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
|
@ -14,7 +14,7 @@ class IzzyOnDroid extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegExA = RegExp(
|
RegExp standardUrlRegExA = RegExp(
|
||||||
'^https?://android.${getSourceRegex(hosts)}/repo/apk/[^/]+',
|
'^https?://android.${getSourceRegex(hosts)}/repo/apk/[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
|
@ -10,7 +10,7 @@ class Mullvad extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
|
@ -10,7 +10,7 @@ class NeutronCode extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/downloads/file/[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}/downloads/file/[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
|
@ -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() {
|
|
||||||
hosts = ['signal.org'];
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
|
||||||
return 'https://${hosts[0]}';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<APKDetails> getLatestAPKDetails(
|
|
||||||
String standardUrl,
|
|
||||||
Map<String, dynamic> additionalSettings,
|
|
||||||
) async {
|
|
||||||
Response res = await sourceRequest(
|
|
||||||
'https://updates.${hosts[0]}/android/latest.json', additionalSettings);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -9,7 +9,7 @@ class SourceForge extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
var sourceRegex = getSourceRegex(hosts);
|
var sourceRegex = getSourceRegex(hosts);
|
||||||
RegExp standardUrlRegExC =
|
RegExp standardUrlRegExC =
|
||||||
RegExp('^https?://(www\\.)?$sourceRegex/p/.+', caseSensitive: false);
|
RegExp('^https?://(www\\.)?$sourceRegex/p/.+', caseSensitive: false);
|
||||||
|
@ -20,7 +20,7 @@ class SourceHut extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
|
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
@ -60,8 +60,17 @@ class SourceHut extends AppSource {
|
|||||||
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();
|
||||||
@ -69,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
|
||||||
@ -98,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();
|
||||||
|
@ -1,63 +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() {
|
|
||||||
hosts = ['store.steampowered.com'];
|
|
||||||
name = '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://${hosts[0]}';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<APKDetails> getLatestAPKDetails(
|
|
||||||
String standardUrl,
|
|
||||||
Map<String, dynamic> additionalSettings,
|
|
||||||
) async {
|
|
||||||
Response res =
|
|
||||||
await sourceRequest('https://${hosts[0]}/mobile', additionalSettings);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -11,7 +11,7 @@ class TelegramApp extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
return 'https://${hosts[0]}';
|
return 'https://${hosts[0]}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
78
lib/app_sources/tencent.dart
Normal file
78
lib/app_sources/tencent.dart
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:obtainium/custom_errors.dart';
|
||||||
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
|
class Tencent extends AppSource {
|
||||||
|
Tencent() {
|
||||||
|
name = 'Tencent App Store';
|
||||||
|
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'];
|
||||||
|
|
||||||
|
return APKDetails(
|
||||||
|
version,
|
||||||
|
[MapEntry(Uri.parse(apkUrl).queryParameters['fsname']!, apkUrl)],
|
||||||
|
AppNames(author, appName),
|
||||||
|
releaseDate: releaseDate != null
|
||||||
|
? DateTime.fromMillisecondsSinceEpoch(releaseDate * 1000)
|
||||||
|
: null);
|
||||||
|
} else {
|
||||||
|
throw getObtainiumHttpError(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -10,10 +10,11 @@ class Uptodown extends AppSource {
|
|||||||
allowSubDomains = true;
|
allowSubDomains = true;
|
||||||
naiveStandardVersionDetection = true;
|
naiveStandardVersionDetection = true;
|
||||||
showReleaseDateAsVersionToggle = true;
|
showReleaseDateAsVersionToggle = true;
|
||||||
|
urlsAlwaysHaveExtension = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
RegExp standardUrlRegEx = RegExp(
|
RegExp standardUrlRegEx = RegExp(
|
||||||
'^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}',
|
'^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}',
|
||||||
caseSensitive: false);
|
caseSensitive: false);
|
||||||
@ -39,20 +40,26 @@ class Uptodown extends AppSource {
|
|||||||
}
|
}
|
||||||
var html = parse(res.body);
|
var html = parse(res.body);
|
||||||
String? version = html.querySelector('div.version')?.innerHtml;
|
String? version = html.querySelector('div.version')?.innerHtml;
|
||||||
String? apkUrl =
|
|
||||||
'${standardUrl.split('/').reversed.toList().sublist(1).reversed.join('/')}/post-download';
|
|
||||||
String? name = html.querySelector('#detail-app-name')?.innerHtml.trim();
|
String? name = html.querySelector('#detail-app-name')?.innerHtml.trim();
|
||||||
String? author = html.querySelector('#author-link')?.innerHtml.trim();
|
String? author = html.querySelector('#author-link')?.innerHtml.trim();
|
||||||
var detailElements = html.querySelectorAll('#technical-information td');
|
var detailElements = html
|
||||||
String? appId = (detailElements.elementAtOrNull(2))?.innerHtml.trim();
|
.querySelectorAll('#technical-information td')
|
||||||
String? dateStr = (detailElements.elementAtOrNull(29))?.innerHtml.trim();
|
.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([
|
return Map.fromEntries([
|
||||||
MapEntry('version', version),
|
MapEntry('version', version),
|
||||||
MapEntry('apkUrl', apkUrl),
|
|
||||||
MapEntry('appId', appId),
|
MapEntry('appId', appId),
|
||||||
MapEntry('name', name),
|
MapEntry('name', name),
|
||||||
MapEntry('author', author),
|
MapEntry('author', author),
|
||||||
MapEntry('dateStr', dateStr)
|
MapEntry('dateStr', dateStr),
|
||||||
|
MapEntry('fileId', fileId),
|
||||||
|
MapEntry('extension', extension)
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,14 +71,16 @@ class Uptodown extends AppSource {
|
|||||||
var appDetails =
|
var appDetails =
|
||||||
await getAppDetailsFromPage(standardUrl, additionalSettings);
|
await getAppDetailsFromPage(standardUrl, additionalSettings);
|
||||||
var version = appDetails['version'];
|
var version = appDetails['version'];
|
||||||
var apkUrl = appDetails['apkUrl'];
|
|
||||||
var appId = appDetails['appId'];
|
var appId = appDetails['appId'];
|
||||||
|
var fileId = appDetails['fileId'];
|
||||||
|
var extension = appDetails['extension'];
|
||||||
if (version == null) {
|
if (version == null) {
|
||||||
throw NoVersionError();
|
throw NoVersionError();
|
||||||
}
|
}
|
||||||
if (apkUrl == null) {
|
if (fileId == null) {
|
||||||
throw NoAPKError();
|
throw NoAPKError();
|
||||||
}
|
}
|
||||||
|
var apkUrl = '$standardUrl/$fileId-x';
|
||||||
if (appId == null) {
|
if (appId == null) {
|
||||||
throw NoReleasesError();
|
throw NoReleasesError();
|
||||||
}
|
}
|
||||||
@ -82,8 +91,8 @@ class Uptodown extends AppSource {
|
|||||||
if (dateStr != null) {
|
if (dateStr != null) {
|
||||||
relDate = parseDateTimeMMMddCommayyyy(dateStr);
|
relDate = parseDateTimeMMMddCommayyyy(dateStr);
|
||||||
}
|
}
|
||||||
return APKDetails(
|
return APKDetails(version, [MapEntry('$appId.$extension', apkUrl)],
|
||||||
version, getApkUrlsFromUrls([apkUrl]), AppNames(author, appName),
|
AppNames(author, appName),
|
||||||
releaseDate: relDate);
|
releaseDate: relDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,7 +105,7 @@ class Uptodown extends AppSource {
|
|||||||
}
|
}
|
||||||
var html = parse(res.body);
|
var html = parse(res.body);
|
||||||
var finalUrlKey =
|
var finalUrlKey =
|
||||||
html.querySelector('.post-download')?.attributes['data-url'];
|
html.querySelector('#detail-download-button')?.attributes['data-url'];
|
||||||
if (finalUrlKey == null) {
|
if (finalUrlKey == null) {
|
||||||
throw NoAPKError();
|
throw NoAPKError();
|
||||||
}
|
}
|
||||||
|
@ -1,110 +0,0 @@
|
|||||||
import 'package:easy_localization/easy_localization.dart';
|
|
||||||
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() {
|
|
||||||
hosts = ['videolan.org'];
|
|
||||||
}
|
|
||||||
get dwUrlBase => 'https://get.${hosts[0]}/vlc-android/';
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<Map<String, String>?> getRequestHeaders(
|
|
||||||
Map<String, dynamic> additionalSettings,
|
|
||||||
{bool forAPKDownload = false}) async {
|
|
||||||
return {
|
|
||||||
"User-Agent":
|
|
||||||
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
|
||||||
return 'https://${hosts[0]}';
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<String?> getLatestVersion(
|
|
||||||
String standardUrl, Map<String, dynamic> additionalSettings) async {
|
|
||||||
Response res = await sourceRequest(dwUrlBase, additionalSettings);
|
|
||||||
if (res.statusCode == 200) {
|
|
||||||
var dwLinks = parse(res.body)
|
|
||||||
.querySelectorAll('a')
|
|
||||||
.where((element) => element.attributes['href'] != 'last/')
|
|
||||||
.map((e) => e.attributes['href']?.split('/')[0])
|
|
||||||
.toList();
|
|
||||||
String? version = dwLinks.isNotEmpty ? dwLinks.last : null;
|
|
||||||
if (version == null) {
|
|
||||||
throw NoVersionError();
|
|
||||||
}
|
|
||||||
return version;
|
|
||||||
} else {
|
|
||||||
throw getObtainiumHttpError(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<APKDetails> getLatestAPKDetails(
|
|
||||||
String standardUrl,
|
|
||||||
Map<String, dynamic> additionalSettings,
|
|
||||||
) async {
|
|
||||||
Response res = await get(
|
|
||||||
Uri.parse('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/';
|
|
||||||
var apkUrls = ['arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64']
|
|
||||||
.map((e) => '${targetUrl}VLC-Android-$version-$e.apk')
|
|
||||||
.toList();
|
|
||||||
return APKDetails(
|
|
||||||
version, getApkUrlsFromUrls(apkUrls), AppNames('VideoLAN', 'VLC'));
|
|
||||||
} else {
|
|
||||||
throw getObtainiumHttpError(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<String> apkUrlPrefetchModifier(String apkUrl, String standardUrl,
|
|
||||||
Map<String, dynamic> additionalSettings) async {
|
|
||||||
Response res = await sourceRequest(apkUrl, additionalSettings);
|
|
||||||
if (res.statusCode == 200) {
|
|
||||||
String? apkUrl =
|
|
||||||
parse(res.body).querySelector('#alt_link')?.attributes['href'];
|
|
||||||
if (apkUrl == null) {
|
|
||||||
throw NoAPKError();
|
|
||||||
}
|
|
||||||
return apkUrl;
|
|
||||||
} else if (res.statusCode == 500 &&
|
|
||||||
res.body.toLowerCase().indexOf('mirror') > 0) {
|
|
||||||
var html = parse(res.body);
|
|
||||||
var err = '';
|
|
||||||
html.body?.nodes.forEach((element) {
|
|
||||||
if (element.text != null) {
|
|
||||||
err += '${element.text}\n';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
err = err.trim();
|
|
||||||
if (err.isEmpty) {
|
|
||||||
err = tr('err');
|
|
||||||
}
|
|
||||||
throw ObtainiumError(err);
|
|
||||||
} else {
|
|
||||||
throw getObtainiumHttpError(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,55 +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() {
|
|
||||||
hosts = ['whatsapp.com'];
|
|
||||||
versionDetectionDisallowed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
|
||||||
return 'https://${hosts[0]}';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<String> apkUrlPrefetchModifier(String apkUrl, String standardUrl,
|
|
||||||
Map<String, dynamic> additionalSettings) async {
|
|
||||||
Response res =
|
|
||||||
await sourceRequest('$standardUrl/android', additionalSettings);
|
|
||||||
if (res.statusCode == 200) {
|
|
||||||
var targetLinks = parse(res.body)
|
|
||||||
.querySelectorAll('a')
|
|
||||||
.map((e) => e.attributes['href'] ?? '')
|
|
||||||
.where((e) => e.isNotEmpty)
|
|
||||||
.where((e) => 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 {
|
|
||||||
// This is a CDN link that is consistent per version
|
|
||||||
// But it has query params that change constantly
|
|
||||||
Uri apkUri = Uri.parse(await apkUrlPrefetchModifier(
|
|
||||||
standardUrl, standardUrl, additionalSettings));
|
|
||||||
var unusableApkUrl = '${apkUri.origin}/${apkUri.path}';
|
|
||||||
// So we use the param-less URL is a pseudo-version to add the app and check for updates
|
|
||||||
// See #357 for why we can't scrape the version number directly
|
|
||||||
// But we re-fetch the URL again with its latest query params at the actual download time
|
|
||||||
String version = unusableApkUrl.hashCode.toString();
|
|
||||||
return APKDetails(version, getApkUrlsFromUrls([unusableApkUrl]),
|
|
||||||
AppNames('Meta', 'WhatsApp'));
|
|
||||||
}
|
|
||||||
}
|
|
@ -23,6 +23,7 @@ import 'package:easy_localization/src/localization.dart';
|
|||||||
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'),
|
||||||
@ -41,6 +42,9 @@ List<MapEntry<Locale, String>> supportedLocales = const [
|
|||||||
MapEntry(Locale('tr'), 'Türkçe'),
|
MapEntry(Locale('tr'), 'Türkçe'),
|
||||||
MapEntry(Locale('uk'), 'Українська'),
|
MapEntry(Locale('uk'), 'Українська'),
|
||||||
MapEntry(Locale('da'), 'Dansk'),
|
MapEntry(Locale('da'), 'Dansk'),
|
||||||
|
MapEntry(Locale('en', 'EO'),
|
||||||
|
'Esperanto'), // https://github.com/aissat/easy_localization/issues/220#issuecomment-846035493
|
||||||
|
MapEntry(Locale('in'), 'Bahasa Indonesia')
|
||||||
];
|
];
|
||||||
const fallbackLocale = Locale('en');
|
const fallbackLocale = Locale('en');
|
||||||
const localeDir = 'assets/translations';
|
const localeDir = 'assets/translations';
|
||||||
@ -245,15 +249,17 @@ class _ObtainiumState extends State<Obtainium> {
|
|||||||
colorScheme: settingsProvider.theme == ThemeSettings.dark
|
colorScheme: settingsProvider.theme == ThemeSettings.dark
|
||||||
? darkColorScheme
|
? darkColorScheme
|
||||||
: lightColorScheme,
|
: lightColorScheme,
|
||||||
fontFamily:
|
fontFamily: settingsProvider.useSystemFont
|
||||||
settingsProvider.useSystemFont ? 'SystemFont' : 'Metropolis'),
|
? 'SystemFont'
|
||||||
|
: 'Wix-Madefor-Display'),
|
||||||
darkTheme: ThemeData(
|
darkTheme: ThemeData(
|
||||||
useMaterial3: true,
|
useMaterial3: true,
|
||||||
colorScheme: settingsProvider.theme == ThemeSettings.light
|
colorScheme: settingsProvider.theme == ThemeSettings.light
|
||||||
? lightColorScheme
|
? lightColorScheme
|
||||||
: darkColorScheme,
|
: darkColorScheme,
|
||||||
fontFamily:
|
fontFamily: settingsProvider.useSystemFont
|
||||||
settingsProvider.useSystemFont ? 'SystemFont' : 'Metropolis'),
|
? 'SystemFont'
|
||||||
|
: 'Wix-Madefor-Display'),
|
||||||
home: Shortcuts(shortcuts: <LogicalKeySet, Intent>{
|
home: Shortcuts(shortcuts: <LogicalKeySet, Intent>{
|
||||||
LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(),
|
LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(),
|
||||||
}, child: const HomePage()));
|
}, child: const HomePage()));
|
||||||
|
@ -30,6 +30,7 @@ class AddAppPageState extends State<AddAppPage> {
|
|||||||
String userInput = '';
|
String userInput = '';
|
||||||
String searchQuery = '';
|
String searchQuery = '';
|
||||||
String? pickedSourceOverride;
|
String? pickedSourceOverride;
|
||||||
|
String? previousPickedSourceOverride;
|
||||||
AppSource? pickedSource;
|
AppSource? pickedSource;
|
||||||
Map<String, dynamic> additionalSettings = {};
|
Map<String, dynamic> additionalSettings = {};
|
||||||
bool additionalSettingsValid = true;
|
bool additionalSettingsValid = true;
|
||||||
@ -58,6 +59,9 @@ class AddAppPageState extends State<AddAppPage> {
|
|||||||
if (overrideSource != null) {
|
if (overrideSource != null) {
|
||||||
pickedSourceOverride = overrideSource;
|
pickedSourceOverride = overrideSource;
|
||||||
}
|
}
|
||||||
|
bool overrideChanged =
|
||||||
|
pickedSourceOverride != previousPickedSourceOverride;
|
||||||
|
previousPickedSourceOverride = pickedSourceOverride;
|
||||||
if (updateUrlInput) {
|
if (updateUrlInput) {
|
||||||
urlInputKey++;
|
urlInputKey++;
|
||||||
}
|
}
|
||||||
@ -69,6 +73,7 @@ class AddAppPageState extends State<AddAppPage> {
|
|||||||
overrideSource: pickedSourceOverride)
|
overrideSource: pickedSourceOverride)
|
||||||
: null;
|
: null;
|
||||||
if (pickedSource.runtimeType != source.runtimeType ||
|
if (pickedSource.runtimeType != source.runtimeType ||
|
||||||
|
overrideChanged ||
|
||||||
(prevHost != null && prevHost != source?.hosts[0])) {
|
(prevHost != null && prevHost != source?.hosts[0])) {
|
||||||
pickedSource = source;
|
pickedSource = source;
|
||||||
pickedSource?.runOnAddAppInputChange(userInput);
|
pickedSource?.runOnAddAppInputChange(userInput);
|
||||||
@ -487,7 +492,8 @@ class AddAppPageState extends State<AddAppPage> {
|
|||||||
height: 16,
|
height: 16,
|
||||||
),
|
),
|
||||||
GeneratedForm(
|
GeneratedForm(
|
||||||
key: Key(pickedSource.runtimeType.toString()),
|
key: Key(
|
||||||
|
'${pickedSource.runtimeType.toString()}-${pickedSource?.hostChanged.toString()}-${pickedSource?.hostIdenticalDespiteAnyChange.toString()}'),
|
||||||
items: [
|
items: [
|
||||||
...pickedSource!.combinedAppSpecificSettingFormItems,
|
...pickedSource!.combinedAppSpecificSettingFormItems,
|
||||||
...(pickedSourceOverride != null
|
...(pickedSourceOverride != null
|
||||||
@ -532,12 +538,45 @@ class AddAppPageState extends State<AddAppPage> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
if (pickedSource != null && pickedSource!.enforceTrackOnly)
|
||||||
|
GeneratedForm(
|
||||||
|
key: Key(
|
||||||
|
'${pickedSource.runtimeType.toString()}-${pickedSource?.hostChanged.toString()}-${pickedSource?.hostIdenticalDespiteAnyChange.toString()}-appId'),
|
||||||
|
items: [
|
||||||
|
[
|
||||||
|
GeneratedFormTextField('appId',
|
||||||
|
label: '${tr('appId')} - ${tr('custom')}',
|
||||||
|
required: false,
|
||||||
|
additionalValidators: [
|
||||||
|
(value) {
|
||||||
|
if (value == null || value.isEmpty) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
final isValid = RegExp(
|
||||||
|
r'^([A-Za-z]{1}[A-Za-z\d_]*\.)+[A-Za-z][A-Za-z\d_]*$')
|
||||||
|
.hasMatch(value);
|
||||||
|
if (!isValid) {
|
||||||
|
return tr('invalidInput');
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
]),
|
||||||
|
]
|
||||||
|
],
|
||||||
|
onValueChanges: (values, valid, isBuilding) {
|
||||||
|
if (!isBuilding) {
|
||||||
|
setState(() {
|
||||||
|
additionalSettings['appId'] = values['appId'];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
Widget getSourcesListWidget() => Padding(
|
Widget getSourcesListWidget() => Padding(
|
||||||
padding: const EdgeInsets.all(16),
|
padding: const EdgeInsets.all(16),
|
||||||
child: Row(
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
@ -594,7 +633,20 @@ class AddAppPageState extends State<AddAppPage> {
|
|||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
decoration: TextDecoration.underline,
|
decoration: TextDecoration.underline,
|
||||||
fontStyle: FontStyle.italic),
|
fontStyle: FontStyle.italic),
|
||||||
))
|
)),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
launchUrlString('https://apps.obtainium.imranr.dev/',
|
||||||
|
mode: LaunchMode.externalApplication);
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
tr('crowdsourcedConfigsShort'),
|
||||||
|
style: const TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
decoration: TextDecoration.underline,
|
||||||
|
fontStyle: FontStyle.italic),
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -242,13 +242,14 @@ class _AppPageState extends State<AppPage> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
getFullInfoColumn() => Column(
|
getFullInfoColumn({bool small = false}) => Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 20),
|
SizedBox(height: small ? 5 : 20),
|
||||||
FutureBuilder(
|
FutureBuilder(
|
||||||
future: appsProvider.updateAppIcon(app?.app.id),
|
future:
|
||||||
|
appsProvider.updateAppIcon(app?.app.id, ignoreCache: true),
|
||||||
builder: (ctx, val) {
|
builder: (ctx, val) {
|
||||||
return app?.icon != null
|
return app?.icon != null
|
||||||
? Row(
|
? Row(
|
||||||
@ -260,24 +261,28 @@ class _AppPageState extends State<AppPage> {
|
|||||||
: () => pm.openApp(app.app.id),
|
: () => pm.openApp(app.app.id),
|
||||||
child: Image.memory(
|
child: Image.memory(
|
||||||
app!.icon!,
|
app!.icon!,
|
||||||
height: 150,
|
height: small ? 70 : 150,
|
||||||
gaplessPlayback: true,
|
gaplessPlayback: true,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
])
|
])
|
||||||
: Container();
|
: Container();
|
||||||
}),
|
}),
|
||||||
const SizedBox(
|
SizedBox(
|
||||||
height: 25,
|
height: small ? 10 : 25,
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
app?.name ?? tr('app'),
|
app?.name ?? tr('app'),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: Theme.of(context).textTheme.displayLarge,
|
style: small
|
||||||
|
? Theme.of(context).textTheme.displaySmall
|
||||||
|
: Theme.of(context).textTheme.displayLarge,
|
||||||
),
|
),
|
||||||
Text(tr('byX', args: [app?.app.author ?? tr('unknown')]),
|
Text(tr('byX', args: [app?.app.author ?? tr('unknown')]),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: Theme.of(context).textTheme.headlineMedium),
|
style: small
|
||||||
|
? Theme.of(context).textTheme.headlineSmall
|
||||||
|
: Theme.of(context).textTheme.headlineMedium),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 24,
|
height: 24,
|
||||||
),
|
),
|
||||||
@ -495,11 +500,8 @@ class _AppPageState extends State<AppPage> {
|
|||||||
builder: (BuildContext ctx) {
|
builder: (BuildContext ctx) {
|
||||||
return AlertDialog(
|
return AlertDialog(
|
||||||
scrollable: true,
|
scrollable: true,
|
||||||
content: getInfoColumn(),
|
content: getFullInfoColumn(small: true),
|
||||||
title: Text(
|
title: Text(app.name),
|
||||||
'${app.name} ${tr('byX', args: [
|
|
||||||
app.app.author
|
|
||||||
])}'),
|
|
||||||
actions: [
|
actions: [
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
|
@ -416,6 +416,8 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
? Image.memory(
|
? Image.memory(
|
||||||
listedApps[appIndex].icon!,
|
listedApps[appIndex].icon!,
|
||||||
gaplessPlayback: true,
|
gaplessPlayback: true,
|
||||||
|
opacity: AlwaysStoppedAnimation(
|
||||||
|
listedApps[appIndex].installedInfo == null ? 0.6 : 1),
|
||||||
)
|
)
|
||||||
: Row(
|
: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
@ -836,30 +838,6 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
resetSelectedAppsInstallStatuses() async {
|
|
||||||
try {
|
|
||||||
var values = await showDialog(
|
|
||||||
context: context,
|
|
||||||
builder: (BuildContext ctx) {
|
|
||||||
return GeneratedFormModal(
|
|
||||||
title: tr('resetInstallStatusForSelectedAppsQuestion'),
|
|
||||||
items: const [],
|
|
||||||
initValid: true,
|
|
||||||
message: tr('installStatusOfXWillBeResetExplanation',
|
|
||||||
args: [plural('apps', selectedAppIds.length)]),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
if (values != null) {
|
|
||||||
appsProvider.saveApps(selectedApps.map((e) {
|
|
||||||
e.installedVersion = null;
|
|
||||||
return e;
|
|
||||||
}).toList());
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
showMoreOptionsDialog() {
|
showMoreOptionsDialog() {
|
||||||
return showDialog(
|
return showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
@ -917,6 +895,27 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
},
|
},
|
||||||
child: Text(tr('shareAppConfigLinks'))),
|
child: Text(tr('shareAppConfigLinks'))),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
|
TextButton(
|
||||||
|
onPressed: selectedAppIds.isEmpty
|
||||||
|
? null
|
||||||
|
: () {
|
||||||
|
var exportJSON = jsonEncode(
|
||||||
|
appsProvider.generateExportJSON(
|
||||||
|
appIds: selectedApps
|
||||||
|
.map((e) => e.id)
|
||||||
|
.toList(),
|
||||||
|
overrideExportSettings: false));
|
||||||
|
XFile f = XFile.fromData(
|
||||||
|
Uint8List.fromList(
|
||||||
|
utf8.encode(exportJSON)),
|
||||||
|
mimeType: 'application/json',
|
||||||
|
name:
|
||||||
|
'${tr('obtainiumExportHyphenatedLowercase')}-${selectedApps.length}-${DateTime.now().millisecondsSinceEpoch}');
|
||||||
|
Share.shareXFiles([f]);
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
'${tr('share')} - ${tr('obtainiumExport')}')),
|
||||||
|
const Divider(),
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
appsProvider
|
appsProvider
|
||||||
@ -1056,7 +1055,9 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
IconButton(
|
IconButton(
|
||||||
color: Theme.of(context).colorScheme.primary,
|
color: Theme.of(context).colorScheme.primary,
|
||||||
style: const ButtonStyle(visualDensity: VisualDensity.compact),
|
style: const ButtonStyle(visualDensity: VisualDensity.compact),
|
||||||
tooltip: '${tr('filter')}${isFilterOff ? '' : ' *'}',
|
tooltip: isFilterOff
|
||||||
|
? tr('filterApps')
|
||||||
|
: '${tr('filter')} - ${tr('remove')}',
|
||||||
onPressed: isFilterOff
|
onPressed: isFilterOff
|
||||||
? showFilterDialog
|
? showFilterDialog
|
||||||
: () {
|
: () {
|
||||||
@ -1065,8 +1066,8 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
icon: Icon(isFilterOff
|
icon: Icon(isFilterOff
|
||||||
? Icons.filter_list_rounded
|
? Icons.search_rounded
|
||||||
: Icons.filter_list_off_rounded)),
|
: Icons.search_off_rounded)),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 10,
|
width: 10,
|
||||||
),
|
),
|
||||||
|
@ -130,13 +130,18 @@ class _HomePageState extends State<HomePage> {
|
|||||||
|
|
||||||
// Check initial link if app was in cold state (terminated)
|
// Check initial link if app was in cold state (terminated)
|
||||||
final appLink = await _appLinks.getInitialLink();
|
final appLink = await _appLinks.getInitialLink();
|
||||||
|
var initLinked = false;
|
||||||
if (appLink != null) {
|
if (appLink != null) {
|
||||||
await interpretLink(appLink);
|
await interpretLink(appLink);
|
||||||
|
initLinked = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle link when app is in warm state (front or background)
|
// Handle link when app is in warm state (front or background)
|
||||||
_linkSubscription = _appLinks.uriLinkStream.listen((uri) async {
|
_linkSubscription = _appLinks.uriLinkStream.listen((uri) async {
|
||||||
await interpretLink(uri);
|
if (!initLinked) {
|
||||||
|
await interpretLink(uri);
|
||||||
|
} else {
|
||||||
|
initLinked = false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,6 +419,25 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
})
|
})
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
height16,
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment
|
||||||
|
.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Flexible(
|
||||||
|
child: Text(tr(
|
||||||
|
'bgUpdatesWhileChargingOnly'))),
|
||||||
|
Switch(
|
||||||
|
value: settingsProvider
|
||||||
|
.bgUpdatesWhileChargingOnly,
|
||||||
|
onChanged: (value) {
|
||||||
|
settingsProvider
|
||||||
|
.bgUpdatesWhileChargingOnly =
|
||||||
|
value;
|
||||||
|
})
|
||||||
|
],
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -578,6 +597,22 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
})
|
})
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
height16,
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Flexible(
|
||||||
|
child: Text(
|
||||||
|
tr('shizukuPretendToBeGooglePlay'))),
|
||||||
|
Switch(
|
||||||
|
value: settingsProvider
|
||||||
|
.shizukuPretendToBeGooglePlay,
|
||||||
|
onChanged: (value) {
|
||||||
|
settingsProvider
|
||||||
|
.shizukuPretendToBeGooglePlay = value;
|
||||||
|
})
|
||||||
|
],
|
||||||
|
),
|
||||||
height32,
|
height32,
|
||||||
Text(
|
Text(
|
||||||
tr('sourceSpecific'),
|
tr('sourceSpecific'),
|
||||||
@ -851,7 +886,7 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
launchUrlString('${settingsProvider.sourceUrl}/wiki',
|
launchUrlString('https://wiki.obtainium.imranr.dev/',
|
||||||
mode: LaunchMode.externalApplication);
|
mode: LaunchMode.externalApplication);
|
||||||
},
|
},
|
||||||
icon: const Icon(Icons.help_outline_rounded),
|
icon: const Icon(Icons.help_outline_rounded),
|
||||||
|
@ -5,6 +5,7 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
import 'package:battery_plus/battery_plus.dart';
|
||||||
import 'package:fluttertoast/fluttertoast.dart';
|
import 'package:fluttertoast/fluttertoast.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:crypto/crypto.dart';
|
import 'package:crypto/crypto.dart';
|
||||||
@ -17,6 +18,9 @@ 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:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:http/io_client.dart';
|
||||||
|
import 'package:obtainium/app_sources/directAPKLink.dart';
|
||||||
|
import 'package:obtainium/app_sources/html.dart';
|
||||||
import 'package:obtainium/components/generated_form.dart';
|
import 'package:obtainium/components/generated_form.dart';
|
||||||
import 'package:obtainium/components/generated_form_modal.dart';
|
import 'package:obtainium/components/generated_form_modal.dart';
|
||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
@ -146,17 +150,23 @@ Future<File> downloadFileWithRetry(String url, String fileName,
|
|||||||
bool fileNameHasExt, Function? onProgress, String destDir,
|
bool fileNameHasExt, Function? onProgress, String destDir,
|
||||||
{bool useExisting = true,
|
{bool useExisting = true,
|
||||||
Map<String, String>? headers,
|
Map<String, String>? headers,
|
||||||
int retries = 3}) async {
|
int retries = 3,
|
||||||
|
bool allowInsecure = false}) async {
|
||||||
try {
|
try {
|
||||||
return await downloadFile(
|
return await downloadFile(
|
||||||
url, fileName, fileNameHasExt, onProgress, destDir,
|
url, fileName, fileNameHasExt, onProgress, destDir,
|
||||||
useExisting: useExisting, headers: headers);
|
useExisting: useExisting,
|
||||||
|
headers: headers,
|
||||||
|
allowInsecure: allowInsecure);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (retries > 0 && e is ClientException) {
|
if (retries > 0 && e is ClientException) {
|
||||||
await Future.delayed(const Duration(seconds: 5));
|
await Future.delayed(const Duration(seconds: 5));
|
||||||
return await downloadFileWithRetry(
|
return await downloadFileWithRetry(
|
||||||
url, fileName, fileNameHasExt, onProgress, destDir,
|
url, fileName, fileNameHasExt, onProgress, destDir,
|
||||||
useExisting: useExisting, headers: headers, retries: (retries - 1));
|
useExisting: useExisting,
|
||||||
|
headers: headers,
|
||||||
|
retries: (retries - 1),
|
||||||
|
allowInsecure: allowInsecure);
|
||||||
} else {
|
} else {
|
||||||
rethrow;
|
rethrow;
|
||||||
}
|
}
|
||||||
@ -173,11 +183,14 @@ String hashListOfLists(List<List<int>> data) {
|
|||||||
Future<String> checkPartialDownloadHashDynamic(String url,
|
Future<String> checkPartialDownloadHashDynamic(String url,
|
||||||
{int startingSize = 1024,
|
{int startingSize = 1024,
|
||||||
int lowerLimit = 128,
|
int lowerLimit = 128,
|
||||||
Map<String, String>? headers}) async {
|
Map<String, String>? headers,
|
||||||
|
bool allowInsecure = false}) async {
|
||||||
for (int i = startingSize; i >= lowerLimit; i -= 256) {
|
for (int i = startingSize; i >= lowerLimit; i -= 256) {
|
||||||
List<String> ab = await Future.wait([
|
List<String> ab = await Future.wait([
|
||||||
checkPartialDownloadHash(url, i, headers: headers),
|
checkPartialDownloadHash(url, i,
|
||||||
checkPartialDownloadHash(url, i, headers: headers)
|
headers: headers, allowInsecure: allowInsecure),
|
||||||
|
checkPartialDownloadHash(url, i,
|
||||||
|
headers: headers, allowInsecure: allowInsecure)
|
||||||
]);
|
]);
|
||||||
if (ab[0] == ab[1]) {
|
if (ab[0] == ab[1]) {
|
||||||
return ab[0];
|
return ab[0];
|
||||||
@ -187,13 +200,13 @@ Future<String> checkPartialDownloadHashDynamic(String url,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<String> checkPartialDownloadHash(String url, int bytesToGrab,
|
Future<String> checkPartialDownloadHash(String url, int bytesToGrab,
|
||||||
{Map<String, String>? headers}) async {
|
{Map<String, String>? headers, bool allowInsecure = false}) async {
|
||||||
var req = Request('GET', Uri.parse(url));
|
var req = Request('GET', Uri.parse(url));
|
||||||
if (headers != null) {
|
if (headers != null) {
|
||||||
req.headers.addAll(headers);
|
req.headers.addAll(headers);
|
||||||
}
|
}
|
||||||
req.headers[HttpHeaders.rangeHeader] = 'bytes=0-$bytesToGrab';
|
req.headers[HttpHeaders.rangeHeader] = 'bytes=0-$bytesToGrab';
|
||||||
var client = http.Client();
|
var client = IOClient(createHttpClient(allowInsecure));
|
||||||
var response = await client.send(req);
|
var response = await client.send(req);
|
||||||
if (response.statusCode < 200 || response.statusCode > 299) {
|
if (response.statusCode < 200 || response.statusCode > 299) {
|
||||||
throw ObtainiumError(response.reasonPhrase ?? tr('unexpectedError'));
|
throw ObtainiumError(response.reasonPhrase ?? tr('unexpectedError'));
|
||||||
@ -204,12 +217,14 @@ Future<String> checkPartialDownloadHash(String url, int bytesToGrab,
|
|||||||
|
|
||||||
Future<File> downloadFile(String url, String fileName, bool fileNameHasExt,
|
Future<File> downloadFile(String url, String fileName, bool fileNameHasExt,
|
||||||
Function? onProgress, String destDir,
|
Function? onProgress, String destDir,
|
||||||
{bool useExisting = true, Map<String, String>? headers}) async {
|
{bool useExisting = true,
|
||||||
|
Map<String, String>? headers,
|
||||||
|
bool allowInsecure = false}) async {
|
||||||
// Send the initial request but cancel it as soon as you have the headers
|
// Send the initial request but cancel it as soon as you have the headers
|
||||||
var reqHeaders = headers ?? {};
|
var reqHeaders = headers ?? {};
|
||||||
var req = Request('GET', Uri.parse(url));
|
var req = Request('GET', Uri.parse(url));
|
||||||
req.headers.addAll(reqHeaders);
|
req.headers.addAll(reqHeaders);
|
||||||
var client = http.Client();
|
var client = IOClient(createHttpClient(allowInsecure));
|
||||||
StreamedResponse response = await client.send(req);
|
StreamedResponse response = await client.send(req);
|
||||||
var resHeaders = response.headers;
|
var resHeaders = response.headers;
|
||||||
|
|
||||||
@ -225,7 +240,9 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt,
|
|||||||
ext != 'apk') {
|
ext != 'apk') {
|
||||||
ext = 'apk';
|
ext = 'apk';
|
||||||
}
|
}
|
||||||
fileName = fileName.split('/').last; // Ensure the fileName is a file name
|
fileName = fileNameHasExt
|
||||||
|
? fileName
|
||||||
|
: fileName.split('/').last; // Ensure the fileName is a file name
|
||||||
File downloadedFile = File('$destDir/$fileName.$ext');
|
File downloadedFile = File('$destDir/$fileName.$ext');
|
||||||
if (fileNameHasExt) {
|
if (fileNameHasExt) {
|
||||||
// If the user says the filename already has an ext, ignore whatever you inferred from above
|
// If the user says the filename already has an ext, ignore whatever you inferred from above
|
||||||
@ -273,7 +290,7 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt,
|
|||||||
IOSink? sink;
|
IOSink? sink;
|
||||||
if (rangeFeatureEnabled && fullContentLength != null && rangeStart > 0) {
|
if (rangeFeatureEnabled && fullContentLength != null && rangeStart > 0) {
|
||||||
client.close();
|
client.close();
|
||||||
client = http.Client();
|
client = IOClient(createHttpClient(allowInsecure));
|
||||||
req = Request('GET', Uri.parse(url));
|
req = Request('GET', Uri.parse(url));
|
||||||
req.headers.addAll(reqHeaders);
|
req.headers.addAll(reqHeaders);
|
||||||
req.headers.addAll({'range': 'bytes=$rangeStart-${fullContentLength - 1}'});
|
req.headers.addAll({'range': 'bytes=$rangeStart-${fullContentLength - 1}'});
|
||||||
@ -316,12 +333,12 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<Map<String, String>> getHeaders(String url,
|
Future<Map<String, String>> getHeaders(String url,
|
||||||
{Map<String, String>? headers}) async {
|
{Map<String, String>? headers, bool allowInsecure = false}) async {
|
||||||
var req = http.Request('GET', Uri.parse(url));
|
var req = http.Request('GET', Uri.parse(url));
|
||||||
if (headers != null) {
|
if (headers != null) {
|
||||||
req.headers.addAll(headers);
|
req.headers.addAll(headers);
|
||||||
}
|
}
|
||||||
var client = http.Client();
|
var client = IOClient(createHttpClient(allowInsecure));
|
||||||
var response = await client.send(req);
|
var response = await client.send(req);
|
||||||
if (response.statusCode < 200 || response.statusCode > 299) {
|
if (response.statusCode < 200 || response.statusCode > 299) {
|
||||||
throw ObtainiumError(response.reasonPhrase ?? tr('unexpectedError'));
|
throw ObtainiumError(response.reasonPhrase ?? tr('unexpectedError'));
|
||||||
@ -361,13 +378,14 @@ class AppsProvider with ChangeNotifier {
|
|||||||
late Stream<FGBGType>? foregroundStream;
|
late Stream<FGBGType>? foregroundStream;
|
||||||
late StreamSubscription<FGBGType>? foregroundSubscription;
|
late StreamSubscription<FGBGType>? foregroundSubscription;
|
||||||
late Directory APKDir;
|
late Directory APKDir;
|
||||||
|
late Directory iconsCacheDir;
|
||||||
late SettingsProvider settingsProvider = SettingsProvider();
|
late SettingsProvider settingsProvider = SettingsProvider();
|
||||||
|
|
||||||
Iterable<AppInMemory> getAppValues() => apps.values.map((a) => a.deepCopy());
|
Iterable<AppInMemory> getAppValues() => apps.values.map((a) => a.deepCopy());
|
||||||
|
|
||||||
AppsProvider({isBg = false}) {
|
AppsProvider({isBg = false}) {
|
||||||
// Subscribe to changes in the app foreground status
|
// Subscribe to changes in the app foreground status
|
||||||
foregroundStream = FGBGEvents.stream.asBroadcastStream();
|
foregroundStream = FGBGEvents.instance.stream.asBroadcastStream();
|
||||||
foregroundSubscription = foregroundStream?.listen((event) async {
|
foregroundSubscription = foregroundStream?.listen((event) async {
|
||||||
isForeground = event == FGBGType.foreground;
|
isForeground = event == FGBGType.foreground;
|
||||||
if (isForeground) {
|
if (isForeground) {
|
||||||
@ -379,12 +397,21 @@ class AppsProvider with ChangeNotifier {
|
|||||||
var cacheDirs = await getExternalCacheDirectories();
|
var cacheDirs = await getExternalCacheDirectories();
|
||||||
if (cacheDirs?.isNotEmpty ?? false) {
|
if (cacheDirs?.isNotEmpty ?? false) {
|
||||||
APKDir = cacheDirs!.first;
|
APKDir = cacheDirs!.first;
|
||||||
|
iconsCacheDir = Directory('${cacheDirs.first.path}/icons');
|
||||||
|
if (!iconsCacheDir.existsSync()) {
|
||||||
|
iconsCacheDir.createSync();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
APKDir =
|
APKDir =
|
||||||
Directory('${(await getExternalStorageDirectory())!.path}/apks');
|
Directory('${(await getExternalStorageDirectory())!.path}/apks');
|
||||||
if (!APKDir.existsSync()) {
|
if (!APKDir.existsSync()) {
|
||||||
APKDir.createSync();
|
APKDir.createSync();
|
||||||
}
|
}
|
||||||
|
iconsCacheDir =
|
||||||
|
Directory('${(await getExternalStorageDirectory())!.path}/icons');
|
||||||
|
if (!iconsCacheDir.existsSync()) {
|
||||||
|
iconsCacheDir.createSync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!isBg) {
|
if (!isBg) {
|
||||||
// Load Apps into memory (in background processes, this is done later instead of in the constructor)
|
// Load Apps into memory (in background processes, this is done later instead of in the constructor)
|
||||||
@ -447,11 +474,15 @@ class AppsProvider with ChangeNotifier {
|
|||||||
notificationsProvider?.cancel(notif.id);
|
notificationsProvider?.cancel(notif.id);
|
||||||
int? prevProg;
|
int? prevProg;
|
||||||
var fileNameNoExt = '${app.id}-${downloadUrl.hashCode}';
|
var fileNameNoExt = '${app.id}-${downloadUrl.hashCode}';
|
||||||
|
if (source.urlsAlwaysHaveExtension) {
|
||||||
|
fileNameNoExt =
|
||||||
|
'$fileNameNoExt.${app.apkUrls[app.preferredApkIndex].key.split('.').last}';
|
||||||
|
}
|
||||||
var headers = await source.getRequestHeaders(app.additionalSettings,
|
var headers = await source.getRequestHeaders(app.additionalSettings,
|
||||||
forAPKDownload: true);
|
forAPKDownload: true);
|
||||||
var downloadedFile = await downloadFileWithRetry(
|
var downloadedFile = await downloadFileWithRetry(
|
||||||
downloadUrl, fileNameNoExt, false, headers: headers,
|
downloadUrl, fileNameNoExt, source.urlsAlwaysHaveExtension,
|
||||||
(double? progress) {
|
headers: headers, (double? progress) {
|
||||||
int? prog = progress?.ceil();
|
int? prog = progress?.ceil();
|
||||||
if (apps[app.id] != null) {
|
if (apps[app.id] != null) {
|
||||||
apps[app.id]!.downloadProgress = progress;
|
apps[app.id]!.downloadProgress = progress;
|
||||||
@ -462,7 +493,9 @@ class AppsProvider with ChangeNotifier {
|
|||||||
notificationsProvider?.notify(notif);
|
notificationsProvider?.notify(notif);
|
||||||
}
|
}
|
||||||
prevProg = prog;
|
prevProg = prog;
|
||||||
}, APKDir.path, useExisting: useExisting);
|
}, APKDir.path,
|
||||||
|
useExisting: useExisting,
|
||||||
|
allowInsecure: app.additionalSettings['allowInsecure'] == true);
|
||||||
// Set to 90 for remaining steps, will make null in 'finally'
|
// Set to 90 for remaining steps, will make null in 'finally'
|
||||||
if (apps[app.id] != null) {
|
if (apps[app.id] != null) {
|
||||||
apps[app.id]!.downloadProgress = -1;
|
apps[app.id]!.downloadProgress = -1;
|
||||||
@ -485,8 +518,35 @@ class AppsProvider with ChangeNotifier {
|
|||||||
.listSync()
|
.listSync()
|
||||||
.where((e) => e.path.toLowerCase().endsWith('.apk'))
|
.where((e) => e.path.toLowerCase().endsWith('.apk'))
|
||||||
.toList();
|
.toList();
|
||||||
newInfo =
|
|
||||||
await pm.getPackageArchiveInfo(archiveFilePath: apks.first.path);
|
FileSystemEntity? temp;
|
||||||
|
apks.removeWhere((element) {
|
||||||
|
bool res = element.uri.pathSegments.last.startsWith(app.id);
|
||||||
|
if (res) {
|
||||||
|
temp = element;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
});
|
||||||
|
if (temp != null) {
|
||||||
|
apks = [
|
||||||
|
temp!,
|
||||||
|
...apks,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < apks.length; i++) {
|
||||||
|
try {
|
||||||
|
newInfo =
|
||||||
|
await pm.getPackageArchiveInfo(archiveFilePath: apks[i].path);
|
||||||
|
if (newInfo != null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
if (i == apks.length - 1) {
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (newInfo == null) {
|
if (newInfo == null) {
|
||||||
downloadedFile.delete();
|
downloadedFile.delete();
|
||||||
@ -526,9 +586,11 @@ class AppsProvider with ChangeNotifier {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (app.additionalSettings['exemptFromBackgroundUpdates'] == true) {
|
if (app.additionalSettings['exemptFromBackgroundUpdates'] == true) {
|
||||||
|
logs.add('Exempted from BG updates: ${app.id}');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (app.apkUrls.length > 1) {
|
if (app.apkUrls.length > 1) {
|
||||||
|
logs.add('Multiple APK URLs: ${app.id}');
|
||||||
return false; // Manual API selection means silent install is not possible
|
return false; // Manual API selection means silent install is not possible
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -540,6 +602,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
?.installingPackageName
|
?.installingPackageName
|
||||||
: (await pm.getInstallerPackageName(packageName: app.id));
|
: (await pm.getInstallerPackageName(packageName: app.id));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
logs.add(
|
||||||
|
'Failed to get installed package details: ${app.id} (${e.toString()})');
|
||||||
return false; // App probably not installed
|
return false; // App probably not installed
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -548,6 +612,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
// The APK should target a new enough API
|
// The APK should target a new enough API
|
||||||
// https://developer.android.com/reference/android/content/pm/PackageInstaller.SessionParams#setRequireUserAction(int)
|
// https://developer.android.com/reference/android/content/pm/PackageInstaller.SessionParams#setRequireUserAction(int)
|
||||||
if (!(targetSDK != null && targetSDK >= (osInfo.version.sdkInt - 3))) {
|
if (!(targetSDK != null && targetSDK >= (osInfo.version.sdkInt - 3))) {
|
||||||
|
logs.add('Multiple APK URLs: ${app.id}');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -562,8 +627,12 @@ class AppsProvider with ChangeNotifier {
|
|||||||
// If we did not install the app, silent install is not possible
|
// If we did not install the app, silent install is not possible
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// The OS must also be new enough
|
if (osInfo.version.sdkInt < 31) {
|
||||||
return osInfo.version.sdkInt >= 31;
|
// The OS must also be new enough
|
||||||
|
logs.add('Android SDK too old: ${osInfo.version.sdkInt}');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> waitForUserToReturnToForeground(BuildContext context) async {
|
Future<void> waitForUserToReturnToForeground(BuildContext context) async {
|
||||||
@ -572,7 +641,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (!isForeground) {
|
if (!isForeground) {
|
||||||
await notificationsProvider.notify(completeInstallationNotification,
|
await notificationsProvider.notify(completeInstallationNotification,
|
||||||
cancelExisting: true);
|
cancelExisting: true);
|
||||||
while (await FGBGEvents.stream.first != FGBGType.foreground) {}
|
while (await FGBGEvents.instance.stream.first != FGBGType.foreground) {}
|
||||||
await notificationsProvider.cancel(completeInstallationNotification.id);
|
await notificationsProvider.cancel(completeInstallationNotification.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -595,28 +664,47 @@ class AppsProvider with ChangeNotifier {
|
|||||||
var somethingInstalled = false;
|
var somethingInstalled = false;
|
||||||
try {
|
try {
|
||||||
MultiAppMultiError errors = MultiAppMultiError();
|
MultiAppMultiError errors = MultiAppMultiError();
|
||||||
|
List<File> APKFiles = [];
|
||||||
for (var file in dir.extracted
|
for (var file in dir.extracted
|
||||||
.listSync(recursive: true, followLinks: false)
|
.listSync(recursive: true, followLinks: false)
|
||||||
.whereType<File>()) {
|
.whereType<File>()) {
|
||||||
if (file.path.toLowerCase().endsWith('.apk')) {
|
if (file.path.toLowerCase().endsWith('.apk')) {
|
||||||
try {
|
APKFiles.add(file);
|
||||||
somethingInstalled = somethingInstalled ||
|
|
||||||
await installApk(
|
|
||||||
DownloadedApk(dir.appId, file), firstTimeWithContext,
|
|
||||||
needsBGWorkaround: needsBGWorkaround,
|
|
||||||
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay);
|
|
||||||
} catch (e) {
|
|
||||||
logs.add(
|
|
||||||
'Could not install APK from XAPK \'${file.path}\': ${e.toString()}');
|
|
||||||
errors.add(dir.appId, e, appName: apps[dir.appId]?.name);
|
|
||||||
}
|
|
||||||
} else if (file.path.toLowerCase().endsWith('.obb')) {
|
} else if (file.path.toLowerCase().endsWith('.obb')) {
|
||||||
await moveObbFile(file, dir.appId);
|
await moveObbFile(file, dir.appId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (somethingInstalled) {
|
|
||||||
|
File? temp;
|
||||||
|
APKFiles.removeWhere((element) {
|
||||||
|
bool res = element.uri.pathSegments.last.startsWith(dir.appId);
|
||||||
|
if (res) {
|
||||||
|
temp = element;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
});
|
||||||
|
if (temp != null) {
|
||||||
|
APKFiles = [
|
||||||
|
temp!,
|
||||||
|
...APKFiles,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await installApk(
|
||||||
|
DownloadedApk(dir.appId, APKFiles[0]), firstTimeWithContext,
|
||||||
|
needsBGWorkaround: needsBGWorkaround,
|
||||||
|
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay,
|
||||||
|
additionalAPKs: APKFiles.sublist(1)
|
||||||
|
.map((a) => DownloadedApk(dir.appId, a))
|
||||||
|
.toList());
|
||||||
|
somethingInstalled = true;
|
||||||
dir.file.delete(recursive: true);
|
dir.file.delete(recursive: true);
|
||||||
} else if (errors.idsByErrorString.isNotEmpty) {
|
} catch (e) {
|
||||||
|
logs.add('Could not install APKs from XAPK: ${e.toString()}');
|
||||||
|
errors.add(dir.appId, e, appName: apps[dir.appId]?.name);
|
||||||
|
}
|
||||||
|
if (errors.idsByErrorString.isNotEmpty) {
|
||||||
throw errors;
|
throw errors;
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@ -628,7 +716,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
Future<bool> installApk(
|
Future<bool> installApk(
|
||||||
DownloadedApk file, BuildContext? firstTimeWithContext,
|
DownloadedApk file, BuildContext? firstTimeWithContext,
|
||||||
{bool needsBGWorkaround = false,
|
{bool needsBGWorkaround = false,
|
||||||
bool shizukuPretendToBeGooglePlay = false}) async {
|
bool shizukuPretendToBeGooglePlay = false,
|
||||||
|
List<DownloadedApk> additionalAPKs = const []}) async {
|
||||||
if (firstTimeWithContext != null &&
|
if (firstTimeWithContext != null &&
|
||||||
settingsProvider.beforeNewInstallsShareToAppVerifier &&
|
settingsProvider.beforeNewInstallsShareToAppVerifier &&
|
||||||
(await getInstalledInfo('dev.soupslurpr.appverifier')) != null) {
|
(await getInstalledInfo('dev.soupslurpr.appverifier')) != null) {
|
||||||
@ -644,6 +733,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (newInfo == null) {
|
if (newInfo == null) {
|
||||||
try {
|
try {
|
||||||
file.file.deleteSync(recursive: true);
|
file.file.deleteSync(recursive: true);
|
||||||
|
additionalAPKs.forEach((a) => a.file.deleteSync(recursive: true));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
//
|
//
|
||||||
} finally {
|
} finally {
|
||||||
@ -651,6 +741,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
PackageInfo? appInfo = await getInstalledInfo(apps[file.appId]!.app.id);
|
PackageInfo? appInfo = await getInstalledInfo(apps[file.appId]!.app.id);
|
||||||
|
logs.add(
|
||||||
|
'Installing "${newInfo.packageName}" version "${newInfo.versionName}" versionCode "${newInfo.versionCode}"${appInfo != null ? ' (from existing version "${appInfo.versionName}" versionCode "${appInfo.versionCode}")' : ''}');
|
||||||
if (appInfo != null &&
|
if (appInfo != null &&
|
||||||
newInfo.versionCode! < appInfo.versionCode! &&
|
newInfo.versionCode! < appInfo.versionCode! &&
|
||||||
!(await canDowngradeApps())) {
|
!(await canDowngradeApps())) {
|
||||||
@ -669,8 +761,10 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
int? code;
|
int? code;
|
||||||
if (!settingsProvider.useShizuku) {
|
if (!settingsProvider.useShizuku) {
|
||||||
code =
|
var allAPKs = [file.file.path];
|
||||||
await AndroidPackageInstaller.installApk(apkFilePath: file.file.path);
|
allAPKs.addAll(additionalAPKs.map((a) => a.file.path));
|
||||||
|
code = await AndroidPackageInstaller.installApk(
|
||||||
|
apkFilePath: allAPKs.join(','));
|
||||||
} else {
|
} else {
|
||||||
code = await ShizukuApkInstaller.installAPK(file.file.uri.toString(),
|
code = await ShizukuApkInstaller.installAPK(file.file.uri.toString(),
|
||||||
shizukuPretendToBeGooglePlay ? "com.android.vending" : "");
|
shizukuPretendToBeGooglePlay ? "com.android.vending" : "");
|
||||||
@ -694,6 +788,10 @@ class AppsProvider with ChangeNotifier {
|
|||||||
return installed;
|
return installed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<String> getStorageRootPath() async {
|
||||||
|
return '/${(await getExternalStorageDirectory())!.uri.pathSegments.sublist(0, 3).join('/')}';
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> moveObbFile(File file, String appId) async {
|
Future<void> moveObbFile(File file, String appId) async {
|
||||||
if (!file.path.toLowerCase().endsWith('.obb')) return;
|
if (!file.path.toLowerCase().endsWith('.obb')) return;
|
||||||
|
|
||||||
@ -702,7 +800,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
await Permission.storage.request();
|
await Permission.storage.request();
|
||||||
}
|
}
|
||||||
|
|
||||||
String obbDirPath = "/storage/emulated/0/Android/obb/$appId";
|
String obbDirPath = "${await getStorageRootPath()}/Android/obb/$appId";
|
||||||
Directory(obbDirPath).createSync(recursive: true);
|
Directory(obbDirPath).createSync(recursive: true);
|
||||||
|
|
||||||
String obbFileName = file.path.split("/").last;
|
String obbFileName = file.path.split("/").last;
|
||||||
@ -792,6 +890,11 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
MapEntry<String, String>? apkUrl;
|
MapEntry<String, String>? apkUrl;
|
||||||
var trackOnly = apps[id]!.app.additionalSettings['trackOnly'] == true;
|
var trackOnly = apps[id]!.app.additionalSettings['trackOnly'] == true;
|
||||||
|
var refreshBeforeDownload =
|
||||||
|
apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true;
|
||||||
|
if (refreshBeforeDownload) {
|
||||||
|
await checkUpdate(apps[id]!.app.id);
|
||||||
|
}
|
||||||
if (!trackOnly) {
|
if (!trackOnly) {
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
apkUrl = await confirmAppFileUrl(apps[id]!.app, context, false);
|
apkUrl = await confirmAppFileUrl(apps[id]!.app, context, false);
|
||||||
@ -840,18 +943,20 @@ class AppsProvider with ChangeNotifier {
|
|||||||
apps[id]?.installedInfo == null ? context : null;
|
apps[id]?.installedInfo == null ? context : null;
|
||||||
bool needBGWorkaround =
|
bool needBGWorkaround =
|
||||||
willBeSilent && context == null && !settingsProvider.useShizuku;
|
willBeSilent && context == null && !settingsProvider.useShizuku;
|
||||||
|
bool shizukuPretendToBeGooglePlay = settingsProvider
|
||||||
|
.shizukuPretendToBeGooglePlay ||
|
||||||
|
apps[id]!.app.additionalSettings['shizukuPretendToBeGooglePlay'] ==
|
||||||
|
true;
|
||||||
if (downloadedFile != null) {
|
if (downloadedFile != null) {
|
||||||
if (needBGWorkaround) {
|
if (needBGWorkaround) {
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
installApk(downloadedFile, contextIfNewInstall,
|
installApk(downloadedFile, contextIfNewInstall,
|
||||||
needsBGWorkaround: true);
|
needsBGWorkaround: true,
|
||||||
|
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay);
|
||||||
} else {
|
} else {
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
sayInstalled = await installApk(downloadedFile, contextIfNewInstall,
|
sayInstalled = await installApk(downloadedFile, contextIfNewInstall,
|
||||||
shizukuPretendToBeGooglePlay: apps[id]!
|
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay);
|
||||||
.app
|
|
||||||
.additionalSettings['shizukuPretendToBeGooglePlay'] ==
|
|
||||||
true);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (needBGWorkaround) {
|
if (needBGWorkaround) {
|
||||||
@ -862,10 +967,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
sayInstalled = await installXApkDir(
|
sayInstalled = await installXApkDir(
|
||||||
downloadedDir!, contextIfNewInstall,
|
downloadedDir!, contextIfNewInstall,
|
||||||
shizukuPretendToBeGooglePlay: apps[id]!
|
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay);
|
||||||
.app
|
|
||||||
.additionalSettings['shizukuPretendToBeGooglePlay'] ==
|
|
||||||
true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (willBeSilent && context == null) {
|
if (willBeSilent && context == null) {
|
||||||
@ -948,11 +1050,16 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
for (var res in downloadResults) {
|
for (var res in downloadResults) {
|
||||||
if (!errors.appIdNames.containsKey(res['id'])) {
|
if (!errors.appIdNames.containsKey(res['id'])) {
|
||||||
await installFn(
|
try {
|
||||||
res['id'] as String,
|
await installFn(
|
||||||
res['willBeSilent'] as bool,
|
res['id'] as String,
|
||||||
res['downloadedFile'] as DownloadedApk?,
|
res['willBeSilent'] as bool,
|
||||||
res['downloadedDir'] as DownloadedXApkDir?);
|
res['downloadedFile'] as DownloadedApk?,
|
||||||
|
res['downloadedDir'] as DownloadedXApkDir?);
|
||||||
|
} catch (e) {
|
||||||
|
var id = res['id'] as String;
|
||||||
|
errors.add(id, e, appName: apps[id]?.name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -974,11 +1081,25 @@ class AppsProvider with ChangeNotifier {
|
|||||||
throw ObtainiumError(tr('appNotFound'));
|
throw ObtainiumError(tr('appNotFound'));
|
||||||
}
|
}
|
||||||
MapEntry<String, String>? fileUrl;
|
MapEntry<String, String>? fileUrl;
|
||||||
|
var refreshBeforeDownload =
|
||||||
|
apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true;
|
||||||
|
if (refreshBeforeDownload) {
|
||||||
|
await checkUpdate(apps[id]!.app.id);
|
||||||
|
}
|
||||||
if (apps[id]!.app.apkUrls.isNotEmpty ||
|
if (apps[id]!.app.apkUrls.isNotEmpty ||
|
||||||
apps[id]!.app.otherAssetUrls.isNotEmpty) {
|
apps[id]!.app.otherAssetUrls.isNotEmpty) {
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
fileUrl = await confirmAppFileUrl(apps[id]!.app, context, true,
|
MapEntry<String, String>? tempFileUrl = await confirmAppFileUrl(
|
||||||
|
apps[id]!.app, context, true,
|
||||||
evenIfSingleChoice: true);
|
evenIfSingleChoice: true);
|
||||||
|
if (tempFileUrl != null) {
|
||||||
|
fileUrl = MapEntry(
|
||||||
|
tempFileUrl.key,
|
||||||
|
await (SourceProvider().getSource(apps[id]!.app.url,
|
||||||
|
overrideSource: apps[id]!.app.overrideSource))
|
||||||
|
.apkUrlPrefetchModifier(tempFileUrl.value, apps[id]!.app.url,
|
||||||
|
apps[id]!.app.additionalSettings));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (fileUrl != null) {
|
if (fileUrl != null) {
|
||||||
filesToDownload.add(MapEntry(fileUrl, apps[id]!.app));
|
filesToDownload.add(MapEntry(fileUrl, apps[id]!.app));
|
||||||
@ -991,17 +1112,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
|
|
||||||
Future<void> downloadFn(MapEntry<String, String> fileUrl, App app) async {
|
Future<void> downloadFn(MapEntry<String, String> fileUrl, App app) async {
|
||||||
try {
|
try {
|
||||||
var exportDir = await settingsProvider.getExportDir();
|
String downloadPath = '${await getStorageRootPath()}/Download';
|
||||||
String downloadPath = '/storage/emulated/0/Download';
|
|
||||||
bool downloadsAccessible = false;
|
|
||||||
try {
|
|
||||||
downloadsAccessible = Directory(downloadPath).existsSync();
|
|
||||||
} catch (e) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
if (!downloadsAccessible && exportDir != null) {
|
|
||||||
downloadPath = exportDir.path;
|
|
||||||
}
|
|
||||||
await downloadFile(fileUrl.value, fileUrl.key, true,
|
await downloadFile(fileUrl.value, fileUrl.key, true,
|
||||||
(double? progress) {
|
(double? progress) {
|
||||||
notificationsProvider
|
notificationsProvider
|
||||||
@ -1012,7 +1123,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
.getRequestHeaders(app.additionalSettings,
|
.getRequestHeaders(app.additionalSettings,
|
||||||
forAPKDownload:
|
forAPKDownload:
|
||||||
fileUrl.key.endsWith('.apk') ? true : false),
|
fileUrl.key.endsWith('.apk') ? true : false),
|
||||||
useExisting: false);
|
useExisting: false,
|
||||||
|
allowInsecure: app.additionalSettings['allowInsecure'] == true);
|
||||||
notificationsProvider
|
notificationsProvider
|
||||||
.notify(DownloadedNotification(fileUrl.key, fileUrl.value));
|
.notify(DownloadedNotification(fileUrl.key, fileUrl.value));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -1049,17 +1161,25 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (app?.app == null) {
|
if (app?.app == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
var source = SourceProvider()
|
||||||
|
.getSource(app!.app.url, overrideSource: app.app.overrideSource);
|
||||||
var naiveStandardVersionDetection =
|
var naiveStandardVersionDetection =
|
||||||
app!.app.additionalSettings['naiveStandardVersionDetection'] == true ||
|
app.app.additionalSettings['naiveStandardVersionDetection'] == true ||
|
||||||
SourceProvider()
|
source.naiveStandardVersionDetection;
|
||||||
.getSource(app.app.url, overrideSource: app.app.overrideSource)
|
|
||||||
.naiveStandardVersionDetection;
|
|
||||||
String? realInstalledVersion =
|
String? realInstalledVersion =
|
||||||
app.app.additionalSettings['useVersionCodeAsOSVersion'] == true
|
app.app.additionalSettings['useVersionCodeAsOSVersion'] == true
|
||||||
? app.installedInfo?.versionCode.toString()
|
? app.installedInfo?.versionCode.toString()
|
||||||
: app.installedInfo?.versionName;
|
: app.installedInfo?.versionName;
|
||||||
|
bool isHTMLWithNoVersionDetection =
|
||||||
|
(source.runtimeType == HTML().runtimeType &&
|
||||||
|
(app.app.additionalSettings['versionExtractionRegEx'] as String?)
|
||||||
|
?.isNotEmpty !=
|
||||||
|
true);
|
||||||
|
bool isDirectAPKLink = source.runtimeType == DirectAPKLink().runtimeType;
|
||||||
return app.app.additionalSettings['trackOnly'] != true &&
|
return app.app.additionalSettings['trackOnly'] != true &&
|
||||||
app.app.additionalSettings['releaseDateAsVersion'] != true &&
|
app.app.additionalSettings['releaseDateAsVersion'] != true &&
|
||||||
|
!isHTMLWithNoVersionDetection &&
|
||||||
|
!isDirectAPKLink &&
|
||||||
realInstalledVersion != null &&
|
realInstalledVersion != null &&
|
||||||
app.app.installedVersion != null &&
|
app.app.installedVersion != null &&
|
||||||
(reconcileVersionDifferences(
|
(reconcileVersionDifferences(
|
||||||
@ -1130,6 +1250,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
!isVersionDetectionPossible(
|
!isVersionDetectionPossible(
|
||||||
AppInMemory(app, null, installedInfo, null))) {
|
AppInMemory(app, null, installedInfo, null))) {
|
||||||
app.additionalSettings['versionDetection'] = false;
|
app.additionalSettings['versionDetection'] = false;
|
||||||
|
app.installedVersion = app.latestVersion;
|
||||||
logs.add('Could not reconcile version formats for: ${app.id}');
|
logs.add('Could not reconcile version formats for: ${app.id}');
|
||||||
modded = true;
|
modded = true;
|
||||||
}
|
}
|
||||||
@ -1258,10 +1379,16 @@ class AppsProvider with ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> updateAppIcon(String? appId) async {
|
Future<void> updateAppIcon(String? appId, {bool ignoreCache = false}) async {
|
||||||
if (apps[appId]?.icon == null) {
|
if (apps[appId]?.icon == null) {
|
||||||
var icon =
|
var cachedIcon = File('${iconsCacheDir.path}/$appId.png');
|
||||||
(await apps[appId]?.installedInfo?.applicationInfo?.getAppIcon());
|
var alreadyCached = cachedIcon.existsSync() && !ignoreCache;
|
||||||
|
var icon = alreadyCached
|
||||||
|
? (await cachedIcon.readAsBytes())
|
||||||
|
: (await apps[appId]?.installedInfo?.applicationInfo?.getAppIcon());
|
||||||
|
if (icon != null && !alreadyCached) {
|
||||||
|
cachedIcon.writeAsBytes(icon.toList());
|
||||||
|
}
|
||||||
if (icon != null) {
|
if (icon != null) {
|
||||||
apps.update(
|
apps.update(
|
||||||
apps[appId]!.app.id,
|
apps[appId]!.app.id,
|
||||||
@ -1501,6 +1628,34 @@ class AppsProvider with ChangeNotifier {
|
|||||||
return updateAppIds;
|
return updateAppIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> generateExportJSON(
|
||||||
|
{List<String>? appIds, bool? overrideExportSettings}) {
|
||||||
|
Map<String, dynamic> finalExport = {};
|
||||||
|
finalExport['apps'] = apps.values
|
||||||
|
.where((e) {
|
||||||
|
if (appIds == null) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return appIds.contains(e.app.id);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.map((e) => e.app.toJson())
|
||||||
|
.toList();
|
||||||
|
bool shouldExportSettings = settingsProvider.exportSettings;
|
||||||
|
if (overrideExportSettings != null) {
|
||||||
|
shouldExportSettings = overrideExportSettings;
|
||||||
|
}
|
||||||
|
if (shouldExportSettings) {
|
||||||
|
finalExport['settings'] = Map<String, Object?>.fromEntries(
|
||||||
|
(settingsProvider.prefs
|
||||||
|
?.getKeys()
|
||||||
|
.map((key) => MapEntry(key, settingsProvider.prefs?.get(key)))
|
||||||
|
.toList()) ??
|
||||||
|
[]);
|
||||||
|
}
|
||||||
|
return finalExport;
|
||||||
|
}
|
||||||
|
|
||||||
Future<String?> export(
|
Future<String?> export(
|
||||||
{bool pickOnly = false, isAuto = false, SettingsProvider? sp}) async {
|
{bool pickOnly = false, isAuto = false, SettingsProvider? sp}) async {
|
||||||
SettingsProvider settingsProvider = sp ?? this.settingsProvider;
|
SettingsProvider settingsProvider = sp ?? this.settingsProvider;
|
||||||
@ -1531,22 +1686,13 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
String? returnPath;
|
String? returnPath;
|
||||||
if (!pickOnly) {
|
if (!pickOnly) {
|
||||||
Map<String, dynamic> finalExport = {};
|
var encoder = const JsonEncoder.withIndent(" ");
|
||||||
finalExport['apps'] = apps.values.map((e) => e.app.toJson()).toList();
|
Map<String, dynamic> finalExport = generateExportJSON();
|
||||||
if (settingsProvider.exportSettings) {
|
|
||||||
finalExport['settings'] = Map<String, Object?>.fromEntries(
|
|
||||||
(settingsProvider.prefs
|
|
||||||
?.getKeys()
|
|
||||||
.map((key) =>
|
|
||||||
MapEntry(key, settingsProvider.prefs?.get(key)))
|
|
||||||
.toList()) ??
|
|
||||||
[]);
|
|
||||||
}
|
|
||||||
var result = await saf.createFile(exportDir,
|
var result = await saf.createFile(exportDir,
|
||||||
displayName:
|
displayName:
|
||||||
'${tr('obtainiumExportHyphenatedLowercase')}-${DateTime.now().toIso8601String().replaceAll(':', '-')}${isAuto ? '-auto' : ''}.json',
|
'${tr('obtainiumExportHyphenatedLowercase')}-${DateTime.now().toIso8601String().replaceAll(':', '-')}${isAuto ? '-auto' : ''}.json',
|
||||||
mimeType: 'application/json',
|
mimeType: 'application/json',
|
||||||
bytes: Uint8List.fromList(utf8.encode(jsonEncode(finalExport))));
|
bytes: Uint8List.fromList(utf8.encode(encoder.convert(finalExport))));
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
throw ObtainiumError(tr('unexpectedError'));
|
throw ObtainiumError(tr('unexpectedError'));
|
||||||
}
|
}
|
||||||
@ -1770,7 +1916,9 @@ Future<void> bgUpdateCheck(String taskId, Map<String, dynamic>? params) async {
|
|||||||
int maxRetryWaitSeconds = 5;
|
int maxRetryWaitSeconds = 5;
|
||||||
|
|
||||||
var netResult = await (Connectivity().checkConnectivity());
|
var netResult = await (Connectivity().checkConnectivity());
|
||||||
if (netResult.contains(ConnectivityResult.none)) {
|
if (netResult.contains(ConnectivityResult.none) ||
|
||||||
|
netResult.isEmpty ||
|
||||||
|
(netResult.contains(ConnectivityResult.vpn) && netResult.length == 1)) {
|
||||||
logs.add('BG update task: No network.');
|
logs.add('BG update task: No network.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1805,10 +1953,20 @@ Future<void> bgUpdateCheck(String taskId, Map<String, dynamic>? params) async {
|
|||||||
(<List<MapEntry<String, int>>>[]))
|
(<List<MapEntry<String, int>>>[]))
|
||||||
];
|
];
|
||||||
|
|
||||||
var networkRestricted = false;
|
var networkRestricted = appsProvider.settingsProvider.bgUpdatesOnWiFiOnly &&
|
||||||
if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) {
|
!netResult.contains(ConnectivityResult.wifi) &&
|
||||||
networkRestricted = !netResult.contains(ConnectivityResult.wifi) &&
|
!netResult.contains(ConnectivityResult.ethernet);
|
||||||
!netResult.contains(ConnectivityResult.ethernet);
|
|
||||||
|
var chargingRestricted =
|
||||||
|
appsProvider.settingsProvider.bgUpdatesWhileChargingOnly &&
|
||||||
|
(await Battery().batteryState) != BatteryState.charging;
|
||||||
|
|
||||||
|
if (networkRestricted) {
|
||||||
|
logs.add('BG update task: Network restriction in effect.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chargingRestricted) {
|
||||||
|
logs.add('BG update task: Charging restriction in effect.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toCheck.isNotEmpty) {
|
if (toCheck.isNotEmpty) {
|
||||||
@ -1848,14 +2006,6 @@ Future<void> bgUpdateCheck(String taskId, Map<String, dynamic>? params) async {
|
|||||||
CheckingUpdatesNotification notif = CheckingUpdatesNotification(
|
CheckingUpdatesNotification notif = CheckingUpdatesNotification(
|
||||||
plural('apps', toCheck.length)); // The notif. to show while checking
|
plural('apps', toCheck.length)); // The notif. to show while checking
|
||||||
|
|
||||||
// Set a bool for when we're no on wifi/wired and the user doesn't want to download apps in that state
|
|
||||||
var networkRestricted = false;
|
|
||||||
if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) {
|
|
||||||
var netResult = await (Connectivity().checkConnectivity());
|
|
||||||
networkRestricted = !netResult.contains(ConnectivityResult.wifi) &&
|
|
||||||
!netResult.contains(ConnectivityResult.ethernet);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Check for updates
|
// Check for updates
|
||||||
notificationsProvider.notify(notif, cancelExisting: true);
|
notificationsProvider.notify(notif, cancelExisting: true);
|
||||||
@ -1903,6 +2053,7 @@ Future<void> bgUpdateCheck(String taskId, Map<String, dynamic>? params) async {
|
|||||||
// Filter out updates that will be installed silently (the rest go into toNotify)
|
// Filter out updates that will be installed silently (the rest go into toNotify)
|
||||||
for (var i = 0; i < updates.length; i++) {
|
for (var i = 0; i < updates.length; i++) {
|
||||||
if (networkRestricted ||
|
if (networkRestricted ||
|
||||||
|
chargingRestricted ||
|
||||||
!(await appsProvider.canInstallSilently(updates[i]))) {
|
!(await appsProvider.canInstallSilently(updates[i]))) {
|
||||||
if (updates[i].additionalSettings['skipUpdateNotifications'] != true) {
|
if (updates[i].additionalSettings['skipUpdateNotifications'] != true) {
|
||||||
toNotify.add(updates[i]);
|
toNotify.add(updates[i]);
|
||||||
@ -1949,7 +2100,7 @@ Future<void> bgUpdateCheck(String taskId, Map<String, dynamic>? params) async {
|
|||||||
} else {
|
} else {
|
||||||
// In install mode...
|
// In install mode...
|
||||||
// If you haven't explicitly been given updates to install, grab all available silent updates
|
// If you haven't explicitly been given updates to install, grab all available silent updates
|
||||||
if (toInstall.isEmpty && !networkRestricted) {
|
if (toInstall.isEmpty && !networkRestricted && !chargingRestricted) {
|
||||||
var temp = appsProvider.findExistingUpdates(installedOnly: true);
|
var temp = appsProvider.findExistingUpdates(installedOnly: true);
|
||||||
for (var i = 0; i < temp.length; i++) {
|
for (var i = 0; i < temp.length; i++) {
|
||||||
if (await appsProvider
|
if (await appsProvider
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||||
|
import 'package:obtainium/providers/settings_provider.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
class ObtainiumNotification {
|
class ObtainiumNotification {
|
||||||
@ -44,23 +45,19 @@ class SilentUpdateNotification extends ObtainiumNotification {
|
|||||||
SilentUpdateNotification(List<App> updates, bool succeeded, {int? id})
|
SilentUpdateNotification(List<App> updates, bool succeeded, {int? id})
|
||||||
: super(
|
: super(
|
||||||
id ?? 3,
|
id ?? 3,
|
||||||
succeeded
|
succeeded ? tr('appsUpdated') : tr('appsNotUpdated'),
|
||||||
? tr('appsUpdated')
|
|
||||||
: tr('appsNotUpdated'),
|
|
||||||
'',
|
'',
|
||||||
'APPS_UPDATED',
|
'APPS_UPDATED',
|
||||||
tr('appsUpdatedNotifChannel'),
|
tr('appsUpdatedNotifChannel'),
|
||||||
tr('appsUpdatedNotifDescription'),
|
tr('appsUpdatedNotifDescription'),
|
||||||
Importance.defaultImportance) {
|
Importance.defaultImportance) {
|
||||||
message = updates.length == 1
|
message = updates.length == 1
|
||||||
? tr(succeeded
|
? tr(succeeded ? 'xWasUpdatedToY' : 'xWasNotUpdatedToY',
|
||||||
? 'xWasUpdatedToY'
|
args: [updates[0].finalName, updates[0].latestVersion])
|
||||||
: 'xWasNotUpdatedToY',
|
: plural(
|
||||||
args: [updates[0].finalName, updates[0].latestVersion])
|
succeeded ? 'xAndNMoreUpdatesInstalled' : "xAndNMoreUpdatesFailed",
|
||||||
: plural(succeeded
|
updates.length - 1,
|
||||||
? 'xAndNMoreUpdatesInstalled'
|
args: [updates[0].finalName, (updates.length - 1).toString()]);
|
||||||
: "xAndNMoreUpdatesFailed",
|
|
||||||
updates.length - 1, args: [updates[0].finalName, (updates.length - 1).toString()]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,7 +211,7 @@ class NotificationsProvider {
|
|||||||
channelDescription: channelDescription,
|
channelDescription: channelDescription,
|
||||||
importance: importance,
|
importance: importance,
|
||||||
priority: importanceToPriority[importance]!,
|
priority: importanceToPriority[importance]!,
|
||||||
groupKey: 'dev.imranr.obtainium.$channelCode',
|
groupKey: '$obtainiumId.$channelCode',
|
||||||
progress: progPercent ?? 0,
|
progress: progPercent ?? 0,
|
||||||
maxProgress: 100,
|
maxProgress: 100,
|
||||||
showProgress: progPercent != null,
|
showProgress: progPercent != null,
|
||||||
|
@ -48,7 +48,7 @@ class SettingsProvider with ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get useShizuku{
|
bool get useShizuku {
|
||||||
return prefs?.getBool('useShizuku') ?? false;
|
return prefs?.getBool('useShizuku') ?? false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,8 +69,7 @@ class SettingsProvider with ChangeNotifier {
|
|||||||
|
|
||||||
Color get themeColor {
|
Color get themeColor {
|
||||||
int? colorCode = prefs?.getInt('themeColor');
|
int? colorCode = prefs?.getInt('themeColor');
|
||||||
return (colorCode != null) ?
|
return (colorCode != null) ? Color(colorCode) : obtainiumThemeColor;
|
||||||
Color(colorCode) : obtainiumThemeColor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set themeColor(Color themeColor) {
|
set themeColor(Color themeColor) {
|
||||||
@ -350,6 +349,15 @@ class SettingsProvider with ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get bgUpdatesWhileChargingOnly {
|
||||||
|
return prefs?.getBool('bgUpdatesWhileChargingOnly') ?? false;
|
||||||
|
}
|
||||||
|
|
||||||
|
set bgUpdatesWhileChargingOnly(bool val) {
|
||||||
|
prefs?.setBool('bgUpdatesWhileChargingOnly', val);
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
DateTime get lastCompletedBGCheckTime {
|
DateTime get lastCompletedBGCheckTime {
|
||||||
int? temp = prefs?.getInt('lastCompletedBGCheckTime');
|
int? temp = prefs?.getInt('lastCompletedBGCheckTime');
|
||||||
return temp != null
|
return temp != null
|
||||||
@ -469,4 +477,13 @@ class SettingsProvider with ChangeNotifier {
|
|||||||
prefs?.setBool('beforeNewInstallsShareToAppVerifier', val);
|
prefs?.setBool('beforeNewInstallsShareToAppVerifier', val);
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get shizukuPretendToBeGooglePlay {
|
||||||
|
return prefs?.getBool('shizukuPretendToBeGooglePlay') ?? false;
|
||||||
|
}
|
||||||
|
|
||||||
|
set shizukuPretendToBeGooglePlay(bool val) {
|
||||||
|
prefs?.setBool('shizukuPretendToBeGooglePlay', val);
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,11 +2,13 @@
|
|||||||
// AppSource is an abstract class with a concrete implementation for each source
|
// AppSource is an abstract class with a concrete implementation for each source
|
||||||
|
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:device_info_plus/device_info_plus.dart';
|
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/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
|
import 'package:http/io_client.dart';
|
||||||
import 'package:obtainium/app_sources/apkmirror.dart';
|
import 'package:obtainium/app_sources/apkmirror.dart';
|
||||||
import 'package:obtainium/app_sources/apkpure.dart';
|
import 'package:obtainium/app_sources/apkpure.dart';
|
||||||
import 'package:obtainium/app_sources/aptoide.dart';
|
import 'package:obtainium/app_sources/aptoide.dart';
|
||||||
@ -21,17 +23,14 @@ import 'package:obtainium/app_sources/izzyondroid.dart';
|
|||||||
import 'package:obtainium/app_sources/html.dart';
|
import 'package:obtainium/app_sources/html.dart';
|
||||||
import 'package:obtainium/app_sources/jenkins.dart';
|
import 'package:obtainium/app_sources/jenkins.dart';
|
||||||
import 'package:obtainium/app_sources/neutroncode.dart';
|
import 'package:obtainium/app_sources/neutroncode.dart';
|
||||||
import 'package:obtainium/app_sources/signal.dart';
|
|
||||||
import 'package:obtainium/app_sources/sourceforge.dart';
|
import 'package:obtainium/app_sources/sourceforge.dart';
|
||||||
import 'package:obtainium/app_sources/sourcehut.dart';
|
import 'package:obtainium/app_sources/sourcehut.dart';
|
||||||
import 'package:obtainium/app_sources/steammobile.dart';
|
import 'package:obtainium/app_sources/tencent.dart';
|
||||||
import 'package:obtainium/app_sources/telegramapp.dart';
|
|
||||||
import 'package:obtainium/app_sources/uptodown.dart';
|
import 'package:obtainium/app_sources/uptodown.dart';
|
||||||
import 'package:obtainium/app_sources/vlc.dart';
|
|
||||||
import 'package:obtainium/app_sources/whatsapp.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/mass_app_sources/githubstars.dart';
|
import 'package:obtainium/mass_app_sources/githubstars.dart';
|
||||||
|
import 'package:obtainium/providers/logs_provider.dart';
|
||||||
import 'package:obtainium/providers/settings_provider.dart';
|
import 'package:obtainium/providers/settings_provider.dart';
|
||||||
|
|
||||||
class AppNames {
|
class AppNames {
|
||||||
@ -152,10 +151,6 @@ appJSONCompatibilityModifiers(Map<String, dynamic> json) {
|
|||||||
additionalSettings['autoApkFilterByArch'] = false;
|
additionalSettings['autoApkFilterByArch'] = false;
|
||||||
}
|
}
|
||||||
if (source.runtimeType == HTML().runtimeType) {
|
if (source.runtimeType == HTML().runtimeType) {
|
||||||
// HTML 'fixed URL' support should be disabled if it previously did not exist
|
|
||||||
if (originalAdditionalSettings['supportFixedAPKURL'] == null) {
|
|
||||||
additionalSettings['supportFixedAPKURL'] = false;
|
|
||||||
}
|
|
||||||
// HTML key rename
|
// HTML key rename
|
||||||
if (originalAdditionalSettings['sortByFileNamesNotLinks'] != null) {
|
if (originalAdditionalSettings['sortByFileNamesNotLinks'] != null) {
|
||||||
additionalSettings['sortByLastLinkSegment'] =
|
additionalSettings['sortByLastLinkSegment'] =
|
||||||
@ -180,7 +175,7 @@ appJSONCompatibilityModifiers(Map<String, dynamic> json) {
|
|||||||
}).toList();
|
}).toList();
|
||||||
}
|
}
|
||||||
// Steam source apps should be converted to HTML (#1244)
|
// Steam source apps should be converted to HTML (#1244)
|
||||||
var legacySteamSourceApps = SteamMobile().apks.keys;
|
var legacySteamSourceApps = ['steam', 'steam-chat-app'];
|
||||||
if (legacySteamSourceApps.contains(additionalSettings['app'] ?? '')) {
|
if (legacySteamSourceApps.contains(additionalSettings['app'] ?? '')) {
|
||||||
json['url'] = '${json['url']}/mobile';
|
json['url'] = '${json['url']}/mobile';
|
||||||
var replacementAdditionalSettings = getDefaultValuesFromFormItems(
|
var replacementAdditionalSettings = getDefaultValuesFromFormItems(
|
||||||
@ -197,6 +192,88 @@ appJSONCompatibilityModifiers(Map<String, dynamic> json) {
|
|||||||
replacementAdditionalSettings['matchGroupToUse'] = '\$1';
|
replacementAdditionalSettings['matchGroupToUse'] = '\$1';
|
||||||
additionalSettings = replacementAdditionalSettings;
|
additionalSettings = replacementAdditionalSettings;
|
||||||
}
|
}
|
||||||
|
// Signal apps from before it was removed should be converted to HTML (#1928)
|
||||||
|
if (json['url'] == 'https://signal.org' &&
|
||||||
|
json['id'] == 'org.thoughtcrime.securesms' &&
|
||||||
|
json['author'] == 'Signal' &&
|
||||||
|
json['name'] == 'Signal' &&
|
||||||
|
json['overrideSource'] == null &&
|
||||||
|
additionalSettings['trackOnly'] == false &&
|
||||||
|
additionalSettings['versionExtractionRegEx'] == '' &&
|
||||||
|
json['lastUpdateCheck'] != null) {
|
||||||
|
json['url'] = 'https://updates.signal.org/android/latest.json';
|
||||||
|
var replacementAdditionalSettings = getDefaultValuesFromFormItems(
|
||||||
|
HTML().combinedAppSpecificSettingFormItems);
|
||||||
|
replacementAdditionalSettings['versionExtractionRegEx'] =
|
||||||
|
'\\d+.\\d+.\\d+';
|
||||||
|
additionalSettings = replacementAdditionalSettings;
|
||||||
|
}
|
||||||
|
// WhatsApp from before it was removed should be converted to HTML (#1943)
|
||||||
|
if (json['url'] == 'https://whatsapp.com' &&
|
||||||
|
json['id'] == 'com.whatsapp' &&
|
||||||
|
json['author'] == 'Meta' &&
|
||||||
|
json['name'] == 'WhatsApp' &&
|
||||||
|
json['overrideSource'] == null &&
|
||||||
|
additionalSettings['trackOnly'] == false &&
|
||||||
|
additionalSettings['versionExtractionRegEx'] == '' &&
|
||||||
|
json['lastUpdateCheck'] != null) {
|
||||||
|
json['url'] = 'https://whatsapp.com/android';
|
||||||
|
var replacementAdditionalSettings = getDefaultValuesFromFormItems(
|
||||||
|
HTML().combinedAppSpecificSettingFormItems);
|
||||||
|
replacementAdditionalSettings['refreshBeforeDownload'] = true;
|
||||||
|
additionalSettings = replacementAdditionalSettings;
|
||||||
|
}
|
||||||
|
// VLC from before it was removed should be converted to HTML (#1943)
|
||||||
|
if (json['url'] == 'https://videolan.org' &&
|
||||||
|
json['id'] == 'org.videolan.vlc' &&
|
||||||
|
json['author'] == 'VideoLAN' &&
|
||||||
|
json['name'] == 'VLC' &&
|
||||||
|
json['overrideSource'] == null &&
|
||||||
|
additionalSettings['trackOnly'] == false &&
|
||||||
|
additionalSettings['versionExtractionRegEx'] == '' &&
|
||||||
|
json['lastUpdateCheck'] != null) {
|
||||||
|
json['url'] = 'https://www.videolan.org/vlc/download-android.html';
|
||||||
|
var replacementAdditionalSettings = getDefaultValuesFromFormItems(
|
||||||
|
HTML().combinedAppSpecificSettingFormItems);
|
||||||
|
replacementAdditionalSettings['refreshBeforeDownload'] = true;
|
||||||
|
replacementAdditionalSettings['intermediateLink'] =
|
||||||
|
<Map<String, dynamic>>[
|
||||||
|
{
|
||||||
|
'customLinkFilterRegex': 'APK',
|
||||||
|
'filterByLinkText': true,
|
||||||
|
'skipSort': false,
|
||||||
|
'reverseSort': false,
|
||||||
|
'sortByLastLinkSegment': false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'customLinkFilterRegex': 'arm64-v8a\\.apk\$',
|
||||||
|
'filterByLinkText': false,
|
||||||
|
'skipSort': false,
|
||||||
|
'reverseSort': false,
|
||||||
|
'sortByLastLinkSegment': false
|
||||||
|
}
|
||||||
|
];
|
||||||
|
replacementAdditionalSettings['versionExtractionRegEx'] =
|
||||||
|
'/vlc-android/([^/]+)/';
|
||||||
|
replacementAdditionalSettings['matchGroupToUse'] = "1";
|
||||||
|
additionalSettings = replacementAdditionalSettings;
|
||||||
|
}
|
||||||
|
// Telegram App from before it was removed should be converted to Direct APK Link (#1943)
|
||||||
|
if (json['url'] == 'https://telegram.org' &&
|
||||||
|
json['id'] == 'org.telegram.messenger.web' &&
|
||||||
|
json['author'] == 'Telegram' &&
|
||||||
|
json['name'] == 'Telegram' &&
|
||||||
|
json['overrideSource'] == null &&
|
||||||
|
additionalSettings['trackOnly'] == false &&
|
||||||
|
additionalSettings['versionExtractionRegEx'] == '' &&
|
||||||
|
json['lastUpdateCheck'] != null) {
|
||||||
|
json['url'] = 'https://telegram.org/dl/android/apk';
|
||||||
|
var newSource = DirectAPKLink();
|
||||||
|
json['overrideSource'] = newSource.runtimeType.toString();
|
||||||
|
var replacementAdditionalSettings = getDefaultValuesFromFormItems(
|
||||||
|
newSource.combinedAppSpecificSettingFormItems);
|
||||||
|
additionalSettings = replacementAdditionalSettings;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
json['additionalSettings'] = jsonEncode(additionalSettings);
|
json['additionalSettings'] = jsonEncode(additionalSettings);
|
||||||
// F-Droid no longer needs cloudflare exception since override can be used - migrate apps appropriately
|
// F-Droid no longer needs cloudflare exception since override can be used - migrate apps appropriately
|
||||||
@ -223,7 +300,7 @@ class App {
|
|||||||
late String name;
|
late String name;
|
||||||
String? installedVersion;
|
String? installedVersion;
|
||||||
late String latestVersion;
|
late String latestVersion;
|
||||||
List<MapEntry<String, String>> apkUrls = [];
|
List<MapEntry<String, String>> apkUrls = []; // Key is name, value is URL
|
||||||
List<MapEntry<String, String>> otherAssetUrls = [];
|
List<MapEntry<String, String>> otherAssetUrls = [];
|
||||||
late int preferredApkIndex;
|
late int preferredApkIndex;
|
||||||
late Map<String, dynamic> additionalSettings;
|
late Map<String, dynamic> additionalSettings;
|
||||||
@ -287,7 +364,14 @@ class App {
|
|||||||
otherAssetUrls: otherAssetUrls);
|
otherAssetUrls: otherAssetUrls);
|
||||||
|
|
||||||
factory App.fromJson(Map<String, dynamic> json) {
|
factory App.fromJson(Map<String, dynamic> json) {
|
||||||
json = appJSONCompatibilityModifiers(json);
|
Map<String, dynamic> originalJSON = new Map.from(json);
|
||||||
|
try {
|
||||||
|
json = appJSONCompatibilityModifiers(json);
|
||||||
|
} catch (e) {
|
||||||
|
json = originalJSON;
|
||||||
|
LogsProvider().add(
|
||||||
|
'Error running JSON compat modifiers: ${e.toString()}: ${originalJSON.toString()}');
|
||||||
|
}
|
||||||
return App(
|
return App(
|
||||||
json['id'] as String,
|
json['id'] as String,
|
||||||
json['url'] as String,
|
json['url'] as String,
|
||||||
@ -355,8 +439,10 @@ preStandardizeUrl(String url) {
|
|||||||
url = 'https://$url';
|
url = 'https://$url';
|
||||||
}
|
}
|
||||||
var uri = Uri.tryParse(url);
|
var uri = Uri.tryParse(url);
|
||||||
var trailingSlash = (uri?.path.endsWith('/') ?? false) &&
|
var trailingSlash = ((uri?.path.endsWith('/') ?? false) ||
|
||||||
|
((uri?.path.isEmpty ?? false) && url.endsWith('/'))) &&
|
||||||
(uri?.queryParameters.isEmpty ?? false);
|
(uri?.queryParameters.isEmpty ?? false);
|
||||||
|
|
||||||
url = url
|
url = url
|
||||||
.split('/')
|
.split('/')
|
||||||
.where((e) => e.isNotEmpty)
|
.where((e) => e.isNotEmpty)
|
||||||
@ -397,9 +483,19 @@ getSourceRegex(List<String> hosts) {
|
|||||||
return '(${hosts.join('|').replaceAll('.', '\\.')})';
|
return '(${hosts.join('|').replaceAll('.', '\\.')})';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HttpClient createHttpClient(bool insecure) {
|
||||||
|
final client = HttpClient();
|
||||||
|
if (insecure) {
|
||||||
|
client.badCertificateCallback =
|
||||||
|
(X509Certificate cert, String host, int port) => true;
|
||||||
|
}
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
abstract class AppSource {
|
abstract class AppSource {
|
||||||
List<String> hosts = [];
|
List<String> hosts = [];
|
||||||
bool hostChanged = false;
|
bool hostChanged = false;
|
||||||
|
bool hostIdenticalDespiteAnyChange = false;
|
||||||
late String name;
|
late String name;
|
||||||
bool enforceTrackOnly = false;
|
bool enforceTrackOnly = false;
|
||||||
bool changeLogIfAnyIsMarkDown = true;
|
bool changeLogIfAnyIsMarkDown = true;
|
||||||
@ -410,6 +506,7 @@ abstract class AppSource {
|
|||||||
bool showReleaseDateAsVersionToggle = false;
|
bool showReleaseDateAsVersionToggle = false;
|
||||||
bool versionDetectionDisallowed = false;
|
bool versionDetectionDisallowed = false;
|
||||||
List<String> excludeCommonSettingKeys = [];
|
List<String> excludeCommonSettingKeys = [];
|
||||||
|
bool urlsAlwaysHaveExtension = false;
|
||||||
|
|
||||||
AppSource() {
|
AppSource() {
|
||||||
name = runtimeType.toString();
|
name = runtimeType.toString();
|
||||||
@ -451,17 +548,25 @@ abstract class AppSource {
|
|||||||
|
|
||||||
Future<Response> sourceRequest(
|
Future<Response> sourceRequest(
|
||||||
String url, Map<String, dynamic> additionalSettings,
|
String url, Map<String, dynamic> additionalSettings,
|
||||||
{bool followRedirects = true}) async {
|
{bool followRedirects = true, Object? postBody}) async {
|
||||||
var requestHeaders = await getRequestHeaders(additionalSettings);
|
var requestHeaders = await getRequestHeaders(additionalSettings);
|
||||||
if (requestHeaders != null || followRedirects == false) {
|
if (requestHeaders != null || followRedirects == false) {
|
||||||
var req = Request('GET', Uri.parse(url));
|
var req = Request(postBody == null ? 'GET' : 'POST', Uri.parse(url));
|
||||||
req.followRedirects = followRedirects;
|
req.followRedirects = followRedirects;
|
||||||
if (requestHeaders != null) {
|
if (requestHeaders != null) {
|
||||||
req.headers.addAll(requestHeaders);
|
req.headers.addAll(requestHeaders);
|
||||||
}
|
}
|
||||||
return Response.fromStream(await Client().send(req));
|
if (postBody != null) {
|
||||||
|
req.headers[HttpHeaders.contentTypeHeader] = 'application/json';
|
||||||
|
req.body = jsonEncode(postBody);
|
||||||
|
}
|
||||||
|
return Response.fromStream(await IOClient(
|
||||||
|
createHttpClient(additionalSettings['allowInsecure'] == true))
|
||||||
|
.send(req));
|
||||||
} else {
|
} else {
|
||||||
return get(Uri.parse(url));
|
return postBody == null
|
||||||
|
? get(Uri.parse(url))
|
||||||
|
: post(Uri.parse(url), body: jsonEncode(postBody));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -469,7 +574,7 @@ abstract class AppSource {
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
throw NotImplementedError();
|
throw NotImplementedError();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -493,13 +598,15 @@ abstract class AppSource {
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
GeneratedFormTextField('versionExtractionRegEx',
|
GeneratedFormTextField('versionExtractionRegEx',
|
||||||
label: tr('versionExtractionRegEx'),
|
label: tr('trimVersionString'),
|
||||||
required: false,
|
required: false,
|
||||||
additionalValidators: [(value) => regExValidator(value)]),
|
additionalValidators: [(value) => regExValidator(value)]),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
GeneratedFormTextField('matchGroupToUse',
|
GeneratedFormTextField('matchGroupToUse',
|
||||||
label: tr('matchGroupToUse'), required: false, hint: '\$0')
|
label: tr('matchGroupToUseForX', args: [tr('trimVersionString')]),
|
||||||
|
required: false,
|
||||||
|
hint: '\$0')
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
GeneratedFormSwitch('versionDetection',
|
GeneratedFormSwitch('versionDetection',
|
||||||
@ -533,6 +640,10 @@ abstract class AppSource {
|
|||||||
GeneratedFormSwitch('shizukuPretendToBeGooglePlay',
|
GeneratedFormSwitch('shizukuPretendToBeGooglePlay',
|
||||||
label: tr('shizukuPretendToBeGooglePlay'), defaultValue: false)
|
label: tr('shizukuPretendToBeGooglePlay'), defaultValue: false)
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
GeneratedFormSwitch('allowInsecure',
|
||||||
|
label: tr('allowInsecure'), defaultValue: false)
|
||||||
|
],
|
||||||
[
|
[
|
||||||
GeneratedFormSwitch('exemptFromBackgroundUpdates',
|
GeneratedFormSwitch('exemptFromBackgroundUpdates',
|
||||||
label: tr('exemptFromBackgroundUpdates'))
|
label: tr('exemptFromBackgroundUpdates'))
|
||||||
@ -541,7 +652,11 @@ abstract class AppSource {
|
|||||||
GeneratedFormSwitch('skipUpdateNotifications',
|
GeneratedFormSwitch('skipUpdateNotifications',
|
||||||
label: tr('skipUpdateNotifications'))
|
label: tr('skipUpdateNotifications'))
|
||||||
],
|
],
|
||||||
[GeneratedFormTextField('about', label: tr('about'), required: false)]
|
[GeneratedFormTextField('about', label: tr('about'), required: false)],
|
||||||
|
[
|
||||||
|
GeneratedFormSwitch('refreshBeforeDownload',
|
||||||
|
label: tr('refreshBeforeDownload'))
|
||||||
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
// Previous 2 variables combined into one at runtime for convenient usage
|
// Previous 2 variables combined into one at runtime for convenient usage
|
||||||
@ -599,9 +714,10 @@ abstract class AppSource {
|
|||||||
SettingsProvider settingsProvider) async {
|
SettingsProvider settingsProvider) async {
|
||||||
Map<String, String> results = {};
|
Map<String, String> results = {};
|
||||||
for (var e in sourceConfigSettingFormItems) {
|
for (var e in sourceConfigSettingFormItems) {
|
||||||
var val = hostChanged
|
var val = hostChanged && !hostIdenticalDespiteAnyChange
|
||||||
? additionalSettings[e.key]
|
? additionalSettings[e.key]
|
||||||
: settingsProvider.getSettingString(e.key);
|
: additionalSettings[e.key] ??
|
||||||
|
settingsProvider.getSettingString(e.key);
|
||||||
if (val != null) {
|
if (val != null) {
|
||||||
results[e.key] = val;
|
results[e.key] = val;
|
||||||
}
|
}
|
||||||
@ -759,13 +875,10 @@ class SourceProvider {
|
|||||||
APKPure(),
|
APKPure(),
|
||||||
Aptoide(),
|
Aptoide(),
|
||||||
Uptodown(),
|
Uptodown(),
|
||||||
APKMirror(),
|
|
||||||
HuaweiAppGallery(),
|
HuaweiAppGallery(),
|
||||||
|
Tencent(),
|
||||||
Jenkins(),
|
Jenkins(),
|
||||||
Signal(),
|
APKMirror(),
|
||||||
VLC(),
|
|
||||||
WhatsApp(),
|
|
||||||
TelegramApp(),
|
|
||||||
NeutronCode(),
|
NeutronCode(),
|
||||||
DirectAPKLink(),
|
DirectAPKLink(),
|
||||||
HTML() // This should ALWAYS be the last option as they are tried in order
|
HTML() // This should ALWAYS be the last option as they are tried in order
|
||||||
@ -783,9 +896,14 @@ class SourceProvider {
|
|||||||
throw UnsupportedURLError();
|
throw UnsupportedURLError();
|
||||||
}
|
}
|
||||||
var res = srcs.first;
|
var res = srcs.first;
|
||||||
res.hosts = [Uri.parse(url).host];
|
var originalHosts = res.hosts;
|
||||||
|
var newHost = Uri.parse(url).host;
|
||||||
|
res.hosts = [newHost];
|
||||||
res.hostChanged = true;
|
res.hostChanged = true;
|
||||||
return srcs.first;
|
if (originalHosts.contains(newHost)) {
|
||||||
|
res.hostIdenticalDespiteAnyChange = true;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
AppSource? source;
|
AppSource? source;
|
||||||
for (var s in sources.where((element) => element.hosts.isNotEmpty)) {
|
for (var s in sources.where((element) => element.hosts.isNotEmpty)) {
|
||||||
@ -804,7 +922,7 @@ class SourceProvider {
|
|||||||
for (var s in sources.where(
|
for (var s in sources.where(
|
||||||
(element) => element.hosts.isEmpty && !element.neverAutoSelect)) {
|
(element) => element.hosts.isEmpty && !element.neverAutoSelect)) {
|
||||||
try {
|
try {
|
||||||
s.sourceSpecificStandardizeURL(url);
|
s.sourceSpecificStandardizeURL(url, forSelection: true);
|
||||||
source = s;
|
source = s;
|
||||||
break;
|
break;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -885,6 +1003,9 @@ class SourceProvider {
|
|||||||
name = name.isNotEmpty ? name : apk.names.name;
|
name = name.isNotEmpty ? name : apk.names.name;
|
||||||
App finalApp = App(
|
App finalApp = App(
|
||||||
currentApp?.id ??
|
currentApp?.id ??
|
||||||
|
((additionalSettings['appId'] != null)
|
||||||
|
? additionalSettings['appId']
|
||||||
|
: null) ??
|
||||||
(!trackOnly &&
|
(!trackOnly &&
|
||||||
(!source.appIdInferIsOptional ||
|
(!source.appIdInferIsOptional ||
|
||||||
(source.appIdInferIsOptional && inferAppIdIfOptional))
|
(source.appIdInferIsOptional && inferAppIdIfOptional))
|
||||||
|
378
pubspec.lock
378
pubspec.lock
@ -5,16 +5,16 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: android_intent_plus
|
name: android_intent_plus
|
||||||
sha256: "2bfdbee8d65e7c26f88b66f0a91f2863da4d3596d8a658b4162c8de5cf04b074"
|
sha256: "38921ec22ebb3b9a7eb678792cf6fab0b6f458b61b9d327688573449c9b47db3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.0.2"
|
version: "5.2.0"
|
||||||
android_package_installer:
|
android_package_installer:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: main
|
ref: main
|
||||||
resolved-ref: ba2aa7a11edc2649d1d80c25ed9291521262f714
|
resolved-ref: bcad19e964d377da8816718032e5dbf6dd16ba3a
|
||||||
url: "https://github.com/ImranR98/android_package_installer"
|
url: "https://github.com/ImranR98/android_package_installer"
|
||||||
source: git
|
source: git
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
@ -47,34 +47,34 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: app_links
|
name: app_links
|
||||||
sha256: a9905d6a60e814503fabc7523a9ed161b812d7ca69c99ad8ceea14279dc4f06b
|
sha256: ad1a6d598e7e39b46a34f746f9a8b011ee147e4c275d407fa457e7a62f84dd99
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.1.3"
|
version: "6.3.2"
|
||||||
app_links_linux:
|
app_links_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: app_links_linux
|
name: app_links_linux
|
||||||
sha256: "567139eca3ca9fb113f2082f3aaa75a26f30f0ebdbe5fa7f09a3913c5bebd630"
|
sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.2"
|
version: "1.0.3"
|
||||||
app_links_platform_interface:
|
app_links_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: app_links_platform_interface
|
name: app_links_platform_interface
|
||||||
sha256: "58cff6f11df59b0e514dd5e4a61e988348ad5662f0e75d45d4e214ebea55c94c"
|
sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.2"
|
||||||
app_links_web:
|
app_links_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: app_links_web
|
name: app_links_web
|
||||||
sha256: "74586ed5f3c4786341e82a0fa43c39ec3f13108a550f74e80d8bf68aa11349d1"
|
sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.3"
|
version: "1.0.4"
|
||||||
archive:
|
archive:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -87,10 +87,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: args
|
name: args
|
||||||
sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
|
sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.5.0"
|
version: "2.6.0"
|
||||||
async:
|
async:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -103,10 +103,26 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: background_fetch
|
name: background_fetch
|
||||||
sha256: b5c298c911bc2ce41152668bc72eb0488f0665d75bc6d1e69e7d8367763eddcd
|
sha256: e9f26ae54d88310b7ac2a68f2f9fcee0081a4d5f11100f233a70702021e7ac4f
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.5"
|
version: "1.3.7"
|
||||||
|
battery_plus:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: battery_plus
|
||||||
|
sha256: "220c8f1961efb01d6870493b5ac5a80afaeaffc8757f7a11ed3025a8570d29e7"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.2.0"
|
||||||
|
battery_plus_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: battery_plus_platform_interface
|
||||||
|
sha256: e8342c0f32de4b1dfd0223114b6785e48e579bfc398da9471c9179b907fa4910
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.1"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -135,10 +151,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: cli_util
|
name: cli_util
|
||||||
sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19
|
sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.4.1"
|
version: "0.4.2"
|
||||||
clock:
|
clock:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -159,42 +175,42 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: connectivity_plus
|
name: connectivity_plus
|
||||||
sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8
|
sha256: "876849631b0c7dc20f8b471a2a03142841b482438e3b707955464f5ffca3e4c3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.3"
|
version: "6.1.0"
|
||||||
connectivity_plus_platform_interface:
|
connectivity_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: connectivity_plus_platform_interface
|
name: connectivity_plus_platform_interface
|
||||||
sha256: b6a56efe1e6675be240de39107281d4034b64ac23438026355b4234042a35adb
|
sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.1"
|
||||||
cross_file:
|
cross_file:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: cross_file
|
name: cross_file
|
||||||
sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32"
|
sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.4+1"
|
version: "0.3.4+2"
|
||||||
crypto:
|
crypto:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: crypto
|
name: crypto
|
||||||
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.3"
|
version: "3.0.6"
|
||||||
csslib:
|
csslib:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: csslib
|
name: csslib
|
||||||
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
|
sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.0.2"
|
||||||
cupertino_icons:
|
cupertino_icons:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -215,18 +231,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: device_info_plus
|
name: device_info_plus
|
||||||
sha256: eead12d1a1ed83d8283ab4c2f3fca23ac4082f29f25f29dff0f758f57d06ec91
|
sha256: f545ffbadee826f26f2e1a0f0cbd667ae9a6011cc0f77c0f8f00a969655e6e95
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.1.0"
|
version: "11.1.1"
|
||||||
device_info_plus_platform_interface:
|
device_info_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: device_info_plus_platform_interface
|
name: device_info_plus_platform_interface
|
||||||
sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64
|
sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "7.0.0"
|
version: "7.0.1"
|
||||||
dynamic_color:
|
dynamic_color:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -271,50 +287,50 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: ffi
|
name: ffi
|
||||||
sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
|
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.3"
|
||||||
file:
|
file:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: file
|
name: file
|
||||||
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
|
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "7.0.0"
|
version: "7.0.1"
|
||||||
file_picker:
|
file_picker:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: file_picker
|
name: file_picker
|
||||||
sha256: "2ca051989f69d1b2ca012b2cf3ccf78c70d40144f0861ff2c063493f7c8c3d45"
|
sha256: "16dc141db5a2ccc6520ebb6a2eb5945b1b09e95085c021d9f914f8ded7f1465c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.0.5"
|
version: "8.1.4"
|
||||||
fixnum:
|
fixnum:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: fixnum
|
name: fixnum
|
||||||
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
|
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.1"
|
||||||
flex_color_picker:
|
flex_color_picker:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flex_color_picker
|
name: flex_color_picker
|
||||||
sha256: "809af4ec82ede3b140ed0219b97d548de99e47aa4b99b14a10f705a2dbbcba5e"
|
sha256: "12dc855ae8ef5491f529b1fc52c655f06dcdf4114f1f7fdecafa41eec2ec8d79"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.5.1"
|
version: "3.6.0"
|
||||||
flex_seed_scheme:
|
flex_seed_scheme:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flex_seed_scheme
|
name: flex_seed_scheme
|
||||||
sha256: "6c595e545b0678e1fe17e8eec3d1fbca7237482da194fadc20ad8607dc7a7f3d"
|
sha256: "7639d2c86268eff84a909026eb169f008064af0fb3696a651b24b0fa24a40334"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.0"
|
version: "3.4.1"
|
||||||
flutter:
|
flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
@ -332,10 +348,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_fgbg
|
name: flutter_fgbg
|
||||||
sha256: "08c4d2fd229e3df26083d5aecc3dea9ff4f2d188f8cd57aaf2b3f047bd08a047"
|
sha256: e02ad0738ba5fc7f331b62acb0d74aa540626a6441ae18fad685faa5ac4ad7a5
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.0"
|
version: "0.6.0"
|
||||||
flutter_keyboard_visibility:
|
flutter_keyboard_visibility:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -388,42 +404,42 @@ packages:
|
|||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: flutter_launcher_icons
|
name: flutter_launcher_icons
|
||||||
sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea"
|
sha256: "31cd0885738e87c72d6f055564d37fabcdacee743b396b78c7636c169cac64f5"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.13.1"
|
version: "0.14.2"
|
||||||
flutter_lints:
|
flutter_lints:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: flutter_lints
|
name: flutter_lints
|
||||||
sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c"
|
sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.0"
|
version: "5.0.0"
|
||||||
flutter_local_notifications:
|
flutter_local_notifications:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications
|
name: flutter_local_notifications
|
||||||
sha256: ced76d337f54de33d7d9f06092137b4ac2da5079e00cee8a11a1794ffc7c61c6
|
sha256: ef41ae901e7529e52934feba19ed82827b11baa67336829564aeab3129460610
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "17.2.1"
|
version: "18.0.1"
|
||||||
flutter_local_notifications_linux:
|
flutter_local_notifications_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications_linux
|
name: flutter_local_notifications_linux
|
||||||
sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03"
|
sha256: "8f685642876742c941b29c32030f6f4f6dacd0e4eaecb3efbb187d6a3812ca01"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.0+1"
|
version: "5.0.0"
|
||||||
flutter_local_notifications_platform_interface:
|
flutter_local_notifications_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications_platform_interface
|
name: flutter_local_notifications_platform_interface
|
||||||
sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66"
|
sha256: "6c5b83c86bf819cdb177a9247a3722067dd8cc6313827ce7c77a4b238a26fd52"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "7.2.0"
|
version: "8.0.0"
|
||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
@ -433,18 +449,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_markdown
|
name: flutter_markdown
|
||||||
sha256: "2e8a801b1ded5ea001a4529c97b1f213dcb11c6b20668e081cafb23468593514"
|
sha256: "255b00afa1a7bad19727da6a7780cf3db6c3c12e68d302d85e0ff1fdf173db9e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.3"
|
version: "0.7.4+3"
|
||||||
flutter_plugin_android_lifecycle:
|
flutter_plugin_android_lifecycle:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_plugin_android_lifecycle
|
name: flutter_plugin_android_lifecycle
|
||||||
sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e
|
sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.20"
|
version: "2.0.23"
|
||||||
flutter_test:
|
flutter_test:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description: flutter
|
description: flutter
|
||||||
@ -467,18 +483,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: fluttertoast
|
name: fluttertoast
|
||||||
sha256: "7eae679e596a44fdf761853a706f74979f8dd3cd92cf4e23cae161fda091b847"
|
sha256: "95f349437aeebe524ef7d6c9bde3e6b4772717cf46a0eb6a3ceaddc740b297cc"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.2.6"
|
version: "8.2.8"
|
||||||
fraction:
|
fraction:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: fraction
|
name: fraction
|
||||||
sha256: "09e9504c9177bbd77df56e5d147abfbb3b43360e64bf61510059c14d6a82d524"
|
sha256: ac0d9904bb8211eb28606bdf623ff9f222c53240d8e9b927a07c149d356eddc2
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.0.2"
|
version: "5.0.3"
|
||||||
gtk:
|
gtk:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -499,18 +515,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: html
|
name: html
|
||||||
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
|
sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.15.4"
|
version: "0.15.5"
|
||||||
http:
|
http:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: http
|
name: http
|
||||||
sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
|
sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.1"
|
version: "1.2.2"
|
||||||
http_parser:
|
http_parser:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -523,10 +539,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: image
|
name: image
|
||||||
sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8"
|
sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.2.0"
|
version: "4.3.0"
|
||||||
intl:
|
intl:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -547,18 +563,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker
|
name: leak_tracker
|
||||||
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
|
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.4"
|
version: "10.0.5"
|
||||||
leak_tracker_flutter_testing:
|
leak_tracker_flutter_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_flutter_testing
|
name: leak_tracker_flutter_testing
|
||||||
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
|
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.3"
|
version: "3.0.5"
|
||||||
leak_tracker_testing:
|
leak_tracker_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -571,10 +587,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: lints
|
name: lints
|
||||||
sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235"
|
sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.0"
|
version: "5.0.0"
|
||||||
markdown:
|
markdown:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -595,26 +611,26 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: material_color_utilities
|
name: material_color_utilities
|
||||||
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
|
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.8.0"
|
version: "0.11.1"
|
||||||
meta:
|
meta:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
|
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.12.0"
|
version: "1.15.0"
|
||||||
mime:
|
mime:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: mime
|
name: mime
|
||||||
sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
|
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.5"
|
version: "2.0.0"
|
||||||
nested:
|
nested:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -643,26 +659,26 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: path_provider
|
name: path_provider
|
||||||
sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
|
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.3"
|
version: "2.1.5"
|
||||||
path_provider_android:
|
path_provider_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_android
|
name: path_provider_android
|
||||||
sha256: bca87b0165ffd7cdb9cad8edd22d18d2201e886d9a9f19b4fb3452ea7df3a72a
|
sha256: "8c4967f8b7cb46dc914e178daa29813d83ae502e0529d7b0478330616a691ef7"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.6"
|
version: "2.2.14"
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_foundation
|
name: path_provider_foundation
|
||||||
sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
|
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.0"
|
version: "2.4.1"
|
||||||
path_provider_linux:
|
path_provider_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -683,10 +699,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_windows
|
name: path_provider_windows
|
||||||
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
|
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.1"
|
version: "2.3.0"
|
||||||
permission_handler:
|
permission_handler:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -699,10 +715,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_android
|
name: permission_handler_android
|
||||||
sha256: b29a799ca03be9f999aa6c39f7de5209482d638e6f857f6b93b0875c618b7e54
|
sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "12.0.7"
|
version: "12.0.13"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -715,18 +731,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_html
|
name: permission_handler_html
|
||||||
sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d"
|
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.1"
|
version: "0.1.3+5"
|
||||||
permission_handler_platform_interface:
|
permission_handler_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_platform_interface
|
name: permission_handler_platform_interface
|
||||||
sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20"
|
sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.2.1"
|
version: "4.2.3"
|
||||||
permission_handler_windows:
|
permission_handler_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -747,10 +763,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: platform
|
name: platform
|
||||||
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
|
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.5"
|
version: "3.1.6"
|
||||||
plugin_platform_interface:
|
plugin_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -763,10 +779,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: pointer_interceptor
|
name: pointer_interceptor
|
||||||
sha256: d0a8e660d1204eaec5bd34b34cc92174690e076d2e4f893d9d68c486a13b07c4
|
sha256: "57210410680379aea8b1b7ed6ae0c3ad349bfd56fe845b8ea934a53344b9d523"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.10.1+1"
|
version: "0.10.1+2"
|
||||||
pointer_interceptor_ios:
|
pointer_interceptor_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -787,10 +803,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: pointer_interceptor_web
|
name: pointer_interceptor_web
|
||||||
sha256: a6237528b46c411d8d55cdfad8fcb3269fc4cbb26060b14bff94879165887d1e
|
sha256: "7a7087782110f8c1827170660b09f8aa893e0e9a61431dbbe2ac3fc482e8c044"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.10.2"
|
version: "0.10.2+1"
|
||||||
provider:
|
provider:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -803,74 +819,74 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: share_plus
|
name: share_plus
|
||||||
sha256: ef3489a969683c4f3d0239010cc8b7a2a46543a8d139e111c06c558875083544
|
sha256: "9c9bafd4060728d7cdb2464c341743adbd79d327cb067ec7afb64583540b47c8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "9.0.0"
|
version: "10.1.2"
|
||||||
share_plus_platform_interface:
|
share_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: share_plus_platform_interface
|
name: share_plus_platform_interface
|
||||||
sha256: "0f9e4418835d1b2c3ae78fdb918251959106cefdbc4dd43526e182f80e82f6d4"
|
sha256: c57c0bbfec7142e3a0f55633be504b796af72e60e3c791b44d5a017b985f7a48
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.0"
|
version: "5.0.1"
|
||||||
shared_preferences:
|
shared_preferences:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: shared_preferences
|
name: shared_preferences
|
||||||
sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
|
sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.3"
|
version: "2.3.3"
|
||||||
shared_preferences_android:
|
shared_preferences_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_android
|
name: shared_preferences_android
|
||||||
sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577"
|
sha256: "7f172d1b06de5da47b6264c2692ee2ead20bbbc246690427cdb4fc301cd0c549"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.3"
|
version: "2.3.4"
|
||||||
shared_preferences_foundation:
|
shared_preferences_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_foundation
|
name: shared_preferences_foundation
|
||||||
sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7"
|
sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.0"
|
version: "2.5.3"
|
||||||
shared_preferences_linux:
|
shared_preferences_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_linux
|
name: shared_preferences_linux
|
||||||
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
|
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.4.1"
|
||||||
shared_preferences_platform_interface:
|
shared_preferences_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_platform_interface
|
name: shared_preferences_platform_interface
|
||||||
sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
|
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.4.1"
|
||||||
shared_preferences_web:
|
shared_preferences_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_web
|
name: shared_preferences_web
|
||||||
sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
|
sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.0"
|
version: "2.4.2"
|
||||||
shared_preferences_windows:
|
shared_preferences_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_windows
|
name: shared_preferences_windows
|
||||||
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
|
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.4.1"
|
||||||
shared_storage:
|
shared_storage:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -913,18 +929,42 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: sqflite
|
name: sqflite
|
||||||
sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d
|
sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.3+1"
|
version: "2.4.1"
|
||||||
|
sqflite_android:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: sqflite_android
|
||||||
|
sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.4.0"
|
||||||
sqflite_common:
|
sqflite_common:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: sqflite_common
|
name: sqflite_common
|
||||||
sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4"
|
sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.5.4"
|
version: "2.5.4+6"
|
||||||
|
sqflite_darwin:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: sqflite_darwin
|
||||||
|
sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.4.1"
|
||||||
|
sqflite_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: sqflite_platform_interface
|
||||||
|
sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.4.0"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -953,10 +993,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: synchronized
|
name: synchronized
|
||||||
sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558"
|
sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.0+1"
|
version: "3.3.0+3"
|
||||||
term_glyph:
|
term_glyph:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -969,66 +1009,74 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
|
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.0"
|
version: "0.7.2"
|
||||||
timezone:
|
timezone:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: timezone
|
name: timezone
|
||||||
sha256: a6ccda4a69a442098b602c44e61a1e2b4bf6f5516e875bbf0f427d5df14745d5
|
sha256: ffc9d5f4d1193534ef051f9254063fa53d588609418c84299956c3db9383587d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.9.3"
|
version: "0.10.0"
|
||||||
typed_data:
|
typed_data:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: typed_data
|
name: typed_data
|
||||||
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
|
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.2"
|
version: "1.4.0"
|
||||||
|
upower:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: upower
|
||||||
|
sha256: cf042403154751180affa1d15614db7fa50234bc2373cd21c3db666c38543ebf
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.7.0"
|
||||||
url_launcher:
|
url_launcher:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: url_launcher
|
name: url_launcher
|
||||||
sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3"
|
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.3.0"
|
version: "6.3.1"
|
||||||
url_launcher_android:
|
url_launcher_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_android
|
name: url_launcher_android
|
||||||
sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf
|
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.3.3"
|
version: "6.3.14"
|
||||||
url_launcher_ios:
|
url_launcher_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_ios
|
name: url_launcher_ios
|
||||||
sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89"
|
sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.3.0"
|
version: "6.3.2"
|
||||||
url_launcher_linux:
|
url_launcher_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_linux
|
name: url_launcher_linux
|
||||||
sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
|
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.1"
|
version: "3.2.1"
|
||||||
url_launcher_macos:
|
url_launcher_macos:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_macos
|
name: url_launcher_macos
|
||||||
sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
|
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.2.0"
|
version: "3.2.2"
|
||||||
url_launcher_platform_interface:
|
url_launcher_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1041,26 +1089,26 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_web
|
name: url_launcher_web
|
||||||
sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a"
|
sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.1"
|
version: "2.3.3"
|
||||||
url_launcher_windows:
|
url_launcher_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_windows
|
name: url_launcher_windows
|
||||||
sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7
|
sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.1"
|
version: "3.1.3"
|
||||||
uuid:
|
uuid:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: uuid
|
name: uuid
|
||||||
sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8"
|
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.4.0"
|
version: "4.5.1"
|
||||||
vector_math:
|
vector_math:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1073,34 +1121,34 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
|
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "14.2.1"
|
version: "14.2.5"
|
||||||
web:
|
web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: web
|
name: web
|
||||||
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
|
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.5.1"
|
version: "1.1.0"
|
||||||
webview_flutter:
|
webview_flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: webview_flutter
|
name: webview_flutter
|
||||||
sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522"
|
sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.8.0"
|
version: "4.10.0"
|
||||||
webview_flutter_android:
|
webview_flutter_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_android
|
name: webview_flutter_android
|
||||||
sha256: f42447ca49523f11d8f70abea55ea211b3cafe172dd7a0e7ac007bb35dd356dc
|
sha256: "285cedfd9441267f6cca8843458620b5fda1af75b04f5818d0441acda5d7df19"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.16.4"
|
version: "4.1.0"
|
||||||
webview_flutter_platform_interface:
|
webview_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1113,34 +1161,34 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_wkwebview
|
name: webview_flutter_wkwebview
|
||||||
sha256: "7affdf9d680c015b11587181171d3cad8093e449db1f7d9f0f08f4f33d24f9a0"
|
sha256: b7e92f129482460951d96ef9a46b49db34bd2e1621685de26e9eaafd9674e7eb
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.13.1"
|
version: "3.16.3"
|
||||||
win32:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4
|
sha256: "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.5.1"
|
version: "5.9.0"
|
||||||
win32_registry:
|
win32_registry:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32_registry
|
name: win32_registry
|
||||||
sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb"
|
sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.3"
|
version: "1.1.5"
|
||||||
xdg_directories:
|
xdg_directories:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: xdg_directories
|
name: xdg_directories
|
||||||
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
|
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.4"
|
version: "1.1.0"
|
||||||
xml:
|
xml:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1158,5 +1206,5 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
version: "3.1.2"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.4.0 <4.0.0"
|
dart: ">=3.5.0 <4.0.0"
|
||||||
flutter: ">=3.22.0"
|
flutter: ">=3.24.0"
|
||||||
|
21
pubspec.yaml
21
pubspec.yaml
@ -1,5 +1,5 @@
|
|||||||
name: obtainium
|
name: obtainium
|
||||||
description: Get Android App Updates Directly From the Source.
|
description: Get Android app updates straight from the source.
|
||||||
|
|
||||||
# The following line prevents the package from being accidentally published to
|
# The following line prevents the package from being accidentally published to
|
||||||
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
||||||
@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 1.1.13+2270
|
version: 1.1.35+2292
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
sdk: '>=3.0.0 <4.0.0'
|
||||||
@ -37,8 +37,8 @@ dependencies:
|
|||||||
# Use with the CupertinoIcons class for iOS style icons.
|
# Use with the CupertinoIcons class for iOS style icons.
|
||||||
cupertino_icons: ^1.0.5
|
cupertino_icons: ^1.0.5
|
||||||
path_provider: ^2.0.11
|
path_provider: ^2.0.11
|
||||||
flutter_fgbg: ^0.3.0 # Try removing reliance on this
|
flutter_fgbg: ^0.6.0
|
||||||
flutter_local_notifications: ^17.0.0
|
flutter_local_notifications: ^18.0.0
|
||||||
provider: ^6.0.3
|
provider: ^6.0.3
|
||||||
http: ^1.0.0
|
http: ^1.0.0
|
||||||
webview_flutter: ^4.0.0
|
webview_flutter: ^4.0.0
|
||||||
@ -48,7 +48,7 @@ dependencies:
|
|||||||
url_launcher: ^6.1.5
|
url_launcher: ^6.1.5
|
||||||
permission_handler: ^11.0.0
|
permission_handler: ^11.0.0
|
||||||
fluttertoast: ^8.0.9
|
fluttertoast: ^8.0.9
|
||||||
device_info_plus: ^10.0.1
|
device_info_plus: ^11.0.0
|
||||||
file_picker: ^8.0.0+1
|
file_picker: ^8.0.0+1
|
||||||
animations: ^2.0.4
|
animations: ^2.0.4
|
||||||
android_package_installer:
|
android_package_installer:
|
||||||
@ -56,7 +56,7 @@ dependencies:
|
|||||||
url: https://github.com/ImranR98/android_package_installer
|
url: https://github.com/ImranR98/android_package_installer
|
||||||
ref: main
|
ref: main
|
||||||
android_package_manager: ^0.7.0
|
android_package_manager: ^0.7.0
|
||||||
share_plus: ^9.0.0
|
share_plus: ^10.0.0
|
||||||
sqflite: ^2.2.0+3
|
sqflite: ^2.2.0+3
|
||||||
easy_localization: ^3.0.1
|
easy_localization: ^3.0.1
|
||||||
android_intent_plus: ^5.0.1
|
android_intent_plus: ^5.0.1
|
||||||
@ -81,17 +81,18 @@ dependencies:
|
|||||||
|
|
||||||
markdown: any
|
markdown: any
|
||||||
flutter_typeahead: ^5.2.0
|
flutter_typeahead: ^5.2.0
|
||||||
|
battery_plus: ^6.1.0
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_launcher_icons: ^0.13.1
|
flutter_launcher_icons: ^0.14.1
|
||||||
|
|
||||||
# The "flutter_lints" package below contains a set of recommended lints to
|
# The "flutter_lints" package below contains a set of recommended lints to
|
||||||
# encourage good coding practices. The lint set provided by the package is
|
# encourage good coding practices. The lint set provided by the package is
|
||||||
# activated in the `analysis_options.yaml` file located at the root of your
|
# activated in the `analysis_options.yaml` file located at the root of your
|
||||||
# package. See that file for information about deactivating specific lint
|
# package. See that file for information about deactivating specific lint
|
||||||
# rules and activating additional ones.
|
# rules and activating additional ones.
|
||||||
flutter_lints: ^4.0.0
|
flutter_lints: ^5.0.0
|
||||||
|
|
||||||
flutter_launcher_icons:
|
flutter_launcher_icons:
|
||||||
android: "ic_launcher"
|
android: "ic_launcher"
|
||||||
@ -145,6 +146,6 @@ flutter:
|
|||||||
# see https://flutter.dev/custom-fonts/#from-packages
|
# see https://flutter.dev/custom-fonts/#from-packages
|
||||||
|
|
||||||
fonts:
|
fonts:
|
||||||
- family: Metropolis
|
- family: Wix-Madefor-Display
|
||||||
fonts:
|
fonts:
|
||||||
- asset: assets/fonts/Metropolis-Regular.otf
|
- asset: assets/fonts/WixMadeforDisplay-Regular.otf
|
38
sign.sh
Executable file
38
sign.sh
Executable file
@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Script to sign unsigned APKs
|
||||||
|
# Assumptions:
|
||||||
|
# 1. Your PGP key is already imported on the locally running agent
|
||||||
|
# 2. An Android SDK is located at $ANDROID_HOME (or ~/Android/Sdk as fallback)
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "sign.sh <PATH_TO_KEYSTORE> <PATH_TO_BUILD_DIR>"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z "$1" ] || [ -z "$2" ] || [ ! -f "$1" ] || [ ! -d "$2" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
KEYSTORE_LOCATION="$1"
|
||||||
|
BUILD_DIR="$2"
|
||||||
|
|
||||||
|
read -s -p "Enter your keystore password: " KEYSTORE_PASSWORD
|
||||||
|
|
||||||
|
if [ -z "$ANDROID_HOME" ]; then
|
||||||
|
ANDROID_HOME=~/Android/Sdk
|
||||||
|
fi
|
||||||
|
if [ ! -d "$ANDROID_HOME" ]; then
|
||||||
|
echo "Could not find Android SDK!" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
for apk in "$BUILD_DIR"/*-release*.apk; do
|
||||||
|
unsignedApk=${apk/-release/-unsigned}
|
||||||
|
mv "$apk" "$unsignedApk"
|
||||||
|
${ANDROID_HOME}/build-tools/$(ls ${ANDROID_HOME}/build-tools/ | tail -1)/apksigner sign --ks "$KEYSTORE_LOCATION" --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedApk}"
|
||||||
|
sha256sum ${apk} | cut -d " " -f 1 >"$apk".sha256
|
||||||
|
gpg --batch --sign --detach-sig "$apk".sha256
|
||||||
|
rm "$unsignedApk"
|
||||||
|
done
|
Reference in New Issue
Block a user