Merge branch 'release/26.03.2'

This commit is contained in:
Jorge Martín 2026-03-06 11:25:55 +01:00
commit 97101a56ef
449 changed files with 6031 additions and 3967 deletions

View file

@ -9,7 +9,7 @@ on:
# Enrich gradle.properties for CI/CD # Enrich gradle.properties for CI/CD
env: env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs: jobs:
@ -68,7 +68,7 @@ jobs:
run: ./gradlew :app:assembleGplayDebug app:assembleFDroidDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES run: ./gradlew :app:assembleGplayDebug app:assembleFDroidDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES
- name: Upload debug APKs - name: Upload debug APKs
if: ${{ matrix.variant == 'debug' }} if: ${{ matrix.variant == 'debug' }}
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: elementx-debug name: elementx-debug
path: | path: |

View file

@ -9,7 +9,7 @@ on:
# Enrich gradle.properties for CI/CD # Enrich gradle.properties for CI/CD
env: env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs: jobs:
@ -76,7 +76,7 @@ jobs:
run: ./gradlew :app:assembleGplayDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES run: ./gradlew :app:assembleGplayDebug -PallWarningsAsErrors=true $CI_GRADLE_ARG_PROPERTIES
- name: Upload debug Enterprise APKs - name: Upload debug Enterprise APKs
if: ${{ matrix.variant == 'debug' }} if: ${{ matrix.variant == 'debug' }}
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: elementx-enterprise-debug name: elementx-enterprise-debug
path: | path: |

View file

@ -7,7 +7,7 @@ on:
# Enrich gradle.properties for CI/CD # Enrich gradle.properties for CI/CD
env: env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache
ARCH: x86_64 ARCH: x86_64
DEVICE: pixel_7_pro DEVICE: pixel_7_pro
@ -57,7 +57,7 @@ jobs:
ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }} ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }}
ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }}
- name: Upload APK as artifact - name: Upload APK as artifact
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: elementx-apk-maestro name: elementx-apk-maestro
path: | path: |
@ -82,7 +82,7 @@ jobs:
# https://github.com/actions/checkout/issues/881 # https://github.com/actions/checkout/issues/881
ref: ${{ github.ref }} ref: ${{ github.ref }}
- name: Download APK artifact from previous job - name: Download APK artifact from previous job
uses: actions/download-artifact@v7 uses: actions/download-artifact@v8
with: with:
name: elementx-apk-maestro name: elementx-apk-maestro
- name: Enable KVM group perms - name: Enable KVM group perms
@ -115,7 +115,7 @@ jobs:
script: | script: |
.github/workflows/scripts/maestro/maestro-local-with-screen-recording.sh app-gplay-x86_64-debug.apk .github/workflows/scripts/maestro/maestro-local-with-screen-recording.sh app-gplay-x86_64-debug.apk
- name: Upload test results - name: Upload test results
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: test-results name: test-results
path: | path: |
@ -126,7 +126,7 @@ jobs:
- name: Update summary (success) - name: Update summary (success)
if: steps.maestro_test.outcome == 'success' if: steps.maestro_test.outcome == 'success'
run: | run: |
echo "### Maestro tests worked :rocket:!" echo "### Maestro tests worked :rocket:!" >> $GITHUB_STEP_SUMMARY
- name: Update summary (failure) - name: Update summary (failure)
if: steps.maestro_test.outcome != 'success' if: steps.maestro_test.outcome != 'success'
run: | run: |

View file

@ -7,7 +7,7 @@ on:
- cron: "0 4 * * *" - cron: "0 4 * * *"
env: env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs: jobs:

View file

@ -8,7 +8,7 @@ on:
# Enrich gradle.properties for CI/CD # Enrich gradle.properties for CI/CD
env: env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache CI_GRADLE_ARG_PROPERTIES: --stacktrace -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs: jobs:
@ -56,7 +56,7 @@ jobs:
- name: ✅ Upload kover report - name: ✅ Upload kover report
if: always() if: always()
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: kover-results name: kover-results
path: | path: |
@ -88,7 +88,7 @@ jobs:
run: ./gradlew dependencyCheckAnalyze $CI_GRADLE_ARG_PROPERTIES run: ./gradlew dependencyCheckAnalyze $CI_GRADLE_ARG_PROPERTIES
- name: Upload dependency analysis - name: Upload dependency analysis
if: always() if: always()
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: dependency-analysis name: dependency-analysis
path: build/reports/dependency-check-report.html path: build/reports/dependency-check-report.html

View file

@ -9,7 +9,7 @@ on:
# Enrich gradle.properties for CI/CD # Enrich gradle.properties for CI/CD
env: env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs: jobs:
@ -111,7 +111,7 @@ jobs:
run: ./gradlew :tests:konsist:testDebugUnitTest $CI_GRADLE_ARG_PROPERTIES --no-daemon run: ./gradlew :tests:konsist:testDebugUnitTest $CI_GRADLE_ARG_PROPERTIES --no-daemon
- name: Upload reports - name: Upload reports
if: always() if: always()
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: konsist-report name: konsist-report
path: | path: |
@ -188,7 +188,7 @@ jobs:
run: ./gradlew :app:lintGplayDebug :app:lintFdroidDebug lintDebug $CI_GRADLE_ARG_PROPERTIES --continue run: ./gradlew :app:lintGplayDebug :app:lintFdroidDebug lintDebug $CI_GRADLE_ARG_PROPERTIES --continue
- name: Upload reports - name: Upload reports
if: always() if: always()
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: linting-report name: linting-report
path: | path: |
@ -228,7 +228,7 @@ jobs:
run: ./gradlew detekt $CI_GRADLE_ARG_PROPERTIES --no-daemon run: ./gradlew detekt $CI_GRADLE_ARG_PROPERTIES --no-daemon
- name: Upload reports - name: Upload reports
if: always() if: always()
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: detekt-report name: detekt-report
path: | path: |
@ -268,7 +268,7 @@ jobs:
run: ./gradlew ktlintCheck $CI_GRADLE_ARG_PROPERTIES run: ./gradlew ktlintCheck $CI_GRADLE_ARG_PROPERTIES
- name: Upload reports - name: Upload reports
if: always() if: always()
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: ktlint-report name: ktlint-report
path: | path: |
@ -331,7 +331,7 @@ jobs:
# https://github.com/actions/checkout/issues/881 # https://github.com/actions/checkout/issues/881
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }}
- name: Download reports from previous jobs - name: Download reports from previous jobs
uses: actions/download-artifact@v7 uses: actions/download-artifact@v8
- name: Prepare Danger - name: Prepare Danger
if: always() if: always()
run: | run: |

View file

@ -7,7 +7,7 @@ on:
# Enrich gradle.properties for CI/CD # Enrich gradle.properties for CI/CD
env: env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g -Dsonar.gradle.skipCompile=true GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g -Dsonar.gradle.skipCompile=true
CI_GRADLE_ARG_PROPERTIES: --no-configuration-cache CI_GRADLE_ARG_PROPERTIES: --no-configuration-cache
jobs: jobs:

View file

@ -7,7 +7,7 @@ on:
# Enrich gradle.properties for CI/CD # Enrich gradle.properties for CI/CD
env: env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache CI_GRADLE_ARG_PROPERTIES: --stacktrace --no-daemon -Dsonar.gradle.skipCompile=true --no-configuration-cache
jobs: jobs:
@ -53,7 +53,7 @@ jobs:
ELEMENT_CALL_RAGESHAKE_URL: ${{ secrets.ELEMENT_CALL_RAGESHAKE_URL }} ELEMENT_CALL_RAGESHAKE_URL: ${{ secrets.ELEMENT_CALL_RAGESHAKE_URL }}
run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES
- name: Upload bundle as artifact - name: Upload bundle as artifact
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: elementx-app-gplay-bundle-unsigned name: elementx-app-gplay-bundle-unsigned
path: | path: |
@ -89,7 +89,7 @@ jobs:
ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }}
run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES run: ./gradlew bundleGplayRelease $CI_GRADLE_ARG_PROPERTIES
- name: Upload bundle as artifact - name: Upload bundle as artifact
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: elementx-enterprise-app-gplay-bundle-unsigned name: elementx-enterprise-app-gplay-bundle-unsigned
path: | path: |
@ -131,7 +131,7 @@ jobs:
ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }} ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }}
run: ./gradlew assembleFdroidRelease $CI_GRADLE_ARG_PROPERTIES run: ./gradlew assembleFdroidRelease $CI_GRADLE_ARG_PROPERTIES
- name: Upload apks as artifact - name: Upload apks as artifact
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: elementx-app-fdroid-apks-unsigned name: elementx-app-fdroid-apks-unsigned
path: | path: |

View file

@ -0,0 +1,77 @@
#!/usr/bin/env python3
import xml.etree.ElementTree as ET
import sys
import glob
screenshot_test_failures = []
output = []
def parse_test_failures(xml_file):
"""Parse XML test results and print failures."""
tree = ET.parse(xml_file)
root = tree.getroot()
# Find all testcase elements with failure children
if root.get("failures", "0") == "0":
return
name = root.get('name', 'Test Suite')
is_screenshot_test = name.startswith('ui.Preview')
if not is_screenshot_test:
output.append(f"## {name}")
for testcase in root.findall('.//testcase'):
failure = testcase.find('failure')
if failure is not None:
# Get testcase attributes
classname = testcase.get('classname', '')
name = testcase.get('name', '')
if is_screenshot_test:
# For screenshot tests, we want to display the classname as well
screenshot_test_failures.append(f"{classname}.{name}")
else:
# Get failure content (text inside the failure element)
failure_message = failure.get('message', '')
failure_content = failure.text if failure.text else ''
# Print in the requested format
output.append(f"### {name}")
output.append("```")
output.append(failure_message)
output.append("```")
output.append("<details><summary>Stacktrace</summary>")
output.append(f"<pre><code>{failure_content}</code></pre>")
output.append("</details>")
output.append("\n")
if __name__ == "__main__":
if len(sys.argv) < 2:
output.append("Usage: parse_test_failures.py <file>", file=sys.stderr)
sys.exit(1)
file = sys.argv[1]
if file.endswith('xml'):
parse_test_failures(file)
else:
files = glob.glob("**/build/test-results/*UnitTest/*.xml", root_dir = file, recursive = True)
for file in files:
parse_test_failures(file)
if screenshot_test_failures:
output.append("## Screenshot Test Failures")
output.append("```")
for failure in screenshot_test_failures:
output.append(failure)
output.append("```")
text_output = '\n'.join(output)
# Trim output larger than 1MB to avoid GitHub Action log limits
while len(text_output.encode('utf-8')) > 1_040_000:
output.pop(-2)
output.append("## !!! Truncated output due to size limits. !!!")
text_output = '\n'.join(output)
print(text_output)

View file

@ -9,7 +9,7 @@ on:
# Enrich gradle.properties for CI/CD # Enrich gradle.properties for CI/CD
env: env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx9g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -Dkotlin.daemon.jvm.options=-Xmx4g
CI_GRADLE_ARG_PROPERTIES: --stacktrace --warn -Dsonar.gradle.skipCompile=true --no-configuration-cache CI_GRADLE_ARG_PROPERTIES: --stacktrace --warn -Dsonar.gradle.skipCompile=true --no-configuration-cache
GROUP: ${{ format('sonar-{0}', github.ref) }} GROUP: ${{ format('sonar-{0}', github.ref) }}

View file

@ -75,7 +75,7 @@ jobs:
- name: 🚫 Upload kover failed coverage reports - name: 🚫 Upload kover failed coverage reports
if: failure() if: failure()
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: kover-error-report name: kover-error-report
path: | path: |
@ -87,7 +87,7 @@ jobs:
- name: 🚫 Upload test results on error - name: 🚫 Upload test results on error
if: failure() if: failure()
uses: actions/upload-artifact@v6 uses: actions/upload-artifact@v7
with: with:
name: tests-and-screenshot-tests-results name: tests-and-screenshot-tests-results
path: | path: |
@ -95,6 +95,15 @@ jobs:
**/build/roborazzi/failures/ **/build/roborazzi/failures/
**/build/reports/tests/*UnitTest/ **/build/reports/tests/*UnitTest/
- name: 🚫 Modify summary on error
if: failure()
run: |
echo """## Tests failed!
""" >> $GITHUB_STEP_SUMMARY
python3 .github/workflows/scripts/parse_test_failures.py . >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
# https://github.com/codecov/codecov-action # https://github.com/codecov/codecov-action
- name: ☂️ Upload coverage reports to codecov - name: ☂️ Upload coverage reports to codecov
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2 uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2

View file

@ -1,3 +1,60 @@
Changes in Element X v26.03.0
=============================
<!-- Release notes generated using configuration in .github/release.yml at v26.03.0 -->
## What's Changed
### ✨ Features
* Let enterprise build be able to use a different notification channel for noisy notification. by @bmarty in https://github.com/element-hq/element-x-android/pull/6177
### 🙌 Improvements
* Notification fallback counter by @bmarty in https://github.com/element-hq/element-x-android/pull/6181
* Sort audio device by device type before sending the list to Element Call by @bmarty in https://github.com/element-hq/element-x-android/pull/6160
### 🐛 Bugfixes
* Fix stack overflow when quickly going back on a `Space` screen by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6180
* Rely on the SessionObserver to detect a sign out. by @bmarty in https://github.com/element-hq/element-x-android/pull/6182
* When linkifying, adjust the `URLSpan`'s url too by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6188
* Fix call button color and ensure call can always be declined from the notification by @bmarty in https://github.com/element-hq/element-x-android/pull/6195
* Try to fix common issue with the top app bar by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6187
* Limit the max number of opened rooms in the backstack by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6215
* Remove all video metadata from externally shared videos by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6224
* Remove `runBlocking` call to restore sessions when the app starts by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6193
* Catch exceptions when changing the audio communication device by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6226
### 🗣 Translations
* Sync Strings by @ElementBot in https://github.com/element-hq/element-x-android/pull/6207
### 🧱 Build
* Fix Maestro tests again by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6167
* Add free disk space action to CI actions by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6212
### 🚧 In development 🚧
* Ensure that Element X can use the service from Element Classic. by @bmarty in https://github.com/element-hq/element-x-android/pull/6238
### Dependency upgrades
* fix(deps): update activity to v1.12.4 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6184
* Update roborazzi to v1.59.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6179
* Update dependency androidx.compose:compose-bom to v2026.02.00 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6172
* Remove explicit dependency `androix.compose.material` by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6199
* Update metro to v0.10.4 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6202
* Update dependency org.matrix.rustcomponents:sdk-android to v26.2.16 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6211
* Update dependency com.posthog:posthog-android to v3.32.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6210
* Update dependency io.sentry:sentry-android to v8.33.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6223
* Update dependency org.matrix.rustcomponents:sdk-android to v26.02.19 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6229
* Update dependency org.unifiedpush.android:connector to v3.3.1 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6214
* Update dependency com.posthog:posthog-android to v3.32.2 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6230
* Update dependency io.github.zxing-cpp:android to v3 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6170
* Update kotlin to v2.3.6 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6218
* Update dependency org.matrix.rustcomponents:sdk-android to v26.03.0 by @renovate[bot] in https://github.com/element-hq/element-x-android/pull/6242
### Others
* Remove `NavigationState.Space`. by @bmarty in https://github.com/element-hq/element-x-android/pull/6185
* Fallback notification cleanup by @bmarty in https://github.com/element-hq/element-x-android/pull/6190
* Use fade animation when replacing Placeholder by @ganfra in https://github.com/element-hq/element-x-android/pull/6216
* request audio focus when recording voice messages by @vmfunc in https://github.com/element-hq/element-x-android/pull/6194
* Disable the cross-process lock in the SDK by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6231
* Improve element gallery header by @bmarty in https://github.com/element-hq/element-x-android/pull/6239
* Add extra analytics for notification performance by @jmartinesp in https://github.com/element-hq/element-x-android/pull/6237
## New Contributors
* @vmfunc made their first contribution in https://github.com/element-hq/element-x-android/pull/6194
**Full Changelog**: https://github.com/element-hq/element-x-android/compare/v26.02.0...v26.03.0
Changes in Element X v26.02.0 Changes in Element X v26.02.0
============================= =============================

View file

@ -57,6 +57,7 @@ dependencies {
testCommonDependencies(libs) testCommonDependencies(libs)
testImplementation(projects.features.login.test) testImplementation(projects.features.login.test)
testImplementation(projects.features.share.test)
testImplementation(projects.libraries.matrix.test) testImplementation(projects.libraries.matrix.test)
testImplementation(projects.libraries.oidc.test) testImplementation(projects.libraries.oidc.test)
testImplementation(projects.libraries.preferences.test) testImplementation(projects.libraries.preferences.test)

View file

@ -8,7 +8,6 @@
package io.element.android.appnav package io.element.android.appnav
import android.content.Intent
import android.os.Parcelable import android.os.Parcelable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -63,6 +62,7 @@ import io.element.android.features.roomdirectory.api.RoomDescription
import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint import io.element.android.features.roomdirectory.api.RoomDirectoryEntryPoint
import io.element.android.features.securebackup.api.SecureBackupEntryPoint import io.element.android.features.securebackup.api.SecureBackupEntryPoint
import io.element.android.features.share.api.ShareEntryPoint import io.element.android.features.share.api.ShareEntryPoint
import io.element.android.features.share.api.ShareIntentData
import io.element.android.features.startchat.api.StartChatEntryPoint import io.element.android.features.startchat.api.StartChatEntryPoint
import io.element.android.features.userprofile.api.UserProfileEntryPoint import io.element.android.features.userprofile.api.UserProfileEntryPoint
import io.element.android.features.verifysession.api.IncomingVerificationEntryPoint import io.element.android.features.verifysession.api.IncomingVerificationEntryPoint
@ -307,7 +307,7 @@ class LoggedInFlowNode(
data object RoomDirectory : NavTarget data object RoomDirectory : NavTarget
@Parcelize @Parcelize
data class IncomingShare(val intent: Intent) : NavTarget data class IncomingShare(val shareIntentData: ShareIntentData) : NavTarget
@Parcelize @Parcelize
data class IncomingVerificationRequest(val data: VerificationRequest.Incoming) : NavTarget data class IncomingVerificationRequest(val data: VerificationRequest.Incoming) : NavTarget
@ -570,7 +570,7 @@ class LoggedInFlowNode(
shareEntryPoint.createNode( shareEntryPoint.createNode(
parentNode = this, parentNode = this,
buildContext = buildContext, buildContext = buildContext,
params = ShareEntryPoint.Params(intent = navTarget.intent), params = ShareEntryPoint.Params(shareIntentData = navTarget.shareIntentData),
callback = object : ShareEntryPoint.Callback { callback = object : ShareEntryPoint.Callback {
override fun onDone(roomIds: List<RoomId>) { override fun onDone(roomIds: List<RoomId>) {
// Remove the incoming share screen // Remove the incoming share screen
@ -649,13 +649,13 @@ class LoggedInFlowNode(
} }
} }
internal suspend fun attachIncomingShare(intent: Intent) { internal suspend fun attachIncomingShare(shareIntentData: ShareIntentData) {
waitForNavTargetAttached { navTarget -> waitForNavTargetAttached { navTarget ->
navTarget is NavTarget.Home navTarget is NavTarget.Home
} }
attachChild<Node> { attachChild<Node> {
backstack.push( backstack.push(
NavTarget.IncomingShare(intent) NavTarget.IncomingShare(shareIntentData)
) )
} }
} }

View file

@ -44,6 +44,7 @@ import io.element.android.features.announcement.api.AnnouncementService
import io.element.android.features.login.api.LoginParams import io.element.android.features.login.api.LoginParams
import io.element.android.features.login.api.accesscontrol.AccountProviderAccessControl import io.element.android.features.login.api.accesscontrol.AccountProviderAccessControl
import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint
import io.element.android.features.share.api.ShareIntentData
import io.element.android.features.signedout.api.SignedOutEntryPoint import io.element.android.features.signedout.api.SignedOutEntryPoint
import io.element.android.libraries.accountselect.api.AccountSelectEntryPoint import io.element.android.libraries.accountselect.api.AccountSelectEntryPoint
import io.element.android.libraries.architecture.BackstackView import io.element.android.libraries.architecture.BackstackView
@ -265,7 +266,7 @@ class RootFlowNode(
@Parcelize data class AccountSelect( @Parcelize data class AccountSelect(
val currentSessionId: SessionId, val currentSessionId: SessionId,
val intent: Intent?, val shareIntentData: ShareIntentData?,
val permalinkData: PermalinkData?, val permalinkData: PermalinkData?,
) : NavTarget ) : NavTarget
@ -357,8 +358,8 @@ class RootFlowNode(
backstack.pop() backstack.pop()
} }
attachSession(sessionId).apply { attachSession(sessionId).apply {
if (navTarget.intent != null) { if (navTarget.shareIntentData != null) {
attachIncomingShare(navTarget.intent) attachIncomingShare(navTarget.shareIntentData)
} else if (navTarget.permalinkData != null) { } else if (navTarget.permalinkData != null) {
attachPermalinkData(navTarget.permalinkData) attachPermalinkData(navTarget.permalinkData)
} }
@ -392,7 +393,7 @@ class RootFlowNode(
is ResolvedIntent.Login -> onLoginLink(resolvedIntent.params) is ResolvedIntent.Login -> onLoginLink(resolvedIntent.params)
is ResolvedIntent.Oidc -> onOidcAction(resolvedIntent.oidcAction) is ResolvedIntent.Oidc -> onOidcAction(resolvedIntent.oidcAction)
is ResolvedIntent.Permalink -> navigateTo(resolvedIntent.permalinkData) is ResolvedIntent.Permalink -> navigateTo(resolvedIntent.permalinkData)
is ResolvedIntent.IncomingShare -> onIncomingShare(resolvedIntent.intent) is ResolvedIntent.IncomingShare -> onIncomingShare(resolvedIntent.shareIntentData)
} }
} }
@ -423,7 +424,7 @@ class RootFlowNode(
} }
} }
private suspend fun onIncomingShare(intent: Intent) { private suspend fun onIncomingShare(shareIntentData: ShareIntentData) {
// Is there a session already? // Is there a session already?
val latestSessionId = sessionStore.getLatestSessionId() val latestSessionId = sessionStore.getLatestSessionId()
if (latestSessionId == null) { if (latestSessionId == null) {
@ -437,13 +438,13 @@ class RootFlowNode(
backstack.push( backstack.push(
NavTarget.AccountSelect( NavTarget.AccountSelect(
currentSessionId = latestSessionId, currentSessionId = latestSessionId,
intent = intent, shareIntentData = shareIntentData,
permalinkData = null, permalinkData = null,
) )
) )
} else { } else {
// Only one account, directly attach the incoming share node. // Only one account, directly attach the incoming share node.
loggedInFlowNode.attachIncomingShare(intent) loggedInFlowNode.attachIncomingShare(shareIntentData)
} }
} }
} }
@ -467,7 +468,7 @@ class RootFlowNode(
backstack.push( backstack.push(
NavTarget.AccountSelect( NavTarget.AccountSelect(
currentSessionId = latestSessionId, currentSessionId = latestSessionId,
intent = null, shareIntentData = null,
permalinkData = permalinkData, permalinkData = permalinkData,
) )
) )

View file

@ -12,6 +12,8 @@ import android.content.Intent
import dev.zacsweers.metro.Inject import dev.zacsweers.metro.Inject
import io.element.android.features.login.api.LoginIntentResolver import io.element.android.features.login.api.LoginIntentResolver
import io.element.android.features.login.api.LoginParams import io.element.android.features.login.api.LoginParams
import io.element.android.features.share.api.ShareIntentData
import io.element.android.features.share.api.ShareIntentHandler
import io.element.android.libraries.deeplink.api.DeeplinkData import io.element.android.libraries.deeplink.api.DeeplinkData
import io.element.android.libraries.deeplink.api.DeeplinkParser import io.element.android.libraries.deeplink.api.DeeplinkParser
import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkData
@ -25,7 +27,7 @@ sealed interface ResolvedIntent {
data class Oidc(val oidcAction: OidcAction) : ResolvedIntent data class Oidc(val oidcAction: OidcAction) : ResolvedIntent
data class Permalink(val permalinkData: PermalinkData) : ResolvedIntent data class Permalink(val permalinkData: PermalinkData) : ResolvedIntent
data class Login(val params: LoginParams) : ResolvedIntent data class Login(val params: LoginParams) : ResolvedIntent
data class IncomingShare(val intent: Intent) : ResolvedIntent data class IncomingShare(val shareIntentData: ShareIntentData) : ResolvedIntent
} }
@Inject @Inject
@ -34,6 +36,7 @@ class IntentResolver(
private val loginIntentResolver: LoginIntentResolver, private val loginIntentResolver: LoginIntentResolver,
private val oidcIntentResolver: OidcIntentResolver, private val oidcIntentResolver: OidcIntentResolver,
private val permalinkParser: PermalinkParser, private val permalinkParser: PermalinkParser,
private val shareIntentHandler: ShareIntentHandler,
) { ) {
fun resolve(intent: Intent): ResolvedIntent? { fun resolve(intent: Intent): ResolvedIntent? {
if (intent.canBeIgnored()) return null if (intent.canBeIgnored()) return null
@ -62,7 +65,8 @@ class IntentResolver(
if (permalinkData != null) return ResolvedIntent.Permalink(permalinkData) if (permalinkData != null) return ResolvedIntent.Permalink(permalinkData)
if (intent.action == Intent.ACTION_SEND || intent.action == Intent.ACTION_SEND_MULTIPLE) { if (intent.action == Intent.ACTION_SEND || intent.action == Intent.ACTION_SEND_MULTIPLE) {
return ResolvedIntent.IncomingShare(intent) val data = shareIntentHandler.handleIncomingShareIntent(intent) ?: return null
return ResolvedIntent.IncomingShare(data)
} }
// Unknown intent // Unknown intent

View file

@ -167,6 +167,6 @@ class LoggedInPresenter(
private fun CoroutineScope.preloadAccountManagementUrl() = launch { private fun CoroutineScope.preloadAccountManagementUrl() = launch {
matrixClient.getAccountManagementUrl(AccountManagementAction.Profile) matrixClient.getAccountManagementUrl(AccountManagementAction.Profile)
matrixClient.getAccountManagementUrl(AccountManagementAction.SessionsList) matrixClient.getAccountManagementUrl(AccountManagementAction.DevicesList)
} }
} }

View file

@ -15,6 +15,9 @@ import androidx.core.net.toUri
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.features.login.api.LoginParams import io.element.android.features.login.api.LoginParams
import io.element.android.features.login.test.FakeLoginIntentResolver import io.element.android.features.login.test.FakeLoginIntentResolver
import io.element.android.features.share.api.ShareIntentData
import io.element.android.features.share.api.UriToShare
import io.element.android.features.share.test.FakeShareIntentHandler
import io.element.android.libraries.deeplink.api.DeeplinkData import io.element.android.libraries.deeplink.api.DeeplinkData
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkData
@ -239,26 +242,34 @@ class IntentResolverTest {
@Test @Test
fun `test incoming share simple`() { fun `test incoming share simple`() {
val shareIntentData = ShareIntentData.PlainText("Hello")
val sut = createIntentResolver( val sut = createIntentResolver(
oidcIntentResolverResult = { null }, oidcIntentResolverResult = { null },
onIncomingShareIntent = { shareIntentData },
) )
val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply {
action = Intent.ACTION_SEND action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, "Hello")
} }
val result = sut.resolve(intent) val result = sut.resolve(intent)
assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(intent = intent)) assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(shareIntentData))
} }
@Test @Test
fun `test incoming share multiple`() { fun `test incoming share multiple`() {
val fileUri = "content://com.example.app/file1.jpg".toUri()
val shareIntentData = ShareIntentData.Uris(text = "Hello", uris = listOf(UriToShare(fileUri, "image/jpg")))
val sut = createIntentResolver( val sut = createIntentResolver(
oidcIntentResolverResult = { null }, oidcIntentResolverResult = { null },
onIncomingShareIntent = { shareIntentData },
) )
val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply { val intent = Intent(RuntimeEnvironment.getApplication(), Activity::class.java).apply {
action = Intent.ACTION_SEND_MULTIPLE action = Intent.ACTION_SEND_MULTIPLE
putExtra(Intent.EXTRA_TEXT, "Hello")
data = fileUri
} }
val result = sut.resolve(intent) val result = sut.resolve(intent)
assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(intent = intent)) assertThat(result).isEqualTo(ResolvedIntent.IncomingShare(shareIntentData))
} }
@Test @Test
@ -296,6 +307,7 @@ class IntentResolverTest {
permalinkParserResult: (String) -> PermalinkData = { lambdaError() }, permalinkParserResult: (String) -> PermalinkData = { lambdaError() },
loginIntentResolverResult: (String) -> LoginParams? = { lambdaError() }, loginIntentResolverResult: (String) -> LoginParams? = { lambdaError() },
oidcIntentResolverResult: (Intent) -> OidcAction? = { lambdaError() }, oidcIntentResolverResult: (Intent) -> OidcAction? = { lambdaError() },
onIncomingShareIntent: (Intent) -> ShareIntentData? = { null },
): IntentResolver { ): IntentResolver {
return IntentResolver( return IntentResolver(
deeplinkParser = { deeplinkParserResult }, deeplinkParser = { deeplinkParserResult },
@ -308,6 +320,9 @@ class IntentResolverTest {
permalinkParser = FakePermalinkParser( permalinkParser = FakePermalinkParser(
result = permalinkParserResult result = permalinkParserResult
), ),
shareIntentHandler = FakeShareIntentHandler(
onIncomingShareIntent = onIncomingShareIntent,
),
) )
} }
} }

View file

@ -81,7 +81,7 @@ class LoggedInPresenterTest {
accountManagementUrlResult.assertions().isCalledExactly(2) accountManagementUrlResult.assertions().isCalledExactly(2)
.withSequence( .withSequence(
listOf(value(AccountManagementAction.Profile)), listOf(value(AccountManagementAction.Profile)),
listOf(value(AccountManagementAction.SessionsList)), listOf(value(AccountManagementAction.DevicesList)),
) )
} }
} }

View file

@ -144,8 +144,8 @@ Prerequisites:
``` ```
You can then build the Rust SDK by running the script You can then build the Rust SDK by running the script
[`tools/sdk/build_rust_sdk.sh`](../tools/sdk/build_rust_sdk.sh) and just answering [`tools/sdk/build-rust-sdk`](../tools/sdk/build-rust-sdk). Type
the questions. `./tools/sdk/build-rust-sdk --help` for help.
This will prompt you for the path to the Rust SDK, then build it and This will prompt you for the path to the Rust SDK, then build it and
`matrix-rust-components-kotlin`, eventually producing an aar file at `matrix-rust-components-kotlin`, eventually producing an aar file at

View file

@ -0,0 +1,2 @@
Main changes in this version: fixed an issue that could cause a crash when instantiating the cryptographic database.
Full changelog: https://github.com/element-hq/element-x-android/releases

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_announcement_item1">"Δείτε τους χώρους που έχετε δημιουργήσει ή στους οποίους έχετε εγγραφεί"</string>
<string name="screen_space_announcement_item2">"Να αποδεχθείτε ή να απορρίψετε προσκλήσεις σε χώρους"</string>
<string name="screen_space_announcement_item3">"Να ανακαλύψτε όλες τις αίθουσες που μπορείτε να συμμετάσχετε στους χώρους σας"</string>
<string name="screen_space_announcement_item4">"Να συμμετάσχετε σε δημόσιους χώρους"</string>
<string name="screen_space_announcement_item5">"Να αποχωρήστε από χώρους στους οποίους έχετε συμμετάσχει"</string>
<string name="screen_space_announcement_notice">"Το φιλτράρισμα, η δημιουργία και η διαχείριση χώρων θα είναι σύντομα διαθέσιμα."</string>
<string name="screen_space_announcement_subtitle">"Καλώς ορίσατε στην δοκιμαστική έκδοση των Χώρων! Με αυτήν την πρώτη έκδοση μπορείτε:"</string>
<string name="screen_space_announcement_title">"Παρουσιάζοντας τους Χώρους"</string>
</resources>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_announcement_item1">"Oluşturduğunuz veya katıldığınız alanları görüntüleyin"</string>
<string name="screen_space_announcement_item2">"Alan davetlerini kabul edin veya reddedin"</string>
<string name="screen_space_announcement_item3">"Alanlarınızdaki katılabileceğiniz odaları keşfedin"</string>
<string name="screen_space_announcement_item4">"Herkese açık alanlara katılın"</string>
<string name="screen_space_announcement_item5">"Katıldığınız alanlardan ayrılın"</string>
<string name="screen_space_announcement_notice">"Alanları filtreleme, oluşturma ve yönetme yakında geliyor."</string>
<string name="screen_space_announcement_subtitle">"Alanların beta sürümüne hoş geldiniz! Bu ilk sürümle şunları yapabilirsiniz:"</string>
<string name="screen_space_announcement_title">"Alanlar ile tanışın"</string>
</resources>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_space_announcement_item1">"Siz yaratgan yoki qoshilgan maydonlarni korish"</string>
<string name="screen_space_announcement_item2">"Maydonlarga takliflarni qabul qilish yoki rad etish"</string>
<string name="screen_space_announcement_item3">"Maydonlaringizga qoshilishingiz mumkin bolgan xonalarni kashf eting"</string>
<string name="screen_space_announcement_item4">"Jamoat maydonlariga qoshilish"</string>
<string name="screen_space_announcement_item5">"Kirgan maydonlaringizni tark eting"</string>
<string name="screen_space_announcement_notice">"Maydonlarni filtrlash, yaratish va boshqarish tez orada amalga oshiriladi."</string>
<string name="screen_space_announcement_subtitle">"Maydonlar beta versiyasiga xush kelibsiz! Bu birinchi versiya bilan siz:"</string>
<string name="screen_space_announcement_title">"Maydonlar bilan tanishish"</string>
</resources>

View file

@ -3,5 +3,6 @@
<string name="call_foreground_service_channel_title_android">"Llamada en curso"</string> <string name="call_foreground_service_channel_title_android">"Llamada en curso"</string>
<string name="call_foreground_service_message_android">"Pulsa para regresar a la llamada"</string> <string name="call_foreground_service_message_android">"Pulsa para regresar a la llamada"</string>
<string name="call_foreground_service_title_android">"☎️ Llamada en curso"</string> <string name="call_foreground_service_title_android">"☎️ Llamada en curso"</string>
<string name="call_invalid_audio_device_bluetooth_devices_disabled">"Element Call no soporta dispositivos de audio Bluetooth en esta versión de Android. Selecciona otro dispositivo de audio."</string>
<string name="screen_incoming_call_subtitle_android">"Llamada de Element Call entrante"</string> <string name="screen_incoming_call_subtitle_android">"Llamada de Element Call entrante"</string>
</resources> </resources>

View file

@ -3,5 +3,6 @@
<string name="call_foreground_service_channel_title_android">"Devam eden çağrı"</string> <string name="call_foreground_service_channel_title_android">"Devam eden çağrı"</string>
<string name="call_foreground_service_message_android">"Aramaya geri dönmek için dokunun"</string> <string name="call_foreground_service_message_android">"Aramaya geri dönmek için dokunun"</string>
<string name="call_foreground_service_title_android">"☎️ Çağrı devam ediyor"</string> <string name="call_foreground_service_title_android">"☎️ Çağrı devam ediyor"</string>
<string name="call_invalid_audio_device_bluetooth_devices_disabled">"Element Araması, bu Android sürümünde Bluetooth ses cihazlarını desteklemiyor. Lütfen farklı bir ses cihazı seçin."</string>
<string name="screen_incoming_call_subtitle_android">"Gelen Element Call"</string> <string name="screen_incoming_call_subtitle_android">"Gelen Element Call"</string>
</resources> </resources>

View file

@ -76,7 +76,7 @@ class ConfigureRoomPresenter(
) : Presenter<ConfigureRoomState> { ) : Presenter<ConfigureRoomState> {
@AssistedFactory @AssistedFactory
interface Factory { interface Factory {
fun create(isSpace: Boolean, parentSpaceId: RoomId?): ConfigureRoomPresenter fun create(isSpace: Boolean, initialParentSpaceId: RoomId?): ConfigureRoomPresenter
} }
private val cameraPermissionPresenter: PermissionsPresenter = permissionsPresenterFactory.create(android.Manifest.permission.CAMERA) private val cameraPermissionPresenter: PermissionsPresenter = permissionsPresenterFactory.create(android.Manifest.permission.CAMERA)

View file

@ -6,7 +6,7 @@
<string name="screen_create_room_private_option_description">"Само поканени хора имат достъп до тази стая. Всички съобщения са шифровани от край до край."</string> <string name="screen_create_room_private_option_description">"Само поканени хора имат достъп до тази стая. Всички съобщения са шифровани от край до край."</string>
<string name="screen_create_room_public_option_description">"Всеки може да намери тази стая. <string name="screen_create_room_public_option_description">"Всеки може да намери тази стая.
Можете да промените това по всяко време в настройките на стаята."</string> Можете да промените това по всяко време в настройките на стаята."</string>
<string name="screen_create_room_room_access_section_public_option_description">"Всеки може да се присъедини към тази стая"</string> <string name="screen_create_room_room_access_section_public_option_description">"Всеки може да се присъедини."</string>
<string name="screen_create_room_room_address_section_footer">"За да бъде тази стая видима в директорията на общодостъпните стаи, ще ви е необходим адрес на стаята."</string> <string name="screen_create_room_room_address_section_footer">"За да бъде тази стая видима в директорията на общодостъпните стаи, ще ви е необходим адрес на стаята."</string>
<string name="screen_create_room_room_visibility_section_title">"Видимост на стаята"</string> <string name="screen_create_room_room_visibility_section_title">"Видимост на стаята"</string>
<string name="screen_create_room_topic_label">"Тема за разговор (незадължително)"</string> <string name="screen_create_room_topic_label">"Тема за разговор (незадължително)"</string>

View file

@ -8,21 +8,26 @@
<string name="screen_create_room_new_room_title">"Nyt rum"</string> <string name="screen_create_room_new_room_title">"Nyt rum"</string>
<string name="screen_create_room_new_space_title">"Ny gruppe"</string> <string name="screen_create_room_new_space_title">"Ny gruppe"</string>
<string name="screen_create_room_private_option_description">"Kun inviterede personer kan deltage."</string> <string name="screen_create_room_private_option_description">"Kun inviterede personer kan deltage."</string>
<string name="screen_create_room_private_option_title">"Privat"</string>
<string name="screen_create_room_public_option_description">"Alle kan finde dette rum. <string name="screen_create_room_public_option_description">"Alle kan finde dette rum.
Du kan ændre dette når som helst i rummets indstillinger."</string> Du kan ændre dette når som helst i rummets indstillinger."</string>
<string name="screen_create_room_public_option_short_description">"Alle kan deltage."</string> <string name="screen_create_room_public_option_short_description">"Alle kan deltage."</string>
<string name="screen_create_room_public_option_title">"Offentlig"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Alle kan bede om at deltage i rummet, men en administrator eller en moderator skal acceptere anmodningen"</string> <string name="screen_create_room_room_access_section_knocking_option_description">"Alle kan bede om at deltage i rummet, men en administrator eller en moderator skal acceptere anmodningen"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Tillad at man kan anmode om deltagelse"</string> <string name="screen_create_room_room_access_section_knocking_option_title">"Tillad at man kan anmode om deltagelse"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Enhver i %1$s kan deltage, men alle andre skal anmode om adgang."</string> <string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Enhver i %1$s kan deltage, men alle andre skal anmode om adgang."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Anmod om at deltage"</string> <string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Anmod om at deltage"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Kun inviterede brugere kan deltage."</string> <string name="screen_create_room_room_access_section_private_option_description">"Kun inviterede brugere kan deltage."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Privat"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Alle kan deltage i dette rum"</string> <string name="screen_create_room_room_access_section_public_option_description">"Alle kan deltage i dette rum"</string>
<string name="screen_create_room_room_access_section_public_option_title">"Offentlig"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Alle i %1$s kan deltage."</string> <string name="screen_create_room_room_access_section_restricted_option_description">"Alle i %1$s kan deltage."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Standard"</string> <string name="screen_create_room_room_access_section_restricted_option_title">"Standard"</string>
<string name="screen_create_room_room_access_section_title">"Hvem har adgang"</string> <string name="screen_create_room_room_access_section_title">"Hvem har adgang"</string>
<string name="screen_create_room_room_address_section_footer">"Hvis dette rum skal være synligt i det offentlige register, skal du bruge en adresse."</string> <string name="screen_create_room_room_address_section_footer">"Hvis dette rum skal være synligt i det offentlige register, skal du bruge en adresse."</string>
<string name="screen_create_room_room_address_section_title">"Adresse"</string> <string name="screen_create_room_room_address_section_title">"Adresse"</string>
<string name="screen_create_room_room_visibility_section_title">"Rummets synlighed"</string> <string name="screen_create_room_room_visibility_section_title">"Rummets synlighed"</string>
<string name="screen_create_room_space_selection_no_space_option">"Tilføj ikke til et mellemrum"</string>
<string name="screen_create_room_topic_label">"Emne (valgfrit)"</string> <string name="screen_create_room_topic_label">"Emne (valgfrit)"</string>
<string name="screen_create_room_topic_placeholder">"Tilføj beskrivelse…"</string> <string name="screen_create_room_topic_placeholder">"Tilføj beskrivelse…"</string>
</resources> </resources>

View file

@ -3,14 +3,34 @@
<string name="screen_create_room_action_create_room">"Νέα αίθουσα"</string> <string name="screen_create_room_action_create_room">"Νέα αίθουσα"</string>
<string name="screen_create_room_add_people_title">"Πρόσκληση ατόμων"</string> <string name="screen_create_room_add_people_title">"Πρόσκληση ατόμων"</string>
<string name="screen_create_room_error_creating_room">"Προέκυψε σφάλμα κατά τη δημιουργία της αίθουσας"</string> <string name="screen_create_room_error_creating_room">"Προέκυψε σφάλμα κατά τη δημιουργία της αίθουσας"</string>
<string name="screen_create_room_private_option_description">"Μόνο τα άτομα που έχουν προσκληθεί μπορούν να έχουν πρόσβαση σε αυτή την αίθουσα. Όλα τα μηνύματα είναι κρυπτογραφημένα από άκρο σε άκρο."</string> <string name="screen_create_room_error_creating_space">"Δεν ήταν δυνατή η δημιουργία του χώρου λόγω άγνωστου σφάλματος. Δοκιμάστε ξανά αργότερα."</string>
<string name="screen_create_room_name_placeholder">"Προσθήκη ονόματος…"</string>
<string name="screen_create_room_new_room_title">"Νέα αίθουσα"</string>
<string name="screen_create_room_new_space_title">"Νέος χώρος"</string>
<string name="screen_create_room_private_option_description">"Μόνο άτομα που έχουν προσκληθεί μπορούν να συμμετάσχουν."</string>
<string name="screen_create_room_private_option_title">"Ιδιωτικό"</string>
<string name="screen_create_room_public_option_description">"Ο καθένας μπορεί να βρει αυτή την αίθουσα. <string name="screen_create_room_public_option_description">"Ο καθένας μπορεί να βρει αυτή την αίθουσα.
Αυτό μπορείτε να το αλλάξετε ανά πάσα στιγμή στις ρυθμίσεις της αίθουσας."</string> Αυτό μπορείτε να το αλλάξετε ανά πάσα στιγμή στις ρυθμίσεις της αίθουσας."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Οποιοσδήποτε μπορεί να ζητήσει να συμμετάσχει στην αίθουσα, αλλά ένας διαχειριστής ή ένας συντονιστής θα πρέπει να αποδεχτεί το αίτημα"</string> <string name="screen_create_room_public_option_short_description">"Οποιοσδήποτε μπορεί να συμμετάσχει."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Αίτημα συμμετοχής"</string> <string name="screen_create_room_public_option_title">"Δημόσιο"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Οποιοσδήποτε μπορεί να συμμετάσχει σε αυτή την αίθουσα"</string> <string name="screen_create_room_room_access_section_knocking_option_description">"Οποιοσδήποτε μπορεί να ζητήσει να συμμετάσχει στην αίθουσα, αλλά ένας διαχειριστής ή ένας συντονιστής θα πρέπει να αποδεχτεί το αίτημα."</string>
<string name="screen_create_room_room_address_section_footer">"Για να είναι ορατή αυτή η αίθουσα στον δημόσιο κατάλογο αιθουσών, θα χρειαστείτε μια διεύθυνση αίθουσας."</string> <string name="screen_create_room_room_access_section_knocking_option_title">"Επιτρέψτε την αίτηση συμμετοχής"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Οποιοιδήποτε στο %1$s μπορούν να συμμετάσχουν, αλλά όλοι οι υπόλοιποι πρέπει να ζητήσουν πρόσβαση."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Αίτημα συμμετοχής"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Μόνο άτομα που έχουν προσκληθεί μπορούν να συμμετάσχουν."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Ιδιωτικό"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Οποιοσδήποτε μπορεί να συμμετάσχει."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Δημόσιο"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Οποιοσδήποτε στο %1$s μπορεί να συμμετάσχει."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Πρότυπο"</string>
<string name="screen_create_room_room_access_section_title">"Ποιος έχει πρόσβαση"</string>
<string name="screen_create_room_room_address_section_footer">"Θα χρειαστείτε μια διεύθυνση για να την κάνετε ορατή στον δημόσιο κατάλογο."</string>
<string name="screen_create_room_room_address_section_title">"Διεύθυνση δωματίου"</string> <string name="screen_create_room_room_address_section_title">"Διεύθυνση δωματίου"</string>
<string name="screen_create_room_room_visibility_section_title">"Ορατότητα αίθουσας"</string> <string name="screen_create_room_room_visibility_section_title">"Ορατότητα αίθουσας"</string>
<string name="screen_create_room_space_selection_no_space_description">"(κανένας χώρος)"</string>
<string name="screen_create_room_space_selection_no_space_option">"Μην προσθέτετε σε χώρο"</string>
<string name="screen_create_room_space_selection_no_space_title">"Δεν έχει επιλεγεί χώρος"</string>
<string name="screen_create_room_space_selection_sheet_title">"Προσθήκη στον χώρο"</string>
<string name="screen_create_room_topic_label">"Θέμα (προαιρετικό)"</string> <string name="screen_create_room_topic_label">"Θέμα (προαιρετικό)"</string>
<string name="screen_create_room_topic_placeholder">"Προσθήκη περιγραφής…"</string>
</resources> </resources>

View file

@ -3,13 +3,14 @@
<string name="screen_create_room_action_create_room">"Nueva sala"</string> <string name="screen_create_room_action_create_room">"Nueva sala"</string>
<string name="screen_create_room_add_people_title">"Invitar personas"</string> <string name="screen_create_room_add_people_title">"Invitar personas"</string>
<string name="screen_create_room_error_creating_room">"Se ha producido un error al crear la sala"</string> <string name="screen_create_room_error_creating_room">"Se ha producido un error al crear la sala"</string>
<string name="screen_create_room_private_option_description">"Solo las personas invitadas pueden acceder a esta sala. Todos los mensajes están cifrados de extremo a extremo."</string> <string name="screen_create_room_private_option_description">"Solo las personas invitadas pueden acceder."</string>
<string name="screen_create_room_public_option_description">"Cualquiera puede encontrar esta sala. <string name="screen_create_room_public_option_description">"Cualquiera puede encontrar esta sala.
Puedes cambiar esto en cualquier momento en los ajustes de la sala."</string> Puedes cambiar esto en cualquier momento en los ajustes de la sala."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Cualquiera puede solicitar unirse a la sala, pero un administrador o un moderador tendrá que aceptar la solicitud"</string> <string name="screen_create_room_room_access_section_knocking_option_description">"Cualquiera puede solicitar unirse, pero un administrador o un moderador tendrá que aceptar la solicitud"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Solicitud para unirse"</string> <string name="screen_create_room_room_access_section_knocking_option_title">"Permitir solicitar unirse"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Cualquiera puede unirse a esta sala"</string> <string name="screen_create_room_room_access_section_public_option_description">"Cualquiera puede unirse."</string>
<string name="screen_create_room_room_address_section_footer">"Para que esta sala sea visible en el directorio de salas públicas, necesitarás una dirección de sala."</string> <string name="screen_create_room_room_address_section_footer">"Necesitarás una dirección de sala para que sea visible en el directorio de salas públicas."</string>
<string name="screen_create_room_room_address_section_title">"Dirección"</string>
<string name="screen_create_room_room_visibility_section_title">"Visibilidad de la sala"</string> <string name="screen_create_room_room_visibility_section_title">"Visibilidad de la sala"</string>
<string name="screen_create_room_topic_label">"Tema (opcional)"</string> <string name="screen_create_room_topic_label">"Tema (opcional)"</string>
</resources> </resources>

View file

@ -3,14 +3,34 @@
<string name="screen_create_room_action_create_room">"Uusi huone"</string> <string name="screen_create_room_action_create_room">"Uusi huone"</string>
<string name="screen_create_room_add_people_title">"Kutsu henkilöitä"</string> <string name="screen_create_room_add_people_title">"Kutsu henkilöitä"</string>
<string name="screen_create_room_error_creating_room">"Huoneen luomisessa tapahtui virhe"</string> <string name="screen_create_room_error_creating_room">"Huoneen luomisessa tapahtui virhe"</string>
<string name="screen_create_room_private_option_description">"Vain kutsutut henkilöt pääsevät tähän huoneeseen. Kaikki viestit ovat päästä päähän salattuja."</string> <string name="screen_create_room_error_creating_space">"Tilaa ei voitu luoda tuntemattoman virheen vuoksi. Yritä myöhemmin uudelleen."</string>
<string name="screen_create_room_name_placeholder">"Lisää nimi…"</string>
<string name="screen_create_room_new_room_title">"Uusi huone"</string>
<string name="screen_create_room_new_space_title">"Uusi tila"</string>
<string name="screen_create_room_private_option_description">"Vain kutsutut henkilöt voivat liittyä."</string>
<string name="screen_create_room_private_option_title">"Yksityinen"</string>
<string name="screen_create_room_public_option_description">"Kuka tahansa voi löytää tämän huoneen. <string name="screen_create_room_public_option_description">"Kuka tahansa voi löytää tämän huoneen.
Voit muuttaa tämän milloin tahansa huoneen asetuksista."</string> Voit muuttaa tämän milloin tahansa huoneen asetuksista."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Kuka tahansa voi pyytää saada liittyä huoneeseen, mutta ylläpitäjän tai valvojan on hyväksyttävä pyyntö"</string> <string name="screen_create_room_public_option_short_description">"Kuka tahansa voi liittyä."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Pyydä liittymistä"</string> <string name="screen_create_room_public_option_title">"Julkinen"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Kuka tahansa voi liittyä tähän huoneeseen"</string> <string name="screen_create_room_room_access_section_knocking_option_description">"Kuka tahansa voi pyytää saada liittyä huoneeseen, mutta ylläpitäjän tai valvojan on hyväksyttävä pyyntö."</string>
<string name="screen_create_room_room_address_section_footer">"Jotta tämä huone näkyisi julkisessa huonehakemistossa, tarvitset huoneen osoitteen."</string> <string name="screen_create_room_room_access_section_knocking_option_title">"Salli liittymispyynnöt"</string>
<string name="screen_create_room_room_address_section_title">"Huoneen osoite"</string> <string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Kuka tahansa tilassa %1$s voi liittyä, mutta kaikkien muiden on pyydettävä pääsyä."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Pyydä liittymistä"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Vain kutsutut henkilöt voivat liittyä."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Yksityinen"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Kuka tahansa voi liittyä."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Julkinen"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Kuka tahansa tilassa %1$s voi liittyä."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Vakio"</string>
<string name="screen_create_room_room_access_section_title">"Kenellä on pääsy"</string>
<string name="screen_create_room_room_address_section_footer">"Jotta tämä näkyisi julkisessa hakemistossa, tarvitset osoitteen."</string>
<string name="screen_create_room_room_address_section_title">"Osoite"</string>
<string name="screen_create_room_room_visibility_section_title">"Huoneen näkyvyys"</string> <string name="screen_create_room_room_visibility_section_title">"Huoneen näkyvyys"</string>
<string name="screen_create_room_space_selection_no_space_description">"(ei tilaa)"</string>
<string name="screen_create_room_space_selection_no_space_option">"Älä lisää tilaan"</string>
<string name="screen_create_room_space_selection_no_space_title">"Ei valittua tilaa"</string>
<string name="screen_create_room_space_selection_sheet_title">"Lisää tilaan"</string>
<string name="screen_create_room_topic_label">"Aihe (valinnainen)"</string> <string name="screen_create_room_topic_label">"Aihe (valinnainen)"</string>
<string name="screen_create_room_topic_placeholder">"Lisää kuvaus…"</string>
</resources> </resources>

View file

@ -8,15 +8,19 @@
<string name="screen_create_room_new_room_title">"Új szoba"</string> <string name="screen_create_room_new_room_title">"Új szoba"</string>
<string name="screen_create_room_new_space_title">"Új tér"</string> <string name="screen_create_room_new_space_title">"Új tér"</string>
<string name="screen_create_room_private_option_description">"Csak a meghívottak léphetnek be."</string> <string name="screen_create_room_private_option_description">"Csak a meghívottak léphetnek be."</string>
<string name="screen_create_room_private_option_title">"Privát"</string>
<string name="screen_create_room_public_option_description">"Bárki megtalálhatja ezt a szobát. <string name="screen_create_room_public_option_description">"Bárki megtalálhatja ezt a szobát.
Ezt bármikor módosíthatja a szobabeállításokban."</string> Ezt bármikor módosíthatja a szobabeállításokban."</string>
<string name="screen_create_room_public_option_short_description">"Bárki csatlakozhat."</string> <string name="screen_create_room_public_option_short_description">"Bárki csatlakozhat."</string>
<string name="screen_create_room_public_option_title">"Nyilvános"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Bárki kérheti, hogy csatlakozhasson a szobához, de egy adminisztrátornak vagy moderátornak el kell fogadnia a kérést."</string> <string name="screen_create_room_room_access_section_knocking_option_description">"Bárki kérheti, hogy csatlakozhasson a szobához, de egy adminisztrátornak vagy moderátornak el kell fogadnia a kérést."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Csatlakozás kérése"</string> <string name="screen_create_room_room_access_section_knocking_option_title">"Csatlakozás kérése"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Bárki csatlakozhat innen: %1$s, de mindenki másnak hozzáférést kell kérnie."</string> <string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Bárki csatlakozhat innen: %1$s, de mindenki másnak hozzáférést kell kérnie."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Csatlakozás kérése"</string> <string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Csatlakozás kérése"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Csak a meghívottak léphetnek be."</string> <string name="screen_create_room_room_access_section_private_option_description">"Csak a meghívottak léphetnek be."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Privát"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Bárki csatlakozhat."</string> <string name="screen_create_room_room_access_section_public_option_description">"Bárki csatlakozhat."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Nyilvános"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Bárki csatlakozhat innen: %1$s."</string> <string name="screen_create_room_room_access_section_restricted_option_description">"Bárki csatlakozhat innen: %1$s."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Szokásos"</string> <string name="screen_create_room_room_access_section_restricted_option_title">"Szokásos"</string>
<string name="screen_create_room_room_access_section_title">"Hozzáférésre jogosultak"</string> <string name="screen_create_room_room_access_section_title">"Hozzáférésre jogosultak"</string>
@ -24,7 +28,8 @@ Ezt bármikor módosíthatja a szobabeállításokban."</string>
<string name="screen_create_room_room_address_section_title">"Cím"</string> <string name="screen_create_room_room_address_section_title">"Cím"</string>
<string name="screen_create_room_room_visibility_section_title">"Szoba láthatósága"</string> <string name="screen_create_room_room_visibility_section_title">"Szoba láthatósága"</string>
<string name="screen_create_room_space_selection_no_space_description">"(nincs tér)"</string> <string name="screen_create_room_space_selection_no_space_description">"(nincs tér)"</string>
<string name="screen_create_room_space_selection_no_space_title">"Kezdőlap"</string> <string name="screen_create_room_space_selection_no_space_option">"Ne adja hozzá térhez"</string>
<string name="screen_create_room_space_selection_no_space_title">"Nincs kiválasztott tér"</string>
<string name="screen_create_room_space_selection_sheet_title">"Hozzáadás a térhez"</string> <string name="screen_create_room_space_selection_sheet_title">"Hozzáadás a térhez"</string>
<string name="screen_create_room_topic_label">"Téma (nem kötelező)"</string> <string name="screen_create_room_topic_label">"Téma (nem kötelező)"</string>
<string name="screen_create_room_topic_placeholder">"Leírás hozzáadása…"</string> <string name="screen_create_room_topic_placeholder">"Leírás hozzáadása…"</string>

View file

@ -3,21 +3,32 @@
<string name="screen_create_room_action_create_room">"Nytt rom"</string> <string name="screen_create_room_action_create_room">"Nytt rom"</string>
<string name="screen_create_room_add_people_title">"Inviter folk"</string> <string name="screen_create_room_add_people_title">"Inviter folk"</string>
<string name="screen_create_room_error_creating_room">"Det oppsto en feil under opprettelsen av rommet"</string> <string name="screen_create_room_error_creating_room">"Det oppsto en feil under opprettelsen av rommet"</string>
<string name="screen_create_room_error_creating_space">"Området kunne ikke opprettes på grunn av en ukjent feil. Prøv på nytt senere."</string>
<string name="screen_create_room_name_placeholder">"Legg til navn…"</string> <string name="screen_create_room_name_placeholder">"Legg til navn…"</string>
<string name="screen_create_room_new_room_title">"Nytt rom"</string> <string name="screen_create_room_new_room_title">"Nytt rom"</string>
<string name="screen_create_room_new_space_title">"Nytt område"</string> <string name="screen_create_room_new_space_title">"Nytt område"</string>
<string name="screen_create_room_private_option_description">"Bare inviterte personer kan bli med."</string> <string name="screen_create_room_private_option_description">"Bare inviterte personer kan bli med."</string>
<string name="screen_create_room_private_option_title">"Privat"</string>
<string name="screen_create_room_public_option_description">"Alle kan finne dette rommet. <string name="screen_create_room_public_option_description">"Alle kan finne dette rommet.
Du kan endre dette når som helst i rominnstillingene."</string> Du kan endre dette når som helst i rominnstillingene."</string>
<string name="screen_create_room_public_option_short_description">"Alle kan bli med."</string> <string name="screen_create_room_public_option_short_description">"Alle kan bli med."</string>
<string name="screen_create_room_public_option_title">"Offentlig"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Alle kan be om å få bli med, men en administrator eller moderator må godta forespørselen."</string> <string name="screen_create_room_room_access_section_knocking_option_description">"Alle kan be om å få bli med, men en administrator eller moderator må godta forespørselen."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Be om å bli med"</string> <string name="screen_create_room_room_access_section_knocking_option_title">"Be om å bli med"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Be om å få bli med"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Bare inviterte personer kan bli med."</string> <string name="screen_create_room_room_access_section_private_option_description">"Bare inviterte personer kan bli med."</string>
<string name="screen_create_room_room_access_section_private_option_title">"Privat"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Alle kan bli med."</string> <string name="screen_create_room_room_access_section_public_option_description">"Alle kan bli med."</string>
<string name="screen_create_room_room_access_section_public_option_title">"Offentlig"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Alle i %1$s kan bli med."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Standard"</string>
<string name="screen_create_room_room_access_section_title">"Hvem har tilgang"</string> <string name="screen_create_room_room_access_section_title">"Hvem har tilgang"</string>
<string name="screen_create_room_room_address_section_footer">"Du trenger en adresse for å gjøre den synlig i den offentlige katalogen."</string> <string name="screen_create_room_room_address_section_footer">"Du trenger en adresse for å gjøre den synlig i den offentlige katalogen."</string>
<string name="screen_create_room_room_address_section_title">"Adresse"</string> <string name="screen_create_room_room_address_section_title">"Adresse"</string>
<string name="screen_create_room_room_visibility_section_title">"Romsynlighet"</string> <string name="screen_create_room_room_visibility_section_title">"Romsynlighet"</string>
<string name="screen_create_room_space_selection_no_space_description">"(ingen område)"</string>
<string name="screen_create_room_space_selection_no_space_title">"Ingen områder valgt"</string>
<string name="screen_create_room_space_selection_sheet_title">"Legg til området"</string>
<string name="screen_create_room_topic_label">"Emne (valgfritt)"</string> <string name="screen_create_room_topic_label">"Emne (valgfritt)"</string>
<string name="screen_create_room_topic_placeholder">"Legg til beskrivelse…"</string> <string name="screen_create_room_topic_placeholder">"Legg til beskrivelse…"</string>
</resources> </resources>

View file

@ -4,10 +4,14 @@
<string name="screen_create_room_add_people_title">"Mensen uitnodigen"</string> <string name="screen_create_room_add_people_title">"Mensen uitnodigen"</string>
<string name="screen_create_room_error_creating_room">"Er is een fout opgetreden bij het aanmaken van de kamer"</string> <string name="screen_create_room_error_creating_room">"Er is een fout opgetreden bij het aanmaken van de kamer"</string>
<string name="screen_create_room_private_option_description">"Alleen uitgenodigde personen hebben toegang tot deze kamer. Alle berichten zijn end-to-end versleuteld."</string> <string name="screen_create_room_private_option_description">"Alleen uitgenodigde personen hebben toegang tot deze kamer. Alle berichten zijn end-to-end versleuteld."</string>
<string name="screen_create_room_private_option_title">"Privé"</string>
<string name="screen_create_room_public_option_description">"Iedereen kan deze kamer vinden. <string name="screen_create_room_public_option_description">"Iedereen kan deze kamer vinden.
Je kunt dit op elk gewenst moment wijzigen in de kamerinstellingen."</string> Je kunt dit op elk gewenst moment wijzigen in de kamerinstellingen."</string>
<string name="screen_create_room_public_option_title">"Openbaar"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Iedereen kan vragen om toe te treden tot de kamer, maar een beheerder of moderator moet het verzoek accepteren"</string> <string name="screen_create_room_room_access_section_knocking_option_description">"Iedereen kan vragen om toe te treden tot de kamer, maar een beheerder of moderator moet het verzoek accepteren"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Vraag om toe te treden"</string> <string name="screen_create_room_room_access_section_knocking_option_title">"Vraag om toe te treden"</string>
<string name="screen_create_room_room_access_section_private_option_title">"Privé"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Iedereen kan toetreden tot deze kamer"</string> <string name="screen_create_room_room_access_section_public_option_description">"Iedereen kan toetreden tot deze kamer"</string>
<string name="screen_create_room_room_access_section_public_option_title">"Openbaar"</string>
<string name="screen_create_room_topic_label">"Onderwerp (optioneel)"</string> <string name="screen_create_room_topic_label">"Onderwerp (optioneel)"</string>
</resources> </resources>

View file

@ -13,12 +13,19 @@
<string name="screen_create_room_public_option_short_description">"Присоединиться может любой."</string> <string name="screen_create_room_public_option_short_description">"Присоединиться может любой."</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"Любой желающий может подать заявку на присоединение к комнате, но администратор или модератор должен будет принять запрос."</string> <string name="screen_create_room_room_access_section_knocking_option_description">"Любой желающий может подать заявку на присоединение к комнате, но администратор или модератор должен будет принять запрос."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Разрешить запрос на присоединение"</string> <string name="screen_create_room_room_access_section_knocking_option_title">"Разрешить запрос на присоединение"</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_description">"Любой из %1$s может присоединиться, а всем остальным нужно запросить доступ."</string>
<string name="screen_create_room_room_access_section_knocking_restricted_option_title">"Подать заявку на вступление"</string>
<string name="screen_create_room_room_access_section_private_option_description">"Присоединиться могут только приглашенные."</string> <string name="screen_create_room_room_access_section_private_option_description">"Присоединиться могут только приглашенные."</string>
<string name="screen_create_room_room_access_section_public_option_description">"Присоединиться может любой желающий."</string> <string name="screen_create_room_room_access_section_public_option_description">"Присоединиться может любой желающий."</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"Любой в %1$s может присоединиться."</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"Стандарт"</string>
<string name="screen_create_room_room_access_section_title">"Кто имеет доступ"</string> <string name="screen_create_room_room_access_section_title">"Кто имеет доступ"</string>
<string name="screen_create_room_room_address_section_footer">"Вам понадобится адрес комнаты, чтобы сделать ее видимой в каталоге."</string> <string name="screen_create_room_room_address_section_footer">"Вам понадобится адрес комнаты, чтобы сделать ее видимой в каталоге."</string>
<string name="screen_create_room_room_address_section_title">"Адрес"</string> <string name="screen_create_room_room_address_section_title">"Адрес"</string>
<string name="screen_create_room_room_visibility_section_title">"Видимость комнаты"</string> <string name="screen_create_room_room_visibility_section_title">"Видимость комнаты"</string>
<string name="screen_create_room_space_selection_no_space_description">"(нет пространства)"</string>
<string name="screen_create_room_space_selection_no_space_title">"Главная"</string>
<string name="screen_create_room_space_selection_sheet_title">"Добавить в пространство"</string>
<string name="screen_create_room_topic_label">"Тема (необязательно)"</string> <string name="screen_create_room_topic_label">"Тема (необязательно)"</string>
<string name="screen_create_room_topic_placeholder">"Добавить описание…"</string> <string name="screen_create_room_topic_placeholder">"Добавить описание…"</string>
</resources> </resources>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Yeni oda"</string> <string name="screen_create_room_action_create_room">"Yeni oda"</string>
<string name="screen_create_room_add_people_title">"İnsanları davet et"</string> <string name="screen_create_room_add_people_title">"Kişileri davet et"</string>
<string name="screen_create_room_error_creating_room">"Oda oluşturulurken bir hata oluştu"</string> <string name="screen_create_room_error_creating_room">"Oda oluşturulurken bir hata oluştu"</string>
<string name="screen_create_room_private_option_description">"Bu odaya yalnızca davet edilen kişiler erişebilir. Tüm mesajlar uçtan uca şifrelenir."</string> <string name="screen_create_room_private_option_description">"Bu odaya yalnızca davet edilen kişiler erişebilir. Tüm mesajlar uçtan uca şifrelenir."</string>
<string name="screen_create_room_public_option_description">"Bu odayı herkes bulabilir. <string name="screen_create_room_public_option_description">"Bu odayı herkes bulabilir.

View file

@ -10,6 +10,7 @@ Buni xona sozlamalaridan istalgan vaqtda oʻzgartirishingiz mumkin."</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"Qoshilishni sorang"</string> <string name="screen_create_room_room_access_section_knocking_option_title">"Qoshilishni sorang"</string>
<string name="screen_create_room_room_access_section_public_option_description">"Bu xonaga istalgan kishi qoshilishi mumkin"</string> <string name="screen_create_room_room_access_section_public_option_description">"Bu xonaga istalgan kishi qoshilishi mumkin"</string>
<string name="screen_create_room_room_address_section_footer">"Ushbu xona ommaviy xonalar royxatida korinishi uchun sizga xona manzili kerak boladi."</string> <string name="screen_create_room_room_address_section_footer">"Ushbu xona ommaviy xonalar royxatida korinishi uchun sizga xona manzili kerak boladi."</string>
<string name="screen_create_room_room_address_section_title">"Xona manzili"</string>
<string name="screen_create_room_room_visibility_section_title">"Xonaning korinishi"</string> <string name="screen_create_room_room_visibility_section_title">"Xonaning korinishi"</string>
<string name="screen_create_room_topic_label">"Mavzu (ixtiyoriy)"</string> <string name="screen_create_room_topic_label">"Mavzu (ixtiyoriy)"</string>
</resources> </resources>

View file

@ -3,14 +3,34 @@
<string name="screen_create_room_action_create_room">"新聊天室"</string> <string name="screen_create_room_action_create_room">"新聊天室"</string>
<string name="screen_create_room_add_people_title">"邀请朋友"</string> <string name="screen_create_room_add_people_title">"邀请朋友"</string>
<string name="screen_create_room_error_creating_room">"创建聊天室时出错"</string> <string name="screen_create_room_error_creating_room">"创建聊天室时出错"</string>
<string name="screen_create_room_private_option_description">"只有受邀用户才能访问此聊天室。所有消息均经过端到端加密。"</string> <string name="screen_create_room_error_creating_space">"由于未知错误,空间创建失败。请稍后再试。"</string>
<string name="screen_create_room_name_placeholder">"添加名称…"</string>
<string name="screen_create_room_new_room_title">"新聊天室"</string>
<string name="screen_create_room_new_space_title">"新空间"</string>
<string name="screen_create_room_private_option_description">"仅限受邀者加入。"</string>
<string name="screen_create_room_private_option_title">"私密"</string>
<string name="screen_create_room_public_option_description">"任何人都能找到此聊天室。 <string name="screen_create_room_public_option_description">"任何人都能找到此聊天室。
你可以随时在聊天室设置中更改。"</string> 你可以随时在聊天室设置中更改。"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"任何人都可以请求加入房间,但必须由管理员或审核人接受"</string> <string name="screen_create_room_public_option_short_description">"任何人都可以找到并加入"</string>
<string name="screen_create_room_public_option_title">"公共"</string>
<string name="screen_create_room_room_access_section_knocking_option_description">"任何人都可申请加入,但需由管理员或版主批准请求。"</string>
<string name="screen_create_room_room_access_section_knocking_option_title">"请求加入"</string> <string name="screen_create_room_room_access_section_knocking_option_title">"请求加入"</string>
<string name="screen_create_room_room_access_section_public_option_description">"任何人都可以加入此房间"</string> <string name="screen_create_room_room_access_section_knocking_restricted_option_description">"%1$s 中的任何人都可加入,但其他人必须申请访问权限。"</string>
<string name="screen_create_room_room_address_section_footer">"要使该房间在公开房间目录中可见,您需要一个房间地址。"</string> <string name="screen_create_room_room_access_section_knocking_restricted_option_title">"申请加入"</string>
<string name="screen_create_room_room_address_section_title">"房间地址"</string> <string name="screen_create_room_room_access_section_private_option_description">"仅限受邀者加入。"</string>
<string name="screen_create_room_room_access_section_private_option_title">"私密"</string>
<string name="screen_create_room_room_access_section_public_option_description">"任何人都可以加入。"</string>
<string name="screen_create_room_room_access_section_public_option_title">"公共"</string>
<string name="screen_create_room_room_access_section_restricted_option_description">"%1$s 中的任何人可加入。"</string>
<string name="screen_create_room_room_access_section_restricted_option_title">"标准"</string>
<string name="screen_create_room_room_access_section_title">"谁有权访问此房间"</string>
<string name="screen_create_room_room_address_section_footer">"要使该聊天室在公共目录中可见,您需要一个聊天室地址。"</string>
<string name="screen_create_room_room_address_section_title">"地址"</string>
<string name="screen_create_room_room_visibility_section_title">"房间可见性"</string> <string name="screen_create_room_room_visibility_section_title">"房间可见性"</string>
<string name="screen_create_room_space_selection_no_space_description">"(无空间)"</string>
<string name="screen_create_room_space_selection_no_space_option">"请勿添加至空间"</string>
<string name="screen_create_room_space_selection_no_space_title">"未选择空间"</string>
<string name="screen_create_room_space_selection_sheet_title">"添加至空间"</string>
<string name="screen_create_room_topic_label">"主题(可选)"</string> <string name="screen_create_room_topic_label">"主题(可选)"</string>
<string name="screen_create_room_topic_placeholder">"添加描述…"</string>
</resources> </resources>

View file

@ -33,7 +33,6 @@ data class HomeState(
val eventSink: (HomeEvent) -> Unit, val eventSink: (HomeEvent) -> Unit,
) { ) {
val isBackHandlerEnabled = currentHomeNavigationBarItem != HomeNavigationBarItem.Chats || roomListState.spaceFiltersState is SpaceFiltersState.Selected val isBackHandlerEnabled = currentHomeNavigationBarItem != HomeNavigationBarItem.Chats || roomListState.spaceFiltersState is SpaceFiltersState.Selected
val displayActions = currentHomeNavigationBarItem == HomeNavigationBarItem.Chats
val displayRoomListFilters = currentHomeNavigationBarItem == HomeNavigationBarItem.Chats && roomListState.displayFilters val displayRoomListFilters = currentHomeNavigationBarItem == HomeNavigationBarItem.Chats && roomListState.displayFilters
val showNavigationBar = homeSpacesState.canCreateSpaces || homeSpacesState.spaceRooms.isNotEmpty() val showNavigationBar = homeSpacesState.canCreateSpaces || homeSpacesState.spaceRooms.isNotEmpty()
} }

View file

@ -45,7 +45,12 @@ open class HomeStateProvider : PreviewParameterProvider<HomeState> {
), ),
) + RoomListStateProvider().values.map { ) + RoomListStateProvider().values.map {
aHomeState(roomListState = it) aHomeState(roomListState = it)
} } + aHomeState(
currentHomeNavigationBarItem = HomeNavigationBarItem.Spaces,
homeSpacesState = aHomeSpacesState(
spaceRooms = emptyList(),
),
)
} }
internal fun aHomeState( internal fun aHomeState(

View file

@ -21,19 +21,21 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.FabPosition
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.rememberTopAppBarState import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import dev.chrisbanes.haze.hazeEffect import dev.chrisbanes.haze.hazeEffect
import dev.chrisbanes.haze.hazeSource import dev.chrisbanes.haze.hazeSource
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
@ -58,15 +60,15 @@ import io.element.android.libraries.androidutils.throttler.FirstThrottler
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.FloatingActionButton import io.element.android.libraries.designsystem.theme.components.FloatingActionButton
import io.element.android.libraries.designsystem.theme.components.HorizontalFloatingToolbar
import io.element.android.libraries.designsystem.theme.components.HorizontalFloatingToolbarItem
import io.element.android.libraries.designsystem.theme.components.HorizontalFloatingToolbarSeparator
import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.NavigationBar
import io.element.android.libraries.designsystem.theme.components.NavigationBarIcon
import io.element.android.libraries.designsystem.theme.components.NavigationBarItem
import io.element.android.libraries.designsystem.theme.components.NavigationBarText
import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarHost import io.element.android.libraries.designsystem.utils.snackbar.SnackbarHost
import io.element.android.libraries.designsystem.utils.snackbar.rememberSnackbarHostState import io.element.android.libraries.designsystem.utils.snackbar.rememberSnackbarHostState
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Composable @Composable
@ -185,12 +187,10 @@ private fun HomeScaffold(
onAccountSwitch = { onAccountSwitch = {
state.eventSink(HomeEvent.SwitchToAccount(it)) state.eventSink(HomeEvent.SwitchToAccount(it))
}, },
onCreateSpace = onCreateSpaceClick,
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
displayFilters = state.displayRoomListFilters, displayFilters = state.displayRoomListFilters,
filtersState = roomListState.filtersState, filtersState = roomListState.filtersState,
spaceFiltersState = roomListState.spaceFiltersState, spaceFiltersState = roomListState.spaceFiltersState,
canCreateSpaces = state.homeSpacesState.canCreateSpaces,
canReportBug = state.canReportBug, canReportBug = state.canReportBug,
modifier = Modifier.hazeEffect( modifier = Modifier.hazeEffect(
state = hazeState, state = hazeState,
@ -198,7 +198,7 @@ private fun HomeScaffold(
) )
) )
}, },
bottomBar = { floatingActionButton = {
if (state.showNavigationBar) { if (state.showNavigationBar) {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
HomeBottomBar( HomeBottomBar(
@ -222,14 +222,31 @@ private fun HomeScaffold(
state.eventSink(HomeEvent.SelectHomeNavigationBarItem(item)) state.eventSink(HomeEvent.SelectHomeNavigationBarItem(item))
} }
}, },
modifier = Modifier.hazeEffect( floatingActionButton = when (state.currentHomeNavigationBarItem) {
state = hazeState, HomeNavigationBarItem.Chats -> {
style = HazeMaterials.thick(), {
) HomeFloatingActionButton(onStartChatClick, CommonStrings.action_create_room)
}
}
HomeNavigationBarItem.Spaces -> if (state.homeSpacesState.canCreateSpaces) {
{
HomeFloatingActionButton(onCreateSpaceClick, CommonStrings.action_create_space)
}
} else {
// No FAB for spaces if we cannot create spaces
null
}
},
) )
} else {
HomeFloatingActionButton(onStartChatClick, CommonStrings.action_create_room)
} }
}, },
floatingActionButtonPosition = if (state.showNavigationBar) FabPosition.Center else FabPosition.End,
content = { padding -> content = { padding ->
val contentPadding = PaddingValues(
bottom = 96.dp,
)
when (state.currentHomeNavigationBarItem) { when (state.currentHomeNavigationBarItem) {
HomeNavigationBarItem.Chats -> { HomeNavigationBarItem.Chats -> {
RoomListContentView( RoomListContentView(
@ -243,15 +260,7 @@ private fun HomeScaffold(
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick, onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onRoomClick = ::onRoomClick, onRoomClick = ::onRoomClick,
onCreateRoomClick = onStartChatClick, onCreateRoomClick = onStartChatClick,
contentPadding = PaddingValues( contentPadding = contentPadding,
// FAB height is 56dp, bottom padding is 16dp, we add 8dp as extra margin -> 56+16+8 = 80,
// and include provided bottom padding
// Disable contentPadding due to navigation issue using the keyboard
// See https://issuetracker.google.com/issues/436432313
bottom = 80.dp,
// bottom = 80.dp + padding.calculateBottomPadding(),
// top = padding.calculateTopPadding()
),
modifier = Modifier modifier = Modifier
.padding( .padding(
PaddingValues( PaddingValues(
@ -274,6 +283,7 @@ private fun HomeScaffold(
.padding(padding) .padding(padding)
.consumeWindowInsets(padding) .consumeWindowInsets(padding)
.hazeSource(state = hazeState), .hazeSource(state = hazeState),
contentPadding = contentPadding,
state = state.homeSpacesState, state = state.homeSpacesState,
lazyListState = spacesLazyListState, lazyListState = spacesLazyListState,
onSpaceClick = { spaceId -> onSpaceClick = { spaceId ->
@ -286,49 +296,47 @@ private fun HomeScaffold(
} }
} }
}, },
floatingActionButton = {
if (state.displayActions) {
FloatingActionButton(
onClick = onStartChatClick,
) {
Icon(
imageVector = CompoundIcons.Plus(),
contentDescription = stringResource(id = R.string.screen_roomlist_a11y_create_message),
)
}
}
},
snackbarHost = { SnackbarHost(snackbarHostState) }, snackbarHost = { SnackbarHost(snackbarHostState) },
) )
} }
@Composable
private fun HomeFloatingActionButton(
onClick: () -> Unit,
contentDescription: Int,
modifier: Modifier = Modifier,
) {
FloatingActionButton(onClick = onClick, modifier = modifier) {
Icon(
imageVector = CompoundIcons.Plus(),
contentDescription = stringResource(id = contentDescription),
)
}
}
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
private fun HomeBottomBar( private fun HomeBottomBar(
currentHomeNavigationBarItem: HomeNavigationBarItem, currentHomeNavigationBarItem: HomeNavigationBarItem,
onItemClick: (HomeNavigationBarItem) -> Unit, onItemClick: (HomeNavigationBarItem) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
floatingActionButton: (@Composable () -> Unit)?,
) { ) {
NavigationBar( HorizontalFloatingToolbar(
containerColor = Color.Transparent, floatingActionButton = floatingActionButton,
modifier = modifier modifier = modifier
.zIndex(1f),
) { ) {
HomeNavigationBarItem.entries.forEach { item -> HomeNavigationBarItem.entries.forEachIndexed { index, item ->
if (index > 0) {
HorizontalFloatingToolbarSeparator()
}
val isSelected = currentHomeNavigationBarItem == item val isSelected = currentHomeNavigationBarItem == item
NavigationBarItem( HorizontalFloatingToolbarItem(
selected = isSelected, icon = item.icon(isSelected),
onClick = { tooltipLabel = stringResource(item.labelRes),
onItemClick(item) isSelected = isSelected,
}, onClick = { onItemClick(item) },
icon = {
NavigationBarIcon(
imageVector = item.icon(isSelected),
)
},
label = {
NavigationBarText(
text = stringResource(item.labelRes),
)
}
) )
} }
} }

View file

@ -87,9 +87,7 @@ fun HomeTopBar(
onMenuActionClick: (RoomListMenuAction) -> Unit, onMenuActionClick: (RoomListMenuAction) -> Unit,
onOpenSettings: () -> Unit, onOpenSettings: () -> Unit,
onAccountSwitch: (SessionId) -> Unit, onAccountSwitch: (SessionId) -> Unit,
onCreateSpace: () -> Unit,
scrollBehavior: TopAppBarScrollBehavior, scrollBehavior: TopAppBarScrollBehavior,
canCreateSpaces: Boolean,
canReportBug: Boolean, canReportBug: Boolean,
displayFilters: Boolean, displayFilters: Boolean,
filtersState: RoomListFiltersState, filtersState: RoomListFiltersState,
@ -134,17 +132,13 @@ fun HomeTopBar(
) )
}, },
actions = { actions = {
when (selectedNavigationItem) { if (selectedNavigationItem == HomeNavigationBarItem.Chats) {
HomeNavigationBarItem.Chats -> RoomListMenuItems( RoomListMenuItems(
onToggleSearch = onToggleSearch, onToggleSearch = onToggleSearch,
onMenuActionClick = onMenuActionClick, onMenuActionClick = onMenuActionClick,
canReportBug = canReportBug, canReportBug = canReportBug,
spaceFiltersState = spaceFiltersState, spaceFiltersState = spaceFiltersState,
) )
HomeNavigationBarItem.Spaces -> SpacesMenuItems(
canCreateSpaces = canCreateSpaces,
onCreateSpace = onCreateSpace
)
} }
}, },
// We want a 16dp left padding for the navigationIcon : // We want a 16dp left padding for the navigationIcon :
@ -230,21 +224,6 @@ private fun RoomListMenuItems(
} }
} }
@Composable
private fun SpacesMenuItems(
canCreateSpaces: Boolean,
onCreateSpace: () -> Unit
) {
if (canCreateSpaces) {
IconButton(onClick = onCreateSpace) {
Icon(
imageVector = CompoundIcons.Plus(),
contentDescription = stringResource(CommonStrings.action_create_space)
)
}
}
}
@Composable @Composable
private fun SpaceFilterButton( private fun SpaceFilterButton(
spaceFiltersState: SpaceFiltersState, spaceFiltersState: SpaceFiltersState,
@ -365,8 +344,6 @@ internal fun HomeTopBarPreview() = ElementPreview {
onOpenSettings = {}, onOpenSettings = {},
onAccountSwitch = {}, onAccountSwitch = {},
onToggleSearch = {}, onToggleSearch = {},
onCreateSpace = {},
canCreateSpaces = true,
canReportBug = true, canReportBug = true,
displayFilters = true, displayFilters = true,
filtersState = aRoomListFiltersState(), filtersState = aRoomListFiltersState(),
@ -388,8 +365,6 @@ internal fun HomeTopBarSpaceFiltersSelectedPreview() = ElementPreview {
onOpenSettings = {}, onOpenSettings = {},
onAccountSwitch = {}, onAccountSwitch = {},
onToggleSearch = {}, onToggleSearch = {},
onCreateSpace = {},
canCreateSpaces = true,
canReportBug = true, canReportBug = true,
displayFilters = true, displayFilters = true,
filtersState = aRoomListFiltersState(), filtersState = aRoomListFiltersState(),
@ -411,8 +386,6 @@ internal fun HomeTopBarSpacesPreview() = ElementPreview {
onOpenSettings = {}, onOpenSettings = {},
onAccountSwitch = {}, onAccountSwitch = {},
onToggleSearch = {}, onToggleSearch = {},
onCreateSpace = {},
canCreateSpaces = true,
canReportBug = true, canReportBug = true,
displayFilters = false, displayFilters = false,
filtersState = aRoomListFiltersState(), filtersState = aRoomListFiltersState(),
@ -434,8 +407,6 @@ internal fun HomeTopBarWithIndicatorPreview() = ElementPreview {
onOpenSettings = {}, onOpenSettings = {},
onAccountSwitch = {}, onAccountSwitch = {},
onToggleSearch = {}, onToggleSearch = {},
onCreateSpace = {},
canCreateSpaces = true,
canReportBug = true, canReportBug = true,
displayFilters = true, displayFilters = true,
filtersState = aRoomListFiltersState(), filtersState = aRoomListFiltersState(),
@ -457,8 +428,6 @@ internal fun HomeTopBarMultiAccountPreview() = ElementPreview {
onOpenSettings = {}, onOpenSettings = {},
onAccountSwitch = {}, onAccountSwitch = {},
onToggleSearch = {}, onToggleSearch = {},
onCreateSpace = {},
canCreateSpaces = true,
canReportBug = true, canReportBug = true,
displayFilters = true, displayFilters = true,
filtersState = aRoomListFiltersState(), filtersState = aRoomListFiltersState(),

View file

@ -10,6 +10,7 @@ package io.element.android.features.home.impl.spaces
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
@ -48,6 +49,7 @@ import kotlinx.collections.immutable.toImmutableList
fun HomeSpacesView( fun HomeSpacesView(
state: HomeSpacesState, state: HomeSpacesState,
lazyListState: LazyListState, lazyListState: LazyListState,
contentPadding: PaddingValues,
onSpaceClick: (RoomId) -> Unit, onSpaceClick: (RoomId) -> Unit,
onCreateSpaceClick: () -> Unit, onCreateSpaceClick: () -> Unit,
onExploreClick: () -> Unit, onExploreClick: () -> Unit,
@ -55,7 +57,7 @@ fun HomeSpacesView(
) { ) {
if (state.canCreateSpaces && state.spaceRooms.isEmpty()) { if (state.canCreateSpaces && state.spaceRooms.isEmpty()) {
EmptySpaceHomeView( EmptySpaceHomeView(
modifier = modifier, modifier = modifier.padding(contentPadding),
onCreateSpaceClick = onCreateSpaceClick, onCreateSpaceClick = onCreateSpaceClick,
onExploreClick = onExploreClick, onExploreClick = onExploreClick,
canExploreSpaces = state.canExploreSpaces, canExploreSpaces = state.canExploreSpaces,
@ -63,7 +65,8 @@ fun HomeSpacesView(
} else { } else {
LazyColumn( LazyColumn(
modifier = modifier, modifier = modifier,
state = lazyListState state = lazyListState,
contentPadding = contentPadding,
) { ) {
val space = state.space val space = state.space
when (space) { when (space) {
@ -115,6 +118,9 @@ fun HomeSpacesView(
} }
} }
/**
* Ref: https://www.figma.com/design/pDlJZGBsri47FNTXMnEdXB/Compound-Android-Templates?node-id=1763-74215&t=9IGKMXHDfTGAqzQK-4
*/
@Composable @Composable
private fun EmptySpaceHomeView( private fun EmptySpaceHomeView(
onCreateSpaceClick: () -> Unit, onCreateSpaceClick: () -> Unit,
@ -159,8 +165,7 @@ private fun EmptySpaceHomeView(
} }
} }
} }
) { )
}
} }
@PreviewsDayNight @PreviewsDayNight
@ -174,5 +179,6 @@ internal fun HomeSpacesViewPreview(
onSpaceClick = {}, onSpaceClick = {},
onCreateSpaceClick = {}, onCreateSpaceClick = {},
onExploreClick = {}, onExploreClick = {},
contentPadding = PaddingValues(bottom = 112.dp),
) )
} }

View file

@ -8,6 +8,7 @@
<string name="full_screen_intent_banner_message">"Каб не прапусціць важны званок, зменіце налады, каб дазволіць поўнаэкранныя апавяшчэнні, калі тэлефон заблакіраваны."</string> <string name="full_screen_intent_banner_message">"Каб не прапусціць важны званок, зменіце налады, каб дазволіць поўнаэкранныя апавяшчэнні, калі тэлефон заблакіраваны."</string>
<string name="full_screen_intent_banner_title">"Палепшыце якасць званкоў"</string> <string name="full_screen_intent_banner_title">"Палепшыце якасць званкоў"</string>
<string name="screen_home_tab_chats">"Усе чаты"</string> <string name="screen_home_tab_chats">"Усе чаты"</string>
<string name="screen_home_tab_spaces">"Прасторы"</string>
<string name="screen_invites_decline_chat_message">"Вы ўпэўненыя, што хочаце адхіліць запрашэнне ў %1$s?"</string> <string name="screen_invites_decline_chat_message">"Вы ўпэўненыя, што хочаце адхіліць запрашэнне ў %1$s?"</string>
<string name="screen_invites_decline_chat_title">"Адхіліць запрашэнне"</string> <string name="screen_invites_decline_chat_title">"Адхіліць запрашэнне"</string>
<string name="screen_invites_decline_direct_chat_message">"Вы ўпэўненыя, што хочаце адмовіцца ад прыватных зносін з %1$s?"</string> <string name="screen_invites_decline_direct_chat_message">"Вы ўпэўненыя, што хочаце адмовіцца ад прыватных зносін з %1$s?"</string>
@ -38,6 +39,7 @@
<string name="screen_roomlist_main_space_title">"Усе чаты"</string> <string name="screen_roomlist_main_space_title">"Усе чаты"</string>
<string name="screen_roomlist_mark_as_read">"Пазначыць як прачытанае"</string> <string name="screen_roomlist_mark_as_read">"Пазначыць як прачытанае"</string>
<string name="screen_roomlist_mark_as_unread">"Пазначыць як непрачытанае"</string> <string name="screen_roomlist_mark_as_unread">"Пазначыць як непрачытанае"</string>
<string name="screen_roomlist_your_spaces">"Вашы прасторы"</string>
<string name="session_verification_banner_message">"Здаецца, вы карыстаецеся новай прыладай. Праверце з дапамогай іншай прылады, каб атрымаць доступ да зашыфраваных паведамленняў."</string> <string name="session_verification_banner_message">"Здаецца, вы карыстаецеся новай прыладай. Праверце з дапамогай іншай прылады, каб атрымаць доступ да зашыфраваных паведамленняў."</string>
<string name="session_verification_banner_title">"Пацвердзіце, што гэта вы"</string> <string name="session_verification_banner_title">"Пацвердзіце, што гэта вы"</string>
</resources> </resources>

View file

@ -3,6 +3,8 @@
<string name="banner_battery_optimization_content_android">"Απενεργοποίησε τη βελτιστοποίηση μπαταρίας για αυτήν την εφαρμογή, για να βεβαιωθείς ότι λαμβάνονται όλες οι ειδοποιήσεις."</string> <string name="banner_battery_optimization_content_android">"Απενεργοποίησε τη βελτιστοποίηση μπαταρίας για αυτήν την εφαρμογή, για να βεβαιωθείς ότι λαμβάνονται όλες οι ειδοποιήσεις."</string>
<string name="banner_battery_optimization_submit_android">"Απενεργοποίηση βελτιστοποίησης"</string> <string name="banner_battery_optimization_submit_android">"Απενεργοποίηση βελτιστοποίησης"</string>
<string name="banner_battery_optimization_title_android">"Δεν φτάνουν οι ειδοποιήσεις;"</string> <string name="banner_battery_optimization_title_android">"Δεν φτάνουν οι ειδοποιήσεις;"</string>
<string name="banner_new_sound_message">"Το ping ειδοποιήσεών σας έχει ενημερωθεί—είναι πιο σαφές, πιο γρήγορο και λιγότερο ενοχλητικό."</string>
<string name="banner_new_sound_title">"Ανανεώσαμε τους ήχους σας"</string>
<string name="banner_set_up_recovery_content">"Δημιούργησε ένα νέο κλειδί ανάκτησης που μπορεί να χρησιμοποιηθεί για την επαναφορά του ιστορικού των κρυπτογραφημένων μηνυμάτων σου σε περίπτωση που χάσεις την πρόσβαση στις συσκευές σου."</string> <string name="banner_set_up_recovery_content">"Δημιούργησε ένα νέο κλειδί ανάκτησης που μπορεί να χρησιμοποιηθεί για την επαναφορά του ιστορικού των κρυπτογραφημένων μηνυμάτων σου σε περίπτωση που χάσεις την πρόσβαση στις συσκευές σου."</string>
<string name="banner_set_up_recovery_submit">"Ρύθμιση ανάκτησης"</string> <string name="banner_set_up_recovery_submit">"Ρύθμιση ανάκτησης"</string>
<string name="banner_set_up_recovery_title">"Ρύθμιση ανάκτησης"</string> <string name="banner_set_up_recovery_title">"Ρύθμιση ανάκτησης"</string>
@ -13,6 +15,7 @@
<string name="full_screen_intent_banner_message">"Για να διασφαλίσετε ότι δεν θα χάσετε ποτέ μια σημαντική κλήση, αλλάξτε τις ρυθμίσεις σας ώστε να επιτρέπονται οι ειδοποιήσεις πλήρους οθόνης όταν το τηλέφωνό σας είναι κλειδωμένο."</string> <string name="full_screen_intent_banner_message">"Για να διασφαλίσετε ότι δεν θα χάσετε ποτέ μια σημαντική κλήση, αλλάξτε τις ρυθμίσεις σας ώστε να επιτρέπονται οι ειδοποιήσεις πλήρους οθόνης όταν το τηλέφωνό σας είναι κλειδωμένο."</string>
<string name="full_screen_intent_banner_title">"Βελτίωσε την εμπειρία κλήσεων"</string> <string name="full_screen_intent_banner_title">"Βελτίωσε την εμπειρία κλήσεων"</string>
<string name="screen_home_tab_chats">"Συνομιλίες"</string> <string name="screen_home_tab_chats">"Συνομιλίες"</string>
<string name="screen_home_tab_spaces">"Χώροι"</string>
<string name="screen_invites_decline_chat_message">"Σίγουρα θες να απορρίψεις την πρόσκληση συμμετοχής στο %1$s;"</string> <string name="screen_invites_decline_chat_message">"Σίγουρα θες να απορρίψεις την πρόσκληση συμμετοχής στο %1$s;"</string>
<string name="screen_invites_decline_chat_title">"Απόρριψη πρόσκλησης"</string> <string name="screen_invites_decline_chat_title">"Απόρριψη πρόσκλησης"</string>
<string name="screen_invites_decline_direct_chat_message">"Σίγουρα θες να απορρίψεις την ιδιωτική συνομιλία με τον χρήστη %1$s;"</string> <string name="screen_invites_decline_direct_chat_message">"Σίγουρα θες να απορρίψεις την ιδιωτική συνομιλία με τον χρήστη %1$s;"</string>
@ -22,6 +25,7 @@
<string name="screen_migration_message">"Αυτή είναι μια εφάπαξ διαδικασία, ευχαριστώ που περίμενες."</string> <string name="screen_migration_message">"Αυτή είναι μια εφάπαξ διαδικασία, ευχαριστώ που περίμενες."</string>
<string name="screen_migration_title">"Ρύθμιση του λογαριασμού σου."</string> <string name="screen_migration_title">"Ρύθμιση του λογαριασμού σου."</string>
<string name="screen_roomlist_a11y_create_message">"Δημιουργία νέας συνομιλίας ή αίθουσας"</string> <string name="screen_roomlist_a11y_create_message">"Δημιουργία νέας συνομιλίας ή αίθουσας"</string>
<string name="screen_roomlist_clear_filters">"Καθαρισμός φίλτρων"</string>
<string name="screen_roomlist_empty_message">"Ξεκίνησε στέλνοντας μηνύματα σε κάποιον."</string> <string name="screen_roomlist_empty_message">"Ξεκίνησε στέλνοντας μηνύματα σε κάποιον."</string>
<string name="screen_roomlist_empty_title">"Δεν υπάρχουν συνομιλίες ακόμα."</string> <string name="screen_roomlist_empty_title">"Δεν υπάρχουν συνομιλίες ακόμα."</string>
<string name="screen_roomlist_filter_favourites">"Αγαπημένα"</string> <string name="screen_roomlist_filter_favourites">"Αγαπημένα"</string>
@ -31,6 +35,7 @@
<string name="screen_roomlist_filter_invites">"Προσκλήσεις"</string> <string name="screen_roomlist_filter_invites">"Προσκλήσεις"</string>
<string name="screen_roomlist_filter_invites_empty_state_title">"Δεν έχεις εκκρεμείς προσκλήσεις."</string> <string name="screen_roomlist_filter_invites_empty_state_title">"Δεν έχεις εκκρεμείς προσκλήσεις."</string>
<string name="screen_roomlist_filter_low_priority">"Χαμηλής Προτεραιότητας"</string> <string name="screen_roomlist_filter_low_priority">"Χαμηλής Προτεραιότητας"</string>
<string name="screen_roomlist_filter_low_priority_empty_state_title">"Δεν έχετε ακόμη συνομιλίες χαμηλής προτεραιότητας"</string>
<string name="screen_roomlist_filter_mixed_empty_state_subtitle">"Μπορείς να καταργήσεις την επιλογή φίλτρων για να δεις τις άλλες συνομιλίες σου"</string> <string name="screen_roomlist_filter_mixed_empty_state_subtitle">"Μπορείς να καταργήσεις την επιλογή φίλτρων για να δεις τις άλλες συνομιλίες σου"</string>
<string name="screen_roomlist_filter_mixed_empty_state_title">"Δεν έχεις συνομιλίες για αυτήν την επιλογή"</string> <string name="screen_roomlist_filter_mixed_empty_state_title">"Δεν έχεις συνομιλίες για αυτήν την επιλογή"</string>
<string name="screen_roomlist_filter_people">"Άτομα"</string> <string name="screen_roomlist_filter_people">"Άτομα"</string>
@ -45,6 +50,7 @@
<string name="screen_roomlist_mark_as_read">"Επισήμανση ως αναγνωσμένου"</string> <string name="screen_roomlist_mark_as_read">"Επισήμανση ως αναγνωσμένου"</string>
<string name="screen_roomlist_mark_as_unread">"Επισήμανση ως μη αναγνωσμένου"</string> <string name="screen_roomlist_mark_as_unread">"Επισήμανση ως μη αναγνωσμένου"</string>
<string name="screen_roomlist_tombstoned_room_description">"Αυτή η αίθουσα έχει αναβαθμιστεί"</string> <string name="screen_roomlist_tombstoned_room_description">"Αυτή η αίθουσα έχει αναβαθμιστεί"</string>
<string name="screen_roomlist_your_spaces">"Οι χώροι σας"</string>
<string name="session_verification_banner_message">"Φαίνεται ότι χρησιμοποιείς μια νέα συσκευή. Επαλήθευσε με άλλη συσκευή για πρόσβαση στα κρυπτογραφημένα σου μηνύματα."</string> <string name="session_verification_banner_message">"Φαίνεται ότι χρησιμοποιείς μια νέα συσκευή. Επαλήθευσε με άλλη συσκευή για πρόσβαση στα κρυπτογραφημένα σου μηνύματα."</string>
<string name="session_verification_banner_title">"Επαλήθευσε ότι είσαι εσύ"</string> <string name="session_verification_banner_title">"Επαλήθευσε ότι είσαι εσύ"</string>
</resources> </resources>

View file

@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="banner_battery_optimization_content_android">"Deshabilita la optimización de la batería en esta aplicación para asegurarte de que recibes notificaciones."</string>
<string name="banner_battery_optimization_submit_android">"Deshabilitar la optimización"</string>
<string name="banner_battery_optimization_title_android">"¿No llegan las notificaciones?"</string>
<string name="banner_set_up_recovery_content">"Recupera tu identidad criptográfica y tu historial de mensajes con una clave de recuperación si has perdido todos tus dispositivos actuales."</string> <string name="banner_set_up_recovery_content">"Recupera tu identidad criptográfica y tu historial de mensajes con una clave de recuperación si has perdido todos tus dispositivos actuales."</string>
<string name="banner_set_up_recovery_submit">"Configurar la recuperación"</string> <string name="banner_set_up_recovery_submit">"Configurar la recuperación"</string>
<string name="banner_set_up_recovery_title">"Configura la recuperación para proteger tu cuenta"</string> <string name="banner_set_up_recovery_title">"Configura la recuperación para proteger tu cuenta"</string>
@ -19,6 +22,7 @@
<string name="screen_migration_message">"Este proceso solo se hace una vez, gracias por esperar."</string> <string name="screen_migration_message">"Este proceso solo se hace una vez, gracias por esperar."</string>
<string name="screen_migration_title">"Configura tu cuenta"</string> <string name="screen_migration_title">"Configura tu cuenta"</string>
<string name="screen_roomlist_a11y_create_message">"Crear una nueva conversación o sala"</string> <string name="screen_roomlist_a11y_create_message">"Crear una nueva conversación o sala"</string>
<string name="screen_roomlist_clear_filters">"Borrar filtros"</string>
<string name="screen_roomlist_empty_message">"Empieza enviando un mensaje a alguien."</string> <string name="screen_roomlist_empty_message">"Empieza enviando un mensaje a alguien."</string>
<string name="screen_roomlist_empty_title">"Aún no hay chats."</string> <string name="screen_roomlist_empty_title">"Aún no hay chats."</string>
<string name="screen_roomlist_filter_favourites">"Favoritos"</string> <string name="screen_roomlist_filter_favourites">"Favoritos"</string>
@ -41,6 +45,7 @@ Por ahora, puedes deseleccionar los filtros para ver tus otros chats"</string>
<string name="screen_roomlist_main_space_title">"Chats"</string> <string name="screen_roomlist_main_space_title">"Chats"</string>
<string name="screen_roomlist_mark_as_read">"Marcar como leído"</string> <string name="screen_roomlist_mark_as_read">"Marcar como leído"</string>
<string name="screen_roomlist_mark_as_unread">"Marcar como no leído"</string> <string name="screen_roomlist_mark_as_unread">"Marcar como no leído"</string>
<string name="screen_roomlist_tombstoned_room_description">"Esta sala ha sido renovada"</string>
<string name="session_verification_banner_message">"Parece que estás usando un nuevo dispositivo. Verifica que eres tú para acceder a tus mensajes cifrados."</string> <string name="session_verification_banner_message">"Parece que estás usando un nuevo dispositivo. Verifica que eres tú para acceder a tus mensajes cifrados."</string>
<string name="session_verification_banner_title">"Verifica que eres tú"</string> <string name="session_verification_banner_title">"Verifica que eres tú"</string>
</resources> </resources>

View file

@ -50,6 +50,7 @@ Sinulla ei ole lukemattomia viestejä!"</string>
<string name="screen_roomlist_mark_as_read">"Merkitse luetuksi"</string> <string name="screen_roomlist_mark_as_read">"Merkitse luetuksi"</string>
<string name="screen_roomlist_mark_as_unread">"Merkitse lukemattomaksi"</string> <string name="screen_roomlist_mark_as_unread">"Merkitse lukemattomaksi"</string>
<string name="screen_roomlist_tombstoned_room_description">"Tämä huone on päivitetty"</string> <string name="screen_roomlist_tombstoned_room_description">"Tämä huone on päivitetty"</string>
<string name="screen_roomlist_your_spaces">"Tilasi"</string>
<string name="session_verification_banner_message">"Vaikuttaisi siltä, että käytät uutta laitetta. Vahvista toisella laitteella nähdäksesi salatut viestit."</string> <string name="session_verification_banner_message">"Vaikuttaisi siltä, että käytät uutta laitetta. Vahvista toisella laitteella nähdäksesi salatut viestit."</string>
<string name="session_verification_banner_title">"Vahvista, että se olet sinä"</string> <string name="session_verification_banner_title">"Vahvista, että se olet sinä"</string>
</resources> </resources>

View file

@ -50,6 +50,7 @@ Du har ingen uleste meldinger!"</string>
<string name="screen_roomlist_mark_as_read">"Marker som lest"</string> <string name="screen_roomlist_mark_as_read">"Marker som lest"</string>
<string name="screen_roomlist_mark_as_unread">"Merk som ulest"</string> <string name="screen_roomlist_mark_as_unread">"Merk som ulest"</string>
<string name="screen_roomlist_tombstoned_room_description">"Dette rommet har blitt oppgradert"</string> <string name="screen_roomlist_tombstoned_room_description">"Dette rommet har blitt oppgradert"</string>
<string name="screen_roomlist_your_spaces">"Dine områder"</string>
<string name="session_verification_banner_message">"Det ser ut til at du bruker en ny enhet. Bekreft med en annen enhet for å få tilgang til de krypterte meldingene dine."</string> <string name="session_verification_banner_message">"Det ser ut til at du bruker en ny enhet. Bekreft med en annen enhet for å få tilgang til de krypterte meldingene dine."</string>
<string name="session_verification_banner_title">"Bekreft at det er deg"</string> <string name="session_verification_banner_title">"Bekreft at det er deg"</string>
</resources> </resources>

View file

@ -50,6 +50,7 @@
<string name="screen_roomlist_mark_as_read">"Пометить как прочитанное"</string> <string name="screen_roomlist_mark_as_read">"Пометить как прочитанное"</string>
<string name="screen_roomlist_mark_as_unread">"Отметить как непрочитанное"</string> <string name="screen_roomlist_mark_as_unread">"Отметить как непрочитанное"</string>
<string name="screen_roomlist_tombstoned_room_description">"Эта комната была обновлена"</string> <string name="screen_roomlist_tombstoned_room_description">"Эта комната была обновлена"</string>
<string name="screen_roomlist_your_spaces">"Ваши пространства"</string>
<string name="session_verification_banner_message">"Похоже, вы используете новое устройство. Чтобы получить доступ к зашифрованным сообщениям пройдите подтверждение с другим устройством."</string> <string name="session_verification_banner_message">"Похоже, вы используете новое устройство. Чтобы получить доступ к зашифрованным сообщениям пройдите подтверждение с другим устройством."</string>
<string name="session_verification_banner_title">"Подтвердите, что это вы"</string> <string name="session_verification_banner_title">"Подтвердите, что это вы"</string>
</resources> </resources>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="banner_new_sound_message">"Bildirim sesi güncellendi — daha net, daha hızlı ve daha az dikkat dağıtıcı."</string>
<string name="banner_set_up_recovery_content">"Mevcut tüm cihazlarınızı kaybettiyseniz şifreleme kimliğinizi ve mesaj geçmişinizi bir kurtarma anahtarıyla kurtarın."</string> <string name="banner_set_up_recovery_content">"Mevcut tüm cihazlarınızı kaybettiyseniz şifreleme kimliğinizi ve mesaj geçmişinizi bir kurtarma anahtarıyla kurtarın."</string>
<string name="banner_set_up_recovery_submit">"Kurtarmayı ayarlayın"</string> <string name="banner_set_up_recovery_submit">"Kurtarmayı ayarlayın"</string>
<string name="banner_set_up_recovery_title">"Hesabınızı korumak için kurtarmayı ayarlayın"</string> <string name="banner_set_up_recovery_title">"Hesabınızı korumak için kurtarmayı ayarlayın"</string>
@ -10,6 +11,7 @@
<string name="full_screen_intent_banner_message">"Önemli bir aramayı asla kaçırmamak için, telefonunuz kilitliyken tam ekran bildirimlere izin vermek üzere ayarlarınızı değiştirin."</string> <string name="full_screen_intent_banner_message">"Önemli bir aramayı asla kaçırmamak için, telefonunuz kilitliyken tam ekran bildirimlere izin vermek üzere ayarlarınızı değiştirin."</string>
<string name="full_screen_intent_banner_title">"Arama deneyiminizi geliştirin"</string> <string name="full_screen_intent_banner_title">"Arama deneyiminizi geliştirin"</string>
<string name="screen_home_tab_chats">"Sohbetler"</string> <string name="screen_home_tab_chats">"Sohbetler"</string>
<string name="screen_home_tab_spaces">"Alanlar"</string>
<string name="screen_invites_decline_chat_message">"%1$s katılma davetini reddetmek istediğinizden emin misiniz?"</string> <string name="screen_invites_decline_chat_message">"%1$s katılma davetini reddetmek istediğinizden emin misiniz?"</string>
<string name="screen_invites_decline_chat_title">"Daveti reddet"</string> <string name="screen_invites_decline_chat_title">"Daveti reddet"</string>
<string name="screen_invites_decline_direct_chat_message">"%1$s ile bu özel sohbeti reddetmek istediğinizden emin misiniz?"</string> <string name="screen_invites_decline_direct_chat_message">"%1$s ile bu özel sohbeti reddetmek istediğinizden emin misiniz?"</string>
@ -19,6 +21,7 @@
<string name="screen_migration_message">"Bu tek seferlik bir işlemdir, beklediğiniz için teşekkürler."</string> <string name="screen_migration_message">"Bu tek seferlik bir işlemdir, beklediğiniz için teşekkürler."</string>
<string name="screen_migration_title">"Hesabınızı ayarlanıyor."</string> <string name="screen_migration_title">"Hesabınızı ayarlanıyor."</string>
<string name="screen_roomlist_a11y_create_message">"Yeni bir sohbet veya oda oluşturun"</string> <string name="screen_roomlist_a11y_create_message">"Yeni bir sohbet veya oda oluşturun"</string>
<string name="screen_roomlist_clear_filters">"Filtreleri temizle"</string>
<string name="screen_roomlist_empty_message">"Birine mesaj göndererek başla."</string> <string name="screen_roomlist_empty_message">"Birine mesaj göndererek başla."</string>
<string name="screen_roomlist_empty_title">"Henüz sohbet yok."</string> <string name="screen_roomlist_empty_title">"Henüz sohbet yok."</string>
<string name="screen_roomlist_filter_favourites">"Favoriler"</string> <string name="screen_roomlist_filter_favourites">"Favoriler"</string>
@ -41,6 +44,7 @@ Okunmamış mesajınız yok!"</string>
<string name="screen_roomlist_main_space_title">"Sohbetler"</string> <string name="screen_roomlist_main_space_title">"Sohbetler"</string>
<string name="screen_roomlist_mark_as_read">"Okundu olarak işaretle"</string> <string name="screen_roomlist_mark_as_read">"Okundu olarak işaretle"</string>
<string name="screen_roomlist_mark_as_unread">"Okunmamış olarak işaretle"</string> <string name="screen_roomlist_mark_as_unread">"Okunmamış olarak işaretle"</string>
<string name="screen_roomlist_tombstoned_room_description">"Bu oda yükseltildi"</string>
<string name="session_verification_banner_message">"Görünüşe göre yeni bir cihaz kullanıyorsunuz. Şifrelenmiş mesajlarınıza erişmek için başka bir cihazla doğrulayın."</string> <string name="session_verification_banner_message">"Görünüşe göre yeni bir cihaz kullanıyorsunuz. Şifrelenmiş mesajlarınıza erişmek için başka bir cihazla doğrulayın."</string>
<string name="session_verification_banner_title">"Siz olduğunuzu doğrulayın"</string> <string name="session_verification_banner_title">"Siz olduğunuzu doğrulayın"</string>
</resources> </resources>

View file

@ -3,6 +3,8 @@
<string name="banner_battery_optimization_content_android">"Ushbu ilova uchun quvvatni optimallashtirishni oʻchirib qoʻying, barcha xabarnomalar qabul qilinganligiga ishonch hosil qilish uchun."</string> <string name="banner_battery_optimization_content_android">"Ushbu ilova uchun quvvatni optimallashtirishni oʻchirib qoʻying, barcha xabarnomalar qabul qilinganligiga ishonch hosil qilish uchun."</string>
<string name="banner_battery_optimization_submit_android">"Optimallashtirishni o\'chiring"</string> <string name="banner_battery_optimization_submit_android">"Optimallashtirishni o\'chiring"</string>
<string name="banner_battery_optimization_title_android">"Bildirishnoma kelmayaptimi?"</string> <string name="banner_battery_optimization_title_android">"Bildirishnoma kelmayaptimi?"</string>
<string name="banner_new_sound_message">"Xabarnoma signali yangilandi — endi u aniqroq, tezroq va kamroq halal beradigan boldi."</string>
<string name="banner_new_sound_title">"Tovushlaringiz yangilandi"</string>
<string name="banner_set_up_recovery_content">"Mavjud barcha qurilmalarni yoʻqotgan boʻlsangiz, kriptografik kimligingizni va xabarlar tarixini qayta tiklovchi kalit bilan saqlab qoʻying."</string> <string name="banner_set_up_recovery_content">"Mavjud barcha qurilmalarni yoʻqotgan boʻlsangiz, kriptografik kimligingizni va xabarlar tarixini qayta tiklovchi kalit bilan saqlab qoʻying."</string>
<string name="banner_set_up_recovery_submit">"Qayta tiklashni sozlang"</string> <string name="banner_set_up_recovery_submit">"Qayta tiklashni sozlang"</string>
<string name="banner_set_up_recovery_title">"Hisobingizni himoya qilish uchun tiklashni sozlang"</string> <string name="banner_set_up_recovery_title">"Hisobingizni himoya qilish uchun tiklashni sozlang"</string>
@ -13,7 +15,7 @@
<string name="full_screen_intent_banner_message">"Muhim qoʻngʻiroqlarni oʻtkazib yubormasligingiz uchun telefoningiz qulflangan holatida toʻliq ekranli bildirishnomalarni korsatishga ruxsat beradigan qilib sozlamalaringizni oʻzgartiring."</string> <string name="full_screen_intent_banner_message">"Muhim qoʻngʻiroqlarni oʻtkazib yubormasligingiz uchun telefoningiz qulflangan holatida toʻliq ekranli bildirishnomalarni korsatishga ruxsat beradigan qilib sozlamalaringizni oʻzgartiring."</string>
<string name="full_screen_intent_banner_title">"Qoʻngʻiroq tajribangizni yaxshilang"</string> <string name="full_screen_intent_banner_title">"Qoʻngʻiroq tajribangizni yaxshilang"</string>
<string name="screen_home_tab_chats">"Suhbatlar"</string> <string name="screen_home_tab_chats">"Suhbatlar"</string>
<string name="screen_home_tab_spaces">"Boshliqlar"</string> <string name="screen_home_tab_spaces">"Maydonlar"</string>
<string name="screen_invites_decline_chat_message">"Haqiqatan ham qo\'shilish taklifini rad qilmoqchimisiz%1$s ?"</string> <string name="screen_invites_decline_chat_message">"Haqiqatan ham qo\'shilish taklifini rad qilmoqchimisiz%1$s ?"</string>
<string name="screen_invites_decline_chat_title">"Taklifni rad etish"</string> <string name="screen_invites_decline_chat_title">"Taklifni rad etish"</string>
<string name="screen_invites_decline_direct_chat_message">"Haqiqatan ham bu shaxsiy chatni rad qilmoqchimisiz%1$s ?"</string> <string name="screen_invites_decline_direct_chat_message">"Haqiqatan ham bu shaxsiy chatni rad qilmoqchimisiz%1$s ?"</string>

View file

@ -50,6 +50,7 @@
<string name="screen_roomlist_mark_as_read">"标记为已读"</string> <string name="screen_roomlist_mark_as_read">"标记为已读"</string>
<string name="screen_roomlist_mark_as_unread">"标记为未读"</string> <string name="screen_roomlist_mark_as_unread">"标记为未读"</string>
<string name="screen_roomlist_tombstoned_room_description">"此房间已升级"</string> <string name="screen_roomlist_tombstoned_room_description">"此房间已升级"</string>
<string name="screen_roomlist_your_spaces">"您的空间"</string>
<string name="session_verification_banner_message">"您似乎正在使用新设备。使用另一台设备进行验证以访问您的加密消息。"</string> <string name="session_verification_banner_message">"您似乎正在使用新设备。使用另一台设备进行验证以访问您的加密消息。"</string>
<string name="session_verification_banner_title">"验证是你本人"</string> <string name="session_verification_banner_title">"验证是你本人"</string>
</resources> </resources>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_decline_and_block_block_user_option_title">"Kullanıcıyı engelle"</string> <string name="screen_decline_and_block_block_user_option_title">"Kullanıcıyı engelle"</string>
<string name="screen_decline_and_block_report_user_reason_placeholder">"Bildirme nedenini açıklayın…"</string>
<string name="screen_invites_decline_chat_message">"%1$s katılma davetini reddetmek istediğinizden emin misiniz?"</string> <string name="screen_invites_decline_chat_message">"%1$s katılma davetini reddetmek istediğinizden emin misiniz?"</string>
<string name="screen_invites_decline_chat_title">"Daveti reddet"</string> <string name="screen_invites_decline_chat_title">"Daveti reddet"</string>
<string name="screen_invites_decline_direct_chat_message">"%1$s ile bu özel sohbeti reddetmek istediğinizden emin misiniz?"</string> <string name="screen_invites_decline_direct_chat_message">"%1$s ile bu özel sohbeti reddetmek istediğinizden emin misiniz?"</string>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_ban_by_message">"Αποκλειστήκατε από αυτή την αίθουσα από το χρήστη %1$s."</string> <string name="screen_join_room_ban_by_message">"Αποκλειστήκατε από το χρήστη %1$s."</string>
<string name="screen_join_room_ban_message">"Σας απαγορεύτηκε η είσοδος σε αυτή την αίθουσα"</string> <string name="screen_join_room_ban_message">"Σας επιβλήθηκε ένα ban"</string>
<string name="screen_join_room_ban_reason">"Αιτία: %1$s."</string> <string name="screen_join_room_ban_reason">"Αιτία: %1$s."</string>
<string name="screen_join_room_cancel_knock_action">"Ακύρωση αιτήματος"</string> <string name="screen_join_room_cancel_knock_action">"Ακύρωση αιτήματος"</string>
<string name="screen_join_room_cancel_knock_alert_confirmation">"Ναι, ακύρωση"</string> <string name="screen_join_room_cancel_knock_alert_confirmation">"Ναι, ακύρωση"</string>
@ -11,13 +11,15 @@
<string name="screen_join_room_decline_and_block_alert_message">"Είστε βέβαιοι ότι θέλετε να απορρίψετε την πρόσκληση συμμετοχής σε αυτήν την αίθουσα; Αυτό θα εμποδίσει επίσης τον χρήστη %1$s να επικοινωνήσει μαζί σας ή να σας προσκαλέσει σε αίθουσες."</string> <string name="screen_join_room_decline_and_block_alert_message">"Είστε βέβαιοι ότι θέλετε να απορρίψετε την πρόσκληση συμμετοχής σε αυτήν την αίθουσα; Αυτό θα εμποδίσει επίσης τον χρήστη %1$s να επικοινωνήσει μαζί σας ή να σας προσκαλέσει σε αίθουσες."</string>
<string name="screen_join_room_decline_and_block_alert_title">"Απόρριψη πρόσκλησης και αποκλεισμός"</string> <string name="screen_join_room_decline_and_block_alert_title">"Απόρριψη πρόσκλησης και αποκλεισμός"</string>
<string name="screen_join_room_decline_and_block_button_title">"Απόρριψη και αποκλεισμός"</string> <string name="screen_join_room_decline_and_block_button_title">"Απόρριψη και αποκλεισμός"</string>
<string name="screen_join_room_fail_message">"Η συμμετοχή στην αίθουσα απέτυχε."</string> <string name="screen_join_room_fail_message">"Η συμμετοχή απέτυχε"</string>
<string name="screen_join_room_fail_reason">"Αυτή η αίθουσα είναι είτε μόνο για προσκεκλημένους είτε ενδέχεται να υπάρχουν περιορισμοί πρόσβασης σε επίπεδο χώρου."</string> <string name="screen_join_room_fail_reason">"Πρέπει να λάβετε πρόσκληση για να συμμετάσχετε ή ενδέχεται να υπάρχουν περιορισμοί πρόσβασης."</string>
<string name="screen_join_room_forget_action">"Ξεχάστε αυτή την αίθουσα"</string> <string name="screen_join_room_forget_action">"Κατάργηση"</string>
<string name="screen_join_room_invite_required_message">"Χρειάζεστε πρόσκληση για να συμμετάσχετε σε αυτή την αίθουσα"</string> <string name="screen_join_room_invite_required_message">"Χρειάζεστε πρόσκληση για να συμμετάσχετε"</string>
<string name="screen_join_room_invited_by">"Προσκεκλημένο από"</string>
<string name="screen_join_room_join_action">"Συμμετοχή"</string> <string name="screen_join_room_join_action">"Συμμετοχή"</string>
<string name="screen_join_room_join_restricted_message">"Ενδέχεται να χρειαστεί να προσκληθείτε ή να είστε μέλος ενός χώρου για να συμμετάσχετε."</string> <string name="screen_join_room_join_restricted_message">"Ενδέχεται να χρειαστεί να προσκληθείτε ή να είστε μέλος ενός χώρου για να συμμετάσχετε."</string>
<string name="screen_join_room_knock_action">"Χτύπα για συμμετοχή"</string> <string name="screen_join_room_knock_action">"Χτύπα για συμμετοχή"</string>
<string name="screen_join_room_knock_message_characters_count">"Επιτρεπόμενοι χαρακτήρες %1$d από %2$d"</string>
<string name="screen_join_room_knock_message_description">"Μήνυμα (προαιρετικό)"</string> <string name="screen_join_room_knock_message_description">"Μήνυμα (προαιρετικό)"</string>
<string name="screen_join_room_knock_sent_description">"Θα λάβετε πρόσκληση για να συμμετάσχετε στην αίθουσα, εάν το αίτημά σας γίνει αποδεκτό."</string> <string name="screen_join_room_knock_sent_description">"Θα λάβετε πρόσκληση για να συμμετάσχετε στην αίθουσα, εάν το αίτημά σας γίνει αποδεκτό."</string>
<string name="screen_join_room_knock_sent_title">"Το αίτημα συμμετοχής στάλθηκε"</string> <string name="screen_join_room_knock_sent_title">"Το αίτημα συμμετοχής στάλθηκε"</string>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_ban_by_message">"Has sido vetado de esta sala por %1$s."</string> <string name="screen_join_room_ban_by_message">"Has sido baneado por %1$s."</string>
<string name="screen_join_room_ban_message">"Has sido vetado de esta sala"</string> <string name="screen_join_room_ban_message">"Has sido baneado."</string>
<string name="screen_join_room_ban_reason">"Motivo: %1$s."</string> <string name="screen_join_room_ban_reason">"Motivo: %1$s."</string>
<string name="screen_join_room_cancel_knock_action">"Cancelar solicitud"</string> <string name="screen_join_room_cancel_knock_action">"Cancelar solicitud"</string>
<string name="screen_join_room_cancel_knock_alert_confirmation">"Sí, cancelar"</string> <string name="screen_join_room_cancel_knock_alert_confirmation">"Sí, cancelar"</string>
@ -11,10 +11,10 @@
<string name="screen_join_room_decline_and_block_alert_message">"¿Estás seguro de que deseas rechazar la invitación para unirte a esta sala? Esto también impedirá que %1$s pueda contactar contigo o invitarte a salas."</string> <string name="screen_join_room_decline_and_block_alert_message">"¿Estás seguro de que deseas rechazar la invitación para unirte a esta sala? Esto también impedirá que %1$s pueda contactar contigo o invitarte a salas."</string>
<string name="screen_join_room_decline_and_block_alert_title">"Rechazar invitación y bloquear"</string> <string name="screen_join_room_decline_and_block_alert_title">"Rechazar invitación y bloquear"</string>
<string name="screen_join_room_decline_and_block_button_title">"Rechazar y bloquear"</string> <string name="screen_join_room_decline_and_block_button_title">"Rechazar y bloquear"</string>
<string name="screen_join_room_fail_message">"No se pudo unir a la sala."</string> <string name="screen_join_room_fail_message">"Error al unirse"</string>
<string name="screen_join_room_fail_reason">"O bien solo se puede acceder a esta sala con invitación, o puede que haya restricciones de acceso a nivel de espacio."</string> <string name="screen_join_room_fail_reason">"O es necesario estar invitado para unirse o puede haber restricciones de acceso."</string>
<string name="screen_join_room_forget_action">"Olvidar esta sala"</string> <string name="screen_join_room_forget_action">"Olvidar"</string>
<string name="screen_join_room_invite_required_message">"Necesitas una invitación para unirte a esta sala"</string> <string name="screen_join_room_invite_required_message">"Necesitas una invitación para unirte"</string>
<string name="screen_join_room_join_action">"Unirse"</string> <string name="screen_join_room_join_action">"Unirse"</string>
<string name="screen_join_room_join_restricted_message">"Es posible que necesites ser invitado o ser miembro de un espacio para poder unirte."</string> <string name="screen_join_room_join_restricted_message">"Es posible que necesites ser invitado o ser miembro de un espacio para poder unirte."</string>
<string name="screen_join_room_knock_action">"Enviar solicitud de unión"</string> <string name="screen_join_room_knock_action">"Enviar solicitud de unión"</string>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_join_room_ban_by_message">"Du bannades från det här rummet av %1$s."</string> <string name="screen_join_room_ban_by_message">"Du bannades av %1$s."</string>
<string name="screen_join_room_ban_message">"Du bannades från det här rummet"</string> <string name="screen_join_room_ban_message">"Du bannades från det här rummet"</string>
<string name="screen_join_room_ban_reason">"Anledning: %1$s."</string> <string name="screen_join_room_ban_reason">"Anledning: %1$s."</string>
<string name="screen_join_room_cancel_knock_action">"Avbryt begäran"</string> <string name="screen_join_room_cancel_knock_action">"Avbryt begäran"</string>
@ -11,10 +11,10 @@
<string name="screen_join_room_decline_and_block_alert_message">"Är du säker på att du vill avvisa inbjudan att gå med i det här rummet? Detta kommer också att hindra %1$s från att kontakta dig eller bjuda in dig till rum."</string> <string name="screen_join_room_decline_and_block_alert_message">"Är du säker på att du vill avvisa inbjudan att gå med i det här rummet? Detta kommer också att hindra %1$s från att kontakta dig eller bjuda in dig till rum."</string>
<string name="screen_join_room_decline_and_block_alert_title">"Avvisa inbjudan och blockera"</string> <string name="screen_join_room_decline_and_block_alert_title">"Avvisa inbjudan och blockera"</string>
<string name="screen_join_room_decline_and_block_button_title">"Avvisa och blockera"</string> <string name="screen_join_room_decline_and_block_button_title">"Avvisa och blockera"</string>
<string name="screen_join_room_fail_message">"Misslyckades att gå med i rummet."</string> <string name="screen_join_room_fail_message">"Misslyckades att gå med."</string>
<string name="screen_join_room_fail_reason">"Detta rum är antingen endast för inbjudna eller så kan det finnas begränsningar för åtkomst på utrymmesnivå."</string> <string name="screen_join_room_fail_reason">"Detta rum är antingen endast för inbjudna eller så kan det finnas begränsningar för åtkomst på utrymmesnivå."</string>
<string name="screen_join_room_forget_action">"Glöm det här rummet"</string> <string name="screen_join_room_forget_action">"Glöm"</string>
<string name="screen_join_room_invite_required_message">"Du behöver en inbjudan för att gå med i detta rum"</string> <string name="screen_join_room_invite_required_message">"Du behöver en inbjudan för att gå med"</string>
<string name="screen_join_room_join_action">"Gå med"</string> <string name="screen_join_room_join_action">"Gå med"</string>
<string name="screen_join_room_join_restricted_message">"Du kan behöva bli inbjuden eller vara medlem i ett utrymme för att gå med."</string> <string name="screen_join_room_join_restricted_message">"Du kan behöva bli inbjuden eller vara medlem i ett utrymme för att gå med."</string>
<string name="screen_join_room_knock_action">"Knacka för att gå med"</string> <string name="screen_join_room_knock_action">"Knacka för att gå med"</string>

View file

@ -15,6 +15,7 @@
<string name="screen_join_room_fail_reason">"Bu xona faqat taklif etilganlar uchun yoki bu maydonga kirish huquqi cheklangan bolishi mumkin."</string> <string name="screen_join_room_fail_reason">"Bu xona faqat taklif etilganlar uchun yoki bu maydonga kirish huquqi cheklangan bolishi mumkin."</string>
<string name="screen_join_room_forget_action">"Bu xonani esdan chiqarish"</string> <string name="screen_join_room_forget_action">"Bu xonani esdan chiqarish"</string>
<string name="screen_join_room_invite_required_message">"Bu xonaga kirish uchun taklifnoma kerak"</string> <string name="screen_join_room_invite_required_message">"Bu xonaga kirish uchun taklifnoma kerak"</string>
<string name="screen_join_room_invited_by">"Tomonidan taklif qilingan"</string>
<string name="screen_join_room_join_action">"Qo\'shilish"</string> <string name="screen_join_room_join_action">"Qo\'shilish"</string>
<string name="screen_join_room_join_restricted_message">"Qoshilish uchun sizga taklif kerak yoki siz maydonga azo bolishingiz kerak."</string> <string name="screen_join_room_join_restricted_message">"Qoshilish uchun sizga taklif kerak yoki siz maydonga azo bolishingiz kerak."</string>
<string name="screen_join_room_knock_action">"Qoʻshilish soʻrovini yuborish"</string> <string name="screen_join_room_knock_action">"Qoʻshilish soʻrovini yuborish"</string>

View file

@ -32,4 +32,5 @@
<string name="screen_room_multiple_knock_requests_view_all_button_title">"Προβολή όλων"</string> <string name="screen_room_multiple_knock_requests_view_all_button_title">"Προβολή όλων"</string>
<string name="screen_room_single_knock_request_accept_button_title">"Αποδοχή"</string> <string name="screen_room_single_knock_request_accept_button_title">"Αποδοχή"</string>
<string name="screen_room_single_knock_request_title">"%1$s θέλει να συμμετάσχει σε αυτή την αίθουσα"</string> <string name="screen_room_single_knock_request_title">"%1$s θέλει να συμμετάσχει σε αυτή την αίθουσα"</string>
<string name="screen_room_single_knock_request_view_button_title">"Προβολή"</string>
</resources> </resources>

View file

@ -32,4 +32,5 @@
<string name="screen_room_multiple_knock_requests_view_all_button_title">"Ver todo"</string> <string name="screen_room_multiple_knock_requests_view_all_button_title">"Ver todo"</string>
<string name="screen_room_single_knock_request_accept_button_title">"Aceptar"</string> <string name="screen_room_single_knock_request_accept_button_title">"Aceptar"</string>
<string name="screen_room_single_knock_request_title">"%1$s quiere unirse a esta sala"</string> <string name="screen_room_single_knock_request_title">"%1$s quiere unirse a esta sala"</string>
<string name="screen_room_single_knock_request_view_button_title">"Ver"</string>
</resources> </resources>

View file

@ -3,5 +3,8 @@
<string name="leave_conversation_alert_subtitle">"Είσαι σίγουρος ότι θέλεις να αποχωρήσεις από αυτή τη συζήτηση; Αυτή η συνομιλία δεν είναι δημόσια και δεν θα μπορείς να συμμετάσχεις ξανά χωρίς πρόσκληση."</string> <string name="leave_conversation_alert_subtitle">"Είσαι σίγουρος ότι θέλεις να αποχωρήσεις από αυτή τη συζήτηση; Αυτή η συνομιλία δεν είναι δημόσια και δεν θα μπορείς να συμμετάσχεις ξανά χωρίς πρόσκληση."</string>
<string name="leave_room_alert_empty_subtitle">"Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτή την αίθουσα; Είστε το μόνο άτομο εδώ. Αν αποχωρήσετε, κανείς δεν θα μπορεί να ενταχθεί στο μέλλον, ούτε εσείς."</string> <string name="leave_room_alert_empty_subtitle">"Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτή την αίθουσα; Είστε το μόνο άτομο εδώ. Αν αποχωρήσετε, κανείς δεν θα μπορεί να ενταχθεί στο μέλλον, ούτε εσείς."</string>
<string name="leave_room_alert_private_subtitle">"Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτήν την αίθουσα; Αυτή η αίθουσα δεν είναι δημόσια και δεν θα μπορέσετε να επανενταχτείτε χωρίς πρόσκληση."</string> <string name="leave_room_alert_private_subtitle">"Είστε σίγουροι ότι θέλετε να αποχωρήσετε από αυτήν την αίθουσα; Αυτή η αίθουσα δεν είναι δημόσια και δεν θα μπορέσετε να επανενταχτείτε χωρίς πρόσκληση."</string>
<string name="leave_room_alert_select_new_owner_action">"Επιλέξτε ιδιοκτήτες"</string>
<string name="leave_room_alert_select_new_owner_subtitle">"Είστε ο μόνος ιδιοκτήτης αυτής της αίθουσας. Πρέπει να μεταβιβάσετε την ιδιοκτησία σε κάποιον άλλο πριν φύγετε από την αίθουσα."</string>
<string name="leave_room_alert_select_new_owner_title">"Μεταβίβαση ιδιοκτησίας"</string>
<string name="leave_room_alert_subtitle">"Είστε σίγουροι ότι θέλετε να αποχωρήσετε από την αίθουσα;"</string> <string name="leave_room_alert_subtitle">"Είστε σίγουροι ότι θέλετε να αποχωρήσετε από την αίθουσα;"</string>
</resources> </resources>

View file

@ -3,7 +3,7 @@
<string name="leave_conversation_alert_subtitle">"Êtes-vous sûr de vouloir quitter cette discussion ? Vous ne pourrez pas la rejoindre à nouveau sans y être invité."</string> <string name="leave_conversation_alert_subtitle">"Êtes-vous sûr de vouloir quitter cette discussion ? Vous ne pourrez pas la rejoindre à nouveau sans y être invité."</string>
<string name="leave_room_alert_empty_subtitle">"Êtes-vous sûr de vouloir quitter ce salon ? Vous êtes la seule personne ici. Si vous partez, personne ne pourra rejoindre le salon à lavenir, y compris vous."</string> <string name="leave_room_alert_empty_subtitle">"Êtes-vous sûr de vouloir quitter ce salon ? Vous êtes la seule personne ici. Si vous partez, personne ne pourra rejoindre le salon à lavenir, y compris vous."</string>
<string name="leave_room_alert_private_subtitle">"Êtes-vous sûr de vouloir quitter ce salon ? Ce salon nest pas public et vous ne pourrez pas le rejoindre sans invitation."</string> <string name="leave_room_alert_private_subtitle">"Êtes-vous sûr de vouloir quitter ce salon ? Ce salon nest pas public et vous ne pourrez pas le rejoindre sans invitation."</string>
<string name="leave_room_alert_select_new_owner_action">"Choisissez les propriétaires"</string> <string name="leave_room_alert_select_new_owner_action">"Choisir les propriétaires"</string>
<string name="leave_room_alert_select_new_owner_subtitle">"Vous êtes le seul propriétaire de ce salon. Vous devez en transférer la propriété à quelquun dautre avant de le quitter."</string> <string name="leave_room_alert_select_new_owner_subtitle">"Vous êtes le seul propriétaire de ce salon. Vous devez en transférer la propriété à quelquun dautre avant de le quitter."</string>
<string name="leave_room_alert_select_new_owner_title">"Transférer la propriété"</string> <string name="leave_room_alert_select_new_owner_title">"Transférer la propriété"</string>
<string name="leave_room_alert_subtitle">"Êtes-vous sûr de vouloir quitter le salon ?"</string> <string name="leave_room_alert_subtitle">"Êtes-vous sûr de vouloir quitter le salon ?"</string>

View file

@ -3,5 +3,8 @@
<string name="leave_conversation_alert_subtitle">"Bu sohbetten ayrılmak istediğinizden emin misiniz? Bu sohbet herkese açık değil ve davet olmadan tekrar katılamayacaksınız."</string> <string name="leave_conversation_alert_subtitle">"Bu sohbetten ayrılmak istediğinizden emin misiniz? Bu sohbet herkese açık değil ve davet olmadan tekrar katılamayacaksınız."</string>
<string name="leave_room_alert_empty_subtitle">"Bu odadan ayrılmak istediğinizden emin misiniz? Burada tek kişi sizsiniz. Ayrılırsanız, siz de dahil olmak üzere gelecekte kimse katılamayacak."</string> <string name="leave_room_alert_empty_subtitle">"Bu odadan ayrılmak istediğinizden emin misiniz? Burada tek kişi sizsiniz. Ayrılırsanız, siz de dahil olmak üzere gelecekte kimse katılamayacak."</string>
<string name="leave_room_alert_private_subtitle">"Bu odadan ayrılmak istediğinizden emin misiniz? Bu oda herkese açık değildir ve davet olmadan tekrar katılamazsınız."</string> <string name="leave_room_alert_private_subtitle">"Bu odadan ayrılmak istediğinizden emin misiniz? Bu oda herkese açık değildir ve davet olmadan tekrar katılamazsınız."</string>
<string name="leave_room_alert_select_new_owner_action">"Sahipleri seçin"</string>
<string name="leave_room_alert_select_new_owner_subtitle">"Bu odanın tek sahibisiniz. Odadan çıkmadan önce sahipliği başka birine devretmelisiniz."</string>
<string name="leave_room_alert_select_new_owner_title">"Sahipliği aktar"</string>
<string name="leave_room_alert_subtitle">"Odadan çıkmak istediğinden emin misin?"</string> <string name="leave_room_alert_subtitle">"Odadan çıkmak istediğinden emin misin?"</string>
</resources> </resources>

View file

@ -189,9 +189,13 @@ class LinkNewDeviceFlowNode(
is ErrorType.InvalidCheckCode -> ErrorScreenType.InsecureChannelDetected is ErrorType.InvalidCheckCode -> ErrorScreenType.InsecureChannelDetected
is ErrorType.MissingSecretsBackup -> ErrorScreenType.UnknownError is ErrorType.MissingSecretsBackup -> ErrorScreenType.UnknownError
is ErrorType.NotFound -> ErrorScreenType.Expired is ErrorType.NotFound -> ErrorScreenType.Expired
is ErrorType.UnableToCreateDevice -> ErrorScreenType.UnknownError is ErrorType.DeviceNotFound -> ErrorScreenType.UnknownError
is ErrorType.Unknown -> ErrorScreenType.UnknownError is ErrorType.Unknown -> ErrorScreenType.UnknownError
is ErrorType.UnsupportedProtocol -> ErrorScreenType.UnknownError is ErrorType.UnsupportedProtocol -> ErrorScreenType.UnknownError
is ErrorType.Cancelled -> ErrorScreenType.UnknownError
is ErrorType.ConnectionInsecure -> ErrorScreenType.InsecureChannelDetected
is ErrorType.Expired -> ErrorScreenType.Expired
is ErrorType.OtherDeviceAlreadySignedIn -> ErrorScreenType.UnknownError
} }
// It is OK to push on backstack, since when user leaves the error screen, a new root will be set, // It is OK to push on backstack, since when user leaves the error screen, a new root will be set,
// or the whole flow will be popped. // or the whole flow will be popped.

View file

@ -1,16 +1,33 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"Σάρωση κωδικού QR"</string> <string name="screen_link_new_device_desktop_scanning_title">"Σάρωση κωδικού QR"</string>
<string name="screen_link_new_device_desktop_step1">"Ανοίξτε το %1$s σε φορητό ή επιτραπέζιο υπολογιστή"</string>
<string name="screen_link_new_device_desktop_step3">"Σάρωσε τον κωδικό QR με αυτήν τη συσκευή"</string> <string name="screen_link_new_device_desktop_step3">"Σάρωσε τον κωδικό QR με αυτήν τη συσκευή"</string>
<string name="screen_link_new_device_desktop_submit">"Έτοιμο για σάρωση"</string> <string name="screen_link_new_device_desktop_submit">"Έτοιμο για σάρωση"</string>
<string name="screen_link_new_device_desktop_title">"Ανοίξτε το %1$s σε έναν επιτραπέζιο υπολογιστή για να λάβετε τον κωδικό QR"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"Οι αριθμοί δεν ταιριάζουν"</string>
<string name="screen_link_new_device_enter_number_notice">"Εισαγάγετε έναν 2ψήφιο κωδικό"</string>
<string name="screen_link_new_device_enter_number_subtitle">"Αυτό θα επαληθεύσει ότι η σύνδεση με την άλλη συσκευή σας είναι ασφαλής."</string>
<string name="screen_link_new_device_enter_number_title">"Εισαγάγετε τον αριθμό που εμφανίζεται στην άλλη συσκευή σας"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"Ο πάροχος λογαριασμού σου δεν υποστηρίζει το %1$s."</string> <string name="screen_link_new_device_error_app_not_supported_subtitle">"Ο πάροχος λογαριασμού σου δεν υποστηρίζει το %1$s."</string>
<string name="screen_link_new_device_error_app_not_supported_title">"Το %1$s δεν υποστηρίζεται"</string> <string name="screen_link_new_device_error_app_not_supported_title">"Το %1$s δεν υποστηρίζεται"</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"Ο πάροχος του λογαριασμού σας δεν υποστηρίζει τη σύνδεση σε νέα συσκευή με κωδικό QR."</string>
<string name="screen_link_new_device_error_not_supported_title">"Ο κωδικός QR δεν υποστηρίζεται"</string> <string name="screen_link_new_device_error_not_supported_title">"Ο κωδικός QR δεν υποστηρίζεται"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"Η σύνδεση ακυρώθηκε στην άλλη συσκευή."</string> <string name="screen_link_new_device_error_request_cancelled_subtitle">"Η σύνδεση ακυρώθηκε στην άλλη συσκευή."</string>
<string name="screen_link_new_device_error_request_cancelled_title">"Το αίτημα σύνδεσης ακυρώθηκε"</string> <string name="screen_link_new_device_error_request_cancelled_title">"Το αίτημα σύνδεσης ακυρώθηκε"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"Η είσοδος έληξε. Παρακαλώ προσπάθησε ξανά."</string> <string name="screen_link_new_device_error_request_timeout_subtitle">"Η είσοδος έληξε. Παρακαλώ προσπάθησε ξανά."</string>
<string name="screen_link_new_device_error_request_timeout_title">"Η σύνδεση δεν ολοκληρώθηκε εγκαίρως"</string> <string name="screen_link_new_device_error_request_timeout_title">"Η σύνδεση δεν ολοκληρώθηκε εγκαίρως"</string>
<string name="screen_link_new_device_mobile_step1">"Ανοίξτε το %1$s στην άλλη συσκευή"</string>
<string name="screen_link_new_device_mobile_step2">"Επιλογή %1$s"</string> <string name="screen_link_new_device_mobile_step2">"Επιλογή %1$s"</string>
<string name="screen_link_new_device_mobile_step2_action">"«Συνδεθείτε με κωδικό QR»"</string>
<string name="screen_link_new_device_mobile_step3">"Σαρώστε τον QR κωδικό που εμφανίζεται εδώ με την άλλη συσκευή."</string>
<string name="screen_link_new_device_mobile_title">"Ανοίξτε το %1$s στην άλλη συσκευή"</string>
<string name="screen_link_new_device_root_desktop_computer">"Υπολογιστής"</string>
<string name="screen_link_new_device_root_loading_qr_code">"Φόρτωση QR κωδικού…"</string>
<string name="screen_link_new_device_root_mobile_device">"Κινητή συσκευή"</string>
<string name="screen_link_new_device_root_title">"Τι είδους συσκευή θέλετε να συνδέσετε;"</string>
<string name="screen_link_new_device_wrong_number_subtitle">"Δοκιμάστε ξανά και βεβαιωθείτε ότι έχετε εισαγάγει σωστά τον 2ψήφιο κωδικό. Εάν οι αριθμοί εξακολουθούν να μην ταιριάζουν, επικοινωνήστε με τον πάροχο του λογαριασμού σας."</string>
<string name="screen_link_new_device_wrong_number_title">"Οι αριθμοί δεν ταιριάζουν"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"Δεν ήταν δυνατή η πραγματοποίηση ασφαλούς σύνδεσης στη νέα συσκευή. Οι υπάρχουσες συσκευές σας εξακολουθούν να είναι ασφαλείς και δεν χρειάζεται να ανησυχείς για αυτές."</string> <string name="screen_qr_code_login_connection_note_secure_state_description">"Δεν ήταν δυνατή η πραγματοποίηση ασφαλούς σύνδεσης στη νέα συσκευή. Οι υπάρχουσες συσκευές σας εξακολουθούν να είναι ασφαλείς και δεν χρειάζεται να ανησυχείς για αυτές."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"Τί είναι πάλι;"</string> <string name="screen_qr_code_login_connection_note_secure_state_list_header">"Τί είναι πάλι;"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Δοκίμασε να συνδεθείς ξανά με έναν κωδικό QR σε περίπτωση που ήταν πρόβλημα του δικτύου"</string> <string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Δοκίμασε να συνδεθείς ξανά με έναν κωδικό QR σε περίπτωση που ήταν πρόβλημα του δικτύου"</string>
@ -21,6 +38,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"Το αίτημα σύνδεσης ακυρώθηκε"</string> <string name="screen_qr_code_login_error_cancelled_title">"Το αίτημα σύνδεσης ακυρώθηκε"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Η σύνδεση απορρίφθηκε στην άλλη συσκευή."</string> <string name="screen_qr_code_login_error_declined_subtitle">"Η σύνδεση απορρίφθηκε στην άλλη συσκευή."</string>
<string name="screen_qr_code_login_error_declined_title">"Η σύνδεση απορρίφθηκε"</string> <string name="screen_qr_code_login_error_declined_title">"Η σύνδεση απορρίφθηκε"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"Δεν χρειάζεται να κάνετε τίποτα άλλο."</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"Η άλλη συσκευή σας είναι ήδη συνδεδεμένη"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"Η είσοδος έληξε. Παρακαλώ προσπάθησε ξανά."</string> <string name="screen_qr_code_login_error_expired_subtitle">"Η είσοδος έληξε. Παρακαλώ προσπάθησε ξανά."</string>
<string name="screen_qr_code_login_error_expired_title">"Η σύνδεση δεν ολοκληρώθηκε εγκαίρως"</string> <string name="screen_qr_code_login_error_expired_title">"Η σύνδεση δεν ολοκληρώθηκε εγκαίρως"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Η άλλη σου συσκευή δεν υποστηρίζει σύνδεση στο %s με κωδικό QR. <string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Η άλλη σου συσκευή δεν υποστηρίζει σύνδεση στο %s με κωδικό QR.

View file

@ -1,16 +1,33 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"Skannaa QR-koodi"</string> <string name="screen_link_new_device_desktop_scanning_title">"Skannaa QR-koodi"</string>
<string name="screen_link_new_device_desktop_step1">"Avaa %1$s läppärillä tai pöytätietokoneella"</string>
<string name="screen_link_new_device_desktop_step3">"Skannaa QR-koodi tällä laitteella"</string> <string name="screen_link_new_device_desktop_step3">"Skannaa QR-koodi tällä laitteella"</string>
<string name="screen_link_new_device_desktop_submit">"Valmis skannaamaan"</string> <string name="screen_link_new_device_desktop_submit">"Valmis skannaamaan"</string>
<string name="screen_link_new_device_desktop_title">"Avaa %1$s pöytätietokoneella saadaksesi QR-koodin"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"Numerot eivät täsmää"</string>
<string name="screen_link_new_device_enter_number_notice">"Syötä 2-numeroinen koodi"</string>
<string name="screen_link_new_device_enter_number_subtitle">"Tämä varmistaa, että yhteys toiseen laitteeseesi on turvallinen."</string>
<string name="screen_link_new_device_enter_number_title">"Kirjoita toisessa laitteessa näkyvä numero"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"Palveluntarjoajasi ei tue %1$s -sovellusta"</string> <string name="screen_link_new_device_error_app_not_supported_subtitle">"Palveluntarjoajasi ei tue %1$s -sovellusta"</string>
<string name="screen_link_new_device_error_app_not_supported_title">"%1$s -sovellusta ei tueta"</string> <string name="screen_link_new_device_error_app_not_supported_title">"%1$s -sovellusta ei tueta"</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"Palveluntarjoajasi ei tue kirjautumista uuteen laitteeseen QR-koodilla."</string>
<string name="screen_link_new_device_error_not_supported_title">"QR-koodia ei tueta"</string> <string name="screen_link_new_device_error_not_supported_title">"QR-koodia ei tueta"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"Kirjautuminen peruutettiin toisella laitteella."</string> <string name="screen_link_new_device_error_request_cancelled_subtitle">"Kirjautuminen peruutettiin toisella laitteella."</string>
<string name="screen_link_new_device_error_request_cancelled_title">"Kirjautumispyyntö peruutettu"</string> <string name="screen_link_new_device_error_request_cancelled_title">"Kirjautumispyyntö peruutettu"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"Kirjautuminen vanhentui. Yritä uudelleen."</string> <string name="screen_link_new_device_error_request_timeout_subtitle">"Kirjautuminen vanhentui. Yritä uudelleen."</string>
<string name="screen_link_new_device_error_request_timeout_title">"Kirjautumista ei suoritettu ajoissa"</string> <string name="screen_link_new_device_error_request_timeout_title">"Kirjautumista ei suoritettu ajoissa"</string>
<string name="screen_link_new_device_mobile_step1">"Avaa %1$s toisella laitteella"</string>
<string name="screen_link_new_device_mobile_step2">"Valitse %1$s"</string> <string name="screen_link_new_device_mobile_step2">"Valitse %1$s"</string>
<string name="screen_link_new_device_mobile_step2_action">"\"Kirjaudu sisään QR-koodilla\""</string>
<string name="screen_link_new_device_mobile_step3">"Skannaa tässä näkyvä QR-koodi toisella laitteella"</string>
<string name="screen_link_new_device_mobile_title">"Avaa %1$s toisella laitteella"</string>
<string name="screen_link_new_device_root_desktop_computer">"Pöytätietokone"</string>
<string name="screen_link_new_device_root_loading_qr_code">"Ladataan QR-koodia…"</string>
<string name="screen_link_new_device_root_mobile_device">"Mobiililaite"</string>
<string name="screen_link_new_device_root_title">"Minkä tyyppisen laitteen haluat yhdistää?"</string>
<string name="screen_link_new_device_wrong_number_subtitle">"Yritä uudelleen ja varmista, että olet syöttänyt 2-numeroisen koodin oikein. Jos numerot eivät vieläkään täsmää, ota yhteyttä palveluntarjoajaasi."</string>
<string name="screen_link_new_device_wrong_number_title">"Numerot eivät täsmää"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"Turvallista yhteyttä uuteen laitteeseen ei voitu muodostaa. Olemassa olevat laitteesi ovat edelleen turvassa, eikä sinun tarvitse huolehtia niistä."</string> <string name="screen_qr_code_login_connection_note_secure_state_description">"Turvallista yhteyttä uuteen laitteeseen ei voitu muodostaa. Olemassa olevat laitteesi ovat edelleen turvassa, eikä sinun tarvitse huolehtia niistä."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"Mitä nyt?"</string> <string name="screen_qr_code_login_connection_note_secure_state_list_header">"Mitä nyt?"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Yritä kirjautua sisään uudelleen QR-koodilla, jos kyseessä oli verkko-ongelma"</string> <string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Yritä kirjautua sisään uudelleen QR-koodilla, jos kyseessä oli verkko-ongelma"</string>
@ -21,6 +38,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"Kirjautumispyyntö peruutettu"</string> <string name="screen_qr_code_login_error_cancelled_title">"Kirjautumispyyntö peruutettu"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Kirjautuminen hylättiin toisella laitteella."</string> <string name="screen_qr_code_login_error_declined_subtitle">"Kirjautuminen hylättiin toisella laitteella."</string>
<string name="screen_qr_code_login_error_declined_title">"Kirjautuminen hylätty"</string> <string name="screen_qr_code_login_error_declined_title">"Kirjautuminen hylätty"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"Sinun ei tarvitse tehdä mitään muuta."</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"Toinen laitteesi on jo kirjautunut sisään"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"Kirjautuminen vanhentui. Yritä uudelleen."</string> <string name="screen_qr_code_login_error_expired_subtitle">"Kirjautuminen vanhentui. Yritä uudelleen."</string>
<string name="screen_qr_code_login_error_expired_title">"Kirjautumista ei suoritettu ajoissa"</string> <string name="screen_qr_code_login_error_expired_title">"Kirjautumista ei suoritettu ajoissa"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Toinen laitteesi ei tue kirjautumista %s -sovellukseen QR-koodilla. <string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Toinen laitteesi ei tue kirjautumista %s -sovellukseen QR-koodilla.

View file

@ -1,16 +1,32 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"QR kodunu tara"</string> <string name="screen_link_new_device_desktop_scanning_title">"QR kodunu tara"</string>
<string name="screen_link_new_device_desktop_step1">"%1$s uygulamasını bir dizüstü veya masaüstü bilgisayarda açın"</string>
<string name="screen_link_new_device_desktop_step3">"QR kodunu bu cihazla tarayın"</string> <string name="screen_link_new_device_desktop_step3">"QR kodunu bu cihazla tarayın"</string>
<string name="screen_link_new_device_desktop_submit">"Taramaya hazır"</string> <string name="screen_link_new_device_desktop_submit">"Taramaya hazır"</string>
<string name="screen_link_new_device_desktop_title">"QR kodu almak için %1$s uygulamasını masaüstü bilgisayarda açın%1$s%1$s"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"Sayılar uyuşmuyor"</string>
<string name="screen_link_new_device_enter_number_notice">"2 haneli kodu girin"</string>
<string name="screen_link_new_device_enter_number_subtitle">"Bu işlem, diğer cihazla olan bağlantının güvenli olduğunu doğrular."</string>
<string name="screen_link_new_device_enter_number_title">"Diğer cihazda gösterilen numarayı girin"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"Hesap sağlayıcınız %1$s desteklemiyor."</string> <string name="screen_link_new_device_error_app_not_supported_subtitle">"Hesap sağlayıcınız %1$s desteklemiyor."</string>
<string name="screen_link_new_device_error_app_not_supported_title">"%1$s desteklenmiyor"</string> <string name="screen_link_new_device_error_app_not_supported_title">"%1$s desteklenmiyor"</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"Hesap sağlayıcınız QR kod ile yeni bir cihaza giriş yapılmasını desteklemiyor."</string>
<string name="screen_link_new_device_error_not_supported_title">"QR kodu desteklenmiyor"</string> <string name="screen_link_new_device_error_not_supported_title">"QR kodu desteklenmiyor"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"Oturum açma işlemi diğer cihazda iptal edildi."</string> <string name="screen_link_new_device_error_request_cancelled_subtitle">"Oturum açma işlemi diğer cihazda iptal edildi."</string>
<string name="screen_link_new_device_error_request_cancelled_title">"Oturum açma isteği iptal edildi"</string> <string name="screen_link_new_device_error_request_cancelled_title">"Oturum açma isteği iptal edildi"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"Oturum açma süresi doldu. Lütfen tekrar deneyin."</string> <string name="screen_link_new_device_error_request_timeout_subtitle">"Oturum açma süresi doldu. Lütfen tekrar deneyin."</string>
<string name="screen_link_new_device_error_request_timeout_title">"Oturum açma işlemi zamanında tamamlanmadı"</string> <string name="screen_link_new_device_error_request_timeout_title">"Oturum açma işlemi zamanında tamamlanmadı"</string>
<string name="screen_link_new_device_mobile_step1">"Diğer cihazda %1$s uygulamasınıın"</string>
<string name="screen_link_new_device_mobile_step2">"Seç %1$s"</string> <string name="screen_link_new_device_mobile_step2">"Seç %1$s"</string>
<string name="screen_link_new_device_mobile_step2_action">"QR kod ile giriş yap"</string>
<string name="screen_link_new_device_mobile_step3">"Burada gösterilen QR kodu diğer cihazla tarayın"</string>
<string name="screen_link_new_device_mobile_title">"Diğer cihazda %1$s uygulamasınıın"</string>
<string name="screen_link_new_device_root_desktop_computer">"Masaüstü bilgisayar"</string>
<string name="screen_link_new_device_root_loading_qr_code">"QR kod yükleniyor…"</string>
<string name="screen_link_new_device_root_title">"Hangi tür cihazı bağlamak istiyorsunuz?"</string>
<string name="screen_link_new_device_wrong_number_subtitle">"Lütfen tekrar deneyin ve 2 haneli kodu doğru girdiğinizden emin olun. Numaralar hâlâ eşleşmiyorsa hesap sağlayıcınızla iletişime geçin."</string>
<string name="screen_link_new_device_wrong_number_title">"Sayılar uyuşmuyor"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"Yeni cihaza güvenli bir bağlantı kurulamadı. Mevcut cihazlarınız hala güvende ve onlar için endişelenmenize gerek yok."</string> <string name="screen_qr_code_login_connection_note_secure_state_description">"Yeni cihaza güvenli bir bağlantı kurulamadı. Mevcut cihazlarınız hala güvende ve onlar için endişelenmenize gerek yok."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"Şimdi ne olacak?"</string> <string name="screen_qr_code_login_connection_note_secure_state_list_header">"Şimdi ne olacak?"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Bunun bir ağ sorunu olması ihtimaline karşı bir QR koduyla tekrar oturum açmayı deneyin"</string> <string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Bunun bir ağ sorunu olması ihtimaline karşı bir QR koduyla tekrar oturum açmayı deneyin"</string>

View file

@ -1,16 +1,32 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"QR kodni skanerlash"</string> <string name="screen_link_new_device_desktop_scanning_title">"QR kodni skanerlash"</string>
<string name="screen_link_new_device_desktop_step1">"%1$s ilovasini noutbuk yoki desktopda ochish"</string>
<string name="screen_link_new_device_desktop_step3">"Bu qurilma bilan QR kodni skanerlang"</string> <string name="screen_link_new_device_desktop_step3">"Bu qurilma bilan QR kodni skanerlang"</string>
<string name="screen_link_new_device_desktop_submit">"Skanerlashga tayyor"</string> <string name="screen_link_new_device_desktop_submit">"Skanerlashga tayyor"</string>
<string name="screen_link_new_device_desktop_title">"QR kodni olish uchun desktop kompyuterda %1$s ilovasini oching"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"Raqamlar mos kelmaydi"</string>
<string name="screen_link_new_device_enter_number_notice">"2 xonali kodni kiriting"</string>
<string name="screen_link_new_device_enter_number_subtitle">"Bu boshqa qurilmangizga ulanish xavfsiz ekanligini tasdiqlaydi."</string>
<string name="screen_link_new_device_enter_number_title">"Boshqa qurilmangizda korsatilgan raqamni kiriting"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"Hisob provayderingiz %1$s bilan ishlamaydi."</string> <string name="screen_link_new_device_error_app_not_supported_subtitle">"Hisob provayderingiz %1$s bilan ishlamaydi."</string>
<string name="screen_link_new_device_error_app_not_supported_title">"%1$s qoʻllab-quvvatlanmaydi"</string> <string name="screen_link_new_device_error_app_not_supported_title">"%1$s qoʻllab-quvvatlanmaydi"</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"Hisob provayderingiz QR kodi bilan yangi qurilmaga kirishni qollab-quvvatlamaydi."</string>
<string name="screen_link_new_device_error_not_supported_title">"QR kod qoʻllab-quvvatlanmaydi"</string> <string name="screen_link_new_device_error_not_supported_title">"QR kod qoʻllab-quvvatlanmaydi"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"Boshqa qurilmadan hisobga kirish bekor qilindi."</string> <string name="screen_link_new_device_error_request_cancelled_subtitle">"Boshqa qurilmadan hisobga kirish bekor qilindi."</string>
<string name="screen_link_new_device_error_request_cancelled_title">"Tizimga kirish soʻrovi bekor qilindi"</string> <string name="screen_link_new_device_error_request_cancelled_title">"Tizimga kirish soʻrovi bekor qilindi"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"Kirish muddati tugagan. Iltimos, qayta urinib koʻring."</string> <string name="screen_link_new_device_error_request_timeout_subtitle">"Kirish muddati tugagan. Iltimos, qayta urinib koʻring."</string>
<string name="screen_link_new_device_error_request_timeout_title">"Kirish oʻz vaqtida tugallanmagan"</string> <string name="screen_link_new_device_error_request_timeout_title">"Kirish oʻz vaqtida tugallanmagan"</string>
<string name="screen_link_new_device_mobile_step1">"Boshqa qurilmada %1$s ni ochish"</string>
<string name="screen_link_new_device_mobile_step2">"%1$sʼni tanlang"</string> <string name="screen_link_new_device_mobile_step2">"%1$sʼni tanlang"</string>
<string name="screen_link_new_device_mobile_step2_action">"\"QR kod bilan kirish\""</string>
<string name="screen_link_new_device_mobile_step3">"Bu yerda korsatilgan QR kodni boshqa qurilma bilan skanerlang"</string>
<string name="screen_link_new_device_mobile_title">"Boshqa qurilmada %1$s ni ochish"</string>
<string name="screen_link_new_device_root_desktop_computer">"Ish stoli kompyuter"</string>
<string name="screen_link_new_device_root_loading_qr_code">"QR kod yuklanmoqda…"</string>
<string name="screen_link_new_device_root_mobile_device">"Mobil qurilma"</string>
<string name="screen_link_new_device_root_title">"Qaysi turdagi qurilmani boglashni xohlaysiz?"</string>
<string name="screen_link_new_device_wrong_number_title">"Raqamlar mos kelmaydi"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"Yangi qurilmaga xavfsiz ulanish amalga oshirilmadi. Mavjud qurilmalaringiz hali ham xavfsiz va ular haqida qaygʻurishingiz shart emas."</string> <string name="screen_qr_code_login_connection_note_secure_state_description">"Yangi qurilmaga xavfsiz ulanish amalga oshirilmadi. Mavjud qurilmalaringiz hali ham xavfsiz va ular haqida qaygʻurishingiz shart emas."</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"Endi nima?"</string> <string name="screen_qr_code_login_connection_note_secure_state_list_header">"Endi nima?"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Agar bu tarmoq muammosi boʻlsa, QR kod bilan qayta kiring"</string> <string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"Agar bu tarmoq muammosi boʻlsa, QR kod bilan qayta kiring"</string>

View file

@ -1,16 +1,33 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_link_new_device_desktop_scanning_title">"扫描二维码"</string> <string name="screen_link_new_device_desktop_scanning_title">"扫描二维码"</string>
<string name="screen_link_new_device_desktop_step1">"在笔记本电脑或台式机上打开%1$s "</string>
<string name="screen_link_new_device_desktop_step3">"使用此设备扫描二维码"</string> <string name="screen_link_new_device_desktop_step3">"使用此设备扫描二维码"</string>
<string name="screen_link_new_device_desktop_submit">"准备进行扫描"</string> <string name="screen_link_new_device_desktop_submit">"准备进行扫描"</string>
<string name="screen_link_new_device_desktop_title">"在电脑上打开%1$s 获取二维码"</string>
<string name="screen_link_new_device_enter_number_error_numbers_do_not_match">"数字不匹配"</string>
<string name="screen_link_new_device_enter_number_notice">"输入两位数的验证码"</string>
<string name="screen_link_new_device_enter_number_subtitle">"这将验证您与其他设备的连接是否安全。"</string>
<string name="screen_link_new_device_enter_number_title">"请输入另一台设备上显示的数字"</string>
<string name="screen_link_new_device_error_app_not_supported_subtitle">"账户提供方不支持 %1$s."</string> <string name="screen_link_new_device_error_app_not_supported_subtitle">"账户提供方不支持 %1$s."</string>
<string name="screen_link_new_device_error_app_not_supported_title">"不支持 %1$s."</string> <string name="screen_link_new_device_error_app_not_supported_title">"不支持 %1$s."</string>
<string name="screen_link_new_device_error_not_supported_subtitle">"您的账户提供商不支持使用二维码登录新设备。"</string>
<string name="screen_link_new_device_error_not_supported_title">"不支持二维码"</string> <string name="screen_link_new_device_error_not_supported_title">"不支持二维码"</string>
<string name="screen_link_new_device_error_request_cancelled_subtitle">"登录被另一台设备取消"</string> <string name="screen_link_new_device_error_request_cancelled_subtitle">"登录被另一台设备取消"</string>
<string name="screen_link_new_device_error_request_cancelled_title">"登录请求已取消"</string> <string name="screen_link_new_device_error_request_cancelled_title">"登录请求已取消"</string>
<string name="screen_link_new_device_error_request_timeout_subtitle">"登录已过期. 请重试."</string> <string name="screen_link_new_device_error_request_timeout_subtitle">"登录已过期. 请重试."</string>
<string name="screen_link_new_device_error_request_timeout_title">"登录未及时完成"</string> <string name="screen_link_new_device_error_request_timeout_title">"登录未及时完成"</string>
<string name="screen_link_new_device_mobile_step1">"在另一台设备上打开 %1$s"</string>
<string name="screen_link_new_device_mobile_step2">"选择 %1$s"</string> <string name="screen_link_new_device_mobile_step2">"选择 %1$s"</string>
<string name="screen_link_new_device_mobile_step2_action">"“使用二维码登录”"</string>
<string name="screen_link_new_device_mobile_step3">"请用另一台设备扫描此处显示的二维码"</string>
<string name="screen_link_new_device_mobile_title">"在另一台设备上打开 %1$s"</string>
<string name="screen_link_new_device_root_desktop_computer">"台式计算机"</string>
<string name="screen_link_new_device_root_loading_qr_code">"正在加载 QR 码…"</string>
<string name="screen_link_new_device_root_mobile_device">"移动设备"</string>
<string name="screen_link_new_device_root_title">"您想连接哪种类型的设备?"</string>
<string name="screen_link_new_device_wrong_number_subtitle">"请重试,并确保您已正确输入两位验证码。如果验证码仍然不匹配,请联系您的账户提供商。"</string>
<string name="screen_link_new_device_wrong_number_title">"数字不匹配"</string>
<string name="screen_qr_code_login_connection_note_secure_state_description">"无法与新设备建立安全连接。您现有的设备仍然安全,无需担心。"</string> <string name="screen_qr_code_login_connection_note_secure_state_description">"无法与新设备建立安全连接。您现有的设备仍然安全,无需担心。"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_header">"现在怎么办?"</string> <string name="screen_qr_code_login_connection_note_secure_state_list_header">"现在怎么办?"</string>
<string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"如果这是网络问题,请尝试使用二维码再次登录"</string> <string name="screen_qr_code_login_connection_note_secure_state_list_item_1">"如果这是网络问题,请尝试使用二维码再次登录"</string>
@ -21,6 +38,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"登录请求已取消"</string> <string name="screen_qr_code_login_error_cancelled_title">"登录请求已取消"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"其它设备未接受请求"</string> <string name="screen_qr_code_login_error_declined_subtitle">"其它设备未接受请求"</string>
<string name="screen_qr_code_login_error_declined_title">"登录被拒绝"</string> <string name="screen_qr_code_login_error_declined_title">"登录被拒绝"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"您无需额外操作。"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"您已在另一台设备登录。"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"登录已过期. 请重试."</string> <string name="screen_qr_code_login_error_expired_subtitle">"登录已过期. 请重试."</string>
<string name="screen_qr_code_login_error_expired_title">"登录未及时完成"</string> <string name="screen_qr_code_login_error_expired_title">"登录未及时完成"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"另一个设备不支持使用二维码登录 %s. <string name="screen_qr_code_login_error_linking_not_suported_subtitle">"另一个设备不支持使用二维码登录 %s.

View file

@ -15,9 +15,9 @@
<string name="screen_app_lock_setup_biometric_unlock_subtitle">"%1$s kullanarak oturum açarken kendinize zaman kazandırın"</string> <string name="screen_app_lock_setup_biometric_unlock_subtitle">"%1$s kullanarak oturum açarken kendinize zaman kazandırın"</string>
<string name="screen_app_lock_setup_choose_pin">"PIN Seç"</string> <string name="screen_app_lock_setup_choose_pin">"PIN Seç"</string>
<string name="screen_app_lock_setup_confirm_pin">"PIN\'i onayla"</string> <string name="screen_app_lock_setup_confirm_pin">"PIN\'i onayla"</string>
<string name="screen_app_lock_setup_pin_context">"Sohbetlerinize ekstra güvenlik eklemek için %1$s kilitleyin. <string name="screen_app_lock_setup_pin_context">"Sohbetlerinizi daha güvenli hale getirmek için %1$s uygulamasına bir kilit ekleyin.
Hatırlanabilir bir şey seçin. Bu PIN\'i unutursanız, uygulamadan çıkış yaparsınız."</string> Uygulamayı her açtığınızda bu PINi girmeniz gerekecek. Bu PINi unutursanız, uygulamadan çıkış yapmanız gerekir."</string>
<string name="screen_app_lock_setup_pin_forbidden_dialog_content">"Güvenlik nedeniyle bunu PIN kodunuz olarak seçemezsiniz"</string> <string name="screen_app_lock_setup_pin_forbidden_dialog_content">"Güvenlik nedeniyle bunu PIN kodunuz olarak seçemezsiniz"</string>
<string name="screen_app_lock_setup_pin_forbidden_dialog_title">"Farklı bir PIN seçin"</string> <string name="screen_app_lock_setup_pin_forbidden_dialog_title">"Farklı bir PIN seçin"</string>
<string name="screen_app_lock_setup_pin_mismatch_dialog_content">"Lütfen aynı PIN\'i iki kez girin"</string> <string name="screen_app_lock_setup_pin_mismatch_dialog_content">"Lütfen aynı PIN\'i iki kez girin"</string>

View file

@ -13,6 +13,9 @@
<string name="screen_change_account_provider_other">"Άλλο"</string> <string name="screen_change_account_provider_other">"Άλλο"</string>
<string name="screen_change_account_provider_subtitle">"Χρησιμοποίησε διαφορετικό πάροχο λογαριασμού, όπως τον δικό σου ιδιωτικό διακομιστή ή έναν εργασιακό λογαριασμό."</string> <string name="screen_change_account_provider_subtitle">"Χρησιμοποίησε διαφορετικό πάροχο λογαριασμού, όπως τον δικό σου ιδιωτικό διακομιστή ή έναν εργασιακό λογαριασμό."</string>
<string name="screen_change_account_provider_title">"Αλλαγή παρόχου λογαριασμού"</string> <string name="screen_change_account_provider_title">"Αλλαγή παρόχου λογαριασμού"</string>
<string name="screen_change_server_error_element_pro_required_action_android">"Google Play"</string>
<string name="screen_change_server_error_element_pro_required_message">"Η εφαρμογή Element Pro απαιτείται στο %1$s. Παρακαλώ κατεβάστε την από το κατάστημα."</string>
<string name="screen_change_server_error_element_pro_required_title">"Απαιτείται το Element Pro"</string>
<string name="screen_change_server_error_invalid_homeserver">"Δεν μπορούσαμε να επικοινωνήσουμε με αυτόν τον οικιακό διακομιστή. Βεβαιώσου ότι έχεις εισαγάγει σωστά τη διεύθυνση URL του αρχικού διακομιστή. Εάν η διεύθυνση URL είναι σωστή, επικοινώνησε με τον διαχειριστή του κεντρικού διακομιστή για περαιτέρω βοήθεια."</string> <string name="screen_change_server_error_invalid_homeserver">"Δεν μπορούσαμε να επικοινωνήσουμε με αυτόν τον οικιακό διακομιστή. Βεβαιώσου ότι έχεις εισαγάγει σωστά τη διεύθυνση URL του αρχικού διακομιστή. Εάν η διεύθυνση URL είναι σωστή, επικοινώνησε με τον διαχειριστή του κεντρικού διακομιστή για περαιτέρω βοήθεια."</string>
<string name="screen_change_server_error_invalid_well_known">"Ο διακομιστής δεν είναι διαθέσιμος λόγω προβλήματος στο αρχείο .well-known: <string name="screen_change_server_error_invalid_well_known">"Ο διακομιστής δεν είναι διαθέσιμος λόγω προβλήματος στο αρχείο .well-known:
%1$s"</string> %1$s"</string>
@ -34,6 +37,7 @@
<string name="screen_login_subtitle">"Το Matrix είναι ένα ανοιχτό δίκτυο για ασφαλή, αποκεντρωμένη επικοινωνία."</string> <string name="screen_login_subtitle">"Το Matrix είναι ένα ανοιχτό δίκτυο για ασφαλή, αποκεντρωμένη επικοινωνία."</string>
<string name="screen_login_title">"Καλωσόρισες ξανά!"</string> <string name="screen_login_title">"Καλωσόρισες ξανά!"</string>
<string name="screen_login_title_with_homeserver">"Συνδέσου στο %1$s"</string> <string name="screen_login_title_with_homeserver">"Συνδέσου στο %1$s"</string>
<string name="screen_onboarding_app_version">"Έκδοση %1$s"</string>
<string name="screen_onboarding_sign_in_manually">"Σύνδεση χειροκίνητα"</string> <string name="screen_onboarding_sign_in_manually">"Σύνδεση χειροκίνητα"</string>
<string name="screen_onboarding_sign_in_to">"Συνδέσου στο %1$s"</string> <string name="screen_onboarding_sign_in_to">"Συνδέσου στο %1$s"</string>
<string name="screen_onboarding_sign_in_with_qr_code">"Συνδέσου με κωδικό QR"</string> <string name="screen_onboarding_sign_in_with_qr_code">"Συνδέσου με κωδικό QR"</string>
@ -56,6 +60,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"Το αίτημα σύνδεσης ακυρώθηκε"</string> <string name="screen_qr_code_login_error_cancelled_title">"Το αίτημα σύνδεσης ακυρώθηκε"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Η σύνδεση απορρίφθηκε στην άλλη συσκευή."</string> <string name="screen_qr_code_login_error_declined_subtitle">"Η σύνδεση απορρίφθηκε στην άλλη συσκευή."</string>
<string name="screen_qr_code_login_error_declined_title">"Η σύνδεση απορρίφθηκε"</string> <string name="screen_qr_code_login_error_declined_title">"Η σύνδεση απορρίφθηκε"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"Δεν χρειάζεται να κάνετε τίποτα άλλο."</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"Η άλλη συσκευή σας είναι ήδη συνδεδεμένη"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"Η είσοδος έληξε. Παρακαλώ προσπάθησε ξανά."</string> <string name="screen_qr_code_login_error_expired_subtitle">"Η είσοδος έληξε. Παρακαλώ προσπάθησε ξανά."</string>
<string name="screen_qr_code_login_error_expired_title">"Η σύνδεση δεν ολοκληρώθηκε εγκαίρως"</string> <string name="screen_qr_code_login_error_expired_title">"Η σύνδεση δεν ολοκληρώθηκε εγκαίρως"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Η άλλη σου συσκευή δεν υποστηρίζει σύνδεση στο %s με κωδικό QR. <string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Η άλλη σου συσκευή δεν υποστηρίζει σύνδεση στο %s με κωδικό QR.

View file

@ -34,6 +34,7 @@
<string name="screen_login_subtitle">"Matrix es una red abierta para una comunicación segura y descentralizada."</string> <string name="screen_login_subtitle">"Matrix es una red abierta para una comunicación segura y descentralizada."</string>
<string name="screen_login_title">"¡Hola de nuevo!"</string> <string name="screen_login_title">"¡Hola de nuevo!"</string>
<string name="screen_login_title_with_homeserver">"Iniciar sesión en %1$s"</string> <string name="screen_login_title_with_homeserver">"Iniciar sesión en %1$s"</string>
<string name="screen_onboarding_app_version">"Versión %1$s"</string>
<string name="screen_onboarding_sign_in_manually">"Iniciar sesión manualmente"</string> <string name="screen_onboarding_sign_in_manually">"Iniciar sesión manualmente"</string>
<string name="screen_onboarding_sign_in_to">"Iniciar sesión en %1$s"</string> <string name="screen_onboarding_sign_in_to">"Iniciar sesión en %1$s"</string>
<string name="screen_onboarding_sign_in_with_qr_code">"Iniciar sesión con un código QR"</string> <string name="screen_onboarding_sign_in_with_qr_code">"Iniciar sesión con un código QR"</string>

View file

@ -60,6 +60,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"Kirjautumispyyntö peruutettu"</string> <string name="screen_qr_code_login_error_cancelled_title">"Kirjautumispyyntö peruutettu"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"Kirjautuminen hylättiin toisella laitteella."</string> <string name="screen_qr_code_login_error_declined_subtitle">"Kirjautuminen hylättiin toisella laitteella."</string>
<string name="screen_qr_code_login_error_declined_title">"Kirjautuminen hylätty"</string> <string name="screen_qr_code_login_error_declined_title">"Kirjautuminen hylätty"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"Sinun ei tarvitse tehdä mitään muuta."</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"Toinen laitteesi on jo kirjautunut sisään"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"Kirjautuminen vanhentui. Yritä uudelleen."</string> <string name="screen_qr_code_login_error_expired_subtitle">"Kirjautuminen vanhentui. Yritä uudelleen."</string>
<string name="screen_qr_code_login_error_expired_title">"Kirjautumista ei suoritettu ajoissa"</string> <string name="screen_qr_code_login_error_expired_title">"Kirjautumista ei suoritettu ajoissa"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Toinen laitteesi ei tue kirjautumista %s -sovellukseen QR-koodilla. <string name="screen_qr_code_login_error_linking_not_suported_subtitle">"Toinen laitteesi ei tue kirjautumista %s -sovellukseen QR-koodilla.

View file

@ -16,6 +16,10 @@
<string name="screen_change_server_error_invalid_homeserver">"Bu ana sunucuya ulaşamadık. Lütfen ana sunucu URL\'sini doğru girip girmediğinizi kontrol edin. URL doğruysa, daha fazla yardım için ana sunucu yöneticinize başvurun."</string> <string name="screen_change_server_error_invalid_homeserver">"Bu ana sunucuya ulaşamadık. Lütfen ana sunucu URL\'sini doğru girip girmediğinizi kontrol edin. URL doğruysa, daha fazla yardım için ana sunucu yöneticinize başvurun."</string>
<string name="screen_change_server_error_invalid_well_known">"Well-known dosyasında bir sorun nedeniyle sunucu kullanılamıyor: <string name="screen_change_server_error_invalid_well_known">"Well-known dosyasında bir sorun nedeniyle sunucu kullanılamıyor:
%1$s"</string> %1$s"</string>
<string name="screen_change_server_error_no_sliding_sync_message">"Seçilen hesap sağlayıcısı sliding sync özelliğini desteklemiyor. %1$s kullanmak için sunucunun yükseltilmesi gerekiyor."</string>
<string name="screen_change_server_error_unauthorized_homeserver">"%1$s, %2$s ile bağlantı kurma yetkisine sahip değil."</string>
<string name="screen_change_server_error_unauthorized_homeserver_content">"Bu uygulama şu sağlayıcılara izin verecek şekilde yapılandırıldı: %1$s."</string>
<string name="screen_change_server_error_unauthorized_homeserver_title">"Hesap sağlayıcısı %1$s İzin verilmiyor."</string>
<string name="screen_change_server_form_header">"Ana sunucu URL\'si"</string> <string name="screen_change_server_form_header">"Ana sunucu URL\'si"</string>
<string name="screen_change_server_subtitle">"Sunucunuzun adresi nedir?"</string> <string name="screen_change_server_subtitle">"Sunucunuzun adresi nedir?"</string>
<string name="screen_change_server_title">"Sunucunuzu seçin"</string> <string name="screen_change_server_title">"Sunucunuzu seçin"</string>

View file

@ -60,6 +60,8 @@
<string name="screen_qr_code_login_error_cancelled_title">"登录请求已取消"</string> <string name="screen_qr_code_login_error_cancelled_title">"登录请求已取消"</string>
<string name="screen_qr_code_login_error_declined_subtitle">"其它设备未接受请求"</string> <string name="screen_qr_code_login_error_declined_subtitle">"其它设备未接受请求"</string>
<string name="screen_qr_code_login_error_declined_title">"登录被拒绝"</string> <string name="screen_qr_code_login_error_declined_title">"登录被拒绝"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_subtitle">"您无需额外操作。"</string>
<string name="screen_qr_code_login_error_device_already_signed_in_title">"您已在另一台设备登录。"</string>
<string name="screen_qr_code_login_error_expired_subtitle">"登录已过期. 请重试."</string> <string name="screen_qr_code_login_error_expired_subtitle">"登录已过期. 请重试."</string>
<string name="screen_qr_code_login_error_expired_title">"登录未及时完成"</string> <string name="screen_qr_code_login_error_expired_title">"登录未及时完成"</string>
<string name="screen_qr_code_login_error_linking_not_suported_subtitle">"另一个设备不支持使用二维码登录 %s. <string name="screen_qr_code_login_error_linking_not_suported_subtitle">"另一个设备不支持使用二维码登录 %s.

View file

@ -23,6 +23,7 @@ import io.element.android.libraries.matrix.api.encryption.RecoveryState
import io.element.android.libraries.matrix.test.AN_EXCEPTION import io.element.android.libraries.matrix.test.AN_EXCEPTION
import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService
import io.element.android.libraries.workmanager.api.WorkManagerRequestType
import io.element.android.libraries.workmanager.test.FakeWorkManagerScheduler import io.element.android.libraries.workmanager.test.FakeWorkManagerScheduler
import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.WarmUpRule
import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.lambdaRecorder
@ -149,7 +150,7 @@ class LogoutPresenterTest {
@Test @Test
fun `present - logout then confirm`() = runTest { fun `present - logout then confirm`() = runTest {
val cancelWorkManagerJobsLambda = lambdaRecorder<SessionId, Unit> {} val cancelWorkManagerJobsLambda = lambdaRecorder<SessionId, WorkManagerRequestType?, Unit> { _, _ -> }
val workManagerScheduler = FakeWorkManagerScheduler(cancelLambda = cancelWorkManagerJobsLambda) val workManagerScheduler = FakeWorkManagerScheduler(cancelLambda = cancelWorkManagerJobsLambda)
val presenter = createLogoutPresenter(workManagerScheduler = workManagerScheduler) val presenter = createLogoutPresenter(workManagerScheduler = workManagerScheduler)
moleculeFlow(RecompositionMode.Immediate) { moleculeFlow(RecompositionMode.Immediate) {
@ -238,7 +239,7 @@ class LogoutPresenterTest {
internal fun createLogoutPresenter( internal fun createLogoutPresenter(
matrixClient: MatrixClient = FakeMatrixClient(), matrixClient: MatrixClient = FakeMatrixClient(),
encryptionService: EncryptionService = FakeEncryptionService(), encryptionService: EncryptionService = FakeEncryptionService(),
workManagerScheduler: FakeWorkManagerScheduler = FakeWorkManagerScheduler(cancelLambda = {}), workManagerScheduler: FakeWorkManagerScheduler = FakeWorkManagerScheduler(cancelLambda = { _, _ -> }),
): LogoutPresenter = LogoutPresenter( ): LogoutPresenter = LogoutPresenter(
matrixClient = matrixClient, matrixClient = matrixClient,
encryptionService = encryptionService, encryptionService = encryptionService,

View file

@ -115,7 +115,7 @@ private fun ViolationAlert(
}, },
submitText = stringResource(submitTextId), submitText = stringResource(submitTextId),
onSubmitClick = onSubmitClick, onSubmitClick = onSubmitClick,
level = if (isCritical) ComposerAlertLevel.Critical else ComposerAlertLevel.Default, level = if (isCritical) ComposerAlertLevel.Critical else ComposerAlertLevel.Info,
) )
} }

View file

@ -30,5 +30,5 @@ data class TimelineItemStickerContent(
/* Stickers are supposed to be small images so /* Stickers are supposed to be small images so
we allow using the mediaSource (unless the url is empty) */ we allow using the mediaSource (unless the url is empty) */
val preferredMediaSource = if (mediaSource.url.isEmpty()) thumbnailSource else mediaSource val preferredMediaSource = if (mediaSource.safeUrl.isEmpty()) thumbnailSource else mediaSource
} }

View file

@ -14,10 +14,18 @@
<string name="emoji_picker_category_objects">"Αντικείμενα"</string> <string name="emoji_picker_category_objects">"Αντικείμενα"</string>
<string name="emoji_picker_category_people">"Φατσούλες &amp; Άνθρωποι"</string> <string name="emoji_picker_category_people">"Φατσούλες &amp; Άνθρωποι"</string>
<string name="emoji_picker_category_places">"Ταξίδια &amp; Μέρη"</string> <string name="emoji_picker_category_places">"Ταξίδια &amp; Μέρη"</string>
<string name="emoji_picker_category_recent">"Πρόσφατα emoji"</string>
<string name="emoji_picker_category_symbols">"Σύμβολα"</string> <string name="emoji_picker_category_symbols">"Σύμβολα"</string>
<string name="screen_media_upload_preview_caption_warning">"Οι λεζάντες ενδέχεται να μην είναι ορατές σε άτομα που χρησιμοποιούν παλαιότερες εφαρμογές."</string> <string name="screen_media_upload_preview_caption_warning">"Οι λεζάντες ενδέχεται να μην είναι ορατές σε άτομα που χρησιμοποιούν παλαιότερες εφαρμογές."</string>
<string name="screen_media_upload_preview_change_video_quality_prompt">"Πατήστε για να αλλάξετε την ποιότητα μεταφόρτωσης βίντεο"</string>
<string name="screen_media_upload_preview_error_could_not_be_uploaded">"Δεν ήταν δυνατή η μεταφόρτωση του αρχείου."</string>
<string name="screen_media_upload_preview_error_failed_processing">"Αποτυχία μεταφόρτωσης μέσου, δοκίμασε ξανά."</string> <string name="screen_media_upload_preview_error_failed_processing">"Αποτυχία μεταφόρτωσης μέσου, δοκίμασε ξανά."</string>
<string name="screen_media_upload_preview_error_failed_sending">"Αποτυχία μεταφόρτωσης πολυμέσων, δοκίμασε ξανά."</string> <string name="screen_media_upload_preview_error_failed_sending">"Αποτυχία μεταφόρτωσης πολυμέσων, δοκίμασε ξανά."</string>
<string name="screen_media_upload_preview_error_too_large_message">"Το μέγιστο επιτρεπόμενο μέγεθος αρχείου είναι %1$s."</string>
<string name="screen_media_upload_preview_error_too_large_title">"Το αρχείο είναι πολύ μεγάλο για μεταφόρτωση"</string>
<string name="screen_media_upload_preview_item_count">"Στοιχείο %1$d από %2$d"</string>
<string name="screen_media_upload_preview_optimize_image_quality_title">"Βελτιστοποίηση ποιότητας εικόνας"</string>
<string name="screen_media_upload_preview_processing">"Επεξεργασία…"</string>
<string name="screen_report_content_block_user">"Αποκλεισμός χρήστη"</string> <string name="screen_report_content_block_user">"Αποκλεισμός χρήστη"</string>
<string name="screen_report_content_block_user_hint">"Επέλεξε εάν θες να αποκρύψεις όλα τα τρέχοντα και μελλοντικά μηνύματα από αυτόν τον χρήστη"</string> <string name="screen_report_content_block_user_hint">"Επέλεξε εάν θες να αποκρύψεις όλα τα τρέχοντα και μελλοντικά μηνύματα από αυτόν τον χρήστη"</string>
<string name="screen_report_content_explanation">"Αυτό το μήνυμα θα αναφερθεί στον διαχειριστή του οικιακού διακομιστή σας. Δεν θα μπορεί να διαβάσει κρυπτογραφημένα μηνύματα."</string> <string name="screen_report_content_explanation">"Αυτό το μήνυμα θα αναφερθεί στον διαχειριστή του οικιακού διακομιστή σας. Δεν θα μπορεί να διαβάσει κρυπτογραφημένα μηνύματα."</string>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="crypto_event_authenticity_mismatched_sender">"El remitente del evento no coincide con el propietario del dispositivo que lo envió."</string>
<string name="crypto_event_authenticity_not_guaranteed">"La autenticidad de este mensaje cifrado no puede ser garantizada en este dispositivo."</string> <string name="crypto_event_authenticity_not_guaranteed">"La autenticidad de este mensaje cifrado no puede ser garantizada en este dispositivo."</string>
<string name="crypto_event_authenticity_previously_verified">"Cifrado por un usuario verificado anteriormente."</string> <string name="crypto_event_authenticity_previously_verified">"Cifrado por un usuario verificado anteriormente."</string>
<string name="crypto_event_authenticity_sent_in_clear">"No cifrado."</string> <string name="crypto_event_authenticity_sent_in_clear">"No cifrado."</string>
@ -46,11 +47,16 @@
<string name="screen_room_timeline_no_permission_to_post">"No tienes permiso para publicar en esta sala"</string> <string name="screen_room_timeline_no_permission_to_post">"No tienes permiso para publicar en esta sala"</string>
<string name="screen_room_timeline_reactions_show_less">"Mostrar menos"</string> <string name="screen_room_timeline_reactions_show_less">"Mostrar menos"</string>
<string name="screen_room_timeline_reactions_show_more">"Mostrar más"</string> <string name="screen_room_timeline_reactions_show_more">"Mostrar más"</string>
<string name="screen_room_timeline_reactions_show_reactions_summary">"Mostrar todas las reacciones"</string>
<string name="screen_room_timeline_read_marker_title">"Nuevos"</string> <string name="screen_room_timeline_read_marker_title">"Nuevos"</string>
<plurals name="screen_room_timeline_state_changes"> <plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d cambio en la sala"</item> <item quantity="one">"%1$d cambio en la sala"</item>
<item quantity="other">"%1$d cambios en la sala"</item> <item quantity="other">"%1$d cambios en la sala"</item>
</plurals> </plurals>
<string name="screen_room_timeline_tombstoned_room_action">"Ir a la nueva sala"</string>
<string name="screen_room_timeline_tombstoned_room_message">"Esta sala ha sido reemplazada y ya no está activa."</string>
<string name="screen_room_timeline_upgraded_room_action">"Ver mensajes antiguos"</string>
<string name="screen_room_timeline_upgraded_room_message">"Esta sala es la sucesora de otra sala."</string>
<plurals name="screen_room_typing_many_members"> <plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s y %3$d otro"</item> <item quantity="one">"%1$s, %2$s y %3$d otro"</item>
<item quantity="other">"%1$s, %2$s y %3$d otros"</item> <item quantity="other">"%1$s, %2$s y %3$d otros"</item>

View file

@ -35,7 +35,7 @@
<string name="screen_room_attachment_source_camera_video">"Ta opp video"</string> <string name="screen_room_attachment_source_camera_video">"Ta opp video"</string>
<string name="screen_room_attachment_source_files">"Vedlegg"</string> <string name="screen_room_attachment_source_files">"Vedlegg"</string>
<string name="screen_room_attachment_source_gallery">"Foto- og videobibliotek"</string> <string name="screen_room_attachment_source_gallery">"Foto- og videobibliotek"</string>
<string name="screen_room_attachment_source_location">"Lokasjon"</string> <string name="screen_room_attachment_source_location">"Posisjon"</string>
<string name="screen_room_attachment_source_poll">"Avstemning"</string> <string name="screen_room_attachment_source_poll">"Avstemning"</string>
<string name="screen_room_attachment_text_formatting">"Tekstformatering"</string> <string name="screen_room_attachment_text_formatting">"Tekstformatering"</string>
<string name="screen_room_encrypted_history_banner">"Meldingshistorikken er for øyeblikket ikke tilgjengelig."</string> <string name="screen_room_encrypted_history_banner">"Meldingshistorikken er for øyeblikket ikke tilgjengelig."</string>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="crypto_event_authenticity_mismatched_sender">"Etkinliği gönderen kişi, onu gönderen cihazın sahibiyle eşleşmiyor."</string>
<string name="crypto_event_authenticity_not_guaranteed">"Bu şifrelenmiş mesajın doğruluğu bu cihazda garanti edilemez."</string> <string name="crypto_event_authenticity_not_guaranteed">"Bu şifrelenmiş mesajın doğruluğu bu cihazda garanti edilemez."</string>
<string name="crypto_event_authenticity_previously_verified">"Daha önce doğrulanmış bir kullanıcı tarafından şifrelenmiştir."</string> <string name="crypto_event_authenticity_previously_verified">"Daha önce doğrulanmış bir kullanıcı tarafından şifrelenmiştir."</string>
<string name="crypto_event_authenticity_sent_in_clear">"Şifrelenmemiş."</string> <string name="crypto_event_authenticity_sent_in_clear">"Şifrelenmemiş."</string>
@ -46,11 +47,15 @@
<string name="screen_room_timeline_no_permission_to_post">"Bu odada gönderi yapma izniniz yok"</string> <string name="screen_room_timeline_no_permission_to_post">"Bu odada gönderi yapma izniniz yok"</string>
<string name="screen_room_timeline_reactions_show_less">"Daha az göster"</string> <string name="screen_room_timeline_reactions_show_less">"Daha az göster"</string>
<string name="screen_room_timeline_reactions_show_more">"Daha fazla göster"</string> <string name="screen_room_timeline_reactions_show_more">"Daha fazla göster"</string>
<string name="screen_room_timeline_reactions_show_reactions_summary">"Tepki özetini göster"</string>
<string name="screen_room_timeline_read_marker_title">"Yeni"</string> <string name="screen_room_timeline_read_marker_title">"Yeni"</string>
<plurals name="screen_room_timeline_state_changes"> <plurals name="screen_room_timeline_state_changes">
<item quantity="one">"%1$d oda değişikliği"</item> <item quantity="one">"%1$d oda değişikliği"</item>
<item quantity="other">"%1$d oda değişikliği"</item> <item quantity="other">"%1$d oda değişikliği"</item>
</plurals> </plurals>
<string name="screen_room_timeline_tombstoned_room_action">"Yeni odaya git"</string>
<string name="screen_room_timeline_tombstoned_room_message">"Bu odanın yerini başka bir oda aldı ve artık aktif değil"</string>
<string name="screen_room_timeline_upgraded_room_message">"Bu oda, başka bir odanın devamıdır"</string>
<plurals name="screen_room_typing_many_members"> <plurals name="screen_room_typing_many_members">
<item quantity="one">"%1$s, %2$s ve %3$d diğer"</item> <item quantity="one">"%1$s, %2$s ve %3$d diğer"</item>
<item quantity="other">"%1$s, %2$s ve %3$d diğer"</item> <item quantity="other">"%1$s, %2$s ve %3$d diğer"</item>

View file

@ -14,6 +14,7 @@
<string name="emoji_picker_category_objects">"Ob\'ektlar"</string> <string name="emoji_picker_category_objects">"Ob\'ektlar"</string>
<string name="emoji_picker_category_people">"Smayllar va odamlar"</string> <string name="emoji_picker_category_people">"Smayllar va odamlar"</string>
<string name="emoji_picker_category_places">"Sayohat va Joylar"</string> <string name="emoji_picker_category_places">"Sayohat va Joylar"</string>
<string name="emoji_picker_category_recent">"Oxirgi kulgichlar"</string>
<string name="emoji_picker_category_symbols">"Belgilar"</string> <string name="emoji_picker_category_symbols">"Belgilar"</string>
<string name="screen_media_upload_preview_caption_warning">"Taglavhalar eski ilovalardan foydalanuvchilarga korinmasligi mumkin."</string> <string name="screen_media_upload_preview_caption_warning">"Taglavhalar eski ilovalardan foydalanuvchilarga korinmasligi mumkin."</string>
<string name="screen_media_upload_preview_change_video_quality_prompt">"Video yuklash sifatini oʻzgartirish uchun bosing"</string> <string name="screen_media_upload_preview_change_video_quality_prompt">"Video yuklash sifatini oʻzgartirish uchun bosing"</string>
@ -22,6 +23,7 @@
<string name="screen_media_upload_preview_error_failed_sending">"Media yuklanmadi, qayta urinib koring."</string> <string name="screen_media_upload_preview_error_failed_sending">"Media yuklanmadi, qayta urinib koring."</string>
<string name="screen_media_upload_preview_error_too_large_message">"Ruxsat etilgan maksimal fayl hajmi %1$s ."</string> <string name="screen_media_upload_preview_error_too_large_message">"Ruxsat etilgan maksimal fayl hajmi %1$s ."</string>
<string name="screen_media_upload_preview_error_too_large_title">"Fayl yuklash uchun juda katta"</string> <string name="screen_media_upload_preview_error_too_large_title">"Fayl yuklash uchun juda katta"</string>
<string name="screen_media_upload_preview_item_count">"Element%1$d ning %2$d"</string>
<string name="screen_media_upload_preview_optimize_image_quality_title">"Tasvir sifatini optimallashtirish"</string> <string name="screen_media_upload_preview_optimize_image_quality_title">"Tasvir sifatini optimallashtirish"</string>
<string name="screen_media_upload_preview_processing">"Qayta ishlanmoqda…"</string> <string name="screen_media_upload_preview_processing">"Qayta ishlanmoqda…"</string>
<string name="screen_report_content_block_user">"Foydalanuvchini bloklash"</string> <string name="screen_report_content_block_user">"Foydalanuvchini bloklash"</string>

View file

@ -31,6 +31,7 @@ dependencies {
implementation(projects.libraries.matrix.api) implementation(projects.libraries.matrix.api)
implementation(projects.libraries.sessionStorage.api) implementation(projects.libraries.sessionStorage.api)
implementation(projects.libraries.uiStrings) implementation(projects.libraries.uiStrings)
implementation(projects.libraries.workmanager.api)
testCommonDependencies(libs) testCommonDependencies(libs)
testImplementation(projects.libraries.matrix.test) testImplementation(projects.libraries.matrix.test)

View file

@ -0,0 +1,39 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package io.element.android.features.migration.impl.migrations
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesIntoSet
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.sessionstorage.api.SessionStore
import io.element.android.libraries.workmanager.api.WorkManagerRequestType
import io.element.android.libraries.workmanager.api.WorkManagerScheduler
/**
* Remove existing fetch notifications work manager requests since their format has changed.
*/
@ContributesIntoSet(AppScope::class)
class AppMigration10(
private val sessionStore: SessionStore,
private val workManagerScheduler: WorkManagerScheduler,
) : AppMigration {
override val order: Int = 10
override suspend fun migrate(isFreshInstall: Boolean) {
if (isFreshInstall) return
val sessions = sessionStore.getAllSessions()
for (session in sessions) {
workManagerScheduler.cancel(
sessionId = SessionId(session.userId),
requestType = WorkManagerRequestType.NOTIFICATION_SYNC
)
}
}
}

View file

@ -20,4 +20,9 @@ interface NetworkMonitor {
* A flow containing the current network connectivity status. * A flow containing the current network connectivity status.
*/ */
val connectivity: StateFlow<NetworkStatus> val connectivity: StateFlow<NetworkStatus>
/**
* Checks if the active network is being blocked by Doze, even if it's available.
*/
fun isNetworkBlocked(): Boolean
} }

View file

@ -43,6 +43,9 @@ class DefaultNetworkMonitor(
appCoroutineScope: CoroutineScope, appCoroutineScope: CoroutineScope,
) : NetworkMonitor { ) : NetworkMonitor {
private val connectivityManager: ConnectivityManager = context.getSystemService(ConnectivityManager::class.java) private val connectivityManager: ConnectivityManager = context.getSystemService(ConnectivityManager::class.java)
private val blockedNetworkBlockedChecker = NetworkBlockedChecker(connectivityManager)
override fun isNetworkBlocked(): Boolean = blockedNetworkBlockedChecker.isNetworkBlocked()
override val connectivity: StateFlow<NetworkStatus> = callbackFlow { override val connectivity: StateFlow<NetworkStatus> = callbackFlow {

View file

@ -0,0 +1,31 @@
/*
* Copyright (c) 2026 Element Creations Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
@file:Suppress("DEPRECATION")
package io.element.android.features.networkmonitor.impl
import android.annotation.SuppressLint
import android.net.ConnectivityManager
import android.net.NetworkInfo
/**
* Helper to check if the active network in [ConnectivityManager] is blocked.
*
* This is extracted to its own class because it uses deprecated APIs (but the only ones that are reliable)
* and we don't want to suppress deprecations everywhere.
*/
class NetworkBlockedChecker(
private val connectivityManager: ConnectivityManager,
) {
// The permission is granted by the manifest, false positive
@SuppressLint("MissingPermission")
fun isNetworkBlocked(): Boolean {
// This call is deprecated, but it seems like it's the only reliable way to tell if doze has blocked network access
return connectivityManager.activeNetworkInfo?.detailedState == NetworkInfo.DetailedState.BLOCKED
}
}

View file

@ -12,6 +12,10 @@ import io.element.android.features.networkmonitor.api.NetworkMonitor
import io.element.android.features.networkmonitor.api.NetworkStatus import io.element.android.features.networkmonitor.api.NetworkStatus
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
class FakeNetworkMonitor(initialStatus: NetworkStatus = NetworkStatus.Connected) : NetworkMonitor { class FakeNetworkMonitor(
initialStatus: NetworkStatus = NetworkStatus.Connected,
private val isNetworkBlockedLambda: () -> Boolean = { false },
) : NetworkMonitor {
override val connectivity = MutableStateFlow(initialStatus) override val connectivity = MutableStateFlow(initialStatus)
override fun isNetworkBlocked(): Boolean = isNetworkBlockedLambda()
} }

View file

@ -4,5 +4,6 @@
<item quantity="one">"%1$d τοις εκατό των συνολικών ψήφων"</item> <item quantity="one">"%1$d τοις εκατό των συνολικών ψήφων"</item>
<item quantity="other">"%1$d τοις εκατό του συνόλου των ψήφων"</item> <item quantity="other">"%1$d τοις εκατό του συνόλου των ψήφων"</item>
</plurals> </plurals>
<string name="a11y_polls_will_remove_selection">"Θα καταργήσει την προηγούμενη επιλογή"</string>
<string name="a11y_polls_winning_answer">"Αυτή είναι η νικητήρια απάντηση"</string> <string name="a11y_polls_winning_answer">"Αυτή είναι η νικητήρια απάντηση"</string>
</resources> </resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="a11y_polls_winning_answer">"Esta es la respuesta ganadora"</string>
</resources>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="a11y_polls_will_remove_selection">"Önceki seçim kaldırılacak"</string>
<string name="a11y_polls_winning_answer">"Kazanan cevap"</string>
</resources>

View file

@ -41,7 +41,7 @@ class CreatePollNode(
private var isNavigatingUp = AtomicBoolean(false) private var isNavigatingUp = AtomicBoolean(false)
private val presenter = presenterFactory.create( private val presenter = presenterFactory.create(
backNavigator = { navigateUp = {
if (isNavigatingUp.compareAndSet(false, true)) { if (isNavigatingUp.compareAndSet(false, true)) {
navigateUp() navigateUp()
} }

View file

@ -50,7 +50,7 @@ class CreatePollPresenter(
fun interface Factory { fun interface Factory {
fun create( fun create(
timelineMode: Timeline.Mode, timelineMode: Timeline.Mode,
backNavigator: () -> Unit, navigateUp: () -> Unit,
mode: CreatePollMode mode: CreatePollMode
): CreatePollPresenter ): CreatePollPresenter
} }

View file

@ -5,6 +5,7 @@
<string name="screen_create_poll_anonymous_headline">"Ocultar votos"</string> <string name="screen_create_poll_anonymous_headline">"Ocultar votos"</string>
<string name="screen_create_poll_answer_hint">"Opción %1$d"</string> <string name="screen_create_poll_answer_hint">"Opción %1$d"</string>
<string name="screen_create_poll_cancel_confirmation_content_android">"Tus cambios no se han guardado. ¿Estás seguro de que quieres volver atrás?"</string> <string name="screen_create_poll_cancel_confirmation_content_android">"Tus cambios no se han guardado. ¿Estás seguro de que quieres volver atrás?"</string>
<string name="screen_create_poll_delete_option_a11y">"Eliminar opción %1$s"</string>
<string name="screen_create_poll_question_desc">"Pregunta o tema"</string> <string name="screen_create_poll_question_desc">"Pregunta o tema"</string>
<string name="screen_create_poll_question_hint">"¿De qué trata la encuesta?"</string> <string name="screen_create_poll_question_hint">"¿De qué trata la encuesta?"</string>
<string name="screen_create_poll_title">"Crear una Encuesta"</string> <string name="screen_create_poll_title">"Crear una Encuesta"</string>

View file

@ -47,7 +47,7 @@ class EditDefaultNotificationSettingPresenter(
) : Presenter<EditDefaultNotificationSettingState> { ) : Presenter<EditDefaultNotificationSettingState> {
@AssistedFactory @AssistedFactory
interface Factory { interface Factory {
fun create(oneToOne: Boolean): EditDefaultNotificationSettingPresenter fun create(isOneToOne: Boolean): EditDefaultNotificationSettingPresenter
} }
private val collator = Collator.getInstance().apply { private val collator = Collator.getInstance().apply {

View file

@ -165,6 +165,6 @@ class PreferencesRootPresenter(
devicesManagementUrl: MutableState<String?>, devicesManagementUrl: MutableState<String?>,
) = launch { ) = launch {
accountManagementUrl.value = matrixClient.getAccountManagementUrl(AccountManagementAction.Profile).getOrNull() accountManagementUrl.value = matrixClient.getAccountManagementUrl(AccountManagementAction.Profile).getOrNull()
devicesManagementUrl.value = matrixClient.getAccountManagementUrl(AccountManagementAction.SessionsList).getOrNull() devicesManagementUrl.value = matrixClient.getAccountManagementUrl(AccountManagementAction.DevicesList).getOrNull()
} }
} }

View file

@ -10,9 +10,17 @@
<string name="screen_advanced_settings_element_call_base_url_validation_error">"Μη έγκυρη διεύθυνση URL, βεβαιώσου ότι έχεις συμπεριλάβει το πρωτόκολλο (http/https) και τη σωστή διεύθυνση."</string> <string name="screen_advanced_settings_element_call_base_url_validation_error">"Μη έγκυρη διεύθυνση URL, βεβαιώσου ότι έχεις συμπεριλάβει το πρωτόκολλο (http/https) και τη σωστή διεύθυνση."</string>
<string name="screen_advanced_settings_hide_invite_avatars_toggle_title">"Απόκρυψη εικόνων προφίλ σε αιτήματα πρόσκλησης αίθουσας"</string> <string name="screen_advanced_settings_hide_invite_avatars_toggle_title">"Απόκρυψη εικόνων προφίλ σε αιτήματα πρόσκλησης αίθουσας"</string>
<string name="screen_advanced_settings_hide_timeline_media_toggle_title">"Απόκρυψη προεπισκοπήσεων πολυμέσων στο timeline"</string> <string name="screen_advanced_settings_hide_timeline_media_toggle_title">"Απόκρυψη προεπισκοπήσεων πολυμέσων στο timeline"</string>
<string name="screen_advanced_settings_labs">"Εργαστήρια"</string>
<string name="screen_advanced_settings_media_compression_description">"Ανέβασε φωτογραφίες και βίντεο γρηγορότερα και μείωσε τη χρήση δεδομένων"</string> <string name="screen_advanced_settings_media_compression_description">"Ανέβασε φωτογραφίες και βίντεο γρηγορότερα και μείωσε τη χρήση δεδομένων"</string>
<string name="screen_advanced_settings_media_compression_title">"Βελτιστοποίηση ποιότητας των μέσων"</string> <string name="screen_advanced_settings_media_compression_title">"Βελτιστοποίηση ποιότητας των μέσων"</string>
<string name="screen_advanced_settings_moderation_and_safety_section_title">"Συντονισμός και Ασφάλεια"</string> <string name="screen_advanced_settings_moderation_and_safety_section_title">"Συντονισμός και Ασφάλεια"</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_description">"Αυτόματη βελτιστοποίηση εικόνων για ταχύτερες μεταφορτώσεις και μικρότερα μεγέθη αρχείων."</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_title">"Βελτιστοποιήστε την ποιότητα μεταφόρτωσης εικόνων"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_description">"%1$s. Πατήστε εδώ για αλλαγή."</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_high">"Υψηλή (1080p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_low">"Χαμηλή (480p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_standard">"Τυπικό (720p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_title">"Ποιότητα μεταφόρτωσης βίντεο"</string>
<string name="screen_advanced_settings_push_provider_android">"Πάροχος ειδοποιήσεων push"</string> <string name="screen_advanced_settings_push_provider_android">"Πάροχος ειδοποιήσεων push"</string>
<string name="screen_advanced_settings_rich_text_editor_description">"Απενεργοποίησε τον επεξεργαστή εμπλουτισμένου κειμένου για να πληκτρολογήσεις Markdown χειροκίνητα."</string> <string name="screen_advanced_settings_rich_text_editor_description">"Απενεργοποίησε τον επεξεργαστή εμπλουτισμένου κειμένου για να πληκτρολογήσεις Markdown χειροκίνητα."</string>
<string name="screen_advanced_settings_send_read_receipts">"Αποδεικτικά ανάγνωσης"</string> <string name="screen_advanced_settings_send_read_receipts">"Αποδεικτικά ανάγνωσης"</string>
@ -36,6 +44,11 @@
<string name="screen_edit_profile_error_title">"Δεν είναι δυνατή η ενημέρωση του προφίλ"</string> <string name="screen_edit_profile_error_title">"Δεν είναι δυνατή η ενημέρωση του προφίλ"</string>
<string name="screen_edit_profile_title">"Επεξεργασία προφίλ"</string> <string name="screen_edit_profile_title">"Επεξεργασία προφίλ"</string>
<string name="screen_edit_profile_updating_details">"Ενημέρωση προφίλ…"</string> <string name="screen_edit_profile_updating_details">"Ενημέρωση προφίλ…"</string>
<string name="screen_labs_enable_threads">"Ενεργοποίηση απαντήσεων σε νήμα"</string>
<string name="screen_labs_enable_threads_description">"Η εφαρμογή θα επανεκκινηθεί για να εφαρμοστεί αυτήν την αλλαγή."</string>
<string name="screen_labs_header_description">"Δοκιμάστε τις τελευταίες μας ιδέες που βρίσκονται σε φάση ανάπτυξης. Αυτές οι λειτουργίες δεν είναι τελικές, ενδέχεται να είναι ασταθείς ή να αλλάξουν."</string>
<string name="screen_labs_header_title">"Έχετε διάθεση για πειραματισμούς;"</string>
<string name="screen_labs_title">"Εργαστήρια"</string>
<string name="screen_notification_settings_additional_settings_section_title">"Πρόσθετες ρυθμίσεις"</string> <string name="screen_notification_settings_additional_settings_section_title">"Πρόσθετες ρυθμίσεις"</string>
<string name="screen_notification_settings_calls_label">"Κλήσεις ήχου και βίντεο"</string> <string name="screen_notification_settings_calls_label">"Κλήσεις ήχου και βίντεο"</string>
<string name="screen_notification_settings_configuration_mismatch">"Αναντιστοιχία διαμόρφωσης"</string> <string name="screen_notification_settings_configuration_mismatch">"Αναντιστοιχία διαμόρφωσης"</string>

View file

@ -26,6 +26,7 @@
<string name="screen_edit_profile_error_title">"Kan profiel niet bijwerken"</string> <string name="screen_edit_profile_error_title">"Kan profiel niet bijwerken"</string>
<string name="screen_edit_profile_title">"Profiel bewerken"</string> <string name="screen_edit_profile_title">"Profiel bewerken"</string>
<string name="screen_edit_profile_updating_details">"Profiel bijwerken…"</string> <string name="screen_edit_profile_updating_details">"Profiel bijwerken…"</string>
<string name="screen_labs_enable_threads">"Gesprek antwoorden inschakelen"</string>
<string name="screen_notification_settings_additional_settings_section_title">"Aanvullende instellingen"</string> <string name="screen_notification_settings_additional_settings_section_title">"Aanvullende instellingen"</string>
<string name="screen_notification_settings_calls_label">"Audio- en videogesprekken"</string> <string name="screen_notification_settings_calls_label">"Audio- en videogesprekken"</string>
<string name="screen_notification_settings_configuration_mismatch">"Configuratie komt niet overeen"</string> <string name="screen_notification_settings_configuration_mismatch">"Configuratie komt niet overeen"</string>

View file

@ -13,12 +13,24 @@
<string name="screen_advanced_settings_media_compression_description">"Fotoğraf ve videoları daha hızlı yükleyin ve veri kullanımını azaltın"</string> <string name="screen_advanced_settings_media_compression_description">"Fotoğraf ve videoları daha hızlı yükleyin ve veri kullanımını azaltın"</string>
<string name="screen_advanced_settings_media_compression_title">"Medya kalitesini optimize edin"</string> <string name="screen_advanced_settings_media_compression_title">"Medya kalitesini optimize edin"</string>
<string name="screen_advanced_settings_moderation_and_safety_section_title">"Yönetim ve Güvenlik"</string> <string name="screen_advanced_settings_moderation_and_safety_section_title">"Yönetim ve Güvenlik"</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_description">"Daha hızlı yükleme ve daha küçük dosya boyutları için görselleri otomatik olarak optimize eder."</string>
<string name="screen_advanced_settings_optimise_image_upload_quality_title">"Görsel yükleme kalitesini optimize et"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_description">"%1$s. Değiştirmek için buraya dokunun."</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_high">"Yüksek (1080p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_low">"Düşük (480p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_standard">"Standart (720p)"</string>
<string name="screen_advanced_settings_optimise_video_upload_quality_title">"Video yükleme kalitesi"</string>
<string name="screen_advanced_settings_push_provider_android">"Anlık bildirim sağlayıcısı"</string> <string name="screen_advanced_settings_push_provider_android">"Anlık bildirim sağlayıcısı"</string>
<string name="screen_advanced_settings_rich_text_editor_description">"Markdown\'ı manuel olarak yazmak için zengin metin düzenleyicisini devre dışı bırakın."</string> <string name="screen_advanced_settings_rich_text_editor_description">"Markdown\'ı manuel olarak yazmak için zengin metin düzenleyicisini devre dışı bırakın."</string>
<string name="screen_advanced_settings_send_read_receipts">"Okundu bilgisi"</string> <string name="screen_advanced_settings_send_read_receipts">"Okundu bilgisi"</string>
<string name="screen_advanced_settings_send_read_receipts_description">"Kapatılırsa, okundu bilgileriniz kimseye gönderilmez. Diğer kullanıcılardan okundu bilgisi almaya devam edersiniz."</string> <string name="screen_advanced_settings_send_read_receipts_description">"Kapatılırsa, okundu bilgileriniz kimseye gönderilmez. Diğer kullanıcılardan okundu bilgisi almaya devam edersiniz."</string>
<string name="screen_advanced_settings_share_presence">"Varlığı paylaşın"</string> <string name="screen_advanced_settings_share_presence">"Varlığı paylaşın"</string>
<string name="screen_advanced_settings_share_presence_description">"Kapatılırsa, okundu bilgisi veya yazma bildirimleri gönderemez veya alamazsınız."</string> <string name="screen_advanced_settings_share_presence_description">"Kapatılırsa, okundu bilgisi veya yazma bildirimleri gönderemez veya alamazsınız."</string>
<string name="screen_advanced_settings_show_media_timeline_always_hide">"Her zaman gizle"</string>
<string name="screen_advanced_settings_show_media_timeline_always_show">"Her zaman göster"</string>
<string name="screen_advanced_settings_show_media_timeline_private_rooms">"Özel odalarda"</string>
<string name="screen_advanced_settings_show_media_timeline_subtitle">"Gizli bir medya, üzerine dokunularak her zaman görüntülenebilir"</string>
<string name="screen_advanced_settings_show_media_timeline_title">"Medya dosyalarını zaman çizelgesinde göster"</string>
<string name="screen_advanced_settings_view_source_description">"Zaman çizelgesinde mesaj kaynağını görüntüleme seçeneğini etkinleştirin."</string> <string name="screen_advanced_settings_view_source_description">"Zaman çizelgesinde mesaj kaynağını görüntüleme seçeneğini etkinleştirin."</string>
<string name="screen_blocked_users_empty">"Engellenen kullanıcı yok."</string> <string name="screen_blocked_users_empty">"Engellenen kullanıcı yok."</string>
<string name="screen_blocked_users_unblock_alert_action">"Engellemeyi kaldır"</string> <string name="screen_blocked_users_unblock_alert_action">"Engellemeyi kaldır"</string>
@ -31,6 +43,10 @@
<string name="screen_edit_profile_error_title">"Profil güncellenemiyor"</string> <string name="screen_edit_profile_error_title">"Profil güncellenemiyor"</string>
<string name="screen_edit_profile_title">"Profili düzenle"</string> <string name="screen_edit_profile_title">"Profili düzenle"</string>
<string name="screen_edit_profile_updating_details">"Profil güncelleniyor…"</string> <string name="screen_edit_profile_updating_details">"Profil güncelleniyor…"</string>
<string name="screen_labs_enable_threads">"Konu yanıtlarını etkinleştir"</string>
<string name="screen_labs_enable_threads_description">"Bu değişikliği uygulamak için uygulama yeniden başlatılacak."</string>
<string name="screen_labs_header_description">"Geliştirme aşamasındaki en yeni fikirlerimizi deneyin. Bu özellikler henüz tamamlanmamıştır ve kararsız olabilir."</string>
<string name="screen_labs_header_title">"Labs Ortamı"</string>
<string name="screen_notification_settings_additional_settings_section_title">"Ek ayarlar"</string> <string name="screen_notification_settings_additional_settings_section_title">"Ek ayarlar"</string>
<string name="screen_notification_settings_calls_label">"Sesli ve Görüntülü aramalar"</string> <string name="screen_notification_settings_calls_label">"Sesli ve Görüntülü aramalar"</string>
<string name="screen_notification_settings_configuration_mismatch">"Yapılandırma uyuşmazlığı"</string> <string name="screen_notification_settings_configuration_mismatch">"Yapılandırma uyuşmazlığı"</string>

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